{"version":3,"file":"file_form.min.js","sources":["../../../frontend/src/auto_init_file_forms.ts","../../../frontend/node_modules/mime/dist/types/standard.js","../../../frontend/node_modules/mime/dist/src/Mime.js","../../../frontend/node_modules/mime/dist/src/index_lite.js","../../../frontend/node_modules/picomatch/lib/constants.js","../../../frontend/node_modules/picomatch/lib/utils.js","../../../frontend/node_modules/picomatch/lib/scan.js","../../../frontend/node_modules/picomatch/lib/parse.js","../../../frontend/node_modules/picomatch/lib/picomatch.js","../../../frontend/node_modules/picomatch/posix.js","../../../frontend/src/accepted_file_types.ts","../../../frontend/src/drop_area.ts","../../../frontend/node_modules/escape-html/index.js","../../../frontend/src/util.ts","../../../frontend/src/render_upload_file.ts","../../../frontend/src/uploads/base_upload.ts","../../../frontend/node_modules/url-join/lib/url-join.js","../../../frontend/src/uploads/s3_utils.ts","../../../frontend/src/uploads/s3_upload.ts","../../../frontend/node_modules/tus-js-client/lib/error.js","../../../frontend/node_modules/js-base64/base64.mjs","../../../frontend/node_modules/url-parse/index.js","../../../frontend/node_modules/requires-port/index.js","../../../frontend/node_modules/querystringify/index.js","../../../frontend/node_modules/tus-js-client/lib/upload.js","../../../frontend/node_modules/tus-js-client/lib/uuid.js","../../../frontend/node_modules/tus-js-client/lib/browser/isReactNative.js","../../../frontend/node_modules/tus-js-client/lib/browser/sources/FileSource.js","../../../frontend/node_modules/tus-js-client/lib/browser/sources/isCordova.js","../../../frontend/node_modules/tus-js-client/lib/browser/sources/readAsByteArray.js","../../../frontend/node_modules/tus-js-client/lib/browser/sources/StreamSource.js","../../../frontend/node_modules/tus-js-client/lib/browser/httpStack.js","../../../frontend/node_modules/tus-js-client/lib/browser/urlStorage.js","../../../frontend/node_modules/tus-js-client/lib/browser/index.js","../../../frontend/node_modules/tus-js-client/lib/browser/fileReader.js","../../../frontend/node_modules/tus-js-client/lib/browser/uriToBlob.js","../../../frontend/node_modules/tus-js-client/lib/noopUrlStorage.js","../../../frontend/node_modules/tus-js-client/lib/browser/fileSignature.js","../../../frontend/src/uploads/tus_utils.ts","../../../frontend/src/uploads/tus_upload.ts","../../../frontend/src/uploads/uploaded_file.ts","../../../frontend/src/file_field.ts","../../../frontend/src/init_upload_fields.ts","../../../frontend/src/file_form.ts","../../../frontend/src/init_form_set.ts"],"sourcesContent":["const findForm = (element: Element): HTMLElement | null => {\n  const parent = element.parentElement;\n\n  if (!parent) {\n    return null;\n  }\n\n  if (parent.tagName === \"FORM\") {\n    return parent;\n  }\n\n  return findForm(parent);\n};\n\nconst unique = (values: unknown[]): unknown[] =>\n  Array.from(new Set(values).values());\n\ndeclare const window: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nconst autoInitFileForms = (): void => {\n  const initUploadFields = window.initUploadFields as () => void; // eslint-disable-line  @typescript-eslint/no-unsafe-member-access\n\n  const forms = unique(\n    Array.from(document.querySelectorAll(\".dff-uploader\")).map(findForm)\n  );\n  forms.forEach(initUploadFields);\n};\n\nexport default autoInitFileForms;\n","const types = {\n    'application/andrew-inset': ['ez'],\n    'application/appinstaller': ['appinstaller'],\n    'application/applixware': ['aw'],\n    'application/appx': ['appx'],\n    'application/appxbundle': ['appxbundle'],\n    'application/atom+xml': ['atom'],\n    'application/atomcat+xml': ['atomcat'],\n    'application/atomdeleted+xml': ['atomdeleted'],\n    'application/atomsvc+xml': ['atomsvc'],\n    'application/atsc-dwd+xml': ['dwd'],\n    'application/atsc-held+xml': ['held'],\n    'application/atsc-rsat+xml': ['rsat'],\n    'application/automationml-aml+xml': ['aml'],\n    'application/automationml-amlx+zip': ['amlx'],\n    'application/bdoc': ['bdoc'],\n    'application/calendar+xml': ['xcs'],\n    'application/ccxml+xml': ['ccxml'],\n    'application/cdfx+xml': ['cdfx'],\n    'application/cdmi-capability': ['cdmia'],\n    'application/cdmi-container': ['cdmic'],\n    'application/cdmi-domain': ['cdmid'],\n    'application/cdmi-object': ['cdmio'],\n    'application/cdmi-queue': ['cdmiq'],\n    'application/cpl+xml': ['cpl'],\n    'application/cu-seeme': ['cu'],\n    'application/cwl': ['cwl'],\n    'application/dash+xml': ['mpd'],\n    'application/dash-patch+xml': ['mpp'],\n    'application/davmount+xml': ['davmount'],\n    'application/docbook+xml': ['dbk'],\n    'application/dssc+der': ['dssc'],\n    'application/dssc+xml': ['xdssc'],\n    'application/ecmascript': ['ecma'],\n    'application/emma+xml': ['emma'],\n    'application/emotionml+xml': ['emotionml'],\n    'application/epub+zip': ['epub'],\n    'application/exi': ['exi'],\n    'application/express': ['exp'],\n    'application/fdf': ['fdf'],\n    'application/fdt+xml': ['fdt'],\n    'application/font-tdpfr': ['pfr'],\n    'application/geo+json': ['geojson'],\n    'application/gml+xml': ['gml'],\n    'application/gpx+xml': ['gpx'],\n    'application/gxf': ['gxf'],\n    'application/gzip': ['gz'],\n    'application/hjson': ['hjson'],\n    'application/hyperstudio': ['stk'],\n    'application/inkml+xml': ['ink', 'inkml'],\n    'application/ipfix': ['ipfix'],\n    'application/its+xml': ['its'],\n    'application/java-archive': ['jar', 'war', 'ear'],\n    'application/java-serialized-object': ['ser'],\n    'application/java-vm': ['class'],\n    'application/javascript': ['*js'],\n    'application/json': ['json', 'map'],\n    'application/json5': ['json5'],\n    'application/jsonml+json': ['jsonml'],\n    'application/ld+json': ['jsonld'],\n    'application/lgr+xml': ['lgr'],\n    'application/lost+xml': ['lostxml'],\n    'application/mac-binhex40': ['hqx'],\n    'application/mac-compactpro': ['cpt'],\n    'application/mads+xml': ['mads'],\n    'application/manifest+json': ['webmanifest'],\n    'application/marc': ['mrc'],\n    'application/marcxml+xml': ['mrcx'],\n    'application/mathematica': ['ma', 'nb', 'mb'],\n    'application/mathml+xml': ['mathml'],\n    'application/mbox': ['mbox'],\n    'application/media-policy-dataset+xml': ['mpf'],\n    'application/mediaservercontrol+xml': ['mscml'],\n    'application/metalink+xml': ['metalink'],\n    'application/metalink4+xml': ['meta4'],\n    'application/mets+xml': ['mets'],\n    'application/mmt-aei+xml': ['maei'],\n    'application/mmt-usd+xml': ['musd'],\n    'application/mods+xml': ['mods'],\n    'application/mp21': ['m21', 'mp21'],\n    'application/mp4': ['*mp4', '*mpg4', 'mp4s', 'm4p'],\n    'application/msix': ['msix'],\n    'application/msixbundle': ['msixbundle'],\n    'application/msword': ['doc', 'dot'],\n    'application/mxf': ['mxf'],\n    'application/n-quads': ['nq'],\n    'application/n-triples': ['nt'],\n    'application/node': ['cjs'],\n    'application/octet-stream': [\n        'bin',\n        'dms',\n        'lrf',\n        'mar',\n        'so',\n        'dist',\n        'distz',\n        'pkg',\n        'bpk',\n        'dump',\n        'elc',\n        'deploy',\n        'exe',\n        'dll',\n        'deb',\n        'dmg',\n        'iso',\n        'img',\n        'msi',\n        'msp',\n        'msm',\n        'buffer',\n    ],\n    'application/oda': ['oda'],\n    'application/oebps-package+xml': ['opf'],\n    'application/ogg': ['ogx'],\n    'application/omdoc+xml': ['omdoc'],\n    'application/onenote': ['onetoc', 'onetoc2', 'onetmp', 'onepkg'],\n    'application/oxps': ['oxps'],\n    'application/p2p-overlay+xml': ['relo'],\n    'application/patch-ops-error+xml': ['xer'],\n    'application/pdf': ['pdf'],\n    'application/pgp-encrypted': ['pgp'],\n    'application/pgp-keys': ['asc'],\n    'application/pgp-signature': ['sig', '*asc'],\n    'application/pics-rules': ['prf'],\n    'application/pkcs10': ['p10'],\n    'application/pkcs7-mime': ['p7m', 'p7c'],\n    'application/pkcs7-signature': ['p7s'],\n    'application/pkcs8': ['p8'],\n    'application/pkix-attr-cert': ['ac'],\n    'application/pkix-cert': ['cer'],\n    'application/pkix-crl': ['crl'],\n    'application/pkix-pkipath': ['pkipath'],\n    'application/pkixcmp': ['pki'],\n    'application/pls+xml': ['pls'],\n    'application/postscript': ['ai', 'eps', 'ps'],\n    'application/provenance+xml': ['provx'],\n    'application/pskc+xml': ['pskcxml'],\n    'application/raml+yaml': ['raml'],\n    'application/rdf+xml': ['rdf', 'owl'],\n    'application/reginfo+xml': ['rif'],\n    'application/relax-ng-compact-syntax': ['rnc'],\n    'application/resource-lists+xml': ['rl'],\n    'application/resource-lists-diff+xml': ['rld'],\n    'application/rls-services+xml': ['rs'],\n    'application/route-apd+xml': ['rapd'],\n    'application/route-s-tsid+xml': ['sls'],\n    'application/route-usd+xml': ['rusd'],\n    'application/rpki-ghostbusters': ['gbr'],\n    'application/rpki-manifest': ['mft'],\n    'application/rpki-roa': ['roa'],\n    'application/rsd+xml': ['rsd'],\n    'application/rss+xml': ['rss'],\n    'application/rtf': ['rtf'],\n    'application/sbml+xml': ['sbml'],\n    'application/scvp-cv-request': ['scq'],\n    'application/scvp-cv-response': ['scs'],\n    'application/scvp-vp-request': ['spq'],\n    'application/scvp-vp-response': ['spp'],\n    'application/sdp': ['sdp'],\n    'application/senml+xml': ['senmlx'],\n    'application/sensml+xml': ['sensmlx'],\n    'application/set-payment-initiation': ['setpay'],\n    'application/set-registration-initiation': ['setreg'],\n    'application/shf+xml': ['shf'],\n    'application/sieve': ['siv', 'sieve'],\n    'application/smil+xml': ['smi', 'smil'],\n    'application/sparql-query': ['rq'],\n    'application/sparql-results+xml': ['srx'],\n    'application/sql': ['sql'],\n    'application/srgs': ['gram'],\n    'application/srgs+xml': ['grxml'],\n    'application/sru+xml': ['sru'],\n    'application/ssdl+xml': ['ssdl'],\n    'application/ssml+xml': ['ssml'],\n    'application/swid+xml': ['swidtag'],\n    'application/tei+xml': ['tei', 'teicorpus'],\n    'application/thraud+xml': ['tfi'],\n    'application/timestamped-data': ['tsd'],\n    'application/toml': ['toml'],\n    'application/trig': ['trig'],\n    'application/ttml+xml': ['ttml'],\n    'application/ubjson': ['ubj'],\n    'application/urc-ressheet+xml': ['rsheet'],\n    'application/urc-targetdesc+xml': ['td'],\n    'application/voicexml+xml': ['vxml'],\n    'application/wasm': ['wasm'],\n    'application/watcherinfo+xml': ['wif'],\n    'application/widget': ['wgt'],\n    'application/winhlp': ['hlp'],\n    'application/wsdl+xml': ['wsdl'],\n    'application/wspolicy+xml': ['wspolicy'],\n    'application/xaml+xml': ['xaml'],\n    'application/xcap-att+xml': ['xav'],\n    'application/xcap-caps+xml': ['xca'],\n    'application/xcap-diff+xml': ['xdf'],\n    'application/xcap-el+xml': ['xel'],\n    'application/xcap-ns+xml': ['xns'],\n    'application/xenc+xml': ['xenc'],\n    'application/xfdf': ['xfdf'],\n    'application/xhtml+xml': ['xhtml', 'xht'],\n    'application/xliff+xml': ['xlf'],\n    'application/xml': ['xml', 'xsl', 'xsd', 'rng'],\n    'application/xml-dtd': ['dtd'],\n    'application/xop+xml': ['xop'],\n    'application/xproc+xml': ['xpl'],\n    'application/xslt+xml': ['*xsl', 'xslt'],\n    'application/xspf+xml': ['xspf'],\n    'application/xv+xml': ['mxml', 'xhvml', 'xvml', 'xvm'],\n    'application/yang': ['yang'],\n    'application/yin+xml': ['yin'],\n    'application/zip': ['zip'],\n    'audio/3gpp': ['*3gpp'],\n    'audio/aac': ['adts', 'aac'],\n    'audio/adpcm': ['adp'],\n    'audio/amr': ['amr'],\n    'audio/basic': ['au', 'snd'],\n    'audio/midi': ['mid', 'midi', 'kar', 'rmi'],\n    'audio/mobile-xmf': ['mxmf'],\n    'audio/mp3': ['*mp3'],\n    'audio/mp4': ['m4a', 'mp4a'],\n    'audio/mpeg': ['mpga', 'mp2', 'mp2a', 'mp3', 'm2a', 'm3a'],\n    'audio/ogg': ['oga', 'ogg', 'spx', 'opus'],\n    'audio/s3m': ['s3m'],\n    'audio/silk': ['sil'],\n    'audio/wav': ['wav'],\n    'audio/wave': ['*wav'],\n    'audio/webm': ['weba'],\n    'audio/xm': ['xm'],\n    'font/collection': ['ttc'],\n    'font/otf': ['otf'],\n    'font/ttf': ['ttf'],\n    'font/woff': ['woff'],\n    'font/woff2': ['woff2'],\n    'image/aces': ['exr'],\n    'image/apng': ['apng'],\n    'image/avci': ['avci'],\n    'image/avcs': ['avcs'],\n    'image/avif': ['avif'],\n    'image/bmp': ['bmp', 'dib'],\n    'image/cgm': ['cgm'],\n    'image/dicom-rle': ['drle'],\n    'image/dpx': ['dpx'],\n    'image/emf': ['emf'],\n    'image/fits': ['fits'],\n    'image/g3fax': ['g3'],\n    'image/gif': ['gif'],\n    'image/heic': ['heic'],\n    'image/heic-sequence': ['heics'],\n    'image/heif': ['heif'],\n    'image/heif-sequence': ['heifs'],\n    'image/hej2k': ['hej2'],\n    'image/hsj2': ['hsj2'],\n    'image/ief': ['ief'],\n    'image/jls': ['jls'],\n    'image/jp2': ['jp2', 'jpg2'],\n    'image/jpeg': ['jpeg', 'jpg', 'jpe'],\n    'image/jph': ['jph'],\n    'image/jphc': ['jhc'],\n    'image/jpm': ['jpm', 'jpgm'],\n    'image/jpx': ['jpx', 'jpf'],\n    'image/jxl': ['jxl'],\n    'image/jxr': ['jxr'],\n    'image/jxra': ['jxra'],\n    'image/jxrs': ['jxrs'],\n    'image/jxs': ['jxs'],\n    'image/jxsc': ['jxsc'],\n    'image/jxsi': ['jxsi'],\n    'image/jxss': ['jxss'],\n    'image/ktx': ['ktx'],\n    'image/ktx2': ['ktx2'],\n    'image/png': ['png'],\n    'image/sgi': ['sgi'],\n    'image/svg+xml': ['svg', 'svgz'],\n    'image/t38': ['t38'],\n    'image/tiff': ['tif', 'tiff'],\n    'image/tiff-fx': ['tfx'],\n    'image/webp': ['webp'],\n    'image/wmf': ['wmf'],\n    'message/disposition-notification': ['disposition-notification'],\n    'message/global': ['u8msg'],\n    'message/global-delivery-status': ['u8dsn'],\n    'message/global-disposition-notification': ['u8mdn'],\n    'message/global-headers': ['u8hdr'],\n    'message/rfc822': ['eml', 'mime'],\n    'model/3mf': ['3mf'],\n    'model/gltf+json': ['gltf'],\n    'model/gltf-binary': ['glb'],\n    'model/iges': ['igs', 'iges'],\n    'model/jt': ['jt'],\n    'model/mesh': ['msh', 'mesh', 'silo'],\n    'model/mtl': ['mtl'],\n    'model/obj': ['obj'],\n    'model/prc': ['prc'],\n    'model/step+xml': ['stpx'],\n    'model/step+zip': ['stpz'],\n    'model/step-xml+zip': ['stpxz'],\n    'model/stl': ['stl'],\n    'model/u3d': ['u3d'],\n    'model/vrml': ['wrl', 'vrml'],\n    'model/x3d+binary': ['*x3db', 'x3dbz'],\n    'model/x3d+fastinfoset': ['x3db'],\n    'model/x3d+vrml': ['*x3dv', 'x3dvz'],\n    'model/x3d+xml': ['x3d', 'x3dz'],\n    'model/x3d-vrml': ['x3dv'],\n    'text/cache-manifest': ['appcache', 'manifest'],\n    'text/calendar': ['ics', 'ifb'],\n    'text/coffeescript': ['coffee', 'litcoffee'],\n    'text/css': ['css'],\n    'text/csv': ['csv'],\n    'text/html': ['html', 'htm', 'shtml'],\n    'text/jade': ['jade'],\n    'text/javascript': ['js', 'mjs'],\n    'text/jsx': ['jsx'],\n    'text/less': ['less'],\n    'text/markdown': ['md', 'markdown'],\n    'text/mathml': ['mml'],\n    'text/mdx': ['mdx'],\n    'text/n3': ['n3'],\n    'text/plain': ['txt', 'text', 'conf', 'def', 'list', 'log', 'in', 'ini'],\n    'text/richtext': ['rtx'],\n    'text/rtf': ['*rtf'],\n    'text/sgml': ['sgml', 'sgm'],\n    'text/shex': ['shex'],\n    'text/slim': ['slim', 'slm'],\n    'text/spdx': ['spdx'],\n    'text/stylus': ['stylus', 'styl'],\n    'text/tab-separated-values': ['tsv'],\n    'text/troff': ['t', 'tr', 'roff', 'man', 'me', 'ms'],\n    'text/turtle': ['ttl'],\n    'text/uri-list': ['uri', 'uris', 'urls'],\n    'text/vcard': ['vcard'],\n    'text/vtt': ['vtt'],\n    'text/wgsl': ['wgsl'],\n    'text/xml': ['*xml'],\n    'text/yaml': ['yaml', 'yml'],\n    'video/3gpp': ['3gp', '3gpp'],\n    'video/3gpp2': ['3g2'],\n    'video/h261': ['h261'],\n    'video/h263': ['h263'],\n    'video/h264': ['h264'],\n    'video/iso.segment': ['m4s'],\n    'video/jpeg': ['jpgv'],\n    'video/jpm': ['*jpm', '*jpgm'],\n    'video/mj2': ['mj2', 'mjp2'],\n    'video/mp2t': ['ts', 'm2t', 'm2ts', 'mts'],\n    'video/mp4': ['mp4', 'mp4v', 'mpg4'],\n    'video/mpeg': ['mpeg', 'mpg', 'mpe', 'm1v', 'm2v'],\n    'video/ogg': ['ogv'],\n    'video/quicktime': ['qt', 'mov'],\n    'video/webm': ['webm'],\n};\nObject.freeze(types);\nexport default types;\n","var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _Mime_extensionToType, _Mime_typeToExtension, _Mime_typeToExtensions;\nclass Mime {\n    constructor(...args) {\n        _Mime_extensionToType.set(this, new Map());\n        _Mime_typeToExtension.set(this, new Map());\n        _Mime_typeToExtensions.set(this, new Map());\n        for (const arg of args) {\n            this.define(arg);\n        }\n    }\n    define(typeMap, force = false) {\n        for (let [type, extensions] of Object.entries(typeMap)) {\n            type = type.toLowerCase();\n            extensions = extensions.map((ext) => ext.toLowerCase());\n            if (!__classPrivateFieldGet(this, _Mime_typeToExtensions, \"f\").has(type)) {\n                __classPrivateFieldGet(this, _Mime_typeToExtensions, \"f\").set(type, new Set());\n            }\n            const allExtensions = __classPrivateFieldGet(this, _Mime_typeToExtensions, \"f\").get(type);\n            let first = true;\n            for (let extension of extensions) {\n                const starred = extension.startsWith('*');\n                extension = starred ? extension.slice(1) : extension;\n                allExtensions?.add(extension);\n                if (first) {\n                    __classPrivateFieldGet(this, _Mime_typeToExtension, \"f\").set(type, extension);\n                }\n                first = false;\n                if (starred)\n                    continue;\n                const currentType = __classPrivateFieldGet(this, _Mime_extensionToType, \"f\").get(extension);\n                if (currentType && currentType != type && !force) {\n                    throw new Error(`\"${type} -> ${extension}\" conflicts with \"${currentType} -> ${extension}\". Pass \\`force=true\\` to override this definition.`);\n                }\n                __classPrivateFieldGet(this, _Mime_extensionToType, \"f\").set(extension, type);\n            }\n        }\n        return this;\n    }\n    getType(path) {\n        if (typeof path !== 'string')\n            return null;\n        const last = path.replace(/^.*[/\\\\]/, '').toLowerCase();\n        const ext = last.replace(/^.*\\./, '').toLowerCase();\n        const hasPath = last.length < path.length;\n        const hasDot = ext.length < last.length - 1;\n        if (!hasDot && hasPath)\n            return null;\n        return __classPrivateFieldGet(this, _Mime_extensionToType, \"f\").get(ext) ?? null;\n    }\n    getExtension(type) {\n        if (typeof type !== 'string')\n            return null;\n        type = type?.split?.(';')[0];\n        return ((type && __classPrivateFieldGet(this, _Mime_typeToExtension, \"f\").get(type.trim().toLowerCase())) ?? null);\n    }\n    getAllExtensions(type) {\n        if (typeof type !== 'string')\n            return null;\n        return __classPrivateFieldGet(this, _Mime_typeToExtensions, \"f\").get(type.toLowerCase()) ?? null;\n    }\n    _freeze() {\n        this.define = () => {\n            throw new Error('define() not allowed for built-in Mime objects. See https://github.com/broofa/mime/blob/main/README.md#custom-mime-instances');\n        };\n        Object.freeze(this);\n        for (const extensions of __classPrivateFieldGet(this, _Mime_typeToExtensions, \"f\").values()) {\n            Object.freeze(extensions);\n        }\n        return this;\n    }\n    _getTestState() {\n        return {\n            types: __classPrivateFieldGet(this, _Mime_extensionToType, \"f\"),\n            extensions: __classPrivateFieldGet(this, _Mime_typeToExtension, \"f\"),\n        };\n    }\n}\n_Mime_extensionToType = new WeakMap(), _Mime_typeToExtension = new WeakMap(), _Mime_typeToExtensions = new WeakMap();\nexport default Mime;\n","import standardTypes from '../types/standard.js';\nimport Mime from './Mime.js';\nexport { default as Mime } from './Mime.js';\nexport default new Mime(standardTypes)._freeze();\n","'use strict';\n\nconst WIN_SLASH = '\\\\\\\\/';\nconst WIN_NO_SLASH = `[^${WIN_SLASH}]`;\n\n/**\n * Posix glob regex\n */\n\nconst DOT_LITERAL = '\\\\.';\nconst PLUS_LITERAL = '\\\\+';\nconst QMARK_LITERAL = '\\\\?';\nconst SLASH_LITERAL = '\\\\/';\nconst ONE_CHAR = '(?=.)';\nconst QMARK = '[^/]';\nconst END_ANCHOR = `(?:${SLASH_LITERAL}|$)`;\nconst START_ANCHOR = `(?:^|${SLASH_LITERAL})`;\nconst DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`;\nconst NO_DOT = `(?!${DOT_LITERAL})`;\nconst NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`;\nconst NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`;\nconst NO_DOTS_SLASH = `(?!${DOTS_SLASH})`;\nconst QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`;\nconst STAR = `${QMARK}*?`;\nconst SEP = '/';\n\nconst POSIX_CHARS = {\n  DOT_LITERAL,\n  PLUS_LITERAL,\n  QMARK_LITERAL,\n  SLASH_LITERAL,\n  ONE_CHAR,\n  QMARK,\n  END_ANCHOR,\n  DOTS_SLASH,\n  NO_DOT,\n  NO_DOTS,\n  NO_DOT_SLASH,\n  NO_DOTS_SLASH,\n  QMARK_NO_DOT,\n  STAR,\n  START_ANCHOR,\n  SEP\n};\n\n/**\n * Windows glob regex\n */\n\nconst WINDOWS_CHARS = {\n  ...POSIX_CHARS,\n\n  SLASH_LITERAL: `[${WIN_SLASH}]`,\n  QMARK: WIN_NO_SLASH,\n  STAR: `${WIN_NO_SLASH}*?`,\n  DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`,\n  NO_DOT: `(?!${DOT_LITERAL})`,\n  NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,\n  NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`,\n  NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,\n  QMARK_NO_DOT: `[^.${WIN_SLASH}]`,\n  START_ANCHOR: `(?:^|[${WIN_SLASH}])`,\n  END_ANCHOR: `(?:[${WIN_SLASH}]|$)`,\n  SEP: '\\\\'\n};\n\n/**\n * POSIX Bracket Regex\n */\n\nconst POSIX_REGEX_SOURCE = {\n  alnum: 'a-zA-Z0-9',\n  alpha: 'a-zA-Z',\n  ascii: '\\\\x00-\\\\x7F',\n  blank: ' \\\\t',\n  cntrl: '\\\\x00-\\\\x1F\\\\x7F',\n  digit: '0-9',\n  graph: '\\\\x21-\\\\x7E',\n  lower: 'a-z',\n  print: '\\\\x20-\\\\x7E ',\n  punct: '\\\\-!\"#$%&\\'()\\\\*+,./:;<=>?@[\\\\]^_`{|}~',\n  space: ' \\\\t\\\\r\\\\n\\\\v\\\\f',\n  upper: 'A-Z',\n  word: 'A-Za-z0-9_',\n  xdigit: 'A-Fa-f0-9'\n};\n\nmodule.exports = {\n  MAX_LENGTH: 1024 * 64,\n  POSIX_REGEX_SOURCE,\n\n  // regular expressions\n  REGEX_BACKSLASH: /\\\\(?![*+?^${}(|)[\\]])/g,\n  REGEX_NON_SPECIAL_CHARS: /^[^@![\\].,$*+?^{}()|\\\\/]+/,\n  REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\\]]/,\n  REGEX_SPECIAL_CHARS_BACKREF: /(\\\\?)((\\W)(\\3*))/g,\n  REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\\]])/g,\n  REGEX_REMOVE_BACKSLASH: /(?:\\[.*?[^\\\\]\\]|\\\\(?=.))/g,\n\n  // Replace globs with equivalent patterns to reduce parsing time.\n  REPLACEMENTS: {\n    '***': '*',\n    '**/**': '**',\n    '**/**/**': '**'\n  },\n\n  // Digits\n  CHAR_0: 48, /* 0 */\n  CHAR_9: 57, /* 9 */\n\n  // Alphabet chars.\n  CHAR_UPPERCASE_A: 65, /* A */\n  CHAR_LOWERCASE_A: 97, /* a */\n  CHAR_UPPERCASE_Z: 90, /* Z */\n  CHAR_LOWERCASE_Z: 122, /* z */\n\n  CHAR_LEFT_PARENTHESES: 40, /* ( */\n  CHAR_RIGHT_PARENTHESES: 41, /* ) */\n\n  CHAR_ASTERISK: 42, /* * */\n\n  // Non-alphabetic chars.\n  CHAR_AMPERSAND: 38, /* & */\n  CHAR_AT: 64, /* @ */\n  CHAR_BACKWARD_SLASH: 92, /* \\ */\n  CHAR_CARRIAGE_RETURN: 13, /* \\r */\n  CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */\n  CHAR_COLON: 58, /* : */\n  CHAR_COMMA: 44, /* , */\n  CHAR_DOT: 46, /* . */\n  CHAR_DOUBLE_QUOTE: 34, /* \" */\n  CHAR_EQUAL: 61, /* = */\n  CHAR_EXCLAMATION_MARK: 33, /* ! */\n  CHAR_FORM_FEED: 12, /* \\f */\n  CHAR_FORWARD_SLASH: 47, /* / */\n  CHAR_GRAVE_ACCENT: 96, /* ` */\n  CHAR_HASH: 35, /* # */\n  CHAR_HYPHEN_MINUS: 45, /* - */\n  CHAR_LEFT_ANGLE_BRACKET: 60, /* < */\n  CHAR_LEFT_CURLY_BRACE: 123, /* { */\n  CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */\n  CHAR_LINE_FEED: 10, /* \\n */\n  CHAR_NO_BREAK_SPACE: 160, /* \\u00A0 */\n  CHAR_PERCENT: 37, /* % */\n  CHAR_PLUS: 43, /* + */\n  CHAR_QUESTION_MARK: 63, /* ? */\n  CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */\n  CHAR_RIGHT_CURLY_BRACE: 125, /* } */\n  CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */\n  CHAR_SEMICOLON: 59, /* ; */\n  CHAR_SINGLE_QUOTE: 39, /* ' */\n  CHAR_SPACE: 32, /*   */\n  CHAR_TAB: 9, /* \\t */\n  CHAR_UNDERSCORE: 95, /* _ */\n  CHAR_VERTICAL_LINE: 124, /* | */\n  CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \\uFEFF */\n\n  /**\n   * Create EXTGLOB_CHARS\n   */\n\n  extglobChars(chars) {\n    return {\n      '!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` },\n      '?': { type: 'qmark', open: '(?:', close: ')?' },\n      '+': { type: 'plus', open: '(?:', close: ')+' },\n      '*': { type: 'star', open: '(?:', close: ')*' },\n      '@': { type: 'at', open: '(?:', close: ')' }\n    };\n  },\n\n  /**\n   * Create GLOB_CHARS\n   */\n\n  globChars(win32) {\n    return win32 === true ? WINDOWS_CHARS : POSIX_CHARS;\n  }\n};\n","/*global navigator*/\n'use strict';\n\nconst {\n  REGEX_BACKSLASH,\n  REGEX_REMOVE_BACKSLASH,\n  REGEX_SPECIAL_CHARS,\n  REGEX_SPECIAL_CHARS_GLOBAL\n} = require('./constants');\n\nexports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);\nexports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str);\nexports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str);\nexports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\\\$1');\nexports.toPosixSlashes = str => str.replace(REGEX_BACKSLASH, '/');\n\nexports.isWindows = () => {\n  if (typeof navigator !== 'undefined' && navigator.platform) {\n    const platform = navigator.platform.toLowerCase();\n    return platform === 'win32' || platform === 'windows';\n  }\n\n  if (typeof process !== 'undefined' && process.platform) {\n    return process.platform === 'win32';\n  }\n\n  return false;\n};\n\nexports.removeBackslashes = str => {\n  return str.replace(REGEX_REMOVE_BACKSLASH, match => {\n    return match === '\\\\' ? '' : match;\n  });\n};\n\nexports.escapeLast = (input, char, lastIdx) => {\n  const idx = input.lastIndexOf(char, lastIdx);\n  if (idx === -1) return input;\n  if (input[idx - 1] === '\\\\') return exports.escapeLast(input, char, idx - 1);\n  return `${input.slice(0, idx)}\\\\${input.slice(idx)}`;\n};\n\nexports.removePrefix = (input, state = {}) => {\n  let output = input;\n  if (output.startsWith('./')) {\n    output = output.slice(2);\n    state.prefix = './';\n  }\n  return output;\n};\n\nexports.wrapOutput = (input, state = {}, options = {}) => {\n  const prepend = options.contains ? '' : '^';\n  const append = options.contains ? '' : '$';\n\n  let output = `${prepend}(?:${input})${append}`;\n  if (state.negated === true) {\n    output = `(?:^(?!${output}).*$)`;\n  }\n  return output;\n};\n\nexports.basename = (path, { windows } = {}) => {\n  const segs = path.split(windows ? /[\\\\/]/ : '/');\n  const last = segs[segs.length - 1];\n\n  if (last === '') {\n    return segs[segs.length - 2];\n  }\n\n  return last;\n};\n","'use strict';\n\nconst utils = require('./utils');\nconst {\n  CHAR_ASTERISK,             /* * */\n  CHAR_AT,                   /* @ */\n  CHAR_BACKWARD_SLASH,       /* \\ */\n  CHAR_COMMA,                /* , */\n  CHAR_DOT,                  /* . */\n  CHAR_EXCLAMATION_MARK,     /* ! */\n  CHAR_FORWARD_SLASH,        /* / */\n  CHAR_LEFT_CURLY_BRACE,     /* { */\n  CHAR_LEFT_PARENTHESES,     /* ( */\n  CHAR_LEFT_SQUARE_BRACKET,  /* [ */\n  CHAR_PLUS,                 /* + */\n  CHAR_QUESTION_MARK,        /* ? */\n  CHAR_RIGHT_CURLY_BRACE,    /* } */\n  CHAR_RIGHT_PARENTHESES,    /* ) */\n  CHAR_RIGHT_SQUARE_BRACKET  /* ] */\n} = require('./constants');\n\nconst isPathSeparator = code => {\n  return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;\n};\n\nconst depth = token => {\n  if (token.isPrefix !== true) {\n    token.depth = token.isGlobstar ? Infinity : 1;\n  }\n};\n\n/**\n * Quickly scans a glob pattern and returns an object with a handful of\n * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists),\n * `glob` (the actual pattern), `negated` (true if the path starts with `!` but not\n * with `!(`) and `negatedExtglob` (true if the path starts with `!(`).\n *\n * ```js\n * const pm = require('picomatch');\n * console.log(pm.scan('foo/bar/*.js'));\n * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' }\n * ```\n * @param {String} `str`\n * @param {Object} `options`\n * @return {Object} Returns an object with tokens and regex source string.\n * @api public\n */\n\nconst scan = (input, options) => {\n  const opts = options || {};\n\n  const length = input.length - 1;\n  const scanToEnd = opts.parts === true || opts.scanToEnd === true;\n  const slashes = [];\n  const tokens = [];\n  const parts = [];\n\n  let str = input;\n  let index = -1;\n  let start = 0;\n  let lastIndex = 0;\n  let isBrace = false;\n  let isBracket = false;\n  let isGlob = false;\n  let isExtglob = false;\n  let isGlobstar = false;\n  let braceEscaped = false;\n  let backslashes = false;\n  let negated = false;\n  let negatedExtglob = false;\n  let finished = false;\n  let braces = 0;\n  let prev;\n  let code;\n  let token = { value: '', depth: 0, isGlob: false };\n\n  const eos = () => index >= length;\n  const peek = () => str.charCodeAt(index + 1);\n  const advance = () => {\n    prev = code;\n    return str.charCodeAt(++index);\n  };\n\n  while (index < length) {\n    code = advance();\n    let next;\n\n    if (code === CHAR_BACKWARD_SLASH) {\n      backslashes = token.backslashes = true;\n      code = advance();\n\n      if (code === CHAR_LEFT_CURLY_BRACE) {\n        braceEscaped = true;\n      }\n      continue;\n    }\n\n    if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) {\n      braces++;\n\n      while (eos() !== true && (code = advance())) {\n        if (code === CHAR_BACKWARD_SLASH) {\n          backslashes = token.backslashes = true;\n          advance();\n          continue;\n        }\n\n        if (code === CHAR_LEFT_CURLY_BRACE) {\n          braces++;\n          continue;\n        }\n\n        if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) {\n          isBrace = token.isBrace = true;\n          isGlob = token.isGlob = true;\n          finished = true;\n\n          if (scanToEnd === true) {\n            continue;\n          }\n\n          break;\n        }\n\n        if (braceEscaped !== true && code === CHAR_COMMA) {\n          isBrace = token.isBrace = true;\n          isGlob = token.isGlob = true;\n          finished = true;\n\n          if (scanToEnd === true) {\n            continue;\n          }\n\n          break;\n        }\n\n        if (code === CHAR_RIGHT_CURLY_BRACE) {\n          braces--;\n\n          if (braces === 0) {\n            braceEscaped = false;\n            isBrace = token.isBrace = true;\n            finished = true;\n            break;\n          }\n        }\n      }\n\n      if (scanToEnd === true) {\n        continue;\n      }\n\n      break;\n    }\n\n    if (code === CHAR_FORWARD_SLASH) {\n      slashes.push(index);\n      tokens.push(token);\n      token = { value: '', depth: 0, isGlob: false };\n\n      if (finished === true) continue;\n      if (prev === CHAR_DOT && index === (start + 1)) {\n        start += 2;\n        continue;\n      }\n\n      lastIndex = index + 1;\n      continue;\n    }\n\n    if (opts.noext !== true) {\n      const isExtglobChar = code === CHAR_PLUS\n        || code === CHAR_AT\n        || code === CHAR_ASTERISK\n        || code === CHAR_QUESTION_MARK\n        || code === CHAR_EXCLAMATION_MARK;\n\n      if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) {\n        isGlob = token.isGlob = true;\n        isExtglob = token.isExtglob = true;\n        finished = true;\n        if (code === CHAR_EXCLAMATION_MARK && index === start) {\n          negatedExtglob = true;\n        }\n\n        if (scanToEnd === true) {\n          while (eos() !== true && (code = advance())) {\n            if (code === CHAR_BACKWARD_SLASH) {\n              backslashes = token.backslashes = true;\n              code = advance();\n              continue;\n            }\n\n            if (code === CHAR_RIGHT_PARENTHESES) {\n              isGlob = token.isGlob = true;\n              finished = true;\n              break;\n            }\n          }\n          continue;\n        }\n        break;\n      }\n    }\n\n    if (code === CHAR_ASTERISK) {\n      if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true;\n      isGlob = token.isGlob = true;\n      finished = true;\n\n      if (scanToEnd === true) {\n        continue;\n      }\n      break;\n    }\n\n    if (code === CHAR_QUESTION_MARK) {\n      isGlob = token.isGlob = true;\n      finished = true;\n\n      if (scanToEnd === true) {\n        continue;\n      }\n      break;\n    }\n\n    if (code === CHAR_LEFT_SQUARE_BRACKET) {\n      while (eos() !== true && (next = advance())) {\n        if (next === CHAR_BACKWARD_SLASH) {\n          backslashes = token.backslashes = true;\n          advance();\n          continue;\n        }\n\n        if (next === CHAR_RIGHT_SQUARE_BRACKET) {\n          isBracket = token.isBracket = true;\n          isGlob = token.isGlob = true;\n          finished = true;\n          break;\n        }\n      }\n\n      if (scanToEnd === true) {\n        continue;\n      }\n\n      break;\n    }\n\n    if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) {\n      negated = token.negated = true;\n      start++;\n      continue;\n    }\n\n    if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) {\n      isGlob = token.isGlob = true;\n\n      if (scanToEnd === true) {\n        while (eos() !== true && (code = advance())) {\n          if (code === CHAR_LEFT_PARENTHESES) {\n            backslashes = token.backslashes = true;\n            code = advance();\n            continue;\n          }\n\n          if (code === CHAR_RIGHT_PARENTHESES) {\n            finished = true;\n            break;\n          }\n        }\n        continue;\n      }\n      break;\n    }\n\n    if (isGlob === true) {\n      finished = true;\n\n      if (scanToEnd === true) {\n        continue;\n      }\n\n      break;\n    }\n  }\n\n  if (opts.noext === true) {\n    isExtglob = false;\n    isGlob = false;\n  }\n\n  let base = str;\n  let prefix = '';\n  let glob = '';\n\n  if (start > 0) {\n    prefix = str.slice(0, start);\n    str = str.slice(start);\n    lastIndex -= start;\n  }\n\n  if (base && isGlob === true && lastIndex > 0) {\n    base = str.slice(0, lastIndex);\n    glob = str.slice(lastIndex);\n  } else if (isGlob === true) {\n    base = '';\n    glob = str;\n  } else {\n    base = str;\n  }\n\n  if (base && base !== '' && base !== '/' && base !== str) {\n    if (isPathSeparator(base.charCodeAt(base.length - 1))) {\n      base = base.slice(0, -1);\n    }\n  }\n\n  if (opts.unescape === true) {\n    if (glob) glob = utils.removeBackslashes(glob);\n\n    if (base && backslashes === true) {\n      base = utils.removeBackslashes(base);\n    }\n  }\n\n  const state = {\n    prefix,\n    input,\n    start,\n    base,\n    glob,\n    isBrace,\n    isBracket,\n    isGlob,\n    isExtglob,\n    isGlobstar,\n    negated,\n    negatedExtglob\n  };\n\n  if (opts.tokens === true) {\n    state.maxDepth = 0;\n    if (!isPathSeparator(code)) {\n      tokens.push(token);\n    }\n    state.tokens = tokens;\n  }\n\n  if (opts.parts === true || opts.tokens === true) {\n    let prevIndex;\n\n    for (let idx = 0; idx < slashes.length; idx++) {\n      const n = prevIndex ? prevIndex + 1 : start;\n      const i = slashes[idx];\n      const value = input.slice(n, i);\n      if (opts.tokens) {\n        if (idx === 0 && start !== 0) {\n          tokens[idx].isPrefix = true;\n          tokens[idx].value = prefix;\n        } else {\n          tokens[idx].value = value;\n        }\n        depth(tokens[idx]);\n        state.maxDepth += tokens[idx].depth;\n      }\n      if (idx !== 0 || value !== '') {\n        parts.push(value);\n      }\n      prevIndex = i;\n    }\n\n    if (prevIndex && prevIndex + 1 < input.length) {\n      const value = input.slice(prevIndex + 1);\n      parts.push(value);\n\n      if (opts.tokens) {\n        tokens[tokens.length - 1].value = value;\n        depth(tokens[tokens.length - 1]);\n        state.maxDepth += tokens[tokens.length - 1].depth;\n      }\n    }\n\n    state.slashes = slashes;\n    state.parts = parts;\n  }\n\n  return state;\n};\n\nmodule.exports = scan;\n","'use strict';\n\nconst constants = require('./constants');\nconst utils = require('./utils');\n\n/**\n * Constants\n */\n\nconst {\n  MAX_LENGTH,\n  POSIX_REGEX_SOURCE,\n  REGEX_NON_SPECIAL_CHARS,\n  REGEX_SPECIAL_CHARS_BACKREF,\n  REPLACEMENTS\n} = constants;\n\n/**\n * Helpers\n */\n\nconst expandRange = (args, options) => {\n  if (typeof options.expandRange === 'function') {\n    return options.expandRange(...args, options);\n  }\n\n  args.sort();\n  const value = `[${args.join('-')}]`;\n\n  try {\n    /* eslint-disable-next-line no-new */\n    new RegExp(value);\n  } catch (ex) {\n    return args.map(v => utils.escapeRegex(v)).join('..');\n  }\n\n  return value;\n};\n\n/**\n * Create the message for a syntax error\n */\n\nconst syntaxError = (type, char) => {\n  return `Missing ${type}: \"${char}\" - use \"\\\\\\\\${char}\" to match literal characters`;\n};\n\n/**\n * Parse the given input string.\n * @param {String} input\n * @param {Object} options\n * @return {Object}\n */\n\nconst parse = (input, options) => {\n  if (typeof input !== 'string') {\n    throw new TypeError('Expected a string');\n  }\n\n  input = REPLACEMENTS[input] || input;\n\n  const opts = { ...options };\n  const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n\n  let len = input.length;\n  if (len > max) {\n    throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);\n  }\n\n  const bos = { type: 'bos', value: '', output: opts.prepend || '' };\n  const tokens = [bos];\n\n  const capture = opts.capture ? '' : '?:';\n\n  // create constants based on platform, for windows or posix\n  const PLATFORM_CHARS = constants.globChars(opts.windows);\n  const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS);\n\n  const {\n    DOT_LITERAL,\n    PLUS_LITERAL,\n    SLASH_LITERAL,\n    ONE_CHAR,\n    DOTS_SLASH,\n    NO_DOT,\n    NO_DOT_SLASH,\n    NO_DOTS_SLASH,\n    QMARK,\n    QMARK_NO_DOT,\n    STAR,\n    START_ANCHOR\n  } = PLATFORM_CHARS;\n\n  const globstar = opts => {\n    return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;\n  };\n\n  const nodot = opts.dot ? '' : NO_DOT;\n  const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT;\n  let star = opts.bash === true ? globstar(opts) : STAR;\n\n  if (opts.capture) {\n    star = `(${star})`;\n  }\n\n  // minimatch options support\n  if (typeof opts.noext === 'boolean') {\n    opts.noextglob = opts.noext;\n  }\n\n  const state = {\n    input,\n    index: -1,\n    start: 0,\n    dot: opts.dot === true,\n    consumed: '',\n    output: '',\n    prefix: '',\n    backtrack: false,\n    negated: false,\n    brackets: 0,\n    braces: 0,\n    parens: 0,\n    quotes: 0,\n    globstar: false,\n    tokens\n  };\n\n  input = utils.removePrefix(input, state);\n  len = input.length;\n\n  const extglobs = [];\n  const braces = [];\n  const stack = [];\n  let prev = bos;\n  let value;\n\n  /**\n   * Tokenizing helpers\n   */\n\n  const eos = () => state.index === len - 1;\n  const peek = state.peek = (n = 1) => input[state.index + n];\n  const advance = state.advance = () => input[++state.index] || '';\n  const remaining = () => input.slice(state.index + 1);\n  const consume = (value = '', num = 0) => {\n    state.consumed += value;\n    state.index += num;\n  };\n\n  const append = token => {\n    state.output += token.output != null ? token.output : token.value;\n    consume(token.value);\n  };\n\n  const negate = () => {\n    let count = 1;\n\n    while (peek() === '!' && (peek(2) !== '(' || peek(3) === '?')) {\n      advance();\n      state.start++;\n      count++;\n    }\n\n    if (count % 2 === 0) {\n      return false;\n    }\n\n    state.negated = true;\n    state.start++;\n    return true;\n  };\n\n  const increment = type => {\n    state[type]++;\n    stack.push(type);\n  };\n\n  const decrement = type => {\n    state[type]--;\n    stack.pop();\n  };\n\n  /**\n   * Push tokens onto the tokens array. This helper speeds up\n   * tokenizing by 1) helping us avoid backtracking as much as possible,\n   * and 2) helping us avoid creating extra tokens when consecutive\n   * characters are plain text. This improves performance and simplifies\n   * lookbehinds.\n   */\n\n  const push = tok => {\n    if (prev.type === 'globstar') {\n      const isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace');\n      const isExtglob = tok.extglob === true || (extglobs.length && (tok.type === 'pipe' || tok.type === 'paren'));\n\n      if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) {\n        state.output = state.output.slice(0, -prev.output.length);\n        prev.type = 'star';\n        prev.value = '*';\n        prev.output = star;\n        state.output += prev.output;\n      }\n    }\n\n    if (extglobs.length && tok.type !== 'paren') {\n      extglobs[extglobs.length - 1].inner += tok.value;\n    }\n\n    if (tok.value || tok.output) append(tok);\n    if (prev && prev.type === 'text' && tok.type === 'text') {\n      prev.output = (prev.output || prev.value) + tok.value;\n      prev.value += tok.value;\n      return;\n    }\n\n    tok.prev = prev;\n    tokens.push(tok);\n    prev = tok;\n  };\n\n  const extglobOpen = (type, value) => {\n    const token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' };\n\n    token.prev = prev;\n    token.parens = state.parens;\n    token.output = state.output;\n    const output = (opts.capture ? '(' : '') + token.open;\n\n    increment('parens');\n    push({ type, value, output: state.output ? '' : ONE_CHAR });\n    push({ type: 'paren', extglob: true, value: advance(), output });\n    extglobs.push(token);\n  };\n\n  const extglobClose = token => {\n    let output = token.close + (opts.capture ? ')' : '');\n    let rest;\n\n    if (token.type === 'negate') {\n      let extglobStar = star;\n\n      if (token.inner && token.inner.length > 1 && token.inner.includes('/')) {\n        extglobStar = globstar(opts);\n      }\n\n      if (extglobStar !== star || eos() || /^\\)+$/.test(remaining())) {\n        output = token.close = `)$))${extglobStar}`;\n      }\n\n      if (token.inner.includes('*') && (rest = remaining()) && /^\\.[^\\\\/.]+$/.test(rest)) {\n        // Any non-magical string (`.ts`) or even nested expression (`.{ts,tsx}`) can follow after the closing parenthesis.\n        // In this case, we need to parse the string and use it in the output of the original pattern.\n        // Suitable patterns: `/!(*.d).ts`, `/!(*.d).{ts,tsx}`, `**/!(*-dbg).@(js)`.\n        //\n        // Disabling the `fastpaths` option due to a problem with parsing strings as `.ts` in the pattern like `**/!(*.d).ts`.\n        const expression = parse(rest, { ...options, fastpaths: false }).output;\n\n        output = token.close = `)${expression})${extglobStar})`;\n      }\n\n      if (token.prev.type === 'bos') {\n        state.negatedExtglob = true;\n      }\n    }\n\n    push({ type: 'paren', extglob: true, value, output });\n    decrement('parens');\n  };\n\n  /**\n   * Fast paths\n   */\n\n  if (opts.fastpaths !== false && !/(^[*!]|[/()[\\]{}\"])/.test(input)) {\n    let backslashes = false;\n\n    let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => {\n      if (first === '\\\\') {\n        backslashes = true;\n        return m;\n      }\n\n      if (first === '?') {\n        if (esc) {\n          return esc + first + (rest ? QMARK.repeat(rest.length) : '');\n        }\n        if (index === 0) {\n          return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : '');\n        }\n        return QMARK.repeat(chars.length);\n      }\n\n      if (first === '.') {\n        return DOT_LITERAL.repeat(chars.length);\n      }\n\n      if (first === '*') {\n        if (esc) {\n          return esc + first + (rest ? star : '');\n        }\n        return star;\n      }\n      return esc ? m : `\\\\${m}`;\n    });\n\n    if (backslashes === true) {\n      if (opts.unescape === true) {\n        output = output.replace(/\\\\/g, '');\n      } else {\n        output = output.replace(/\\\\+/g, m => {\n          return m.length % 2 === 0 ? '\\\\\\\\' : (m ? '\\\\' : '');\n        });\n      }\n    }\n\n    if (output === input && opts.contains === true) {\n      state.output = input;\n      return state;\n    }\n\n    state.output = utils.wrapOutput(output, state, options);\n    return state;\n  }\n\n  /**\n   * Tokenize input until we reach end-of-string\n   */\n\n  while (!eos()) {\n    value = advance();\n\n    if (value === '\\u0000') {\n      continue;\n    }\n\n    /**\n     * Escaped characters\n     */\n\n    if (value === '\\\\') {\n      const next = peek();\n\n      if (next === '/' && opts.bash !== true) {\n        continue;\n      }\n\n      if (next === '.' || next === ';') {\n        continue;\n      }\n\n      if (!next) {\n        value += '\\\\';\n        push({ type: 'text', value });\n        continue;\n      }\n\n      // collapse slashes to reduce potential for exploits\n      const match = /^\\\\+/.exec(remaining());\n      let slashes = 0;\n\n      if (match && match[0].length > 2) {\n        slashes = match[0].length;\n        state.index += slashes;\n        if (slashes % 2 !== 0) {\n          value += '\\\\';\n        }\n      }\n\n      if (opts.unescape === true) {\n        value = advance();\n      } else {\n        value += advance();\n      }\n\n      if (state.brackets === 0) {\n        push({ type: 'text', value });\n        continue;\n      }\n    }\n\n    /**\n     * If we're inside a regex character class, continue\n     * until we reach the closing bracket.\n     */\n\n    if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) {\n      if (opts.posix !== false && value === ':') {\n        const inner = prev.value.slice(1);\n        if (inner.includes('[')) {\n          prev.posix = true;\n\n          if (inner.includes(':')) {\n            const idx = prev.value.lastIndexOf('[');\n            const pre = prev.value.slice(0, idx);\n            const rest = prev.value.slice(idx + 2);\n            const posix = POSIX_REGEX_SOURCE[rest];\n            if (posix) {\n              prev.value = pre + posix;\n              state.backtrack = true;\n              advance();\n\n              if (!bos.output && tokens.indexOf(prev) === 1) {\n                bos.output = ONE_CHAR;\n              }\n              continue;\n            }\n          }\n        }\n      }\n\n      if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) {\n        value = `\\\\${value}`;\n      }\n\n      if (value === ']' && (prev.value === '[' || prev.value === '[^')) {\n        value = `\\\\${value}`;\n      }\n\n      if (opts.posix === true && value === '!' && prev.value === '[') {\n        value = '^';\n      }\n\n      prev.value += value;\n      append({ value });\n      continue;\n    }\n\n    /**\n     * If we're inside a quoted string, continue\n     * until we reach the closing double quote.\n     */\n\n    if (state.quotes === 1 && value !== '\"') {\n      value = utils.escapeRegex(value);\n      prev.value += value;\n      append({ value });\n      continue;\n    }\n\n    /**\n     * Double quotes\n     */\n\n    if (value === '\"') {\n      state.quotes = state.quotes === 1 ? 0 : 1;\n      if (opts.keepQuotes === true) {\n        push({ type: 'text', value });\n      }\n      continue;\n    }\n\n    /**\n     * Parentheses\n     */\n\n    if (value === '(') {\n      increment('parens');\n      push({ type: 'paren', value });\n      continue;\n    }\n\n    if (value === ')') {\n      if (state.parens === 0 && opts.strictBrackets === true) {\n        throw new SyntaxError(syntaxError('opening', '('));\n      }\n\n      const extglob = extglobs[extglobs.length - 1];\n      if (extglob && state.parens === extglob.parens + 1) {\n        extglobClose(extglobs.pop());\n        continue;\n      }\n\n      push({ type: 'paren', value, output: state.parens ? ')' : '\\\\)' });\n      decrement('parens');\n      continue;\n    }\n\n    /**\n     * Square brackets\n     */\n\n    if (value === '[') {\n      if (opts.nobracket === true || !remaining().includes(']')) {\n        if (opts.nobracket !== true && opts.strictBrackets === true) {\n          throw new SyntaxError(syntaxError('closing', ']'));\n        }\n\n        value = `\\\\${value}`;\n      } else {\n        increment('brackets');\n      }\n\n      push({ type: 'bracket', value });\n      continue;\n    }\n\n    if (value === ']') {\n      if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) {\n        push({ type: 'text', value, output: `\\\\${value}` });\n        continue;\n      }\n\n      if (state.brackets === 0) {\n        if (opts.strictBrackets === true) {\n          throw new SyntaxError(syntaxError('opening', '['));\n        }\n\n        push({ type: 'text', value, output: `\\\\${value}` });\n        continue;\n      }\n\n      decrement('brackets');\n\n      const prevValue = prev.value.slice(1);\n      if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) {\n        value = `/${value}`;\n      }\n\n      prev.value += value;\n      append({ value });\n\n      // when literal brackets are explicitly disabled\n      // assume we should match with a regex character class\n      if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) {\n        continue;\n      }\n\n      const escaped = utils.escapeRegex(prev.value);\n      state.output = state.output.slice(0, -prev.value.length);\n\n      // when literal brackets are explicitly enabled\n      // assume we should escape the brackets to match literal characters\n      if (opts.literalBrackets === true) {\n        state.output += escaped;\n        prev.value = escaped;\n        continue;\n      }\n\n      // when the user specifies nothing, try to match both\n      prev.value = `(${capture}${escaped}|${prev.value})`;\n      state.output += prev.value;\n      continue;\n    }\n\n    /**\n     * Braces\n     */\n\n    if (value === '{' && opts.nobrace !== true) {\n      increment('braces');\n\n      const open = {\n        type: 'brace',\n        value,\n        output: '(',\n        outputIndex: state.output.length,\n        tokensIndex: state.tokens.length\n      };\n\n      braces.push(open);\n      push(open);\n      continue;\n    }\n\n    if (value === '}') {\n      const brace = braces[braces.length - 1];\n\n      if (opts.nobrace === true || !brace) {\n        push({ type: 'text', value, output: value });\n        continue;\n      }\n\n      let output = ')';\n\n      if (brace.dots === true) {\n        const arr = tokens.slice();\n        const range = [];\n\n        for (let i = arr.length - 1; i >= 0; i--) {\n          tokens.pop();\n          if (arr[i].type === 'brace') {\n            break;\n          }\n          if (arr[i].type !== 'dots') {\n            range.unshift(arr[i].value);\n          }\n        }\n\n        output = expandRange(range, opts);\n        state.backtrack = true;\n      }\n\n      if (brace.comma !== true && brace.dots !== true) {\n        const out = state.output.slice(0, brace.outputIndex);\n        const toks = state.tokens.slice(brace.tokensIndex);\n        brace.value = brace.output = '\\\\{';\n        value = output = '\\\\}';\n        state.output = out;\n        for (const t of toks) {\n          state.output += (t.output || t.value);\n        }\n      }\n\n      push({ type: 'brace', value, output });\n      decrement('braces');\n      braces.pop();\n      continue;\n    }\n\n    /**\n     * Pipes\n     */\n\n    if (value === '|') {\n      if (extglobs.length > 0) {\n        extglobs[extglobs.length - 1].conditions++;\n      }\n      push({ type: 'text', value });\n      continue;\n    }\n\n    /**\n     * Commas\n     */\n\n    if (value === ',') {\n      let output = value;\n\n      const brace = braces[braces.length - 1];\n      if (brace && stack[stack.length - 1] === 'braces') {\n        brace.comma = true;\n        output = '|';\n      }\n\n      push({ type: 'comma', value, output });\n      continue;\n    }\n\n    /**\n     * Slashes\n     */\n\n    if (value === '/') {\n      // if the beginning of the glob is \"./\", advance the start\n      // to the current index, and don't add the \"./\" characters\n      // to the state. This greatly simplifies lookbehinds when\n      // checking for BOS characters like \"!\" and \".\" (not \"./\")\n      if (prev.type === 'dot' && state.index === state.start + 1) {\n        state.start = state.index + 1;\n        state.consumed = '';\n        state.output = '';\n        tokens.pop();\n        prev = bos; // reset \"prev\" to the first token\n        continue;\n      }\n\n      push({ type: 'slash', value, output: SLASH_LITERAL });\n      continue;\n    }\n\n    /**\n     * Dots\n     */\n\n    if (value === '.') {\n      if (state.braces > 0 && prev.type === 'dot') {\n        if (prev.value === '.') prev.output = DOT_LITERAL;\n        const brace = braces[braces.length - 1];\n        prev.type = 'dots';\n        prev.output += value;\n        prev.value += value;\n        brace.dots = true;\n        continue;\n      }\n\n      if ((state.braces + state.parens) === 0 && prev.type !== 'bos' && prev.type !== 'slash') {\n        push({ type: 'text', value, output: DOT_LITERAL });\n        continue;\n      }\n\n      push({ type: 'dot', value, output: DOT_LITERAL });\n      continue;\n    }\n\n    /**\n     * Question marks\n     */\n\n    if (value === '?') {\n      const isGroup = prev && prev.value === '(';\n      if (!isGroup && opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n        extglobOpen('qmark', value);\n        continue;\n      }\n\n      if (prev && prev.type === 'paren') {\n        const next = peek();\n        let output = value;\n\n        if ((prev.value === '(' && !/[!=<:]/.test(next)) || (next === '<' && !/<([!=]|\\w+>)/.test(remaining()))) {\n          output = `\\\\${value}`;\n        }\n\n        push({ type: 'text', value, output });\n        continue;\n      }\n\n      if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) {\n        push({ type: 'qmark', value, output: QMARK_NO_DOT });\n        continue;\n      }\n\n      push({ type: 'qmark', value, output: QMARK });\n      continue;\n    }\n\n    /**\n     * Exclamation\n     */\n\n    if (value === '!') {\n      if (opts.noextglob !== true && peek() === '(') {\n        if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) {\n          extglobOpen('negate', value);\n          continue;\n        }\n      }\n\n      if (opts.nonegate !== true && state.index === 0) {\n        negate();\n        continue;\n      }\n    }\n\n    /**\n     * Plus\n     */\n\n    if (value === '+') {\n      if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n        extglobOpen('plus', value);\n        continue;\n      }\n\n      if ((prev && prev.value === '(') || opts.regex === false) {\n        push({ type: 'plus', value, output: PLUS_LITERAL });\n        continue;\n      }\n\n      if ((prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) || state.parens > 0) {\n        push({ type: 'plus', value });\n        continue;\n      }\n\n      push({ type: 'plus', value: PLUS_LITERAL });\n      continue;\n    }\n\n    /**\n     * Plain text\n     */\n\n    if (value === '@') {\n      if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n        push({ type: 'at', extglob: true, value, output: '' });\n        continue;\n      }\n\n      push({ type: 'text', value });\n      continue;\n    }\n\n    /**\n     * Plain text\n     */\n\n    if (value !== '*') {\n      if (value === '$' || value === '^') {\n        value = `\\\\${value}`;\n      }\n\n      const match = REGEX_NON_SPECIAL_CHARS.exec(remaining());\n      if (match) {\n        value += match[0];\n        state.index += match[0].length;\n      }\n\n      push({ type: 'text', value });\n      continue;\n    }\n\n    /**\n     * Stars\n     */\n\n    if (prev && (prev.type === 'globstar' || prev.star === true)) {\n      prev.type = 'star';\n      prev.star = true;\n      prev.value += value;\n      prev.output = star;\n      state.backtrack = true;\n      state.globstar = true;\n      consume(value);\n      continue;\n    }\n\n    let rest = remaining();\n    if (opts.noextglob !== true && /^\\([^?]/.test(rest)) {\n      extglobOpen('star', value);\n      continue;\n    }\n\n    if (prev.type === 'star') {\n      if (opts.noglobstar === true) {\n        consume(value);\n        continue;\n      }\n\n      const prior = prev.prev;\n      const before = prior.prev;\n      const isStart = prior.type === 'slash' || prior.type === 'bos';\n      const afterStar = before && (before.type === 'star' || before.type === 'globstar');\n\n      if (opts.bash === true && (!isStart || (rest[0] && rest[0] !== '/'))) {\n        push({ type: 'star', value, output: '' });\n        continue;\n      }\n\n      const isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace');\n      const isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren');\n      if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) {\n        push({ type: 'star', value, output: '' });\n        continue;\n      }\n\n      // strip consecutive `/**/`\n      while (rest.slice(0, 3) === '/**') {\n        const after = input[state.index + 4];\n        if (after && after !== '/') {\n          break;\n        }\n        rest = rest.slice(3);\n        consume('/**', 3);\n      }\n\n      if (prior.type === 'bos' && eos()) {\n        prev.type = 'globstar';\n        prev.value += value;\n        prev.output = globstar(opts);\n        state.output = prev.output;\n        state.globstar = true;\n        consume(value);\n        continue;\n      }\n\n      if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) {\n        state.output = state.output.slice(0, -(prior.output + prev.output).length);\n        prior.output = `(?:${prior.output}`;\n\n        prev.type = 'globstar';\n        prev.output = globstar(opts) + (opts.strictSlashes ? ')' : '|$)');\n        prev.value += value;\n        state.globstar = true;\n        state.output += prior.output + prev.output;\n        consume(value);\n        continue;\n      }\n\n      if (prior.type === 'slash' && prior.prev.type !== 'bos' && rest[0] === '/') {\n        const end = rest[1] !== void 0 ? '|$' : '';\n\n        state.output = state.output.slice(0, -(prior.output + prev.output).length);\n        prior.output = `(?:${prior.output}`;\n\n        prev.type = 'globstar';\n        prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`;\n        prev.value += value;\n\n        state.output += prior.output + prev.output;\n        state.globstar = true;\n\n        consume(value + advance());\n\n        push({ type: 'slash', value: '/', output: '' });\n        continue;\n      }\n\n      if (prior.type === 'bos' && rest[0] === '/') {\n        prev.type = 'globstar';\n        prev.value += value;\n        prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`;\n        state.output = prev.output;\n        state.globstar = true;\n        consume(value + advance());\n        push({ type: 'slash', value: '/', output: '' });\n        continue;\n      }\n\n      // remove single star from output\n      state.output = state.output.slice(0, -prev.output.length);\n\n      // reset previous token to globstar\n      prev.type = 'globstar';\n      prev.output = globstar(opts);\n      prev.value += value;\n\n      // reset output with globstar\n      state.output += prev.output;\n      state.globstar = true;\n      consume(value);\n      continue;\n    }\n\n    const token = { type: 'star', value, output: star };\n\n    if (opts.bash === true) {\n      token.output = '.*?';\n      if (prev.type === 'bos' || prev.type === 'slash') {\n        token.output = nodot + token.output;\n      }\n      push(token);\n      continue;\n    }\n\n    if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) {\n      token.output = value;\n      push(token);\n      continue;\n    }\n\n    if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') {\n      if (prev.type === 'dot') {\n        state.output += NO_DOT_SLASH;\n        prev.output += NO_DOT_SLASH;\n\n      } else if (opts.dot === true) {\n        state.output += NO_DOTS_SLASH;\n        prev.output += NO_DOTS_SLASH;\n\n      } else {\n        state.output += nodot;\n        prev.output += nodot;\n      }\n\n      if (peek() !== '*') {\n        state.output += ONE_CHAR;\n        prev.output += ONE_CHAR;\n      }\n    }\n\n    push(token);\n  }\n\n  while (state.brackets > 0) {\n    if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']'));\n    state.output = utils.escapeLast(state.output, '[');\n    decrement('brackets');\n  }\n\n  while (state.parens > 0) {\n    if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')'));\n    state.output = utils.escapeLast(state.output, '(');\n    decrement('parens');\n  }\n\n  while (state.braces > 0) {\n    if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}'));\n    state.output = utils.escapeLast(state.output, '{');\n    decrement('braces');\n  }\n\n  if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) {\n    push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` });\n  }\n\n  // rebuild the output if we had to backtrack at any point\n  if (state.backtrack === true) {\n    state.output = '';\n\n    for (const token of state.tokens) {\n      state.output += token.output != null ? token.output : token.value;\n\n      if (token.suffix) {\n        state.output += token.suffix;\n      }\n    }\n  }\n\n  return state;\n};\n\n/**\n * Fast paths for creating regular expressions for common glob patterns.\n * This can significantly speed up processing and has very little downside\n * impact when none of the fast paths match.\n */\n\nparse.fastpaths = (input, options) => {\n  const opts = { ...options };\n  const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n  const len = input.length;\n  if (len > max) {\n    throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);\n  }\n\n  input = REPLACEMENTS[input] || input;\n\n  // create constants based on platform, for windows or posix\n  const {\n    DOT_LITERAL,\n    SLASH_LITERAL,\n    ONE_CHAR,\n    DOTS_SLASH,\n    NO_DOT,\n    NO_DOTS,\n    NO_DOTS_SLASH,\n    STAR,\n    START_ANCHOR\n  } = constants.globChars(opts.windows);\n\n  const nodot = opts.dot ? NO_DOTS : NO_DOT;\n  const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT;\n  const capture = opts.capture ? '' : '?:';\n  const state = { negated: false, prefix: '' };\n  let star = opts.bash === true ? '.*?' : STAR;\n\n  if (opts.capture) {\n    star = `(${star})`;\n  }\n\n  const globstar = opts => {\n    if (opts.noglobstar === true) return star;\n    return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;\n  };\n\n  const create = str => {\n    switch (str) {\n      case '*':\n        return `${nodot}${ONE_CHAR}${star}`;\n\n      case '.*':\n        return `${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n      case '*.*':\n        return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n      case '*/*':\n        return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;\n\n      case '**':\n        return nodot + globstar(opts);\n\n      case '**/*':\n        return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;\n\n      case '**/*.*':\n        return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n      case '**/.*':\n        return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n      default: {\n        const match = /^(.*?)\\.(\\w+)$/.exec(str);\n        if (!match) return;\n\n        const source = create(match[1]);\n        if (!source) return;\n\n        return source + DOT_LITERAL + match[2];\n      }\n    }\n  };\n\n  const output = utils.removePrefix(input, state);\n  let source = create(output);\n\n  if (source && opts.strictSlashes !== true) {\n    source += `${SLASH_LITERAL}?`;\n  }\n\n  return source;\n};\n\nmodule.exports = parse;\n","'use strict';\n\nconst scan = require('./scan');\nconst parse = require('./parse');\nconst utils = require('./utils');\nconst constants = require('./constants');\nconst isObject = val => val && typeof val === 'object' && !Array.isArray(val);\n\n/**\n * Creates a matcher function from one or more glob patterns. The\n * returned function takes a string to match as its first argument,\n * and returns true if the string is a match. The returned matcher\n * function also takes a boolean as the second argument that, when true,\n * returns an object with additional information.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch(glob[, options]);\n *\n * const isMatch = picomatch('*.!(*a)');\n * console.log(isMatch('a.a')); //=> false\n * console.log(isMatch('a.b')); //=> true\n * ```\n * @name picomatch\n * @param {String|Array} `globs` One or more glob patterns.\n * @param {Object=} `options`\n * @return {Function=} Returns a matcher function.\n * @api public\n */\n\nconst picomatch = (glob, options, returnState = false) => {\n  if (Array.isArray(glob)) {\n    const fns = glob.map(input => picomatch(input, options, returnState));\n    const arrayMatcher = str => {\n      for (const isMatch of fns) {\n        const state = isMatch(str);\n        if (state) return state;\n      }\n      return false;\n    };\n    return arrayMatcher;\n  }\n\n  const isState = isObject(glob) && glob.tokens && glob.input;\n\n  if (glob === '' || (typeof glob !== 'string' && !isState)) {\n    throw new TypeError('Expected pattern to be a non-empty string');\n  }\n\n  const opts = options || {};\n  const posix = opts.windows;\n  const regex = isState\n    ? picomatch.compileRe(glob, options)\n    : picomatch.makeRe(glob, options, false, true);\n\n  const state = regex.state;\n  delete regex.state;\n\n  let isIgnored = () => false;\n  if (opts.ignore) {\n    const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null };\n    isIgnored = picomatch(opts.ignore, ignoreOpts, returnState);\n  }\n\n  const matcher = (input, returnObject = false) => {\n    const { isMatch, match, output } = picomatch.test(input, regex, options, { glob, posix });\n    const result = { glob, state, regex, posix, input, output, match, isMatch };\n\n    if (typeof opts.onResult === 'function') {\n      opts.onResult(result);\n    }\n\n    if (isMatch === false) {\n      result.isMatch = false;\n      return returnObject ? result : false;\n    }\n\n    if (isIgnored(input)) {\n      if (typeof opts.onIgnore === 'function') {\n        opts.onIgnore(result);\n      }\n      result.isMatch = false;\n      return returnObject ? result : false;\n    }\n\n    if (typeof opts.onMatch === 'function') {\n      opts.onMatch(result);\n    }\n    return returnObject ? result : true;\n  };\n\n  if (returnState) {\n    matcher.state = state;\n  }\n\n  return matcher;\n};\n\n/**\n * Test `input` with the given `regex`. This is used by the main\n * `picomatch()` function to test the input string.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.test(input, regex[, options]);\n *\n * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\\/([^/]*?))$/));\n * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' }\n * ```\n * @param {String} `input` String to test.\n * @param {RegExp} `regex`\n * @return {Object} Returns an object with matching info.\n * @api public\n */\n\npicomatch.test = (input, regex, options, { glob, posix } = {}) => {\n  if (typeof input !== 'string') {\n    throw new TypeError('Expected input to be a string');\n  }\n\n  if (input === '') {\n    return { isMatch: false, output: '' };\n  }\n\n  const opts = options || {};\n  const format = opts.format || (posix ? utils.toPosixSlashes : null);\n  let match = input === glob;\n  let output = (match && format) ? format(input) : input;\n\n  if (match === false) {\n    output = format ? format(input) : input;\n    match = output === glob;\n  }\n\n  if (match === false || opts.capture === true) {\n    if (opts.matchBase === true || opts.basename === true) {\n      match = picomatch.matchBase(input, regex, options, posix);\n    } else {\n      match = regex.exec(output);\n    }\n  }\n\n  return { isMatch: Boolean(match), match, output };\n};\n\n/**\n * Match the basename of a filepath.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.matchBase(input, glob[, options]);\n * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true\n * ```\n * @param {String} `input` String to test.\n * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe).\n * @return {Boolean}\n * @api public\n */\n\npicomatch.matchBase = (input, glob, options) => {\n  const regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options);\n  return regex.test(utils.basename(input));\n};\n\n/**\n * Returns true if **any** of the given glob `patterns` match the specified `string`.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.isMatch(string, patterns[, options]);\n *\n * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true\n * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false\n * ```\n * @param {String|Array} str The string to test.\n * @param {String|Array} patterns One or more glob patterns to use for matching.\n * @param {Object} [options] See available [options](#options).\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\npicomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str);\n\n/**\n * Parse a glob pattern to create the source string for a regular\n * expression.\n *\n * ```js\n * const picomatch = require('picomatch');\n * const result = picomatch.parse(pattern[, options]);\n * ```\n * @param {String} `pattern`\n * @param {Object} `options`\n * @return {Object} Returns an object with useful properties and output to be used as a regex source string.\n * @api public\n */\n\npicomatch.parse = (pattern, options) => {\n  if (Array.isArray(pattern)) return pattern.map(p => picomatch.parse(p, options));\n  return parse(pattern, { ...options, fastpaths: false });\n};\n\n/**\n * Scan a glob pattern to separate the pattern into segments.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.scan(input[, options]);\n *\n * const result = picomatch.scan('!./foo/*.js');\n * console.log(result);\n * { prefix: '!./',\n *   input: '!./foo/*.js',\n *   start: 3,\n *   base: 'foo',\n *   glob: '*.js',\n *   isBrace: false,\n *   isBracket: false,\n *   isGlob: true,\n *   isExtglob: false,\n *   isGlobstar: false,\n *   negated: true }\n * ```\n * @param {String} `input` Glob pattern to scan.\n * @param {Object} `options`\n * @return {Object} Returns an object with\n * @api public\n */\n\npicomatch.scan = (input, options) => scan(input, options);\n\n/**\n * Compile a regular expression from the `state` object returned by the\n * [parse()](#parse) method.\n *\n * @param {Object} `state`\n * @param {Object} `options`\n * @param {Boolean} `returnOutput` Intended for implementors, this argument allows you to return the raw output from the parser.\n * @param {Boolean} `returnState` Adds the state to a `state` property on the returned regex. Useful for implementors and debugging.\n * @return {RegExp}\n * @api public\n */\n\npicomatch.compileRe = (state, options, returnOutput = false, returnState = false) => {\n  if (returnOutput === true) {\n    return state.output;\n  }\n\n  const opts = options || {};\n  const prepend = opts.contains ? '' : '^';\n  const append = opts.contains ? '' : '$';\n\n  let source = `${prepend}(?:${state.output})${append}`;\n  if (state && state.negated === true) {\n    source = `^(?!${source}).*$`;\n  }\n\n  const regex = picomatch.toRegex(source, options);\n  if (returnState === true) {\n    regex.state = state;\n  }\n\n  return regex;\n};\n\n/**\n * Create a regular expression from a parsed glob pattern.\n *\n * ```js\n * const picomatch = require('picomatch');\n * const state = picomatch.parse('*.js');\n * // picomatch.compileRe(state[, options]);\n *\n * console.log(picomatch.compileRe(state));\n * //=> /^(?:(?!\\.)(?=.)[^/]*?\\.js)$/\n * ```\n * @param {String} `state` The object returned from the `.parse` method.\n * @param {Object} `options`\n * @param {Boolean} `returnOutput` Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result.\n * @param {Boolean} `returnState` Implementors may use this argument to return the state from the parsed glob with the returned regular expression.\n * @return {RegExp} Returns a regex created from the given pattern.\n * @api public\n */\n\npicomatch.makeRe = (input, options = {}, returnOutput = false, returnState = false) => {\n  if (!input || typeof input !== 'string') {\n    throw new TypeError('Expected a non-empty string');\n  }\n\n  let parsed = { negated: false, fastpaths: true };\n\n  if (options.fastpaths !== false && (input[0] === '.' || input[0] === '*')) {\n    parsed.output = parse.fastpaths(input, options);\n  }\n\n  if (!parsed.output) {\n    parsed = parse(input, options);\n  }\n\n  return picomatch.compileRe(parsed, options, returnOutput, returnState);\n};\n\n/**\n * Create a regular expression from the given regex source string.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.toRegex(source[, options]);\n *\n * const { output } = picomatch.parse('*.js');\n * console.log(picomatch.toRegex(output));\n * //=> /^(?:(?!\\.)(?=.)[^/]*?\\.js)$/\n * ```\n * @param {String} `source` Regular expression source string.\n * @param {Object} `options`\n * @return {RegExp}\n * @api public\n */\n\npicomatch.toRegex = (source, options) => {\n  try {\n    const opts = options || {};\n    return new RegExp(source, opts.flags || (opts.nocase ? 'i' : ''));\n  } catch (err) {\n    if (options && options.debug === true) throw err;\n    return /$^/;\n  }\n};\n\n/**\n * Picomatch constants.\n * @return {Object}\n */\n\npicomatch.constants = constants;\n\n/**\n * Expose \"picomatch\"\n */\n\nmodule.exports = picomatch;\n","'use strict';\n\nmodule.exports = require('./lib/picomatch');\n","import mime from \"mime/lite\";\nimport picomatch from \"picomatch/posix\";\n\nconst parseInputAccept = (inputAccept: string): [string[], string[]] => {\n  const extensions: string[] = [];\n  const mimeTypes: string[] = [];\n\n  inputAccept\n    .split(\",\")\n    .map(mimeType => mimeType.trim())\n    .filter(Boolean)\n    .forEach(fileType => {\n      if (fileType.startsWith(\".\")) {\n        extensions.push(`*${fileType}`);\n      } else {\n        mimeTypes.push(fileType);\n      }\n    });\n\n  return [extensions, mimeTypes];\n};\n\nclass AcceptedFileTypes {\n  private extensions: string[];\n  private mimeTypes: string[];\n\n  constructor(inputAccept: string) {\n    const [extensions, mimeTypes] = parseInputAccept(inputAccept);\n\n    this.extensions = extensions;\n    this.mimeTypes = mimeTypes;\n  }\n\n  public isAccepted(fileName: string): boolean {\n    if (this.extensions.length === 0 && this.mimeTypes.length === 0) {\n      return true;\n    }\n    return (\n      this.isMimeTypeAccepted(mime.getType(fileName)) ||\n      this.isExtensionAccepted(fileName)\n    );\n  }\n\n  private isExtensionAccepted(fileName: string): boolean {\n    if (this.extensions.length === 0) {\n      return false;\n    }\n\n    return picomatch.isMatch(fileName, this.extensions, { nocase: true });\n  }\n\n  private isMimeTypeAccepted(mimeType: null | string): boolean {\n    if (!mimeType || this.mimeTypes.length === 0) {\n      return false;\n    }\n\n    return picomatch.isMatch(mimeType, this.mimeTypes);\n  }\n}\n\nexport default AcceptedFileTypes;\n","import AcceptedFileTypes from \"./accepted_file_types.ts\";\nimport RenderUploadFile from \"./render_upload_file.ts\";\n\nconst getEntriesFromDirectory = async (\n  directoryEntry: FileSystemDirectoryEntry\n): Promise<FileSystemEntry[]> =>\n  new Promise((resolve, reject) => {\n    directoryEntry.createReader().readEntries(resolve, reject);\n  });\n\nconst getFileFromFileSystemFileEntry = async (\n  fileEntry: FileSystemFileEntry\n): Promise<File> =>\n  new Promise((resolve, reject) => {\n    fileEntry.file(resolve, reject);\n  });\n\nconst getFilesFromFileSystemEntries = async (\n  entries: FileSystemEntry[]\n): Promise<File[]> => {\n  const result: File[] = [];\n\n  for (const entry of entries) {\n    const filesFromEntry = await getFilesFromFileSystemEntry(entry);\n    filesFromEntry.forEach(file => result.push(file));\n  }\n\n  return result;\n};\n\nconst getFilesFromFileSystemEntry = async (\n  entry: FileSystemEntry\n): Promise<File[]> => {\n  const result: File[] = [];\n\n  if (entry.isFile) {\n    const file = await getFileFromFileSystemFileEntry(\n      entry as FileSystemFileEntry\n    );\n    result.push(file);\n  } else if (entry.isDirectory) {\n    const entriesFromDirectory = await getEntriesFromDirectory(\n      entry as FileSystemDirectoryEntry\n    );\n    const files = await getFilesFromFileSystemEntries(entriesFromDirectory);\n    files.forEach(file => result.push(file));\n  }\n\n  return result;\n};\n\nconst getFilesFromDataTransfer = async (\n  dataTransfer: DataTransfer\n): Promise<File[]> => {\n  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n  if (dataTransfer.items) {\n    const files: File[] = [];\n\n    for (const item of dataTransfer.items) {\n      const fileSystemEntry = item.webkitGetAsEntry();\n      if (fileSystemEntry) {\n        const filesFromEntry = await getFilesFromFileSystemEntry(\n          fileSystemEntry\n        );\n        filesFromEntry.forEach(file => files.push(file));\n      } else {\n        const file = item.getAsFile();\n\n        if (file) {\n          files.push(file);\n        }\n      }\n    }\n\n    return files;\n  } else {\n    // backwards compatibility\n    return [...dataTransfer.files];\n  }\n};\n\nclass DropArea {\n  acceptedFileTypes: AcceptedFileTypes;\n  container: Element;\n  onUploadFiles: (files: File[]) => Promise<void>;\n  renderer: RenderUploadFile;\n\n  constructor({\n    container,\n    inputAccept,\n    onUploadFiles,\n    renderer\n  }: {\n    container: Element;\n    inputAccept: string;\n    onUploadFiles: (files: File[]) => Promise<void>;\n    renderer: RenderUploadFile;\n  }) {\n    this.container = container;\n    this.onUploadFiles = onUploadFiles;\n    this.acceptedFileTypes = new AcceptedFileTypes(inputAccept);\n    this.renderer = renderer;\n\n    container.addEventListener(\"dragenter\", () => {\n      container.classList.add(\"dff-dropping\");\n    });\n    container.addEventListener(\"dragleave\", () => {\n      container.classList.remove(\"dff-dropping\");\n    });\n    container.addEventListener(\"dragover\", e => {\n      container.classList.add(\"dff-dropping\");\n      e.preventDefault();\n    });\n    container.addEventListener(\"drop\", this.onDrop);\n  }\n\n  onDrop = (e: Event): void => {\n    const dragEvent = e as DragEvent;\n    this.container.classList.remove(\"dff-dropping\");\n    dragEvent.preventDefault();\n    dragEvent.stopPropagation();\n\n    const uploadFiles = async (): Promise<void> => {\n      try {\n        if (dragEvent.dataTransfer) {\n          const files = await getFilesFromDataTransfer(dragEvent.dataTransfer);\n          const acceptedFiles: File[] = [];\n          const invalidFiles: File[] = [];\n\n          for (const file of files) {\n            if (this.acceptedFileTypes.isAccepted(file.name)) {\n              acceptedFiles.push(file);\n            } else {\n              invalidFiles.push(file);\n            }\n          }\n\n          this.renderer.setErrorInvalidFiles(invalidFiles);\n          void this.onUploadFiles(acceptedFiles);\n        }\n      } catch (error) {\n        console.error(error);\n      }\n    };\n\n    void uploadFiles();\n  };\n}\n\nexport default DropArea;\n","/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param  {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n  var str = '' + string;\n  var match = matchHtmlRegExp.exec(str);\n\n  if (!match) {\n    return str;\n  }\n\n  var escape;\n  var html = '';\n  var index = 0;\n  var lastIndex = 0;\n\n  for (index = match.index; index < str.length; index++) {\n    switch (str.charCodeAt(index)) {\n      case 34: // \"\n        escape = '&quot;';\n        break;\n      case 38: // &\n        escape = '&amp;';\n        break;\n      case 39: // '\n        escape = '&#39;';\n        break;\n      case 60: // <\n        escape = '&lt;';\n        break;\n      case 62: // >\n        escape = '&gt;';\n        break;\n      default:\n        continue;\n    }\n\n    if (lastIndex !== index) {\n      html += str.substring(lastIndex, index);\n    }\n\n    lastIndex = index + 1;\n    html += escape;\n  }\n\n  return lastIndex !== index\n    ? html + str.substring(lastIndex, index)\n    : html;\n}\n","export const formatBytes = (bytes: number, decimals: number): string => {\n  if (bytes === 0) {\n    return \"0 Bytes\";\n  }\n\n  const k = 1024;\n  const dm = decimals <= 0 ? 0 : decimals || 2;\n  const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"];\n  const i = Math.floor(Math.log(bytes) / Math.log(k));\n  const n = parseFloat((bytes / k ** i).toFixed(dm));\n  const size = sizes[i];\n\n  if (size == null) {\n    return \"\";\n  } else {\n    return `${n.toString()} ${size}`;\n  }\n};\n\nexport const getInputNameWithPrefix = (\n  fieldName: string,\n  prefix: null | string\n): string => (prefix ? `${prefix}-${fieldName}` : fieldName);\n\nconst getInputNameWithoutPrefix = (\n  fieldName: string,\n  prefix: null | string\n): string => (prefix ? fieldName.slice(prefix.length + 1) : fieldName);\n\nexport const findInput = (\n  form: Element,\n  fieldName: string,\n  prefix: null | string\n): HTMLInputElement | null => {\n  const inputNameWithPrefix = getInputNameWithPrefix(fieldName, prefix);\n  const input = form.querySelector(`[name=\"${inputNameWithPrefix}\"]`);\n\n  if (!input) {\n    return null;\n  }\n\n  return input as HTMLInputElement;\n};\n\nexport const getUploadsFieldName = (\n  fieldName: string,\n  prefix: null | string\n): string => `${getInputNameWithoutPrefix(fieldName, prefix)}-uploads`;\n\nexport const getInputValueForFormAndPrefix = (\n  form: Element,\n  fieldName: string,\n  prefix: null | string\n): string | undefined => findInput(form, fieldName, prefix)?.value;\n\nexport const getMetadataFieldName = (\n  fieldName: string,\n  prefix: null | string\n): string => `${getInputNameWithoutPrefix(fieldName, prefix)}-metadata`;\n","import escape from \"escape-html\";\n\nimport { formatBytes } from \"./util.ts\";\n\nclass RenderUploadFile {\n  container: Element;\n  errors: Element;\n  input: HTMLInputElement;\n  translations: Record<string, string>;\n\n  constructor({\n    input,\n    parent,\n    skipRequired,\n    translations\n  }: {\n    input: HTMLInputElement;\n    parent: Element;\n    skipRequired: boolean;\n    translations: Record<string, string>;\n  }) {\n    this.container = this.createFilesContainer(parent);\n    this.errors = this.createErrorContainer(parent);\n    this.input = input;\n    this.translations = translations;\n\n    if (skipRequired) {\n      this.input.required = false;\n    }\n  }\n\n  public addNewUpload(filename: string, uploadIndex: number): HTMLElement {\n    const div = this.addFile(filename, uploadIndex);\n\n    const progressSpan = document.createElement(\"span\");\n    progressSpan.className = \"dff-progress\";\n\n    const innerSpan = document.createElement(\"span\");\n    innerSpan.className = \"dff-progress-inner\";\n\n    progressSpan.appendChild(innerSpan);\n    div.appendChild(progressSpan);\n\n    const cancelLink = document.createElement(\"a\");\n    cancelLink.className = \"dff-cancel\";\n    cancelLink.innerText = this.translations.Cancel ?? \"\";\n    cancelLink.setAttribute(\"data-index\", uploadIndex.toString());\n    cancelLink.href = \"#\";\n    div.appendChild(cancelLink);\n\n    return div;\n  }\n\n  public addUploadedFile(\n    filename: string,\n    uploadIndex: number,\n    filesize?: number\n  ): HTMLElement {\n    const element = this.addFile(filename, uploadIndex);\n    this.setSuccess(uploadIndex, filesize);\n    return element;\n  }\n\n  public clearInput(): void {\n    const { input } = this;\n\n    input.value = \"\";\n  }\n\n  public deleteFile(index: number): void {\n    const div = this.findFileDiv(index);\n\n    if (div) {\n      div.remove();\n    }\n  }\n\n  public disableCancel(index: number): void {\n    const cancelSpan = this.findCancelSpan(index);\n\n    if (cancelSpan) {\n      cancelSpan.classList.add(\"dff-disabled\");\n    }\n  }\n\n  public disableDelete(index: number): void {\n    const deleteLink = this.findDeleteLink(index);\n\n    if (deleteLink) {\n      deleteLink.classList.add(\"dff-disabled\");\n    }\n  }\n\n  public findFileDiv(index: number): HTMLElement | null {\n    return this.container.querySelector(`.dff-file-id-${index.toString()}`);\n  }\n\n  public removeDropHint(): void {\n    const dropHint = this.container.querySelector(\".dff-drop-hint\");\n\n    if (dropHint) {\n      dropHint.remove();\n    }\n  }\n\n  public renderDropHint(): void {\n    if (this.container.querySelector(\".dff-drop-hint\")) {\n      return;\n    }\n\n    const dropHint = document.createElement(\"div\");\n    dropHint.className = \"dff-drop-hint\";\n    dropHint.innerText = this.translations[\"Drop your files here\"] ?? \"\";\n\n    this.container.appendChild(dropHint);\n  }\n\n  public setDeleteFailed(index: number): void {\n    this.setErrorMessage(index, this.translations[\"Delete failed\"] ?? \"\");\n\n    this.enableDelete(index);\n  }\n\n  public setError(index: number): void {\n    this.setErrorMessage(index, this.translations[\"Upload failed\"] ?? \"\");\n\n    const el = this.findFileDiv(index);\n    if (el) {\n      el.classList.add(\"dff-upload-fail\");\n    }\n\n    this.removeProgress(index);\n    this.removeCancel(index);\n  }\n\n  public setErrorInvalidFiles(files: File[]): void {\n    const errorsMessages = document.createElement(\"ul\");\n\n    for (const file of files) {\n      const msg = document.createElement(\"li\");\n      const invalidFileTypeMessage =\n        this.translations[\"Invalid file type\"] ?? \"\";\n      msg.innerText = `${file.name}: ${invalidFileTypeMessage}`;\n      msg.className = \"dff-error\";\n      errorsMessages.appendChild(msg);\n    }\n\n    this.errors.replaceChildren(errorsMessages);\n    this.clearInput();\n  }\n\n  public setSuccess(index: number, size?: number): void {\n    const { translations } = this;\n\n    const el = this.findFileDiv(index);\n    if (el) {\n      el.classList.add(\"dff-upload-success\");\n\n      if (size != null) {\n        const fileSizeInfo = document.createElement(\"span\");\n        fileSizeInfo.innerText = formatBytes(size, 2);\n        fileSizeInfo.className = \"dff-filesize\";\n\n        el.appendChild(fileSizeInfo);\n      }\n\n      const deleteLink = document.createElement(\"a\");\n      deleteLink.innerText = translations.Delete ?? \"\";\n      deleteLink.className = \"dff-delete\";\n      deleteLink.setAttribute(\"data-index\", index.toString());\n      deleteLink.href = \"#\";\n\n      el.appendChild(deleteLink);\n    }\n\n    this.removeProgress(index);\n    this.removeCancel(index);\n  }\n\n  public updateProgress(index: number, percentage: string): void {\n    const el = this.container.querySelector(`.dff-file-id-${index.toString()}`);\n    if (el) {\n      const innerProgressSpan = el.querySelector(\".dff-progress-inner\");\n\n      if (innerProgressSpan) {\n        (innerProgressSpan as HTMLElement).style.width = `${percentage}%`;\n      }\n    }\n  }\n\n  private addFile(filename: string, uploadIndex: number): HTMLElement {\n    const div = document.createElement(\"div\");\n    div.className = `dff-file dff-file-id-${uploadIndex.toString()}`;\n\n    const nameSpan = document.createElement(\"span\");\n    nameSpan.innerHTML = escape(filename);\n    nameSpan.className = \"dff-filename\";\n    nameSpan.setAttribute(\"data-index\", uploadIndex.toString());\n\n    div.appendChild(nameSpan);\n    this.container.appendChild(div);\n\n    this.input.required = false;\n    return div;\n  }\n\n  private createErrorContainer = (parent: Element): Element => {\n    const div = document.createElement(\"div\");\n    div.className = \"dff-invalid-files\";\n    parent.appendChild(div);\n    return div;\n  };\n\n  private createFilesContainer = (parent: Element): Element => {\n    const div = document.createElement(\"div\");\n    div.className = \"dff-files\";\n    parent.appendChild(div);\n\n    return div;\n  };\n\n  private enableDelete(index: number): void {\n    const deleteLink = this.findDeleteLink(index);\n\n    if (deleteLink) {\n      deleteLink.classList.remove(\"dff-disabled\");\n    }\n  }\n\n  private findCancelSpan(index: number): HTMLElement | null {\n    const el = this.findFileDiv(index);\n\n    if (!el) {\n      return null;\n    }\n\n    return el.querySelector<HTMLElement>(\".dff-cancel\");\n  }\n\n  private findDeleteLink(index: number): HTMLElement | null {\n    const div = this.findFileDiv(index);\n    if (!div) {\n      return div;\n    }\n\n    return div.querySelector(\".dff-delete\");\n  }\n\n  private removeCancel(index: number): void {\n    const cancelSpan = this.findCancelSpan(index);\n\n    if (cancelSpan) {\n      cancelSpan.remove();\n    }\n  }\n\n  private removeProgress(index: number): void {\n    const el = this.findFileDiv(index);\n\n    if (el) {\n      const progressSpan = el.querySelector(\".dff-progress\");\n\n      if (progressSpan) {\n        progressSpan.remove();\n      }\n    }\n  }\n\n  private setErrorMessage(index: number, message: string): void {\n    const el = this.findFileDiv(index);\n    if (!el) {\n      return;\n    }\n\n    const originalMessageSpan = el.querySelector(\".dff-error\");\n    if (originalMessageSpan) {\n      originalMessageSpan.remove();\n    }\n\n    const span = document.createElement(\"span\");\n    span.classList.add(\"dff-error\");\n    span.innerText = message;\n\n    el.appendChild(span);\n  }\n}\n\nexport default RenderUploadFile;\n","export interface InitialExistingFile {\n  name: string;\n  size: number;\n  type: \"existing\";\n}\nexport type InitialFile =\n  | InitialExistingFile\n  | InitialPlaceholderFile\n  | InitialS3File\n  | InitialTusFile;\n\nexport interface InitialPlaceholderFile {\n  id: string;\n  name: string;\n  size: number;\n  type: \"placeholder\";\n}\n\nexport interface InitialS3File {\n  id: string;\n  name: string;\n  original_name: string;\n  size: number;\n  type: \"s3\";\n}\n\nexport interface InitialTusFile {\n  id: string;\n  name: string;\n  size: number;\n  type: \"tus\";\n  url: string;\n}\n\nexport type UploadType =\n  | \"existing\"\n  | \"placeholder\"\n  | \"s3\"\n  | \"tus\"\n  | \"uploadedS3\"\n  | \"uploadedTus\";\n\ninterface UploadParameters {\n  name: string;\n  status: UploadStatus;\n  type: UploadType;\n  uploadIndex: number;\n}\n\ntype UploadStatus = \"done\" | \"error\" | \"uploading\";\n\nabstract class BaseUpload {\n  name: string;\n  status: UploadStatus;\n  type: UploadType;\n  uploadIndex: number;\n\n  constructor({ name, status, type, uploadIndex }: UploadParameters) {\n    this.name = name;\n    this.status = status;\n    this.type = type;\n    this.uploadIndex = uploadIndex;\n  }\n\n  public async abort(): Promise<void> {\n    //\n  }\n  public async delete(): Promise<void> {\n    //\n  }\n\n  public abstract getId(): string | undefined;\n  public abstract getInitialFile(): InitialFile;\n  public abstract getSize(): number | undefined;\n}\n\nexport default BaseUpload;\n","function normalize (strArray) {\n  var resultArray = [];\n  if (strArray.length === 0) { return ''; }\n\n  if (typeof strArray[0] !== 'string') {\n    throw new TypeError('Url must be a string. Received ' + strArray[0]);\n  }\n\n  // If the first part is a plain protocol, we combine it with the next part.\n  if (strArray[0].match(/^[^/:]+:\\/*$/) && strArray.length > 1) {\n    var first = strArray.shift();\n    strArray[0] = first + strArray[0];\n  }\n\n  // There must be two or three slashes in the file protocol, two slashes in anything else.\n  if (strArray[0].match(/^file:\\/\\/\\//)) {\n    strArray[0] = strArray[0].replace(/^([^/:]+):\\/*/, '$1:///');\n  } else {\n    strArray[0] = strArray[0].replace(/^([^/:]+):\\/*/, '$1://');\n  }\n\n  for (var i = 0; i < strArray.length; i++) {\n    var component = strArray[i];\n\n    if (typeof component !== 'string') {\n      throw new TypeError('Url must be a string. Received ' + component);\n    }\n\n    if (component === '') { continue; }\n\n    if (i > 0) {\n      // Removing the starting slashes for each component but the first.\n      component = component.replace(/^[\\/]+/, '');\n    }\n    if (i < strArray.length - 1) {\n      // Removing the ending slashes for each component but the last.\n      component = component.replace(/[\\/]+$/, '');\n    } else {\n      // For the last component we will combine multiple slashes to a single one.\n      component = component.replace(/[\\/]+$/, '/');\n    }\n\n    resultArray.push(component);\n\n  }\n\n  var str = resultArray.join('/');\n  // Each input component is now separated by a single slash except the possible first plain protocol part.\n\n  // remove trailing slash before parameters or hash\n  str = str.replace(/\\/(\\?|&|#[^!])/g, '$1');\n\n  // replace ? in parameters with &\n  var parts = str.split('?');\n  str = parts.shift() + (parts.length > 0 ? '?': '') + parts.join('&');\n\n  return str;\n}\n\nexport default function urlJoin() {\n  var input;\n\n  if (typeof arguments[0] === 'object') {\n    input = arguments[0];\n  } else {\n    input = [].slice.call(arguments);\n  }\n\n  return normalize(input);\n}\n","import urljoin from \"url-join\";\n\nexport interface LocationInfo {\n  location: string;\n}\n\nexport interface MultipartUpload {\n  endpoint: string;\n  key: string;\n  uploadId: string;\n}\n\nexport interface Part {\n  ETag: string;\n  PartNumber: number;\n}\n\nexport interface UrlInfo {\n  url: string;\n}\n\nexport const MB = 1024 * 1024;\n\ninterface AbortMultipartUploadParameters {\n  csrfToken: string;\n  endpoint: string;\n  key: string;\n  uploadId: string;\n}\n\nexport const abortMultipartUpload = ({\n  csrfToken,\n  endpoint,\n  key,\n  uploadId\n}: AbortMultipartUploadParameters): Promise<unknown> => {\n  const filename = encodeURIComponent(key);\n  const uploadIdEnc = encodeURIComponent(uploadId);\n  const headers = new Headers({\n    \"X-CSRFToken\": csrfToken\n  });\n  const url = urljoin(endpoint, uploadIdEnc, `?key=${filename}`);\n  return fetch(url, {\n    headers: headers,\n    method: \"delete\"\n  }).then(response => {\n    return response.json();\n  });\n};\n\ninterface CompleteMultipartUploadParameters {\n  csrfToken: string;\n  endpoint: string;\n  key: string;\n  parts: Part[];\n  uploadId: string;\n}\n\nexport const completeMultipartUpload = ({\n  csrfToken,\n  endpoint,\n  key,\n  parts,\n  uploadId\n}: CompleteMultipartUploadParameters): Promise<LocationInfo> => {\n  const filename = encodeURIComponent(key);\n  const uploadIdEnc = encodeURIComponent(uploadId);\n  const headers = new Headers({\n    \"X-CSRFToken\": csrfToken\n  });\n  const url = urljoin(endpoint, uploadIdEnc, \"complete\", `?key=${filename}`);\n  return fetch(url, {\n    body: JSON.stringify({\n      parts: parts\n    }),\n    headers: headers,\n    method: \"post\"\n  })\n    .then(response => {\n      return response.json();\n    })\n    .then(data => {\n      return data as LocationInfo;\n    });\n};\n\ninterface CreateMultipartUploadParameters {\n  csrfToken: string;\n  endpoint: string;\n  file: File;\n  s3UploadDir: string;\n}\n\nexport const createMultipartUpload = ({\n  csrfToken,\n  endpoint,\n  file,\n  s3UploadDir\n}: CreateMultipartUploadParameters): Promise<MultipartUpload> => {\n  const headers = new Headers({\n    accept: \"application/json\",\n    \"content-type\": \"application/json\",\n    \"X-CSRFToken\": csrfToken\n  });\n  return fetch(endpoint, {\n    body: JSON.stringify({\n      contentType: file.type,\n      filename: file.name,\n      s3UploadDir: s3UploadDir\n    }),\n    headers: headers,\n    method: \"post\"\n  })\n    .then(response => {\n      return response.json();\n    })\n    .then(data => {\n      return data as MultipartUpload;\n    });\n};\n\nexport const getChunkSize = (file: File): number =>\n  Math.ceil(file.size / 10000);\n\ninterface PrepareUploadPartParameters {\n  csrfToken: string;\n  endpoint: string;\n  key: string;\n  number: number;\n  uploadId: string;\n}\n\nexport const prepareUploadPart = ({\n  csrfToken,\n  endpoint,\n  key,\n  number,\n  uploadId\n}: PrepareUploadPartParameters): Promise<UrlInfo> => {\n  const filename = encodeURIComponent(key);\n  const headers = new Headers({ \"X-CSRFToken\": csrfToken });\n  const url = urljoin(\n    endpoint,\n    uploadId,\n    number.toString(),\n    `?key=${filename}`\n  );\n  return fetch(url, {\n    headers: headers,\n    method: \"get\"\n  })\n    .then(response => {\n      return response.json();\n    })\n    .then(data => {\n      return data as UrlInfo;\n    });\n};\n\nexport const remove = (arr: unknown[], el: unknown): void => {\n  const i = arr.indexOf(el);\n  if (i !== -1) {\n    arr.splice(i, 1);\n  }\n};\n","// The following code is adapted from https://github.com/transloadit/uppy/blob/master/packages/%40uppy/aws-s3-multipart/src/MultipartUploader.js\n// which is released under a MIT License (https://github.com/transloadit/uppy/blob/master/LICENSE)\n\nimport BaseUpload, { InitialFile } from \"./base_upload.ts\";\nimport {\n  abortMultipartUpload,\n  completeMultipartUpload,\n  createMultipartUpload,\n  getChunkSize,\n  MB,\n  MultipartUpload,\n  Part,\n  prepareUploadPart,\n  remove,\n  UrlInfo\n} from \"./s3_utils.ts\";\n\ninterface ChunkState {\n  busy: boolean;\n  done: boolean;\n  etag?: string;\n  uploaded: number;\n}\n\ninterface S3UploadParameters {\n  csrfToken: string;\n  endpoint: string;\n  file: File;\n  s3UploadDir: string;\n  uploadIndex: number;\n}\n\nclass S3Upload extends BaseUpload {\n  public onError?: (error: unknown) => void;\n  public onProgress?: (bytesUploaded: number, bytesTotal: number) => void;\n  public onSuccess?: () => void;\n\n  private chunks: Blob[];\n  private chunkState: ChunkState[];\n  private createdPromise: Promise<MultipartUpload>;\n  private csrfToken: string;\n  private endpoint: string;\n  private file: File;\n  private key: null | string;\n  private parts: Part[];\n  private s3UploadDir: string;\n  private uploadId: null | string;\n  private uploading: XMLHttpRequest[];\n\n  constructor({\n    csrfToken,\n    endpoint,\n    file,\n    s3UploadDir,\n    uploadIndex\n  }: S3UploadParameters) {\n    super({ name: file.name, status: \"uploading\", type: \"s3\", uploadIndex });\n\n    this.csrfToken = csrfToken;\n    this.endpoint = endpoint;\n    this.file = file;\n    this.s3UploadDir = s3UploadDir;\n\n    this.key = null;\n    this.uploadId = null;\n    this.parts = [];\n\n    // Do `this.createdPromise.then(OP)` to execute an operation `OP` _only_ if the\n    // upload was created already. That also ensures that the sequencing is right\n    // (so the `OP` definitely happens if the upload is created).\n    //\n    // This mostly exists to make `abortUpload` work well: only sending the abort request if\n    // the upload was already created, and if the createMultipartUpload request is still in flight,\n    // aborting it immediately after it finishes.\n    this.createdPromise = Promise.reject(new Error());\n    this.chunks = [];\n    this.chunkState = [];\n    this.uploading = [];\n    this.onError = undefined;\n    this.onProgress = undefined;\n    this.onSuccess = undefined;\n\n    this.initChunks();\n\n    this.createdPromise.catch(() => ({})); // silence uncaught rejection warning\n  }\n\n  public async abort(): Promise<void> {\n    this.uploading.slice().forEach(xhr => {\n      xhr.abort();\n    });\n    this.uploading = [];\n\n    await this.createdPromise;\n\n    if (this.key && this.uploadId) {\n      await abortMultipartUpload({\n        csrfToken: this.csrfToken,\n        endpoint: this.endpoint,\n        key: this.key,\n        uploadId: this.uploadId\n      });\n    }\n  }\n\n  public async delete(): Promise<void> {\n    return Promise.resolve();\n  }\n\n  public getId(): string | undefined {\n    return this.uploadId ?? undefined;\n  }\n\n  public getInitialFile(): InitialFile {\n    return {\n      id: this.uploadId ?? \"\",\n      name: this.key ?? \"\",\n      original_name: this.file.name,\n      size: this.file.size,\n      type: \"s3\"\n    };\n  }\n\n  public getSize(): number {\n    return this.file.size;\n  }\n\n  public start(): void {\n    void this.createUpload();\n  }\n\n  private completeUpload(): Promise<void> {\n    // Parts may not have completed uploading in sorted order, if limit > 1.\n    this.parts.sort((a, b) => a.PartNumber - b.PartNumber);\n\n    if (!this.uploadId || !this.key) {\n      return Promise.resolve();\n    }\n\n    return completeMultipartUpload({\n      csrfToken: this.csrfToken,\n      endpoint: this.endpoint,\n      key: this.key,\n      parts: this.parts,\n      uploadId: this.uploadId\n    }).then(\n      () => {\n        if (this.onSuccess) {\n          this.onSuccess();\n        }\n      },\n      (err: unknown) => {\n        this.handleError(err as Error);\n      }\n    );\n  }\n\n  private createUpload(): Promise<void> {\n    this.createdPromise = createMultipartUpload({\n      csrfToken: this.csrfToken,\n      endpoint: this.endpoint,\n      file: this.file,\n      s3UploadDir: this.s3UploadDir\n    });\n    return this.createdPromise\n      .then((result: MultipartUpload | null) => {\n        const valid =\n          typeof result === \"object\" &&\n          result &&\n          typeof result.uploadId === \"string\" &&\n          typeof result.key === \"string\";\n        if (!valid) {\n          throw new TypeError(\n            \"AwsS3/Multipart: Got incorrect result from `createMultipartUpload()`, expected an object `{ uploadId, key }`.\"\n          );\n        }\n\n        this.key = result.key;\n        this.uploadId = result.uploadId;\n\n        this.uploadParts();\n      })\n      .catch((err: unknown) => {\n        this.handleError(err);\n      });\n  }\n\n  private handleError(error: unknown): void {\n    if (this.onError) {\n      this.onError(error);\n    } else {\n      throw error;\n    }\n  }\n\n  private initChunks(): void {\n    const chunks: Blob[] = [];\n    const desiredChunkSize = getChunkSize(this.file);\n    // at least 5MB per request, at most 10k requests\n    const minChunkSize = Math.max(5 * MB, Math.ceil(this.file.size / 10000));\n    const chunkSize = Math.max(desiredChunkSize, minChunkSize);\n\n    for (let i = 0; i < this.file.size; i += chunkSize) {\n      const end = Math.min(this.file.size, i + chunkSize);\n      chunks.push(this.file.slice(i, end));\n    }\n\n    this.chunks = chunks;\n    this.chunkState = chunks.map(() => ({\n      busy: false,\n      done: false,\n      uploaded: 0\n    }));\n  }\n\n  private onPartComplete(index: number, etag: string): void {\n    const state = this.chunkState[index];\n\n    if (state) {\n      state.etag = etag;\n      state.done = true;\n    }\n\n    const part = {\n      ETag: etag,\n      PartNumber: index + 1\n    };\n    this.parts.push(part);\n\n    this.uploadParts();\n  }\n\n  private onPartProgress(index: number, sent: number): void {\n    const state = this.chunkState[index];\n\n    if (state) {\n      state.uploaded = sent;\n    }\n\n    if (this.onProgress) {\n      const totalUploaded = this.chunkState.reduce((n, c) => n + c.uploaded, 0);\n      this.onProgress(totalUploaded, this.file.size);\n    }\n  }\n\n  private uploadPart(index: number): Promise<void> {\n    const state = this.chunkState[index];\n\n    if (state) {\n      state.busy = true;\n    }\n\n    if (!this.key || !this.uploadId) {\n      return Promise.resolve();\n    }\n\n    return prepareUploadPart({\n      csrfToken: this.csrfToken,\n      endpoint: this.endpoint,\n      key: this.key,\n      number: index + 1,\n      uploadId: this.uploadId\n    })\n      .then(result => {\n        const valid =\n          typeof result === \"object\" && typeof result.url === \"string\";\n        if (!valid) {\n          throw new TypeError(\n            \"AwsS3/Multipart: Got incorrect result from `prepareUploadPart()`, expected an object `{ url }`.\"\n          );\n        }\n        return result;\n      })\n      .then(\n        ({ url }: UrlInfo) => {\n          this.uploadPartBytes(index, url);\n        },\n        (err: unknown) => {\n          this.handleError(err);\n        }\n      );\n  }\n\n  private uploadPartBytes(index: number, url: string): void {\n    const body = this.chunks[index];\n    const xhr = new XMLHttpRequest();\n    xhr.open(\"PUT\", url, true);\n    xhr.responseType = \"text\";\n\n    this.uploading.push(xhr);\n\n    xhr.upload.addEventListener(\"progress\", ev => {\n      if (!ev.lengthComputable) {\n        return;\n      }\n\n      this.onPartProgress(index, ev.loaded);\n    });\n\n    xhr.addEventListener(\"abort\", ev => {\n      remove(this.uploading, ev.target);\n\n      const state = this.chunkState[index];\n\n      if (state) {\n        state.busy = false;\n      }\n    });\n\n    xhr.addEventListener(\"load\", ev => {\n      const target = ev.target as XMLHttpRequest;\n      remove(this.uploading, target);\n\n      const state = this.chunkState[index];\n\n      if (state) {\n        state.busy = false;\n      }\n\n      if (target.status < 200 || target.status >= 300) {\n        this.handleError(new Error(\"Non 2xx\"));\n        return;\n      }\n\n      this.onPartProgress(index, body?.size ?? 0);\n\n      // NOTE This must be allowed by CORS.\n      const etag = target.getResponseHeader(\"ETag\");\n      if (etag === null) {\n        this.handleError(\n          new Error(\n            \"AwsS3/Multipart: Could not read the ETag header. This likely means CORS is not configured correctly on the S3 Bucket. See https://uppy.io/docs/aws-s3-multipart#S3-Bucket-Configuration for instructions.\"\n          )\n        );\n        return;\n      }\n\n      this.onPartComplete(index, etag);\n    });\n\n    xhr.addEventListener(\"error\", ev => {\n      remove(this.uploading, ev.target);\n\n      const state = this.chunkState[index];\n\n      if (state) {\n        state.busy = false;\n      }\n\n      const error = new Error(\"Unknown error\");\n      // error.source = ev.target\n      this.handleError(error);\n    });\n    xhr.send(body);\n  }\n\n  private uploadParts(): void {\n    const need = 1 - this.uploading.length;\n    if (need === 0) {\n      return;\n    }\n\n    // All parts are uploaded.\n    if (this.chunkState.every(state => state.done)) {\n      void this.completeUpload();\n      return;\n    }\n\n    const candidates = [];\n    for (let i = 0; i < this.chunkState.length; i++) {\n      const state = this.chunkState[i];\n\n      if (!state || state.done || state.busy) {\n        continue;\n      }\n\n      candidates.push(i);\n      if (candidates.length >= need) {\n        break;\n      }\n    }\n\n    candidates.forEach(index => {\n      void this.uploadPart(index);\n    });\n  }\n}\n\nexport default S3Upload;\n","class DetailedError extends Error {\n  constructor(message, causingErr = null, req = null, res = null) {\n    super(message)\n\n    this.originalRequest = req\n    this.originalResponse = res\n    this.causingError = causingErr\n\n    if (causingErr != null) {\n      message += `, caused by ${causingErr.toString()}`\n    }\n\n    if (req != null) {\n      const requestId = req.getHeader('X-Request-ID') || 'n/a'\n      const method = req.getMethod()\n      const url = req.getURL()\n      const status = res ? res.getStatus() : 'n/a'\n      const body = res ? res.getBody() || '' : 'n/a'\n      message += `, originated from request (method: ${method}, url: ${url}, response code: ${status}, response text: ${body}, request id: ${requestId})`\n    }\n    this.message = message\n  }\n}\n\nexport default DetailedError\n","/**\n *  base64.ts\n *\n *  Licensed under the BSD 3-Clause License.\n *    http://opensource.org/licenses/BSD-3-Clause\n *\n *  References:\n *    http://en.wikipedia.org/wiki/Base64\n *\n * @author Dan Kogai (https://github.com/dankogai)\n */\nconst version = '3.7.7';\n/**\n * @deprecated use lowercase `version`.\n */\nconst VERSION = version;\nconst _hasBuffer = typeof Buffer === 'function';\nconst _TD = typeof TextDecoder === 'function' ? new TextDecoder() : undefined;\nconst _TE = typeof TextEncoder === 'function' ? new TextEncoder() : undefined;\nconst b64ch = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\nconst b64chs = Array.prototype.slice.call(b64ch);\nconst b64tab = ((a) => {\n    let tab = {};\n    a.forEach((c, i) => tab[c] = i);\n    return tab;\n})(b64chs);\nconst b64re = /^(?:[A-Za-z\\d+\\/]{4})*?(?:[A-Za-z\\d+\\/]{2}(?:==)?|[A-Za-z\\d+\\/]{3}=?)?$/;\nconst _fromCC = String.fromCharCode.bind(String);\nconst _U8Afrom = typeof Uint8Array.from === 'function'\n    ? Uint8Array.from.bind(Uint8Array)\n    : (it) => new Uint8Array(Array.prototype.slice.call(it, 0));\nconst _mkUriSafe = (src) => src\n    .replace(/=/g, '').replace(/[+\\/]/g, (m0) => m0 == '+' ? '-' : '_');\nconst _tidyB64 = (s) => s.replace(/[^A-Za-z0-9\\+\\/]/g, '');\n/**\n * polyfill version of `btoa`\n */\nconst btoaPolyfill = (bin) => {\n    // console.log('polyfilled');\n    let u32, c0, c1, c2, asc = '';\n    const pad = bin.length % 3;\n    for (let i = 0; i < bin.length;) {\n        if ((c0 = bin.charCodeAt(i++)) > 255 ||\n            (c1 = bin.charCodeAt(i++)) > 255 ||\n            (c2 = bin.charCodeAt(i++)) > 255)\n            throw new TypeError('invalid character found');\n        u32 = (c0 << 16) | (c1 << 8) | c2;\n        asc += b64chs[u32 >> 18 & 63]\n            + b64chs[u32 >> 12 & 63]\n            + b64chs[u32 >> 6 & 63]\n            + b64chs[u32 & 63];\n    }\n    return pad ? asc.slice(0, pad - 3) + \"===\".substring(pad) : asc;\n};\n/**\n * does what `window.btoa` of web browsers do.\n * @param {String} bin binary string\n * @returns {string} Base64-encoded string\n */\nconst _btoa = typeof btoa === 'function' ? (bin) => btoa(bin)\n    : _hasBuffer ? (bin) => Buffer.from(bin, 'binary').toString('base64')\n        : btoaPolyfill;\nconst _fromUint8Array = _hasBuffer\n    ? (u8a) => Buffer.from(u8a).toString('base64')\n    : (u8a) => {\n        // cf. https://stackoverflow.com/questions/12710001/how-to-convert-uint8-array-to-base64-encoded-string/12713326#12713326\n        const maxargs = 0x1000;\n        let strs = [];\n        for (let i = 0, l = u8a.length; i < l; i += maxargs) {\n            strs.push(_fromCC.apply(null, u8a.subarray(i, i + maxargs)));\n        }\n        return _btoa(strs.join(''));\n    };\n/**\n * converts a Uint8Array to a Base64 string.\n * @param {boolean} [urlsafe] URL-and-filename-safe a la RFC4648 §5\n * @returns {string} Base64 string\n */\nconst fromUint8Array = (u8a, urlsafe = false) => urlsafe ? _mkUriSafe(_fromUint8Array(u8a)) : _fromUint8Array(u8a);\n// This trick is found broken https://github.com/dankogai/js-base64/issues/130\n// const utob = (src: string) => unescape(encodeURIComponent(src));\n// reverting good old fationed regexp\nconst cb_utob = (c) => {\n    if (c.length < 2) {\n        var cc = c.charCodeAt(0);\n        return cc < 0x80 ? c\n            : cc < 0x800 ? (_fromCC(0xc0 | (cc >>> 6))\n                + _fromCC(0x80 | (cc & 0x3f)))\n                : (_fromCC(0xe0 | ((cc >>> 12) & 0x0f))\n                    + _fromCC(0x80 | ((cc >>> 6) & 0x3f))\n                    + _fromCC(0x80 | (cc & 0x3f)));\n    }\n    else {\n        var cc = 0x10000\n            + (c.charCodeAt(0) - 0xD800) * 0x400\n            + (c.charCodeAt(1) - 0xDC00);\n        return (_fromCC(0xf0 | ((cc >>> 18) & 0x07))\n            + _fromCC(0x80 | ((cc >>> 12) & 0x3f))\n            + _fromCC(0x80 | ((cc >>> 6) & 0x3f))\n            + _fromCC(0x80 | (cc & 0x3f)));\n    }\n};\nconst re_utob = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFFF]|[^\\x00-\\x7F]/g;\n/**\n * @deprecated should have been internal use only.\n * @param {string} src UTF-8 string\n * @returns {string} UTF-16 string\n */\nconst utob = (u) => u.replace(re_utob, cb_utob);\n//\nconst _encode = _hasBuffer\n    ? (s) => Buffer.from(s, 'utf8').toString('base64')\n    : _TE\n        ? (s) => _fromUint8Array(_TE.encode(s))\n        : (s) => _btoa(utob(s));\n/**\n * converts a UTF-8-encoded string to a Base64 string.\n * @param {boolean} [urlsafe] if `true` make the result URL-safe\n * @returns {string} Base64 string\n */\nconst encode = (src, urlsafe = false) => urlsafe\n    ? _mkUriSafe(_encode(src))\n    : _encode(src);\n/**\n * converts a UTF-8-encoded string to URL-safe Base64 RFC4648 §5.\n * @returns {string} Base64 string\n */\nconst encodeURI = (src) => encode(src, true);\n// This trick is found broken https://github.com/dankogai/js-base64/issues/130\n// const btou = (src: string) => decodeURIComponent(escape(src));\n// reverting good old fationed regexp\nconst re_btou = /[\\xC0-\\xDF][\\x80-\\xBF]|[\\xE0-\\xEF][\\x80-\\xBF]{2}|[\\xF0-\\xF7][\\x80-\\xBF]{3}/g;\nconst cb_btou = (cccc) => {\n    switch (cccc.length) {\n        case 4:\n            var cp = ((0x07 & cccc.charCodeAt(0)) << 18)\n                | ((0x3f & cccc.charCodeAt(1)) << 12)\n                | ((0x3f & cccc.charCodeAt(2)) << 6)\n                | (0x3f & cccc.charCodeAt(3)), offset = cp - 0x10000;\n            return (_fromCC((offset >>> 10) + 0xD800)\n                + _fromCC((offset & 0x3FF) + 0xDC00));\n        case 3:\n            return _fromCC(((0x0f & cccc.charCodeAt(0)) << 12)\n                | ((0x3f & cccc.charCodeAt(1)) << 6)\n                | (0x3f & cccc.charCodeAt(2)));\n        default:\n            return _fromCC(((0x1f & cccc.charCodeAt(0)) << 6)\n                | (0x3f & cccc.charCodeAt(1)));\n    }\n};\n/**\n * @deprecated should have been internal use only.\n * @param {string} src UTF-16 string\n * @returns {string} UTF-8 string\n */\nconst btou = (b) => b.replace(re_btou, cb_btou);\n/**\n * polyfill version of `atob`\n */\nconst atobPolyfill = (asc) => {\n    // console.log('polyfilled');\n    asc = asc.replace(/\\s+/g, '');\n    if (!b64re.test(asc))\n        throw new TypeError('malformed base64.');\n    asc += '=='.slice(2 - (asc.length & 3));\n    let u24, bin = '', r1, r2;\n    for (let i = 0; i < asc.length;) {\n        u24 = b64tab[asc.charAt(i++)] << 18\n            | b64tab[asc.charAt(i++)] << 12\n            | (r1 = b64tab[asc.charAt(i++)]) << 6\n            | (r2 = b64tab[asc.charAt(i++)]);\n        bin += r1 === 64 ? _fromCC(u24 >> 16 & 255)\n            : r2 === 64 ? _fromCC(u24 >> 16 & 255, u24 >> 8 & 255)\n                : _fromCC(u24 >> 16 & 255, u24 >> 8 & 255, u24 & 255);\n    }\n    return bin;\n};\n/**\n * does what `window.atob` of web browsers do.\n * @param {String} asc Base64-encoded string\n * @returns {string} binary string\n */\nconst _atob = typeof atob === 'function' ? (asc) => atob(_tidyB64(asc))\n    : _hasBuffer ? (asc) => Buffer.from(asc, 'base64').toString('binary')\n        : atobPolyfill;\n//\nconst _toUint8Array = _hasBuffer\n    ? (a) => _U8Afrom(Buffer.from(a, 'base64'))\n    : (a) => _U8Afrom(_atob(a).split('').map(c => c.charCodeAt(0)));\n/**\n * converts a Base64 string to a Uint8Array.\n */\nconst toUint8Array = (a) => _toUint8Array(_unURI(a));\n//\nconst _decode = _hasBuffer\n    ? (a) => Buffer.from(a, 'base64').toString('utf8')\n    : _TD\n        ? (a) => _TD.decode(_toUint8Array(a))\n        : (a) => btou(_atob(a));\nconst _unURI = (a) => _tidyB64(a.replace(/[-_]/g, (m0) => m0 == '-' ? '+' : '/'));\n/**\n * converts a Base64 string to a UTF-8 string.\n * @param {String} src Base64 string.  Both normal and URL-safe are supported\n * @returns {string} UTF-8 string\n */\nconst decode = (src) => _decode(_unURI(src));\n/**\n * check if a value is a valid Base64 string\n * @param {String} src a value to check\n  */\nconst isValid = (src) => {\n    if (typeof src !== 'string')\n        return false;\n    const s = src.replace(/\\s+/g, '').replace(/={0,2}$/, '');\n    return !/[^\\s0-9a-zA-Z\\+/]/.test(s) || !/[^\\s0-9a-zA-Z\\-_]/.test(s);\n};\n//\nconst _noEnum = (v) => {\n    return {\n        value: v, enumerable: false, writable: true, configurable: true\n    };\n};\n/**\n * extend String.prototype with relevant methods\n */\nconst extendString = function () {\n    const _add = (name, body) => Object.defineProperty(String.prototype, name, _noEnum(body));\n    _add('fromBase64', function () { return decode(this); });\n    _add('toBase64', function (urlsafe) { return encode(this, urlsafe); });\n    _add('toBase64URI', function () { return encode(this, true); });\n    _add('toBase64URL', function () { return encode(this, true); });\n    _add('toUint8Array', function () { return toUint8Array(this); });\n};\n/**\n * extend Uint8Array.prototype with relevant methods\n */\nconst extendUint8Array = function () {\n    const _add = (name, body) => Object.defineProperty(Uint8Array.prototype, name, _noEnum(body));\n    _add('toBase64', function (urlsafe) { return fromUint8Array(this, urlsafe); });\n    _add('toBase64URI', function () { return fromUint8Array(this, true); });\n    _add('toBase64URL', function () { return fromUint8Array(this, true); });\n};\n/**\n * extend Builtin prototypes with relevant methods\n */\nconst extendBuiltins = () => {\n    extendString();\n    extendUint8Array();\n};\nconst gBase64 = {\n    version: version,\n    VERSION: VERSION,\n    atob: _atob,\n    atobPolyfill: atobPolyfill,\n    btoa: _btoa,\n    btoaPolyfill: btoaPolyfill,\n    fromBase64: decode,\n    toBase64: encode,\n    encode: encode,\n    encodeURI: encodeURI,\n    encodeURL: encodeURI,\n    utob: utob,\n    btou: btou,\n    decode: decode,\n    isValid: isValid,\n    fromUint8Array: fromUint8Array,\n    toUint8Array: toUint8Array,\n    extendString: extendString,\n    extendUint8Array: extendUint8Array,\n    extendBuiltins: extendBuiltins\n};\n// makecjs:CUT //\nexport { version };\nexport { VERSION };\nexport { _atob as atob };\nexport { atobPolyfill };\nexport { _btoa as btoa };\nexport { btoaPolyfill };\nexport { decode as fromBase64 };\nexport { encode as toBase64 };\nexport { utob };\nexport { encode };\nexport { encodeURI };\nexport { encodeURI as encodeURL };\nexport { btou };\nexport { decode };\nexport { isValid };\nexport { fromUint8Array };\nexport { toUint8Array };\nexport { extendString };\nexport { extendUint8Array };\nexport { extendBuiltins };\n// and finally,\nexport { gBase64 as Base64 };\n","'use strict';\n\nvar required = require('requires-port')\n  , qs = require('querystringify')\n  , controlOrWhitespace = /^[\\x00-\\x20\\u00a0\\u1680\\u2000-\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff]+/\n  , CRHTLF = /[\\n\\r\\t]/g\n  , slashes = /^[A-Za-z][A-Za-z0-9+-.]*:\\/\\//\n  , port = /:\\d+$/\n  , protocolre = /^([a-z][a-z0-9.+-]*:)?(\\/\\/)?([\\\\/]+)?([\\S\\s]*)/i\n  , windowsDriveLetter = /^[a-zA-Z]:/;\n\n/**\n * Remove control characters and whitespace from the beginning of a string.\n *\n * @param {Object|String} str String to trim.\n * @returns {String} A new string representing `str` stripped of control\n *     characters and whitespace from its beginning.\n * @public\n */\nfunction trimLeft(str) {\n  return (str ? str : '').toString().replace(controlOrWhitespace, '');\n}\n\n/**\n * These are the parse rules for the URL parser, it informs the parser\n * about:\n *\n * 0. The char it Needs to parse, if it's a string it should be done using\n *    indexOf, RegExp using exec and NaN means set as current value.\n * 1. The property we should set when parsing this value.\n * 2. Indication if it's backwards or forward parsing, when set as number it's\n *    the value of extra chars that should be split off.\n * 3. Inherit from location if non existing in the parser.\n * 4. `toLowerCase` the resulting value.\n */\nvar rules = [\n  ['#', 'hash'],                        // Extract from the back.\n  ['?', 'query'],                       // Extract from the back.\n  function sanitize(address, url) {     // Sanitize what is left of the address\n    return isSpecial(url.protocol) ? address.replace(/\\\\/g, '/') : address;\n  },\n  ['/', 'pathname'],                    // Extract from the back.\n  ['@', 'auth', 1],                     // Extract from the front.\n  [NaN, 'host', undefined, 1, 1],       // Set left over value.\n  [/:(\\d*)$/, 'port', undefined, 1],    // RegExp the back.\n  [NaN, 'hostname', undefined, 1, 1]    // Set left over.\n];\n\n/**\n * These properties should not be copied or inherited from. This is only needed\n * for all non blob URL's as a blob URL does not include a hash, only the\n * origin.\n *\n * @type {Object}\n * @private\n */\nvar ignore = { hash: 1, query: 1 };\n\n/**\n * The location object differs when your code is loaded through a normal page,\n * Worker or through a worker using a blob. And with the blobble begins the\n * trouble as the location object will contain the URL of the blob, not the\n * location of the page where our code is loaded in. The actual origin is\n * encoded in the `pathname` so we can thankfully generate a good \"default\"\n * location from it so we can generate proper relative URL's again.\n *\n * @param {Object|String} loc Optional default location object.\n * @returns {Object} lolcation object.\n * @public\n */\nfunction lolcation(loc) {\n  var globalVar;\n\n  if (typeof window !== 'undefined') globalVar = window;\n  else if (typeof global !== 'undefined') globalVar = global;\n  else if (typeof self !== 'undefined') globalVar = self;\n  else globalVar = {};\n\n  var location = globalVar.location || {};\n  loc = loc || location;\n\n  var finaldestination = {}\n    , type = typeof loc\n    , key;\n\n  if ('blob:' === loc.protocol) {\n    finaldestination = new Url(unescape(loc.pathname), {});\n  } else if ('string' === type) {\n    finaldestination = new Url(loc, {});\n    for (key in ignore) delete finaldestination[key];\n  } else if ('object' === type) {\n    for (key in loc) {\n      if (key in ignore) continue;\n      finaldestination[key] = loc[key];\n    }\n\n    if (finaldestination.slashes === undefined) {\n      finaldestination.slashes = slashes.test(loc.href);\n    }\n  }\n\n  return finaldestination;\n}\n\n/**\n * Check whether a protocol scheme is special.\n *\n * @param {String} The protocol scheme of the URL\n * @return {Boolean} `true` if the protocol scheme is special, else `false`\n * @private\n */\nfunction isSpecial(scheme) {\n  return (\n    scheme === 'file:' ||\n    scheme === 'ftp:' ||\n    scheme === 'http:' ||\n    scheme === 'https:' ||\n    scheme === 'ws:' ||\n    scheme === 'wss:'\n  );\n}\n\n/**\n * @typedef ProtocolExtract\n * @type Object\n * @property {String} protocol Protocol matched in the URL, in lowercase.\n * @property {Boolean} slashes `true` if protocol is followed by \"//\", else `false`.\n * @property {String} rest Rest of the URL that is not part of the protocol.\n */\n\n/**\n * Extract protocol information from a URL with/without double slash (\"//\").\n *\n * @param {String} address URL we want to extract from.\n * @param {Object} location\n * @return {ProtocolExtract} Extracted information.\n * @private\n */\nfunction extractProtocol(address, location) {\n  address = trimLeft(address);\n  address = address.replace(CRHTLF, '');\n  location = location || {};\n\n  var match = protocolre.exec(address);\n  var protocol = match[1] ? match[1].toLowerCase() : '';\n  var forwardSlashes = !!match[2];\n  var otherSlashes = !!match[3];\n  var slashesCount = 0;\n  var rest;\n\n  if (forwardSlashes) {\n    if (otherSlashes) {\n      rest = match[2] + match[3] + match[4];\n      slashesCount = match[2].length + match[3].length;\n    } else {\n      rest = match[2] + match[4];\n      slashesCount = match[2].length;\n    }\n  } else {\n    if (otherSlashes) {\n      rest = match[3] + match[4];\n      slashesCount = match[3].length;\n    } else {\n      rest = match[4]\n    }\n  }\n\n  if (protocol === 'file:') {\n    if (slashesCount >= 2) {\n      rest = rest.slice(2);\n    }\n  } else if (isSpecial(protocol)) {\n    rest = match[4];\n  } else if (protocol) {\n    if (forwardSlashes) {\n      rest = rest.slice(2);\n    }\n  } else if (slashesCount >= 2 && isSpecial(location.protocol)) {\n    rest = match[4];\n  }\n\n  return {\n    protocol: protocol,\n    slashes: forwardSlashes || isSpecial(protocol),\n    slashesCount: slashesCount,\n    rest: rest\n  };\n}\n\n/**\n * Resolve a relative URL pathname against a base URL pathname.\n *\n * @param {String} relative Pathname of the relative URL.\n * @param {String} base Pathname of the base URL.\n * @return {String} Resolved pathname.\n * @private\n */\nfunction resolve(relative, base) {\n  if (relative === '') return base;\n\n  var path = (base || '/').split('/').slice(0, -1).concat(relative.split('/'))\n    , i = path.length\n    , last = path[i - 1]\n    , unshift = false\n    , up = 0;\n\n  while (i--) {\n    if (path[i] === '.') {\n      path.splice(i, 1);\n    } else if (path[i] === '..') {\n      path.splice(i, 1);\n      up++;\n    } else if (up) {\n      if (i === 0) unshift = true;\n      path.splice(i, 1);\n      up--;\n    }\n  }\n\n  if (unshift) path.unshift('');\n  if (last === '.' || last === '..') path.push('');\n\n  return path.join('/');\n}\n\n/**\n * The actual URL instance. Instead of returning an object we've opted-in to\n * create an actual constructor as it's much more memory efficient and\n * faster and it pleases my OCD.\n *\n * It is worth noting that we should not use `URL` as class name to prevent\n * clashes with the global URL instance that got introduced in browsers.\n *\n * @constructor\n * @param {String} address URL we want to parse.\n * @param {Object|String} [location] Location defaults for relative paths.\n * @param {Boolean|Function} [parser] Parser for the query string.\n * @private\n */\nfunction Url(address, location, parser) {\n  address = trimLeft(address);\n  address = address.replace(CRHTLF, '');\n\n  if (!(this instanceof Url)) {\n    return new Url(address, location, parser);\n  }\n\n  var relative, extracted, parse, instruction, index, key\n    , instructions = rules.slice()\n    , type = typeof location\n    , url = this\n    , i = 0;\n\n  //\n  // The following if statements allows this module two have compatibility with\n  // 2 different API:\n  //\n  // 1. Node.js's `url.parse` api which accepts a URL, boolean as arguments\n  //    where the boolean indicates that the query string should also be parsed.\n  //\n  // 2. The `URL` interface of the browser which accepts a URL, object as\n  //    arguments. The supplied object will be used as default values / fall-back\n  //    for relative paths.\n  //\n  if ('object' !== type && 'string' !== type) {\n    parser = location;\n    location = null;\n  }\n\n  if (parser && 'function' !== typeof parser) parser = qs.parse;\n\n  location = lolcation(location);\n\n  //\n  // Extract protocol information before running the instructions.\n  //\n  extracted = extractProtocol(address || '', location);\n  relative = !extracted.protocol && !extracted.slashes;\n  url.slashes = extracted.slashes || relative && location.slashes;\n  url.protocol = extracted.protocol || location.protocol || '';\n  address = extracted.rest;\n\n  //\n  // When the authority component is absent the URL starts with a path\n  // component.\n  //\n  if (\n    extracted.protocol === 'file:' && (\n      extracted.slashesCount !== 2 || windowsDriveLetter.test(address)) ||\n    (!extracted.slashes &&\n      (extracted.protocol ||\n        extracted.slashesCount < 2 ||\n        !isSpecial(url.protocol)))\n  ) {\n    instructions[3] = [/(.*)/, 'pathname'];\n  }\n\n  for (; i < instructions.length; i++) {\n    instruction = instructions[i];\n\n    if (typeof instruction === 'function') {\n      address = instruction(address, url);\n      continue;\n    }\n\n    parse = instruction[0];\n    key = instruction[1];\n\n    if (parse !== parse) {\n      url[key] = address;\n    } else if ('string' === typeof parse) {\n      index = parse === '@'\n        ? address.lastIndexOf(parse)\n        : address.indexOf(parse);\n\n      if (~index) {\n        if ('number' === typeof instruction[2]) {\n          url[key] = address.slice(0, index);\n          address = address.slice(index + instruction[2]);\n        } else {\n          url[key] = address.slice(index);\n          address = address.slice(0, index);\n        }\n      }\n    } else if ((index = parse.exec(address))) {\n      url[key] = index[1];\n      address = address.slice(0, index.index);\n    }\n\n    url[key] = url[key] || (\n      relative && instruction[3] ? location[key] || '' : ''\n    );\n\n    //\n    // Hostname, host and protocol should be lowercased so they can be used to\n    // create a proper `origin`.\n    //\n    if (instruction[4]) url[key] = url[key].toLowerCase();\n  }\n\n  //\n  // Also parse the supplied query string in to an object. If we're supplied\n  // with a custom parser as function use that instead of the default build-in\n  // parser.\n  //\n  if (parser) url.query = parser(url.query);\n\n  //\n  // If the URL is relative, resolve the pathname against the base URL.\n  //\n  if (\n      relative\n    && location.slashes\n    && url.pathname.charAt(0) !== '/'\n    && (url.pathname !== '' || location.pathname !== '')\n  ) {\n    url.pathname = resolve(url.pathname, location.pathname);\n  }\n\n  //\n  // Default to a / for pathname if none exists. This normalizes the URL\n  // to always have a /\n  //\n  if (url.pathname.charAt(0) !== '/' && isSpecial(url.protocol)) {\n    url.pathname = '/' + url.pathname;\n  }\n\n  //\n  // We should not add port numbers if they are already the default port number\n  // for a given protocol. As the host also contains the port number we're going\n  // override it with the hostname which contains no port number.\n  //\n  if (!required(url.port, url.protocol)) {\n    url.host = url.hostname;\n    url.port = '';\n  }\n\n  //\n  // Parse down the `auth` for the username and password.\n  //\n  url.username = url.password = '';\n\n  if (url.auth) {\n    index = url.auth.indexOf(':');\n\n    if (~index) {\n      url.username = url.auth.slice(0, index);\n      url.username = encodeURIComponent(decodeURIComponent(url.username));\n\n      url.password = url.auth.slice(index + 1);\n      url.password = encodeURIComponent(decodeURIComponent(url.password))\n    } else {\n      url.username = encodeURIComponent(decodeURIComponent(url.auth));\n    }\n\n    url.auth = url.password ? url.username +':'+ url.password : url.username;\n  }\n\n  url.origin = url.protocol !== 'file:' && isSpecial(url.protocol) && url.host\n    ? url.protocol +'//'+ url.host\n    : 'null';\n\n  //\n  // The href is just the compiled result.\n  //\n  url.href = url.toString();\n}\n\n/**\n * This is convenience method for changing properties in the URL instance to\n * insure that they all propagate correctly.\n *\n * @param {String} part          Property we need to adjust.\n * @param {Mixed} value          The newly assigned value.\n * @param {Boolean|Function} fn  When setting the query, it will be the function\n *                               used to parse the query.\n *                               When setting the protocol, double slash will be\n *                               removed from the final url if it is true.\n * @returns {URL} URL instance for chaining.\n * @public\n */\nfunction set(part, value, fn) {\n  var url = this;\n\n  switch (part) {\n    case 'query':\n      if ('string' === typeof value && value.length) {\n        value = (fn || qs.parse)(value);\n      }\n\n      url[part] = value;\n      break;\n\n    case 'port':\n      url[part] = value;\n\n      if (!required(value, url.protocol)) {\n        url.host = url.hostname;\n        url[part] = '';\n      } else if (value) {\n        url.host = url.hostname +':'+ value;\n      }\n\n      break;\n\n    case 'hostname':\n      url[part] = value;\n\n      if (url.port) value += ':'+ url.port;\n      url.host = value;\n      break;\n\n    case 'host':\n      url[part] = value;\n\n      if (port.test(value)) {\n        value = value.split(':');\n        url.port = value.pop();\n        url.hostname = value.join(':');\n      } else {\n        url.hostname = value;\n        url.port = '';\n      }\n\n      break;\n\n    case 'protocol':\n      url.protocol = value.toLowerCase();\n      url.slashes = !fn;\n      break;\n\n    case 'pathname':\n    case 'hash':\n      if (value) {\n        var char = part === 'pathname' ? '/' : '#';\n        url[part] = value.charAt(0) !== char ? char + value : value;\n      } else {\n        url[part] = value;\n      }\n      break;\n\n    case 'username':\n    case 'password':\n      url[part] = encodeURIComponent(value);\n      break;\n\n    case 'auth':\n      var index = value.indexOf(':');\n\n      if (~index) {\n        url.username = value.slice(0, index);\n        url.username = encodeURIComponent(decodeURIComponent(url.username));\n\n        url.password = value.slice(index + 1);\n        url.password = encodeURIComponent(decodeURIComponent(url.password));\n      } else {\n        url.username = encodeURIComponent(decodeURIComponent(value));\n      }\n  }\n\n  for (var i = 0; i < rules.length; i++) {\n    var ins = rules[i];\n\n    if (ins[4]) url[ins[1]] = url[ins[1]].toLowerCase();\n  }\n\n  url.auth = url.password ? url.username +':'+ url.password : url.username;\n\n  url.origin = url.protocol !== 'file:' && isSpecial(url.protocol) && url.host\n    ? url.protocol +'//'+ url.host\n    : 'null';\n\n  url.href = url.toString();\n\n  return url;\n}\n\n/**\n * Transform the properties back in to a valid and full URL string.\n *\n * @param {Function} stringify Optional query stringify function.\n * @returns {String} Compiled version of the URL.\n * @public\n */\nfunction toString(stringify) {\n  if (!stringify || 'function' !== typeof stringify) stringify = qs.stringify;\n\n  var query\n    , url = this\n    , host = url.host\n    , protocol = url.protocol;\n\n  if (protocol && protocol.charAt(protocol.length - 1) !== ':') protocol += ':';\n\n  var result =\n    protocol +\n    ((url.protocol && url.slashes) || isSpecial(url.protocol) ? '//' : '');\n\n  if (url.username) {\n    result += url.username;\n    if (url.password) result += ':'+ url.password;\n    result += '@';\n  } else if (url.password) {\n    result += ':'+ url.password;\n    result += '@';\n  } else if (\n    url.protocol !== 'file:' &&\n    isSpecial(url.protocol) &&\n    !host &&\n    url.pathname !== '/'\n  ) {\n    //\n    // Add back the empty userinfo, otherwise the original invalid URL\n    // might be transformed into a valid one with `url.pathname` as host.\n    //\n    result += '@';\n  }\n\n  //\n  // Trailing colon is removed from `url.host` when it is parsed. If it still\n  // ends with a colon, then add back the trailing colon that was removed. This\n  // prevents an invalid URL from being transformed into a valid one.\n  //\n  if (host[host.length - 1] === ':' || (port.test(url.hostname) && !url.port)) {\n    host += ':';\n  }\n\n  result += host + url.pathname;\n\n  query = 'object' === typeof url.query ? stringify(url.query) : url.query;\n  if (query) result += '?' !== query.charAt(0) ? '?'+ query : query;\n\n  if (url.hash) result += url.hash;\n\n  return result;\n}\n\nUrl.prototype = { set: set, toString: toString };\n\n//\n// Expose the URL parser and some additional properties that might be useful for\n// others or testing.\n//\nUrl.extractProtocol = extractProtocol;\nUrl.location = lolcation;\nUrl.trimLeft = trimLeft;\nUrl.qs = qs;\n\nmodule.exports = Url;\n","'use strict';\n\n/**\n * Check if we're required to add a port number.\n *\n * @see https://url.spec.whatwg.org/#default-port\n * @param {Number|String} port Port number we need to check\n * @param {String} protocol Protocol we need to check against.\n * @returns {Boolean} Is it a default port for the given protocol\n * @api private\n */\nmodule.exports = function required(port, protocol) {\n  protocol = protocol.split(':')[0];\n  port = +port;\n\n  if (!port) return false;\n\n  switch (protocol) {\n    case 'http':\n    case 'ws':\n    return port !== 80;\n\n    case 'https':\n    case 'wss':\n    return port !== 443;\n\n    case 'ftp':\n    return port !== 21;\n\n    case 'gopher':\n    return port !== 70;\n\n    case 'file':\n    return false;\n  }\n\n  return port !== 0;\n};\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n  , undef;\n\n/**\n * Decode a URI encoded string.\n *\n * @param {String} input The URI encoded string.\n * @returns {String|Null} The decoded string.\n * @api private\n */\nfunction decode(input) {\n  try {\n    return decodeURIComponent(input.replace(/\\+/g, ' '));\n  } catch (e) {\n    return null;\n  }\n}\n\n/**\n * Attempts to encode a given input.\n *\n * @param {String} input The string that needs to be encoded.\n * @returns {String|Null} The encoded string.\n * @api private\n */\nfunction encode(input) {\n  try {\n    return encodeURIComponent(input);\n  } catch (e) {\n    return null;\n  }\n}\n\n/**\n * Simple query string parser.\n *\n * @param {String} query The query string that needs to be parsed.\n * @returns {Object}\n * @api public\n */\nfunction querystring(query) {\n  var parser = /([^=?#&]+)=?([^&]*)/g\n    , result = {}\n    , part;\n\n  while (part = parser.exec(query)) {\n    var key = decode(part[1])\n      , value = decode(part[2]);\n\n    //\n    // Prevent overriding of existing properties. This ensures that build-in\n    // methods like `toString` or __proto__ are not overriden by malicious\n    // querystrings.\n    //\n    // In the case if failed decoding, we want to omit the key/value pairs\n    // from the result.\n    //\n    if (key === null || value === null || key in result) continue;\n    result[key] = value;\n  }\n\n  return result;\n}\n\n/**\n * Transform a query string to an object.\n *\n * @param {Object} obj Object that should be transformed.\n * @param {String} prefix Optional prefix.\n * @returns {String}\n * @api public\n */\nfunction querystringify(obj, prefix) {\n  prefix = prefix || '';\n\n  var pairs = []\n    , value\n    , key;\n\n  //\n  // Optionally prefix with a '?' if needed\n  //\n  if ('string' !== typeof prefix) prefix = '?';\n\n  for (key in obj) {\n    if (has.call(obj, key)) {\n      value = obj[key];\n\n      //\n      // Edge cases where we actually want to encode the value to an empty\n      // string instead of the stringified value.\n      //\n      if (!value && (value === null || value === undef || isNaN(value))) {\n        value = '';\n      }\n\n      key = encode(key);\n      value = encode(value);\n\n      //\n      // If we failed to encode the strings, we should bail out as we don't\n      // want to add invalid strings to the query.\n      //\n      if (key === null || value === null) continue;\n      pairs.push(key +'='+ value);\n    }\n  }\n\n  return pairs.length ? prefix + pairs.join('&') : '';\n}\n\n//\n// Expose the module.\n//\nexports.stringify = querystringify;\nexports.parse = querystring;\n","import { Base64 } from 'js-base64'\nimport URL from 'url-parse'\nimport DetailedError from './error.js'\nimport { log } from './logger.js'\nimport uuid from './uuid.js'\n\nconst PROTOCOL_TUS_V1 = 'tus-v1'\nconst PROTOCOL_IETF_DRAFT_03 = 'ietf-draft-03'\nconst PROTOCOL_IETF_DRAFT_05 = 'ietf-draft-05'\n\nconst defaultOptions = {\n  endpoint: null,\n\n  uploadUrl: null,\n  metadata: {},\n  metadataForPartialUploads: {},\n  fingerprint: null,\n  uploadSize: null,\n\n  onProgress: null,\n  onChunkComplete: null,\n  onSuccess: null,\n  onError: null,\n  onUploadUrlAvailable: null,\n\n  overridePatchMethod: false,\n  headers: {},\n  addRequestId: false,\n  onBeforeRequest: null,\n  onAfterResponse: null,\n  onShouldRetry: defaultOnShouldRetry,\n\n  chunkSize: Number.POSITIVE_INFINITY,\n  retryDelays: [0, 1000, 3000, 5000],\n  parallelUploads: 1,\n  parallelUploadBoundaries: null,\n  storeFingerprintForResuming: true,\n  removeFingerprintOnSuccess: false,\n  uploadLengthDeferred: false,\n  uploadDataDuringCreation: false,\n\n  urlStorage: null,\n  fileReader: null,\n  httpStack: null,\n\n  protocol: PROTOCOL_TUS_V1,\n}\n\nclass BaseUpload {\n  constructor(file, options) {\n    // Warn about removed options from previous versions\n    if ('resume' in options) {\n      console.log(\n        'tus: The `resume` option has been removed in tus-js-client v2. Please use the URL storage API instead.',\n      )\n    }\n\n    // The default options will already be added from the wrapper classes.\n    this.options = options\n\n    // Cast chunkSize to integer\n    this.options.chunkSize = Number(this.options.chunkSize)\n\n    // The storage module used to store URLs\n    this._urlStorage = this.options.urlStorage\n\n    // The underlying File/Blob object\n    this.file = file\n\n    // The URL against which the file will be uploaded\n    this.url = null\n\n    // The underlying request object for the current PATCH request\n    this._req = null\n\n    // The fingerpinrt for the current file (set after start())\n    this._fingerprint = null\n\n    // The key that the URL storage returned when saving an URL with a fingerprint,\n    this._urlStorageKey = null\n\n    // The offset used in the current PATCH request\n    this._offset = null\n\n    // True if the current PATCH request has been aborted\n    this._aborted = false\n\n    // The file's size in bytes\n    this._size = null\n\n    // The Source object which will wrap around the given file and provides us\n    // with a unified interface for getting its size and slice chunks from its\n    // content allowing us to easily handle Files, Blobs, Buffers and Streams.\n    this._source = null\n\n    // The current count of attempts which have been made. Zero indicates none.\n    this._retryAttempt = 0\n\n    // The timeout's ID which is used to delay the next retry\n    this._retryTimeout = null\n\n    // The offset of the remote upload before the latest attempt was started.\n    this._offsetBeforeRetry = 0\n\n    // An array of BaseUpload instances which are used for uploading the different\n    // parts, if the parallelUploads option is used.\n    this._parallelUploads = null\n\n    // An array of upload URLs which are used for uploading the different\n    // parts, if the parallelUploads option is used.\n    this._parallelUploadUrls = null\n  }\n\n  /**\n   * Use the Termination extension to delete an upload from the server by sending a DELETE\n   * request to the specified upload URL. This is only possible if the server supports the\n   * Termination extension. If the `options.retryDelays` property is set, the method will\n   * also retry if an error ocurrs.\n   *\n   * @param {String} url The upload's URL which will be terminated.\n   * @param {object} options Optional options for influencing HTTP requests.\n   * @return {Promise} The Promise will be resolved/rejected when the requests finish.\n   */\n  static terminate(url, options = {}) {\n    const req = openRequest('DELETE', url, options)\n\n    return sendRequest(req, null, options)\n      .then((res) => {\n        // A 204 response indicates a successfull request\n        if (res.getStatus() === 204) {\n          return\n        }\n\n        throw new DetailedError('tus: unexpected response while terminating upload', null, req, res)\n      })\n      .catch((err) => {\n        if (!(err instanceof DetailedError)) {\n          err = new DetailedError('tus: failed to terminate upload', err, req, null)\n        }\n\n        if (!shouldRetry(err, 0, options)) {\n          throw err\n        }\n\n        // Instead of keeping track of the retry attempts, we remove the first element from the delays\n        // array. If the array is empty, all retry attempts are used up and we will bubble up the error.\n        // We recursively call the terminate function will removing elements from the retryDelays array.\n        const delay = options.retryDelays[0]\n        const remainingDelays = options.retryDelays.slice(1)\n        const newOptions = {\n          ...options,\n          retryDelays: remainingDelays,\n        }\n        return new Promise((resolve) => setTimeout(resolve, delay)).then(() =>\n          BaseUpload.terminate(url, newOptions),\n        )\n      })\n  }\n\n  findPreviousUploads() {\n    return this.options\n      .fingerprint(this.file, this.options)\n      .then((fingerprint) => this._urlStorage.findUploadsByFingerprint(fingerprint))\n  }\n\n  resumeFromPreviousUpload(previousUpload) {\n    this.url = previousUpload.uploadUrl || null\n    this._parallelUploadUrls = previousUpload.parallelUploadUrls || null\n    this._urlStorageKey = previousUpload.urlStorageKey\n  }\n\n  start() {\n    const { file } = this\n\n    if (!file) {\n      this._emitError(new Error('tus: no file or stream to upload provided'))\n      return\n    }\n\n    if (\n      ![PROTOCOL_TUS_V1, PROTOCOL_IETF_DRAFT_03, PROTOCOL_IETF_DRAFT_05].includes(\n        this.options.protocol,\n      )\n    ) {\n      this._emitError(new Error(`tus: unsupported protocol ${this.options.protocol}`))\n      return\n    }\n\n    if (!this.options.endpoint && !this.options.uploadUrl && !this.url) {\n      this._emitError(new Error('tus: neither an endpoint or an upload URL is provided'))\n      return\n    }\n\n    const { retryDelays } = this.options\n    if (retryDelays != null && Object.prototype.toString.call(retryDelays) !== '[object Array]') {\n      this._emitError(new Error('tus: the `retryDelays` option must either be an array or null'))\n      return\n    }\n\n    if (this.options.parallelUploads > 1) {\n      // Test which options are incompatible with parallel uploads.\n      for (const optionName of ['uploadUrl', 'uploadSize', 'uploadLengthDeferred']) {\n        if (this.options[optionName]) {\n          this._emitError(\n            new Error(`tus: cannot use the ${optionName} option when parallelUploads is enabled`),\n          )\n          return\n        }\n      }\n    }\n\n    if (this.options.parallelUploadBoundaries) {\n      if (this.options.parallelUploads <= 1) {\n        this._emitError(\n          new Error(\n            'tus: cannot use the `parallelUploadBoundaries` option when `parallelUploads` is disabled',\n          ),\n        )\n        return\n      }\n      if (this.options.parallelUploads !== this.options.parallelUploadBoundaries.length) {\n        this._emitError(\n          new Error(\n            'tus: the `parallelUploadBoundaries` must have the same length as the value of `parallelUploads`',\n          ),\n        )\n        return\n      }\n    }\n\n    this.options\n      .fingerprint(file, this.options)\n      .then((fingerprint) => {\n        if (fingerprint == null) {\n          log(\n            'No fingerprint was calculated meaning that the upload cannot be stored in the URL storage.',\n          )\n        } else {\n          log(`Calculated fingerprint: ${fingerprint}`)\n        }\n\n        this._fingerprint = fingerprint\n\n        if (this._source) {\n          return this._source\n        }\n        return this.options.fileReader.openFile(file, this.options.chunkSize)\n      })\n      .then((source) => {\n        this._source = source\n\n        // First, we look at the uploadLengthDeferred option.\n        // Next, we check if the caller has supplied a manual upload size.\n        // Finally, we try to use the calculated size from the source object.\n        if (this.options.uploadLengthDeferred) {\n          this._size = null\n        } else if (this.options.uploadSize != null) {\n          this._size = Number(this.options.uploadSize)\n          if (Number.isNaN(this._size)) {\n            this._emitError(new Error('tus: cannot convert `uploadSize` option into a number'))\n            return\n          }\n        } else {\n          this._size = this._source.size\n          if (this._size == null) {\n            this._emitError(\n              new Error(\n                \"tus: cannot automatically derive upload's size from input. Specify it manually using the `uploadSize` option or use the `uploadLengthDeferred` option\",\n              ),\n            )\n            return\n          }\n        }\n\n        // If the upload was configured to use multiple requests or if we resume from\n        // an upload which used multiple requests, we start a parallel upload.\n        if (this.options.parallelUploads > 1 || this._parallelUploadUrls != null) {\n          this._startParallelUpload()\n        } else {\n          this._startSingleUpload()\n        }\n      })\n      .catch((err) => {\n        this._emitError(err)\n      })\n  }\n\n  /**\n   * Initiate the uploading procedure for a parallelized upload, where one file is split into\n   * multiple request which are run in parallel.\n   *\n   * @api private\n   */\n  _startParallelUpload() {\n    const totalSize = this._size\n    let totalProgress = 0\n    this._parallelUploads = []\n\n    const partCount =\n      this._parallelUploadUrls != null\n        ? this._parallelUploadUrls.length\n        : this.options.parallelUploads\n\n    // The input file will be split into multiple slices which are uploaded in separate\n    // requests. Here we get the start and end position for the slices.\n    const parts =\n      this.options.parallelUploadBoundaries ?? splitSizeIntoParts(this._source.size, partCount)\n\n    // Attach URLs from previous uploads, if available.\n    if (this._parallelUploadUrls) {\n      parts.forEach((part, index) => {\n        part.uploadUrl = this._parallelUploadUrls[index] || null\n      })\n    }\n\n    // Create an empty list for storing the upload URLs\n    this._parallelUploadUrls = new Array(parts.length)\n\n    // Generate a promise for each slice that will be resolve if the respective\n    // upload is completed.\n    const uploads = parts.map((part, index) => {\n      let lastPartProgress = 0\n\n      return this._source.slice(part.start, part.end).then(\n        ({ value }) =>\n          new Promise((resolve, reject) => {\n            // Merge with the user supplied options but overwrite some values.\n            const options = {\n              ...this.options,\n              // If available, the partial upload should be resumed from a previous URL.\n              uploadUrl: part.uploadUrl || null,\n              // We take manually care of resuming for partial uploads, so they should\n              // not be stored in the URL storage.\n              storeFingerprintForResuming: false,\n              removeFingerprintOnSuccess: false,\n              // Reset the parallelUploads option to not cause recursion.\n              parallelUploads: 1,\n              // Reset this option as we are not doing a parallel upload.\n              parallelUploadBoundaries: null,\n              metadata: this.options.metadataForPartialUploads,\n              // Add the header to indicate the this is a partial upload.\n              headers: {\n                ...this.options.headers,\n                'Upload-Concat': 'partial',\n              },\n              // Reject or resolve the promise if the upload errors or completes.\n              onSuccess: resolve,\n              onError: reject,\n              // Based in the progress for this partial upload, calculate the progress\n              // for the entire final upload.\n              onProgress: (newPartProgress) => {\n                totalProgress = totalProgress - lastPartProgress + newPartProgress\n                lastPartProgress = newPartProgress\n                this._emitProgress(totalProgress, totalSize)\n              },\n              // Wait until every partial upload has an upload URL, so we can add\n              // them to the URL storage.\n              onUploadUrlAvailable: () => {\n                this._parallelUploadUrls[index] = upload.url\n                // Test if all uploads have received an URL\n                if (this._parallelUploadUrls.filter((u) => Boolean(u)).length === parts.length) {\n                  this._saveUploadInUrlStorage()\n                }\n              },\n            }\n\n            const upload = new BaseUpload(value, options)\n            upload.start()\n\n            // Store the upload in an array, so we can later abort them if necessary.\n            this._parallelUploads.push(upload)\n          }),\n      )\n    })\n\n    let req\n    // Wait until all partial uploads are finished and we can send the POST request for\n    // creating the final upload.\n    Promise.all(uploads)\n      .then(() => {\n        req = this._openRequest('POST', this.options.endpoint)\n        req.setHeader('Upload-Concat', `final;${this._parallelUploadUrls.join(' ')}`)\n\n        // Add metadata if values have been added\n        const metadata = encodeMetadata(this.options.metadata)\n        if (metadata !== '') {\n          req.setHeader('Upload-Metadata', metadata)\n        }\n\n        return this._sendRequest(req, null)\n      })\n      .then((res) => {\n        if (!inStatusCategory(res.getStatus(), 200)) {\n          this._emitHttpError(req, res, 'tus: unexpected response while creating upload')\n          return\n        }\n\n        const location = res.getHeader('Location')\n        if (location == null) {\n          this._emitHttpError(req, res, 'tus: invalid or missing Location header')\n          return\n        }\n\n        this.url = resolveUrl(this.options.endpoint, location)\n        log(`Created upload at ${this.url}`)\n\n        this._emitSuccess(res)\n      })\n      .catch((err) => {\n        this._emitError(err)\n      })\n  }\n\n  /**\n   * Initiate the uploading procedure for a non-parallel upload. Here the entire file is\n   * uploaded in a sequential matter.\n   *\n   * @api private\n   */\n  _startSingleUpload() {\n    // Reset the aborted flag when the upload is started or else the\n    // _performUpload will stop before sending a request if the upload has been\n    // aborted previously.\n    this._aborted = false\n\n    // The upload had been started previously and we should reuse this URL.\n    if (this.url != null) {\n      log(`Resuming upload from previous URL: ${this.url}`)\n      this._resumeUpload()\n      return\n    }\n\n    // A URL has manually been specified, so we try to resume\n    if (this.options.uploadUrl != null) {\n      log(`Resuming upload from provided URL: ${this.options.uploadUrl}`)\n      this.url = this.options.uploadUrl\n      this._resumeUpload()\n      return\n    }\n\n    // An upload has not started for the file yet, so we start a new one\n    log('Creating a new upload')\n    this._createUpload()\n  }\n\n  /**\n   * Abort any running request and stop the current upload. After abort is called, no event\n   * handler will be invoked anymore. You can use the `start` method to resume the upload\n   * again.\n   * If `shouldTerminate` is true, the `terminate` function will be called to remove the\n   * current upload from the server.\n   *\n   * @param {boolean} shouldTerminate True if the upload should be deleted from the server.\n   * @return {Promise} The Promise will be resolved/rejected when the requests finish.\n   */\n  abort(shouldTerminate) {\n    // Stop any parallel partial uploads, that have been started in _startParallelUploads.\n    if (this._parallelUploads != null) {\n      for (const upload of this._parallelUploads) {\n        upload.abort(shouldTerminate)\n      }\n    }\n\n    // Stop any current running request.\n    if (this._req !== null) {\n      this._req.abort()\n      // Note: We do not close the file source here, so the user can resume in the future.\n    }\n    this._aborted = true\n\n    // Stop any timeout used for initiating a retry.\n    if (this._retryTimeout != null) {\n      clearTimeout(this._retryTimeout)\n      this._retryTimeout = null\n    }\n\n    if (!shouldTerminate || this.url == null) {\n      return Promise.resolve()\n    }\n\n    return (\n      BaseUpload.terminate(this.url, this.options)\n        // Remove entry from the URL storage since the upload URL is no longer valid.\n        .then(() => this._removeFromUrlStorage())\n    )\n  }\n\n  _emitHttpError(req, res, message, causingErr) {\n    this._emitError(new DetailedError(message, causingErr, req, res))\n  }\n\n  _emitError(err) {\n    // Do not emit errors, e.g. from aborted HTTP requests, if the upload has been stopped.\n    if (this._aborted) return\n\n    // Check if we should retry, when enabled, before sending the error to the user.\n    if (this.options.retryDelays != null) {\n      // We will reset the attempt counter if\n      // - we were already able to connect to the server (offset != null) and\n      // - we were able to upload a small chunk of data to the server\n      const shouldResetDelays = this._offset != null && this._offset > this._offsetBeforeRetry\n      if (shouldResetDelays) {\n        this._retryAttempt = 0\n      }\n\n      if (shouldRetry(err, this._retryAttempt, this.options)) {\n        const delay = this.options.retryDelays[this._retryAttempt++]\n\n        this._offsetBeforeRetry = this._offset\n\n        this._retryTimeout = setTimeout(() => {\n          this.start()\n        }, delay)\n        return\n      }\n    }\n\n    if (typeof this.options.onError === 'function') {\n      this.options.onError(err)\n    } else {\n      throw err\n    }\n  }\n\n  /**\n   * Publishes notification if the upload has been successfully completed.\n   *\n   * @param {object} lastResponse Last HTTP response.\n   * @api private\n   */\n  _emitSuccess(lastResponse) {\n    if (this.options.removeFingerprintOnSuccess) {\n      // Remove stored fingerprint and corresponding endpoint. This causes\n      // new uploads of the same file to be treated as a different file.\n      this._removeFromUrlStorage()\n    }\n\n    if (typeof this.options.onSuccess === 'function') {\n      this.options.onSuccess({ lastResponse })\n    }\n  }\n\n  /**\n   * Publishes notification when data has been sent to the server. This\n   * data may not have been accepted by the server yet.\n   *\n   * @param {number} bytesSent  Number of bytes sent to the server.\n   * @param {number} bytesTotal Total number of bytes to be sent to the server.\n   * @api private\n   */\n  _emitProgress(bytesSent, bytesTotal) {\n    if (typeof this.options.onProgress === 'function') {\n      this.options.onProgress(bytesSent, bytesTotal)\n    }\n  }\n\n  /**\n   * Publishes notification when a chunk of data has been sent to the server\n   * and accepted by the server.\n   * @param {number} chunkSize  Size of the chunk that was accepted by the server.\n   * @param {number} bytesAccepted Total number of bytes that have been\n   *                                accepted by the server.\n   * @param {number} bytesTotal Total number of bytes to be sent to the server.\n   * @api private\n   */\n  _emitChunkComplete(chunkSize, bytesAccepted, bytesTotal) {\n    if (typeof this.options.onChunkComplete === 'function') {\n      this.options.onChunkComplete(chunkSize, bytesAccepted, bytesTotal)\n    }\n  }\n\n  /**\n   * Create a new upload using the creation extension by sending a POST\n   * request to the endpoint. After successful creation the file will be\n   * uploaded\n   *\n   * @api private\n   */\n  _createUpload() {\n    if (!this.options.endpoint) {\n      this._emitError(new Error('tus: unable to create upload because no endpoint is provided'))\n      return\n    }\n\n    const req = this._openRequest('POST', this.options.endpoint)\n\n    if (this.options.uploadLengthDeferred) {\n      req.setHeader('Upload-Defer-Length', '1')\n    } else {\n      req.setHeader('Upload-Length', `${this._size}`)\n    }\n\n    // Add metadata if values have been added\n    const metadata = encodeMetadata(this.options.metadata)\n    if (metadata !== '') {\n      req.setHeader('Upload-Metadata', metadata)\n    }\n\n    let promise\n    if (this.options.uploadDataDuringCreation && !this.options.uploadLengthDeferred) {\n      this._offset = 0\n      promise = this._addChunkToRequest(req)\n    } else {\n      if (\n        this.options.protocol === PROTOCOL_IETF_DRAFT_03 ||\n        this.options.protocol === PROTOCOL_IETF_DRAFT_05\n      ) {\n        req.setHeader('Upload-Complete', '?0')\n      }\n      promise = this._sendRequest(req, null)\n    }\n\n    promise\n      .then((res) => {\n        if (!inStatusCategory(res.getStatus(), 200)) {\n          this._emitHttpError(req, res, 'tus: unexpected response while creating upload')\n          return\n        }\n\n        const location = res.getHeader('Location')\n        if (location == null) {\n          this._emitHttpError(req, res, 'tus: invalid or missing Location header')\n          return\n        }\n\n        this.url = resolveUrl(this.options.endpoint, location)\n        log(`Created upload at ${this.url}`)\n\n        if (typeof this.options.onUploadUrlAvailable === 'function') {\n          this.options.onUploadUrlAvailable()\n        }\n\n        if (this._size === 0) {\n          // Nothing to upload and file was successfully created\n          this._emitSuccess(res)\n          this._source.close()\n          return\n        }\n\n        this._saveUploadInUrlStorage().then(() => {\n          if (this.options.uploadDataDuringCreation) {\n            this._handleUploadResponse(req, res)\n          } else {\n            this._offset = 0\n            this._performUpload()\n          }\n        })\n      })\n      .catch((err) => {\n        this._emitHttpError(req, null, 'tus: failed to create upload', err)\n      })\n  }\n\n  /*\n   * Try to resume an existing upload. First a HEAD request will be sent\n   * to retrieve the offset. If the request fails a new upload will be\n   * created. In the case of a successful response the file will be uploaded.\n   *\n   * @api private\n   */\n  _resumeUpload() {\n    const req = this._openRequest('HEAD', this.url)\n    const promise = this._sendRequest(req, null)\n\n    promise\n      .then((res) => {\n        const status = res.getStatus()\n        if (!inStatusCategory(status, 200)) {\n          // If the upload is locked (indicated by the 423 Locked status code), we\n          // emit an error instead of directly starting a new upload. This way the\n          // retry logic can catch the error and will retry the upload. An upload\n          // is usually locked for a short period of time and will be available\n          // afterwards.\n          if (status === 423) {\n            this._emitHttpError(req, res, 'tus: upload is currently locked; retry later')\n            return\n          }\n\n          if (inStatusCategory(status, 400)) {\n            // Remove stored fingerprint and corresponding endpoint,\n            // on client errors since the file can not be found\n            this._removeFromUrlStorage()\n          }\n\n          if (!this.options.endpoint) {\n            // Don't attempt to create a new upload if no endpoint is provided.\n            this._emitHttpError(\n              req,\n              res,\n              'tus: unable to resume upload (new upload cannot be created without an endpoint)',\n            )\n            return\n          }\n\n          // Try to create a new upload\n          this.url = null\n          this._createUpload()\n          return\n        }\n\n        const offset = Number.parseInt(res.getHeader('Upload-Offset'), 10)\n        if (Number.isNaN(offset)) {\n          this._emitHttpError(req, res, 'tus: invalid or missing offset value')\n          return\n        }\n\n        const length = Number.parseInt(res.getHeader('Upload-Length'), 10)\n        if (\n          Number.isNaN(length) &&\n          !this.options.uploadLengthDeferred &&\n          this.options.protocol === PROTOCOL_TUS_V1\n        ) {\n          this._emitHttpError(req, res, 'tus: invalid or missing length value')\n          return\n        }\n\n        if (typeof this.options.onUploadUrlAvailable === 'function') {\n          this.options.onUploadUrlAvailable()\n        }\n\n        this._saveUploadInUrlStorage().then(() => {\n          // Upload has already been completed and we do not need to send additional\n          // data to the server\n          if (offset === length) {\n            this._emitProgress(length, length)\n            this._emitSuccess(res)\n            return\n          }\n\n          this._offset = offset\n          this._performUpload()\n        })\n      })\n      .catch((err) => {\n        this._emitHttpError(req, null, 'tus: failed to resume upload', err)\n      })\n  }\n\n  /**\n   * Start uploading the file using PATCH requests. The file will be divided\n   * into chunks as specified in the chunkSize option. During the upload\n   * the onProgress event handler may be invoked multiple times.\n   *\n   * @api private\n   */\n  _performUpload() {\n    // If the upload has been aborted, we will not send the next PATCH request.\n    // This is important if the abort method was called during a callback, such\n    // as onChunkComplete or onProgress.\n    if (this._aborted) {\n      return\n    }\n\n    let req\n\n    // Some browser and servers may not support the PATCH method. For those\n    // cases, you can tell tus-js-client to use a POST request with the\n    // X-HTTP-Method-Override header for simulating a PATCH request.\n    if (this.options.overridePatchMethod) {\n      req = this._openRequest('POST', this.url)\n      req.setHeader('X-HTTP-Method-Override', 'PATCH')\n    } else {\n      req = this._openRequest('PATCH', this.url)\n    }\n\n    req.setHeader('Upload-Offset', `${this._offset}`)\n    const promise = this._addChunkToRequest(req)\n\n    promise\n      .then((res) => {\n        if (!inStatusCategory(res.getStatus(), 200)) {\n          this._emitHttpError(req, res, 'tus: unexpected response while uploading chunk')\n          return\n        }\n\n        this._handleUploadResponse(req, res)\n      })\n      .catch((err) => {\n        // Don't emit an error if the upload was aborted manually\n        if (this._aborted) {\n          return\n        }\n\n        this._emitHttpError(req, null, `tus: failed to upload chunk at offset ${this._offset}`, err)\n      })\n  }\n\n  /**\n   * _addChunktoRequest reads a chunk from the source and sends it using the\n   * supplied request object. It will not handle the response.\n   *\n   * @api private\n   */\n  _addChunkToRequest(req) {\n    const start = this._offset\n    let end = this._offset + this.options.chunkSize\n\n    req.setProgressHandler((bytesSent) => {\n      this._emitProgress(start + bytesSent, this._size)\n    })\n\n    if (this.options.protocol === PROTOCOL_TUS_V1) {\n      req.setHeader('Content-Type', 'application/offset+octet-stream')\n    } else if (this.options.protocol === PROTOCOL_IETF_DRAFT_05) {\n      req.setHeader('Content-Type', 'application/partial-upload')\n    }\n\n    // The specified chunkSize may be Infinity or the calcluated end position\n    // may exceed the file's size. In both cases, we limit the end position to\n    // the input's total size for simpler calculations and correctness.\n    if (\n      (end === Number.POSITIVE_INFINITY || end > this._size) &&\n      !this.options.uploadLengthDeferred\n    ) {\n      end = this._size\n    }\n\n    return this._source.slice(start, end).then(({ value, done }) => {\n      const valueSize = value?.size ? value.size : 0\n\n      // If the upload length is deferred, the upload size was not specified during\n      // upload creation. So, if the file reader is done reading, we know the total\n      // upload size and can tell the tus server.\n      if (this.options.uploadLengthDeferred && done) {\n        this._size = this._offset + valueSize\n        req.setHeader('Upload-Length', `${this._size}`)\n      }\n\n      // The specified uploadSize might not match the actual amount of data that a source\n      // provides. In these cases, we cannot successfully complete the upload, so we\n      // rather error out and let the user know. If not, tus-js-client will be stuck\n      // in a loop of repeating empty PATCH requests.\n      // See https://community.transloadit.com/t/how-to-abort-hanging-companion-uploads/16488/13\n      const newSize = this._offset + valueSize\n      if (!this.options.uploadLengthDeferred && done && newSize !== this._size) {\n        return Promise.reject(\n          new Error(\n            `upload was configured with a size of ${this._size} bytes, but the source is done after ${newSize} bytes`,\n          ),\n        )\n      }\n\n      if (value === null) {\n        return this._sendRequest(req)\n      }\n\n      if (\n        this.options.protocol === PROTOCOL_IETF_DRAFT_03 ||\n        this.options.protocol === PROTOCOL_IETF_DRAFT_05\n      ) {\n        req.setHeader('Upload-Complete', done ? '?1' : '?0')\n      }\n      this._emitProgress(this._offset, this._size)\n      return this._sendRequest(req, value)\n    })\n  }\n\n  /**\n   * _handleUploadResponse is used by requests that haven been sent using _addChunkToRequest\n   * and already have received a response.\n   *\n   * @api private\n   */\n  _handleUploadResponse(req, res) {\n    const offset = Number.parseInt(res.getHeader('Upload-Offset'), 10)\n    if (Number.isNaN(offset)) {\n      this._emitHttpError(req, res, 'tus: invalid or missing offset value')\n      return\n    }\n\n    this._emitProgress(offset, this._size)\n    this._emitChunkComplete(offset - this._offset, offset, this._size)\n\n    this._offset = offset\n\n    if (offset === this._size) {\n      // Yay, finally done :)\n      this._emitSuccess(res)\n      this._source.close()\n      return\n    }\n\n    this._performUpload()\n  }\n\n  /**\n   * Create a new HTTP request object with the given method and URL.\n   *\n   * @api private\n   */\n  _openRequest(method, url) {\n    const req = openRequest(method, url, this.options)\n    this._req = req\n    return req\n  }\n\n  /**\n   * Remove the entry in the URL storage, if it has been saved before.\n   *\n   * @api private\n   */\n  _removeFromUrlStorage() {\n    if (!this._urlStorageKey) return\n\n    this._urlStorage.removeUpload(this._urlStorageKey).catch((err) => {\n      this._emitError(err)\n    })\n    this._urlStorageKey = null\n  }\n\n  /**\n   * Add the upload URL to the URL storage, if possible.\n   *\n   * @api private\n   */\n  _saveUploadInUrlStorage() {\n    // We do not store the upload URL\n    // - if it was disabled in the option, or\n    // - if no fingerprint was calculated for the input (i.e. a stream), or\n    // - if the URL is already stored (i.e. key is set alread).\n    if (\n      !this.options.storeFingerprintForResuming ||\n      !this._fingerprint ||\n      this._urlStorageKey !== null\n    ) {\n      return Promise.resolve()\n    }\n\n    const storedUpload = {\n      size: this._size,\n      metadata: this.options.metadata,\n      creationTime: new Date().toString(),\n    }\n\n    if (this._parallelUploads) {\n      // Save multiple URLs if the parallelUploads option is used ...\n      storedUpload.parallelUploadUrls = this._parallelUploadUrls\n    } else {\n      // ... otherwise we just save the one available URL.\n      storedUpload.uploadUrl = this.url\n    }\n\n    return this._urlStorage.addUpload(this._fingerprint, storedUpload).then((urlStorageKey) => {\n      this._urlStorageKey = urlStorageKey\n    })\n  }\n\n  /**\n   * Send a request with the provided body.\n   *\n   * @api private\n   */\n  _sendRequest(req, body = null) {\n    return sendRequest(req, body, this.options)\n  }\n}\n\nfunction encodeMetadata(metadata) {\n  return Object.entries(metadata)\n    .map(([key, value]) => `${key} ${Base64.encode(String(value))}`)\n    .join(',')\n}\n\n/**\n * Checks whether a given status is in the range of the expected category.\n * For example, only a status between 200 and 299 will satisfy the category 200.\n *\n * @api private\n */\nfunction inStatusCategory(status, category) {\n  return status >= category && status < category + 100\n}\n\n/**\n * Create a new HTTP request with the specified method and URL.\n * The necessary headers that are included in every request\n * will be added, including the request ID.\n *\n * @api private\n */\nfunction openRequest(method, url, options) {\n  const req = options.httpStack.createRequest(method, url)\n\n  if (options.protocol === PROTOCOL_IETF_DRAFT_03) {\n    req.setHeader('Upload-Draft-Interop-Version', '5')\n  } else if (options.protocol === PROTOCOL_IETF_DRAFT_05) {\n    req.setHeader('Upload-Draft-Interop-Version', '6')\n  } else {\n    req.setHeader('Tus-Resumable', '1.0.0')\n  }\n  const headers = options.headers || {}\n\n  for (const [name, value] of Object.entries(headers)) {\n    req.setHeader(name, value)\n  }\n\n  if (options.addRequestId) {\n    const requestId = uuid()\n    req.setHeader('X-Request-ID', requestId)\n  }\n\n  return req\n}\n\n/**\n * Send a request with the provided body while invoking the onBeforeRequest\n * and onAfterResponse callbacks.\n *\n * @api private\n */\nasync function sendRequest(req, body, options) {\n  if (typeof options.onBeforeRequest === 'function') {\n    await options.onBeforeRequest(req)\n  }\n\n  const res = await req.send(body)\n\n  if (typeof options.onAfterResponse === 'function') {\n    await options.onAfterResponse(req, res)\n  }\n\n  return res\n}\n\n/**\n * Checks whether the browser running this code has internet access.\n * This function will always return true in the node.js environment\n *\n * @api private\n */\nfunction isOnline() {\n  let online = true\n  // Note: We don't reference `window` here because the navigator object also exists\n  // in a Web Worker's context.\n  if (typeof navigator !== 'undefined' && navigator.onLine === false) {\n    online = false\n  }\n\n  return online\n}\n\n/**\n * Checks whether or not it is ok to retry a request.\n * @param {Error|DetailedError} err the error returned from the last request\n * @param {number} retryAttempt the number of times the request has already been retried\n * @param {object} options tus Upload options\n *\n * @api private\n */\nfunction shouldRetry(err, retryAttempt, options) {\n  // We only attempt a retry if\n  // - retryDelays option is set\n  // - we didn't exceed the maxium number of retries, yet, and\n  // - this error was caused by a request or it's response and\n  // - the error is server error (i.e. not a status 4xx except a 409 or 423) or\n  // a onShouldRetry is specified and returns true\n  // - the browser does not indicate that we are offline\n  if (\n    options.retryDelays == null ||\n    retryAttempt >= options.retryDelays.length ||\n    err.originalRequest == null\n  ) {\n    return false\n  }\n\n  if (options && typeof options.onShouldRetry === 'function') {\n    return options.onShouldRetry(err, retryAttempt, options)\n  }\n\n  return defaultOnShouldRetry(err)\n}\n\n/**\n * determines if the request should be retried. Will only retry if not a status 4xx except a 409 or 423\n * @param {DetailedError} err\n * @returns {boolean}\n */\nfunction defaultOnShouldRetry(err) {\n  const status = err.originalResponse ? err.originalResponse.getStatus() : 0\n  return (!inStatusCategory(status, 400) || status === 409 || status === 423) && isOnline()\n}\n\n/**\n * Resolve a relative link given the origin as source. For example,\n * if a HTTP request to http://example.com/files/ returns a Location\n * header with the value /upload/abc, the resolved URL will be:\n * http://example.com/upload/abc\n */\nfunction resolveUrl(origin, link) {\n  return new URL(link, origin).toString()\n}\n\n/**\n * Calculate the start and end positions for the parts if an upload\n * is split into multiple parallel requests.\n *\n * @param {number} totalSize The byte size of the upload, which will be split.\n * @param {number} partCount The number in how many parts the upload will be split.\n * @return {object[]}\n * @api private\n */\nfunction splitSizeIntoParts(totalSize, partCount) {\n  const partSize = Math.floor(totalSize / partCount)\n  const parts = []\n\n  for (let i = 0; i < partCount; i++) {\n    parts.push({\n      start: partSize * i,\n      end: partSize * (i + 1),\n    })\n  }\n\n  parts[partCount - 1].end = totalSize\n\n  return parts\n}\n\nBaseUpload.defaultOptions = defaultOptions\n\nexport default BaseUpload\n","/**\n * Generate a UUID v4 based on random numbers. We intentioanlly use the less\n * secure Math.random function here since the more secure crypto.getRandomNumbers\n * is not available on all platforms.\n * This is not a problem for us since we use the UUID only for generating a\n * request ID, so we can correlate server logs to client errors.\n *\n * This function is taken from following site:\n * https://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript\n *\n * @return {string} The generate UUID\n */\nexport default function uuid() {\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n    const r = (Math.random() * 16) | 0\n    const v = c === 'x' ? r : (r & 0x3) | 0x8\n    return v.toString(16)\n  })\n}\n","const isReactNative = () =>\n  typeof navigator !== 'undefined' &&\n  typeof navigator.product === 'string' &&\n  navigator.product.toLowerCase() === 'reactnative'\n\nexport default isReactNative\n","import isCordova from './isCordova.js'\nimport readAsByteArray from './readAsByteArray.js'\n\nexport default class FileSource {\n  // Make this.size a method\n  constructor(file) {\n    this._file = file\n    this.size = file.size\n  }\n\n  slice(start, end) {\n    // In Apache Cordova applications, a File must be resolved using\n    // FileReader instances, see\n    // https://cordova.apache.org/docs/en/8.x/reference/cordova-plugin-file/index.html#read-a-file\n    if (isCordova()) {\n      return readAsByteArray(this._file.slice(start, end))\n    }\n\n    const value = this._file.slice(start, end)\n    const done = end >= this.size\n    return Promise.resolve({ value, done })\n  }\n\n  close() {\n    // Nothing to do here since we don't need to release any resources.\n  }\n}\n","const isCordova = () =>\n  typeof window !== 'undefined' &&\n  (typeof window.PhoneGap !== 'undefined' ||\n    typeof window.Cordova !== 'undefined' ||\n    typeof window.cordova !== 'undefined')\n\nexport default isCordova\n","/**\n * readAsByteArray converts a File object to a Uint8Array.\n * This function is only used on the Apache Cordova platform.\n * See https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-file/index.html#read-a-file\n */\nexport default function readAsByteArray(chunk) {\n  return new Promise((resolve, reject) => {\n    const reader = new FileReader()\n    reader.onload = () => {\n      const value = new Uint8Array(reader.result)\n      resolve({ value })\n    }\n    reader.onerror = (err) => {\n      reject(err)\n    }\n    reader.readAsArrayBuffer(chunk)\n  })\n}\n","function len(blobOrArray) {\n  if (blobOrArray === undefined) return 0\n  if (blobOrArray.size !== undefined) return blobOrArray.size\n  return blobOrArray.length\n}\n\n/*\n  Typed arrays and blobs don't have a concat method.\n  This function helps StreamSource accumulate data to reach chunkSize.\n*/\nfunction concat(a, b) {\n  if (a.concat) {\n    // Is `a` an Array?\n    return a.concat(b)\n  }\n  if (a instanceof Blob) {\n    return new Blob([a, b], { type: a.type })\n  }\n  if (a.set) {\n    // Is `a` a typed array?\n    const c = new a.constructor(a.length + b.length)\n    c.set(a)\n    c.set(b, a.length)\n    return c\n  }\n  throw new Error('Unknown data type')\n}\n\nexport default class StreamSource {\n  constructor(reader) {\n    this._buffer = undefined\n    this._bufferOffset = 0\n    this._reader = reader\n    this._done = false\n  }\n\n  slice(start, end) {\n    if (start < this._bufferOffset) {\n      return Promise.reject(new Error(\"Requested data is before the reader's current offset\"))\n    }\n\n    return this._readUntilEnoughDataOrDone(start, end)\n  }\n\n  _readUntilEnoughDataOrDone(start, end) {\n    const hasEnoughData = end <= this._bufferOffset + len(this._buffer)\n    if (this._done || hasEnoughData) {\n      const value = this._getDataFromBuffer(start, end)\n      const done = value == null ? this._done : false\n      return Promise.resolve({ value, done })\n    }\n\n    return this._reader.read().then(({ value, done }) => {\n      if (done) {\n        this._done = true\n      } else if (this._buffer === undefined) {\n        this._buffer = value\n      } else {\n        this._buffer = concat(this._buffer, value)\n      }\n\n      return this._readUntilEnoughDataOrDone(start, end)\n    })\n  }\n\n  _getDataFromBuffer(start, end) {\n    // Remove data from buffer before `start`.\n    // Data might be reread from the buffer if an upload fails, so we can only\n    // safely delete data when it comes *before* what is currently being read.\n    if (start > this._bufferOffset) {\n      this._buffer = this._buffer.slice(start - this._bufferOffset)\n      this._bufferOffset = start\n    }\n    // If the buffer is empty after removing old data, all data has been read.\n    const hasAllDataBeenRead = len(this._buffer) === 0\n    if (this._done && hasAllDataBeenRead) {\n      return null\n    }\n    // We already removed data before `start`, so we just return the first\n    // chunk from the buffer.\n    return this._buffer.slice(0, end - start)\n  }\n\n  close() {\n    if (this._reader.cancel) {\n      this._reader.cancel()\n    }\n  }\n}\n","export default class XHRHttpStack {\n  createRequest(method, url) {\n    return new Request(method, url)\n  }\n\n  getName() {\n    return 'XHRHttpStack'\n  }\n}\n\nclass Request {\n  constructor(method, url) {\n    this._xhr = new XMLHttpRequest()\n    this._xhr.open(method, url, true)\n\n    this._method = method\n    this._url = url\n    this._headers = {}\n  }\n\n  getMethod() {\n    return this._method\n  }\n\n  getURL() {\n    return this._url\n  }\n\n  setHeader(header, value) {\n    this._xhr.setRequestHeader(header, value)\n    this._headers[header] = value\n  }\n\n  getHeader(header) {\n    return this._headers[header]\n  }\n\n  setProgressHandler(progressHandler) {\n    // Test support for progress events before attaching an event listener\n    if (!('upload' in this._xhr)) {\n      return\n    }\n\n    this._xhr.upload.onprogress = (e) => {\n      if (!e.lengthComputable) {\n        return\n      }\n\n      progressHandler(e.loaded)\n    }\n  }\n\n  send(body = null) {\n    return new Promise((resolve, reject) => {\n      this._xhr.onload = () => {\n        resolve(new Response(this._xhr))\n      }\n\n      this._xhr.onerror = (err) => {\n        reject(err)\n      }\n\n      this._xhr.send(body)\n    })\n  }\n\n  abort() {\n    this._xhr.abort()\n    return Promise.resolve()\n  }\n\n  getUnderlyingObject() {\n    return this._xhr\n  }\n}\n\nclass Response {\n  constructor(xhr) {\n    this._xhr = xhr\n  }\n\n  getStatus() {\n    return this._xhr.status\n  }\n\n  getHeader(header) {\n    return this._xhr.getResponseHeader(header)\n  }\n\n  getBody() {\n    return this._xhr.responseText\n  }\n\n  getUnderlyingObject() {\n    return this._xhr\n  }\n}\n","let hasStorage = false\ntry {\n  // Note: localStorage does not exist in the Web Worker's context, so we must use window here.\n  hasStorage = 'localStorage' in window\n\n  // Attempt to store and read entries from the local storage to detect Private\n  // Mode on Safari on iOS (see #49)\n  // If the key was not used before, we remove it from local storage again to\n  // not cause confusion where the entry came from.\n  const key = 'tusSupport'\n  const originalValue = localStorage.getItem(key)\n  localStorage.setItem(key, originalValue)\n  if (originalValue === null) localStorage.removeItem(key)\n} catch (e) {\n  // If we try to access localStorage inside a sandboxed iframe, a SecurityError\n  // is thrown. When in private mode on iOS Safari, a QuotaExceededError is\n  // thrown (see #49)\n  if (e.code === e.SECURITY_ERR || e.code === e.QUOTA_EXCEEDED_ERR) {\n    hasStorage = false\n  } else {\n    throw e\n  }\n}\n\nexport const canStoreURLs = hasStorage\n\nexport class WebStorageUrlStorage {\n  findAllUploads() {\n    const results = this._findEntries('tus::')\n    return Promise.resolve(results)\n  }\n\n  findUploadsByFingerprint(fingerprint) {\n    const results = this._findEntries(`tus::${fingerprint}::`)\n    return Promise.resolve(results)\n  }\n\n  removeUpload(urlStorageKey) {\n    localStorage.removeItem(urlStorageKey)\n    return Promise.resolve()\n  }\n\n  addUpload(fingerprint, upload) {\n    const id = Math.round(Math.random() * 1e12)\n    const key = `tus::${fingerprint}::${id}`\n\n    localStorage.setItem(key, JSON.stringify(upload))\n    return Promise.resolve(key)\n  }\n\n  _findEntries(prefix) {\n    const results = []\n\n    for (let i = 0; i < localStorage.length; i++) {\n      const key = localStorage.key(i)\n      if (key.indexOf(prefix) !== 0) continue\n\n      try {\n        const upload = JSON.parse(localStorage.getItem(key))\n        upload.urlStorageKey = key\n\n        results.push(upload)\n      } catch (_e) {\n        // The JSON parse error is intentionally ignored here, so a malformed\n        // entry in the storage cannot prevent an upload.\n      }\n    }\n\n    return results\n  }\n}\n","import DetailedError from '../error.js'\nimport { enableDebugLog } from '../logger.js'\nimport NoopUrlStorage from '../noopUrlStorage.js'\nimport BaseUpload from '../upload.js'\n\nimport FileReader from './fileReader.js'\nimport fingerprint from './fileSignature.js'\nimport DefaultHttpStack from './httpStack.js'\nimport { WebStorageUrlStorage, canStoreURLs } from './urlStorage.js'\n\nconst defaultOptions = {\n  ...BaseUpload.defaultOptions,\n  httpStack: new DefaultHttpStack(),\n  fileReader: new FileReader(),\n  urlStorage: canStoreURLs ? new WebStorageUrlStorage() : new NoopUrlStorage(),\n  fingerprint,\n}\n\nclass Upload extends BaseUpload {\n  constructor(file = null, options = {}) {\n    options = { ...defaultOptions, ...options }\n    super(file, options)\n  }\n\n  static terminate(url, options = {}) {\n    options = { ...defaultOptions, ...options }\n    return BaseUpload.terminate(url, options)\n  }\n}\n\n// Note: We don't reference `window` here because these classes also exist in a Web Worker's context.\nconst isSupported =\n  typeof XMLHttpRequest === 'function' &&\n  typeof Blob === 'function' &&\n  typeof Blob.prototype.slice === 'function'\n\nexport {\n  Upload,\n  canStoreURLs,\n  defaultOptions,\n  isSupported,\n  enableDebugLog,\n  DefaultHttpStack,\n  DetailedError,\n}\n","import isReactNative from './isReactNative.js'\nimport uriToBlob from './uriToBlob.js'\n\nimport FileSource from './sources/FileSource.js'\nimport StreamSource from './sources/StreamSource.js'\n\nexport default class FileReader {\n  async openFile(input, chunkSize) {\n    // In React Native, when user selects a file, instead of a File or Blob,\n    // you usually get a file object {} with a uri property that contains\n    // a local path to the file. We use XMLHttpRequest to fetch\n    // the file blob, before uploading with tus.\n    if (isReactNative() && input && typeof input.uri !== 'undefined') {\n      try {\n        const blob = await uriToBlob(input.uri)\n        return new FileSource(blob)\n      } catch (err) {\n        throw new Error(\n          `tus: cannot fetch \\`file.uri\\` as Blob, make sure the uri is correct and accessible. ${err}`,\n        )\n      }\n    }\n\n    // Since we emulate the Blob type in our tests (not all target browsers\n    // support it), we cannot use `instanceof` for testing whether the input value\n    // can be handled. Instead, we simply check is the slice() function and the\n    // size property are available.\n    if (typeof input.slice === 'function' && typeof input.size !== 'undefined') {\n      return Promise.resolve(new FileSource(input))\n    }\n\n    if (typeof input.read === 'function') {\n      chunkSize = Number(chunkSize)\n      if (!Number.isFinite(chunkSize)) {\n        return Promise.reject(\n          new Error(\n            'cannot create source for stream without a finite value for the `chunkSize` option',\n          ),\n        )\n      }\n\n      return Promise.resolve(new StreamSource(input, chunkSize))\n    }\n\n    return Promise.reject(\n      new Error(\n        'source object may only be an instance of File, Blob, or Reader in this environment',\n      ),\n    )\n  }\n}\n","/**\n * uriToBlob resolves a URI to a Blob object. This is used for\n * React Native to retrieve a file (identified by a file://\n * URI) as a blob.\n */\nexport default function uriToBlob(uri) {\n  return new Promise((resolve, reject) => {\n    const xhr = new XMLHttpRequest()\n    xhr.responseType = 'blob'\n    xhr.onload = () => {\n      const blob = xhr.response\n      resolve(blob)\n    }\n    xhr.onerror = (err) => {\n      reject(err)\n    }\n    xhr.open('GET', uri)\n    xhr.send()\n  })\n}\n","export default class NoopUrlStorage {\n  listAllUploads() {\n    return Promise.resolve([])\n  }\n\n  findUploadsByFingerprint(_fingerprint) {\n    return Promise.resolve([])\n  }\n\n  removeUpload(_urlStorageKey) {\n    return Promise.resolve()\n  }\n\n  addUpload(_fingerprint, _upload) {\n    return Promise.resolve(null)\n  }\n}\n","import isReactNative from './isReactNative.js'\n\n// TODO: Differenciate between input types\n\n/**\n * Generate a fingerprint for a file which will be used the store the endpoint\n *\n * @param {File} file\n * @param {Object} options\n * @param {Function} callback\n */\nexport default function fingerprint(file, options) {\n  if (isReactNative()) {\n    return Promise.resolve(reactNativeFingerprint(file, options))\n  }\n\n  return Promise.resolve(\n    ['tus-br', file.name, file.type, file.size, file.lastModified, options.endpoint].join('-'),\n  )\n}\n\nfunction reactNativeFingerprint(file, options) {\n  const exifHash = file.exif ? hashCode(JSON.stringify(file.exif)) : 'noexif'\n  return ['tus-rn', file.name || 'noname', file.size || 'nosize', exifHash, options.endpoint].join(\n    '/',\n  )\n}\n\nfunction hashCode(str) {\n  // from https://stackoverflow.com/a/8831937/151666\n  let hash = 0\n  if (str.length === 0) {\n    return hash\n  }\n  for (let i = 0; i < str.length; i++) {\n    const char = str.charCodeAt(i)\n    hash = (hash << 5) - hash + char\n    hash &= hash // Convert to 32bit integer\n  }\n  return hash\n}\n","export const deleteUpload = async (\n  url: string,\n  csrfToken: string\n): Promise<void> =>\n  new Promise((resolve, reject) => {\n    const xhr = new XMLHttpRequest();\n    xhr.open(\"DELETE\", url);\n\n    xhr.onload = (): void => {\n      if (xhr.status === 204) {\n        resolve();\n      } else {\n        reject(new Error());\n      }\n    };\n    xhr.setRequestHeader(\"Tus-Resumable\", \"1.0.0\");\n    xhr.setRequestHeader(\"X-CSRFToken\", csrfToken);\n    xhr.send(null);\n  });\n","import { HttpRequest, HttpResponse, Upload } from \"tus-js-client\";\n\nimport BaseUpload, { InitialFile } from \"./base_upload.ts\";\nimport { deleteUpload } from \"./tus_utils.ts\";\n\ninterface Parameters {\n  chunkSize: number;\n  csrfToken: string;\n  fieldName: string;\n  file: File;\n  formId: string;\n  retryDelays: null | number[];\n  uploadIndex: number;\n  uploadUrl: string;\n}\n\nexport default class TusUpload extends BaseUpload {\n  public onError?: (error: Error) => void;\n  public onProgress?: (bytesUploaded: number, bytesTotal: number) => void;\n  public onSuccess?: () => void;\n  private csrfToken: string;\n  private id: string;\n  private upload: Upload;\n\n  constructor({\n    chunkSize,\n    csrfToken,\n    fieldName,\n    file,\n    formId,\n    retryDelays,\n    uploadIndex,\n    uploadUrl\n  }: Parameters) {\n    super({ name: file.name, status: \"uploading\", type: \"tus\", uploadIndex });\n\n    this.csrfToken = csrfToken;\n\n    this.upload = new Upload(file, {\n      chunkSize,\n      endpoint: uploadUrl,\n      metadata: {\n        fieldName: fieldName,\n        filename: file.name,\n        formId: formId\n      },\n      onAfterResponse: this.handleAfterReponse,\n      onBeforeRequest: this.addCsrTokenToRequest,\n      onError: this.handleError,\n      onProgress: this.handleProgress,\n      onSuccess: this.handleSucces,\n      retryDelays: retryDelays ?? [0, 1000, 3000, 5000]\n    });\n\n    this.onError = undefined;\n    this.onProgress = undefined;\n    this.onSuccess = undefined;\n  }\n\n  public async abort(): Promise<void> {\n    await this.upload.abort(true);\n  }\n\n  public async delete(): Promise<void> {\n    if (!this.upload.url) {\n      return Promise.resolve();\n    }\n\n    await deleteUpload(this.upload.url, this.csrfToken);\n  }\n\n  public getId(): string | undefined {\n    return this.id;\n  }\n\n  getInitialFile(): InitialFile {\n    return {\n      id: this.id,\n      name: this.name,\n      size: this.getSize(),\n      type: \"tus\",\n      url: \"\"\n    };\n  }\n\n  public getSize(): number {\n    return (this.upload.file as File).size;\n  }\n\n  public start(): void {\n    this.upload.start();\n  }\n\n  private addCsrTokenToRequest = (request: HttpRequest) => {\n    request.setHeader(\"X-CSRFToken\", this.csrfToken);\n  };\n\n  private handleAfterReponse = (\n    _request: HttpRequest,\n    response: HttpResponse\n  ) => {\n    const resourceId = response.getHeader(\"ResourceId\");\n\n    if (resourceId) {\n      this.id = resourceId;\n    }\n  };\n\n  private handleError = (error: Error) => {\n    if (this.onError) {\n      this.onError(error);\n    } else {\n      throw error;\n    }\n  };\n\n  private handleProgress = (bytesUploaded: number, bytesTotal: number) => {\n    if (this.onProgress) {\n      this.onProgress(bytesUploaded, bytesTotal);\n    }\n  };\n\n  private handleSucces = () => {\n    if (this.onSuccess) {\n      this.onSuccess();\n    }\n  };\n}\n","import BaseUpload, {\n  InitialExistingFile,\n  InitialFile,\n  InitialPlaceholderFile,\n  InitialS3File,\n  InitialTusFile,\n  UploadType\n} from \"./base_upload.ts\";\nimport { deleteUpload } from \"./tus_utils.ts\";\n\ninterface BaseUploadedFileParameters {\n  name: string;\n  size: number;\n  type: UploadType;\n  uploadIndex: number;\n}\n\ninterface UploadedFileParameters {\n  csrfToken: string;\n  initialFile: InitialFile;\n  uploadIndex: number;\n  uploadUrl: string;\n}\n\ninterface UploadedTusFileParameters {\n  csrfToken: string;\n  initialFile: InitialTusFile;\n  uploadIndex: number;\n  uploadUrl: string;\n}\n\nexport abstract class BaseUploadedFile extends BaseUpload {\n  size: number;\n\n  constructor({ name, size, type, uploadIndex }: BaseUploadedFileParameters) {\n    super({ name, status: \"done\", type, uploadIndex });\n\n    this.size = size;\n  }\n\n  public async abort(): Promise<void> {\n    return Promise.resolve();\n  }\n\n  public async delete(): Promise<void> {\n    return Promise.resolve();\n  }\n\n  public getSize(): number | undefined {\n    return this.size;\n  }\n}\n\nclass PlaceholderFile extends BaseUploadedFile {\n  id: string;\n\n  constructor(initialFile: InitialPlaceholderFile, uploadIndex: number) {\n    super({\n      name: initialFile.name,\n      size: initialFile.size,\n      type: \"placeholder\",\n      uploadIndex\n    });\n\n    this.id = initialFile.id;\n  }\n\n  public getId(): string | undefined {\n    return undefined;\n  }\n\n  public getInitialFile(): InitialPlaceholderFile {\n    return {\n      id: this.id,\n      name: this.name,\n      size: this.size,\n      type: \"placeholder\"\n    };\n  }\n}\n\nexport class ExistingFile extends BaseUploadedFile {\n  constructor(initialFile: InitialExistingFile, uploadIndex: number) {\n    super({\n      name: initialFile.name,\n      size: initialFile.size,\n      type: \"existing\",\n      uploadIndex\n    });\n  }\n\n  public getId(): string | undefined {\n    return undefined;\n  }\n\n  public getInitialFile(): InitialExistingFile {\n    return {\n      name: this.name,\n      size: this.size,\n      type: \"existing\"\n    };\n  }\n}\n\nexport class UploadedS3File extends BaseUploadedFile {\n  id: string;\n  key: string;\n\n  constructor(initialFile: InitialS3File, uploadIndex: number) {\n    super({\n      name: initialFile.original_name || initialFile.name,\n      size: initialFile.size,\n      type: \"uploadedS3\",\n      uploadIndex\n    });\n\n    this.id = initialFile.id;\n    this.key = initialFile.name;\n  }\n\n  public getId(): string | undefined {\n    return this.id;\n  }\n\n  getInitialFile(): InitialS3File {\n    return {\n      id: this.id,\n      name: this.key,\n      original_name: this.name,\n      size: this.size,\n      type: \"s3\"\n    };\n  }\n}\n\nexport class UploadedTusFile extends BaseUploadedFile {\n  csrfToken: string;\n  id: string;\n  url: string;\n\n  constructor({\n    csrfToken,\n    initialFile,\n    uploadIndex,\n    uploadUrl\n  }: UploadedTusFileParameters) {\n    super({\n      name: initialFile.name,\n      size: initialFile.size,\n      type: \"uploadedTus\",\n      uploadIndex\n    });\n\n    this.csrfToken = csrfToken;\n    this.id = initialFile.id;\n    this.url = `${uploadUrl}${initialFile.id}`;\n  }\n\n  public async delete(): Promise<void> {\n    await deleteUpload(this.url, this.csrfToken);\n  }\n\n  public getId(): string | undefined {\n    return this.id;\n  }\n\n  getInitialFile(): InitialTusFile {\n    return {\n      id: this.id,\n      name: this.name,\n      size: this.size,\n      type: \"tus\",\n      url: \"\"\n    };\n  }\n}\n\nexport const createUploadedFile = ({\n  csrfToken,\n  initialFile,\n  uploadIndex,\n  uploadUrl\n}: UploadedFileParameters): BaseUploadedFile => {\n  switch (initialFile.type) {\n    case \"existing\":\n      return new ExistingFile(initialFile, uploadIndex);\n\n    case \"placeholder\":\n      return new PlaceholderFile(initialFile, uploadIndex);\n\n    case \"s3\":\n      return new UploadedS3File(initialFile, uploadIndex);\n\n    case \"tus\":\n      return new UploadedTusFile({\n        csrfToken,\n        initialFile,\n        uploadIndex,\n        uploadUrl\n      });\n  }\n};\n","import { EventEmitter } from \"eventemitter3\";\n\nimport AcceptedFileTypes from \"./accepted_file_types.ts\";\nimport DropArea from \"./drop_area.ts\";\nimport RenderUploadFile from \"./render_upload_file.ts\";\nimport BaseUpload, { InitialFile, UploadType } from \"./uploads/base_upload.ts\";\nimport S3Upload from \"./uploads/s3_upload.ts\";\nimport TusUpload from \"./uploads/tus_upload.ts\";\nimport { createUploadedFile } from \"./uploads/uploaded_file.ts\";\nimport {\n  findInput,\n  getMetadataFieldName,\n  getUploadsFieldName\n} from \"./util.ts\";\n\nexport interface Callbacks {\n  onClick?: ({ fieldName, fileName, type }: ClickEvent) => void;\n  onDelete?: (upload: BaseUpload) => void;\n  onError?: (error: unknown, upload: BaseUpload) => void;\n  onProgress?: (\n    bytesUploaded: number,\n    bytesTotal: number,\n    upload: BaseUpload\n  ) => void;\n  onSuccess?: (upload: BaseUpload) => void;\n}\n\nexport type Translations = Record<string, string>;\n\ninterface ClickEvent {\n  fieldName: string;\n  fileName: string;\n  id?: string;\n  type: UploadType;\n}\n\ninterface ConstructorParams {\n  callbacks: Callbacks;\n  chunkSize: number;\n  csrfToken: string;\n  eventEmitter?: EventEmitter;\n  fieldName: string;\n  form: Element;\n  formId: string;\n  initial: InitialFile[];\n  input: HTMLInputElement;\n  multiple: boolean;\n  parent: Element;\n  prefix: null | string;\n  retryDelays: null | number[];\n  s3UploadDir: null | string;\n  skipRequired: boolean;\n  supportDropArea: boolean;\n  translations: Translations;\n  uploadUrl: string;\n}\n\nclass FileField {\n  acceptedFileTypes: AcceptedFileTypes;\n  callbacks: Callbacks;\n  chunkSize: number;\n  csrfToken: string;\n  eventEmitter?: EventEmitter;\n  fieldName: string;\n  form: Element;\n  formId: string;\n  multiple: boolean;\n  nextUploadIndex: number;\n  prefix: null | string;\n  renderer: RenderUploadFile;\n  retryDelays: null | number[];\n  s3UploadDir: null | string;\n  supportDropArea: boolean;\n  uploads: BaseUpload[];\n  uploadUrl: string;\n\n  constructor({\n    callbacks,\n    chunkSize,\n    csrfToken,\n    eventEmitter,\n    fieldName,\n    form,\n    formId,\n    initial,\n    input,\n    multiple,\n    parent,\n    prefix,\n    retryDelays,\n    s3UploadDir,\n    skipRequired,\n    supportDropArea,\n    translations,\n    uploadUrl\n  }: ConstructorParams) {\n    this.callbacks = callbacks;\n    this.chunkSize = chunkSize;\n    this.csrfToken = csrfToken;\n    this.eventEmitter = eventEmitter;\n    this.fieldName = fieldName;\n    this.form = form;\n    this.formId = formId;\n    this.multiple = multiple;\n    this.prefix = prefix;\n    this.retryDelays = retryDelays;\n    this.s3UploadDir = s3UploadDir;\n    this.supportDropArea = supportDropArea && !input.disabled;\n    this.uploadUrl = uploadUrl;\n    this.acceptedFileTypes = new AcceptedFileTypes(input.accept);\n\n    this.uploads = [];\n    this.nextUploadIndex = 0;\n\n    this.renderer = new RenderUploadFile({\n      input,\n      parent,\n      skipRequired,\n      translations\n    });\n    const filesContainer = this.renderer.container;\n\n    if (supportDropArea) {\n      this.initDropArea(filesContainer, input.accept);\n    }\n\n    this.addInitialFiles(initial);\n\n    this.checkDropHint();\n\n    input.addEventListener(\"change\", this.onChange);\n    filesContainer.addEventListener(\"click\", this.handleClick);\n  }\n\n  addInitialFiles(initialFiles: InitialFile[]): void {\n    if (initialFiles.length === 0) {\n      return;\n    }\n\n    const { multiple, renderer } = this;\n\n    const addInitialFile = (initialFile: InitialFile): void => {\n      const { size } = initialFile;\n      const name =\n        initialFile.type === \"s3\" && initialFile.original_name\n          ? initialFile.original_name\n          : initialFile.name;\n\n      const element = renderer.addUploadedFile(\n        name,\n        this.nextUploadIndex,\n        size\n      );\n\n      const upload = createUploadedFile({\n        csrfToken: this.csrfToken,\n        initialFile,\n        uploadIndex: this.nextUploadIndex,\n        uploadUrl: this.uploadUrl\n      });\n      this.uploads.push(upload);\n\n      this.emitEvent(\"addUpload\", element, upload);\n    };\n\n    if (multiple) {\n      initialFiles.forEach((file: InitialFile): void => {\n        addInitialFile(file);\n        this.nextUploadIndex += 1;\n      });\n    } else {\n      const initialFile = initialFiles[0];\n\n      if (initialFile) {\n        addInitialFile(initialFile);\n      }\n    }\n  }\n\n  checkDropHint(): void {\n    if (!this.supportDropArea) {\n      return;\n    }\n\n    const nonEmptyUploads = this.uploads.filter(e => Boolean(e));\n\n    if (nonEmptyUploads.length === 0) {\n      this.renderer.renderDropHint();\n    } else {\n      this.renderer.removeDropHint();\n    }\n  }\n\n  emitEvent(eventName: string, element: HTMLElement, upload: BaseUpload): void {\n    if (this.eventEmitter) {\n      this.eventEmitter.emit(eventName, {\n        element,\n        fieldName: this.fieldName,\n        fileName: upload.name,\n        metaDataField: this.getMetaDataField(),\n        upload\n      });\n    }\n  }\n\n  findUploadByName(fileName: string): BaseUpload | undefined {\n    return this.uploads.find(upload => upload.name === fileName);\n  }\n\n  getMetaDataField(): HTMLElement | null {\n    return findInput(\n      this.form,\n      getMetadataFieldName(this.fieldName, this.prefix),\n      this.prefix\n    );\n  }\n\n  getUploadByIndex(uploadIndex: number): BaseUpload | undefined {\n    return this.uploads.find(upload => upload.uploadIndex === uploadIndex);\n  }\n\n  async handleCancel(upload: BaseUpload): Promise<void> {\n    this.renderer.disableCancel(upload.uploadIndex);\n    await upload.abort();\n    this.removeUploadFromList(upload);\n  }\n\n  handleClick = (e: Event): void => {\n    const target = e.target as HTMLElement;\n\n    const getUpload = (): BaseUpload | undefined => {\n      const dataIndex = target.getAttribute(\"data-index\");\n\n      if (!dataIndex) {\n        return undefined;\n      }\n\n      const uploadIndex = parseInt(dataIndex, 10);\n      return this.getUploadByIndex(uploadIndex);\n    };\n\n    if (\n      target.classList.contains(\"dff-delete\") &&\n      !target.classList.contains(\"dff-disabled\")\n    ) {\n      e.preventDefault();\n\n      const upload = getUpload();\n\n      if (upload) {\n        void this.removeExistingUpload(upload);\n      }\n    } else if (target.classList.contains(\"dff-cancel\")) {\n      e.preventDefault();\n\n      const upload = getUpload();\n\n      if (upload) {\n        void this.handleCancel(upload);\n      }\n    } else if (target.classList.contains(\"dff-filename\")) {\n      e.preventDefault();\n\n      const upload = getUpload();\n\n      if (upload?.status === \"done\" && this.callbacks.onClick) {\n        this.callbacks.onClick({\n          fieldName: this.fieldName,\n          fileName: upload.name,\n          id: upload.getId(),\n          type: upload.type\n        });\n      }\n    }\n  };\n\n  handleError = (upload: BaseUpload, error: unknown): void => {\n    this.renderer.setError(upload.uploadIndex);\n    upload.status = \"error\";\n\n    const { onError } = this.callbacks;\n\n    if (onError) {\n      if (upload instanceof TusUpload) {\n        onError(error, upload);\n      }\n    }\n  };\n\n  handleInvalidFiles = (files: File[]): void => {\n    this.renderer.setErrorInvalidFiles(files);\n  };\n\n  handleProgress = (\n    upload: BaseUpload,\n    bytesUploaded: number,\n    bytesTotal: number\n  ): void => {\n    const percentage = ((bytesUploaded / bytesTotal) * 100).toFixed(2);\n\n    this.renderer.updateProgress(upload.uploadIndex, percentage);\n\n    const { onProgress } = this.callbacks;\n\n    if (onProgress) {\n      if (upload instanceof TusUpload) {\n        onProgress(bytesUploaded, bytesTotal, upload);\n      }\n    }\n  };\n\n  handleSuccess = (upload: BaseUpload): void => {\n    const { renderer } = this;\n\n    this.updatePlaceholderInput();\n\n    renderer.clearInput();\n    renderer.setSuccess(upload.uploadIndex, upload.getSize());\n    upload.status = \"done\";\n\n    const { onSuccess } = this.callbacks;\n\n    const element = this.renderer.findFileDiv(upload.uploadIndex);\n\n    if (element) {\n      this.emitEvent(\"uploadComplete\", element, upload);\n    }\n\n    if (onSuccess && upload.type === \"tus\") {\n      onSuccess(upload);\n    }\n  };\n\n  initDropArea(container: Element, inputAccept: string): void {\n    new DropArea({\n      container,\n      inputAccept,\n      onUploadFiles: this.uploadFiles,\n      renderer: this.renderer\n    });\n  }\n\n  onChange = (e: Event): void => {\n    const files = (e.target as HTMLInputElement).files ?? ([] as File[]);\n    const acceptedFiles: File[] = [];\n    const invalidFiles: File[] = [];\n\n    for (const file of files) {\n      if (this.acceptedFileTypes.isAccepted(file.name)) {\n        acceptedFiles.push(file);\n      } else {\n        invalidFiles.push(file);\n      }\n    }\n\n    this.handleInvalidFiles([...invalidFiles]);\n    void this.uploadFiles([...acceptedFiles]);\n\n    this.renderer.clearInput();\n  };\n\n  async removeExistingUpload(upload: BaseUpload): Promise<void> {\n    const element = this.renderer.findFileDiv(upload.uploadIndex);\n\n    if (element) {\n      this.emitEvent(\"removeUpload\", element, upload);\n    }\n\n    if (upload.status === \"uploading\") {\n      this.renderer.disableCancel(upload.uploadIndex);\n      await upload.abort();\n    } else if (upload.status === \"done\") {\n      this.renderer.disableDelete(upload.uploadIndex);\n\n      try {\n        await upload.delete();\n      } catch {\n        this.renderer.setDeleteFailed(upload.uploadIndex);\n        return;\n      }\n    }\n\n    this.removeUploadFromList(upload);\n    this.updatePlaceholderInput();\n  }\n\n  removeUploadFromList(upload: BaseUpload): void {\n    this.renderer.deleteFile(upload.uploadIndex);\n\n    const index = this.uploads.indexOf(upload);\n\n    if (index >= 0) {\n      this.uploads.splice(index, 1);\n    }\n\n    this.checkDropHint();\n\n    const { onDelete } = this.callbacks;\n\n    if (onDelete) {\n      onDelete(upload);\n    }\n  }\n\n  updatePlaceholderInput(): void {\n    const input = findInput(\n      this.form,\n      getUploadsFieldName(this.fieldName, this.prefix),\n      this.prefix\n    );\n    if (!input) {\n      return;\n    }\n\n    const placeholdersInfo: InitialFile[] = this.uploads.map(upload =>\n      upload.getInitialFile()\n    );\n\n    input.value = JSON.stringify(placeholdersInfo);\n  }\n\n  async uploadFile(file: File): Promise<void> {\n    const createUpload = (): S3Upload | TusUpload => {\n      const { csrfToken, s3UploadDir } = this;\n\n      if (s3UploadDir != null) {\n        return new S3Upload({\n          csrfToken,\n          endpoint: uploadUrl,\n          file,\n          s3UploadDir,\n          uploadIndex: newUploadIndex\n        });\n      } else {\n        return new TusUpload({\n          chunkSize: this.chunkSize,\n          csrfToken: this.csrfToken,\n          fieldName,\n          file,\n          formId,\n          retryDelays: this.retryDelays,\n          uploadIndex: newUploadIndex,\n          uploadUrl\n        });\n      }\n    };\n\n    const { fieldName, formId, renderer, uploadUrl } = this;\n    const fileName = file.name;\n    const existingUpload = this.findUploadByName(fileName);\n    const newUploadIndex = existingUpload\n      ? existingUpload.uploadIndex\n      : this.nextUploadIndex;\n\n    if (!existingUpload) {\n      this.nextUploadIndex += 1;\n    }\n\n    if (existingUpload) {\n      await this.removeExistingUpload(existingUpload);\n    }\n\n    const upload = createUpload();\n\n    upload.onError = (error: unknown) => {\n      this.handleError(upload, error);\n    };\n    upload.onProgress = (bytesUploaded, bytesTotal) => {\n      this.handleProgress(upload, bytesUploaded, bytesTotal);\n    };\n    upload.onSuccess = () => {\n      this.handleSuccess(upload);\n    };\n    upload.start();\n\n    this.uploads.push(upload);\n\n    const element = renderer.addNewUpload(fileName, newUploadIndex);\n    this.emitEvent(\"addUpload\", element, upload);\n  }\n\n  uploadFiles = async (files: File[]): Promise<void> => {\n    if (files.length === 0) {\n      return;\n    }\n\n    if (!this.multiple) {\n      for (const upload of this.uploads) {\n        this.renderer.deleteFile(upload.uploadIndex);\n      }\n\n      this.uploads = [];\n      const file = files[0];\n\n      if (file) {\n        await this.uploadFile(file);\n      }\n    } else {\n      for (const file of files) {\n        await this.uploadFile(file);\n      }\n    }\n\n    this.checkDropHint();\n  };\n}\n\nexport default FileField;\n","import { EventEmitter } from \"eventemitter3\";\n\nimport FileField, { Callbacks, Translations } from \"./file_field.ts\";\nimport { InitialFile } from \"./uploads/base_upload.ts\";\nimport {\n  findInput,\n  getInputValueForFormAndPrefix,\n  getUploadsFieldName\n} from \"./util.ts\";\n\nexport interface Options {\n  callbacks?: Callbacks;\n  chunkSize?: number;\n  eventEmitter?: EventEmitter;\n  prefix?: string;\n  retryDelays?: number[];\n  skipRequired?: boolean;\n  supportDropArea?: boolean;\n}\n\nconst initUploadFields = (form: Element, options: Options = {}): void => {\n  const matchesPrefix = (fieldName: string): boolean => {\n    if (!options.prefix) {\n      return true;\n    }\n\n    return fieldName.startsWith(`${options.prefix}-`);\n  };\n\n  const getPrefix = (): null | string => options.prefix ?? null;\n\n  const getInputValue = (fieldName: string): string | undefined =>\n    getInputValueForFormAndPrefix(form, fieldName, getPrefix());\n\n  const getInitialFiles = (fieldName: string): InitialFile[] => {\n    const data = getInputValue(getUploadsFieldName(fieldName, getPrefix()));\n\n    if (!data) {\n      return [];\n    }\n\n    return (JSON.parse(data) as Record<string, unknown>[]).filter(\n      file => file.type\n    ) as unknown as InitialFile[];\n  };\n\n  const uploadUrl = getInputValue(\"upload_url\");\n  const formId = getInputValue(\"form_id\");\n  const s3UploadDir = getInputValue(\"s3_upload_dir\");\n  const skipRequired = options.skipRequired ?? false;\n  const prefix = getPrefix();\n  const csrfToken = findInput(form, \"csrfmiddlewaretoken\", null)?.value;\n\n  if (!csrfToken) {\n    throw Error(\"Csrf token not found\");\n  }\n\n  if (!formId || !uploadUrl) {\n    return;\n  }\n\n  form.querySelectorAll(\".dff-uploader\").forEach(uploaderDiv => {\n    const container = uploaderDiv.querySelector(\".dff-container\");\n\n    if (!container) {\n      return;\n    }\n\n    const input = container.querySelector<HTMLInputElement>(\"input[type=file]\");\n\n    if (!(input && matchesPrefix(input.name))) {\n      return;\n    }\n\n    const fieldName = input.name;\n    const { multiple } = input;\n    const initial = getInitialFiles(fieldName);\n    const dataTranslations = container.getAttribute(\"data-translations\");\n    const translations: Translations = dataTranslations\n      ? (JSON.parse(dataTranslations) as Translations)\n      : {};\n    const supportDropArea = !(options.supportDropArea === false);\n\n    new FileField({\n      callbacks: options.callbacks ?? {},\n      chunkSize: options.chunkSize ?? 2621440,\n      csrfToken,\n      eventEmitter: options.eventEmitter,\n      fieldName,\n      form,\n      formId,\n      initial,\n      input,\n      multiple,\n      parent: container,\n      prefix,\n      retryDelays: options.retryDelays ?? null,\n      s3UploadDir: s3UploadDir ?? null,\n      skipRequired,\n      supportDropArea,\n      translations,\n      uploadUrl\n    });\n  });\n};\n\nexport default initUploadFields;\n","import autoInitFileForms from \"./auto_init_file_forms.ts\";\nimport initFormSet from \"./init_form_set.ts\";\nimport initUploadFields from \"./init_upload_fields.ts\";\n\ndeclare const window: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nwindow.autoInitFileForms = autoInitFileForms; // eslint-disable-line  @typescript-eslint/no-unsafe-member-access\nwindow.initFormSet = initFormSet; // eslint-disable-line  @typescript-eslint/no-unsafe-member-access\nwindow.initUploadFields = initUploadFields; // eslint-disable-line  @typescript-eslint/no-unsafe-member-access\n","import initUploadFields, { Options } from \"./init_upload_fields.ts\";\nimport {\n  getInputNameWithPrefix,\n  getInputValueForFormAndPrefix\n} from \"./util.ts\";\n\nconst initFormSet = (form: Element, optionsParam: Options | string): void => {\n  let options: Options;\n\n  if (typeof optionsParam === \"string\") {\n    options = { prefix: optionsParam };\n  } else {\n    options = optionsParam;\n  }\n\n  const prefix = options.prefix ?? \"form\";\n\n  const totalFormsValue = getInputValueForFormAndPrefix(\n    form,\n    \"TOTAL_FORMS\",\n    prefix\n  );\n\n  if (!totalFormsValue) {\n    return;\n  }\n\n  const formCount = parseInt(totalFormsValue, 10);\n\n  for (let i = 0; i < formCount; i += 1) {\n    const subFormPrefix = getInputNameWithPrefix(i.toString(), null);\n    initUploadFields(form, {\n      ...options,\n      prefix: `${prefix}-${subFormPrefix}`\n    });\n  }\n};\n\nexport default initFormSet;\n"],"names":["findForm","element","parent","parentElement","tagName","types","Object","freeze","_Mime_extensionToType","_Mime_typeToExtension","_Mime_typeToExtensions","__classPrivateFieldGet","this","receiver","state","kind","f","TypeError","has","call","value","get","WeakMap","mime","constructor","args","set","Map","arg","define","typeMap","force","type","extensions","entries","toLowerCase","map","ext","Set","allExtensions","first","extension","starred","startsWith","slice","add","currentType","Error","getType","path","last","replace","hasPath","length","getExtension","split","trim","getAllExtensions","_freeze","values","_getTestState","standardTypes","WIN_SLASH","WIN_NO_SLASH","DOT_LITERAL","SLASH_LITERAL","QMARK","END_ANCHOR","START_ANCHOR","DOTS_SLASH","POSIX_CHARS","PLUS_LITERAL","QMARK_LITERAL","ONE_CHAR","NO_DOT","NO_DOTS","NO_DOT_SLASH","NO_DOTS_SLASH","QMARK_NO_DOT","STAR","SEP","WINDOWS_CHARS","constants","MAX_LENGTH","POSIX_REGEX_SOURCE","alnum","alpha","ascii","blank","cntrl","digit","graph","lower","print","punct","space","upper","word","xdigit","REGEX_BACKSLASH","REGEX_NON_SPECIAL_CHARS","REGEX_SPECIAL_CHARS","REGEX_SPECIAL_CHARS_BACKREF","REGEX_SPECIAL_CHARS_GLOBAL","REGEX_REMOVE_BACKSLASH","REPLACEMENTS","CHAR_0","CHAR_9","CHAR_UPPERCASE_A","CHAR_LOWERCASE_A","CHAR_UPPERCASE_Z","CHAR_LOWERCASE_Z","CHAR_LEFT_PARENTHESES","CHAR_RIGHT_PARENTHESES","CHAR_ASTERISK","CHAR_AMPERSAND","CHAR_AT","CHAR_BACKWARD_SLASH","CHAR_CARRIAGE_RETURN","CHAR_CIRCUMFLEX_ACCENT","CHAR_COLON","CHAR_COMMA","CHAR_DOT","CHAR_DOUBLE_QUOTE","CHAR_EQUAL","CHAR_EXCLAMATION_MARK","CHAR_FORM_FEED","CHAR_FORWARD_SLASH","CHAR_GRAVE_ACCENT","CHAR_HASH","CHAR_HYPHEN_MINUS","CHAR_LEFT_ANGLE_BRACKET","CHAR_LEFT_CURLY_BRACE","CHAR_LEFT_SQUARE_BRACKET","CHAR_LINE_FEED","CHAR_NO_BREAK_SPACE","CHAR_PERCENT","CHAR_PLUS","CHAR_QUESTION_MARK","CHAR_RIGHT_ANGLE_BRACKET","CHAR_RIGHT_CURLY_BRACE","CHAR_RIGHT_SQUARE_BRACKET","CHAR_SEMICOLON","CHAR_SINGLE_QUOTE","CHAR_SPACE","CHAR_TAB","CHAR_UNDERSCORE","CHAR_VERTICAL_LINE","CHAR_ZERO_WIDTH_NOBREAK_SPACE","extglobChars","chars","open","close","globChars","win32","require$$0","exports","isObject","val","Array","isArray","hasRegexChars","str","test","isRegexChar","escapeRegex","toPosixSlashes","isWindows","navigator","platform","process","removeBackslashes","match","escapeLast","input","char","lastIdx","idx","lastIndexOf","removePrefix","output","prefix","wrapOutput","options","contains","negated","basename","windows","segs","utils","require$$1","isPathSeparator","code","depth","token","isPrefix","isGlobstar","Infinity","scan_1","opts","scanToEnd","parts","slashes","tokens","prev","index","start","lastIndex","isBrace","isBracket","isGlob","isExtglob","braceEscaped","backslashes","negatedExtglob","finished","braces","eos","advance","charCodeAt","next","noext","nonegate","noparen","push","base","glob","unescape","maxDepth","prevIndex","n","i","expandRange","sort","join","RegExp","ex","v","syntaxError","parse","max","maxLength","Math","min","len","SyntaxError","bos","prepend","capture","PLATFORM_CHARS","EXTGLOB_CHARS","globstar","dot","nodot","qmarkNoDot","star","bash","noextglob","consumed","backtrack","brackets","parens","quotes","extglobs","stack","peek","remaining","consume","num","append","negate","count","increment","decrement","pop","tok","extglob","inner","extglobOpen","conditions","extglobClose","rest","extglobStar","includes","expression","fastpaths","m","esc","repeat","exec","posix","pre","indexOf","keepQuotes","strictBrackets","nobracket","prevValue","literalBrackets","escaped","nobrace","outputIndex","tokensIndex","brace","dots","arr","range","unshift","comma","out","toks","t","regex","noglobstar","prior","before","isStart","afterStar","after","strictSlashes","end","suffix","slashDot","create","source","parse_1","scan","require$$2","require$$3","picomatch","returnState","fns","arrayMatcher","isMatch","isState","compileRe","makeRe","isIgnored","ignore","ignoreOpts","onMatch","onResult","matcher","returnObject","result","onIgnore","format","matchBase","Boolean","patterns","pattern","p","returnOutput","toRegex","parsed","flags","nocase","err","debug","picomatch_1","AcceptedFileTypes","inputAccept","mimeTypes","mimeType","filter","forEach","fileType","parseInputAccept","isAccepted","fileName","isMimeTypeAccepted","isExtensionAccepted","getFilesFromFileSystemEntry","async","entry","isFile","file","Promise","resolve","reject","fileEntry","getFileFromFileSystemFileEntry","isDirectory","entriesFromDirectory","directoryEntry","createReader","readEntries","getEntriesFromDirectory","files","getFilesFromFileSystemEntries","DropArea","_ref","container","onUploadFiles","renderer","acceptedFileTypes","addEventListener","classList","remove","e","preventDefault","onDrop","dragEvent","stopPropagation","dataTransfer","items","item","fileSystemEntry","webkitGetAsEntry","getAsFile","getFilesFromDataTransfer","acceptedFiles","invalidFiles","name","setErrorInvalidFiles","error","console","uploadFiles","matchHtmlRegExp","escapeHtml_1","string","escape","html","substring","getInputNameWithPrefix","fieldName","getInputNameWithoutPrefix","findInput","form","inputNameWithPrefix","querySelector","getUploadsFieldName","getInputValueForFormAndPrefix","RenderUploadFile","skipRequired","translations","createFilesContainer","errors","createErrorContainer","required","addNewUpload","filename","uploadIndex","div","addFile","progressSpan","document","createElement","className","innerSpan","appendChild","cancelLink","innerText","Cancel","setAttribute","toString","href","addUploadedFile","filesize","setSuccess","clearInput","deleteFile","findFileDiv","disableCancel","cancelSpan","findCancelSpan","disableDelete","deleteLink","findDeleteLink","removeDropHint","dropHint","renderDropHint","setDeleteFailed","setErrorMessage","enableDelete","setError","el","removeProgress","removeCancel","errorsMessages","msg","invalidFileTypeMessage","replaceChildren","size","fileSizeInfo","formatBytes","bytes","decimals","dm","floor","log","parseFloat","toFixed","Delete","updateProgress","percentage","innerProgressSpan","style","width","nameSpan","innerHTML","message","originalMessageSpan","span","BaseUpload$1","status","abort","delete","urlJoin","strArray","resultArray","shift","component","normalize","arguments","splice","S3Upload","BaseUpload","csrfToken","endpoint","s3UploadDir","super","key","uploadId","createdPromise","chunks","chunkState","uploading","onError","undefined","onProgress","onSuccess","initChunks","catch","xhr","encodeURIComponent","uploadIdEnc","headers","Headers","url","urljoin","fetch","method","then","response","json","abortMultipartUpload","getId","getInitialFile","id","original_name","getSize","createUpload","completeUpload","a","b","PartNumber","_ref2","body","JSON","stringify","data","completeMultipartUpload","handleError","_ref3","accept","contentType","createMultipartUpload","uploadParts","desiredChunkSize","ceil","minChunkSize","chunkSize","busy","done","uploaded","onPartComplete","etag","part","ETag","onPartProgress","sent","totalUploaded","reduce","c","uploadPart","_ref4","number","prepareUploadPart","uploadPartBytes","XMLHttpRequest","responseType","upload","ev","lengthComputable","loaded","target","getResponseHeader","send","need","every","candidates","DetailedError","causingErr","req","res","originalRequest","originalResponse","causingError","requestId","getHeader","getMethod","getURL","getStatus","getBody","_hasBuffer","Buffer","_TE","TextDecoder","TextEncoder","b64chs","prototype","b64tab","tab","b64re","_fromCC","String","fromCharCode","bind","_mkUriSafe","Uint8Array","from","src","m0","_tidyB64","s","btoaPolyfill","bin","u32","c0","c1","c2","asc","pad","_btoa","btoa","_fromUint8Array","u8a","strs","l","apply","subarray","cb_utob","cc","re_utob","utob","u","_encode","encode","urlsafe","atobPolyfill","u24","r1","r2","charAt","gBase64","requiresPort","port","protocol","qs","hasOwnProperty","decode","decodeURIComponent","querystringify_1","obj","pairs","isNaN","query","parser","controlOrWhitespace","CRHTLF","protocolre","windowsDriveLetter","trimLeft","rules","address","isSpecial","NaN","hash","lolcation","loc","location","window","global","self","finaldestination","Url","pathname","scheme","extractProtocol","forwardSlashes","otherSlashes","slashesCount","relative","extracted","instruction","instructions","concat","up","host","hostname","username","password","auth","origin","fn","ins","urlParse","PROTOCOL_TUS_V1","PROTOCOL_IETF_DRAFT_03","PROTOCOL_IETF_DRAFT_05","defaultOptions","uploadUrl","metadata","metadataForPartialUploads","fingerprint","uploadSize","onChunkComplete","onUploadUrlAvailable","overridePatchMethod","addRequestId","onBeforeRequest","onAfterResponse","onShouldRetry","defaultOnShouldRetry","Number","POSITIVE_INFINITY","retryDelays","parallelUploads","parallelUploadBoundaries","storeFingerprintForResuming","removeFingerprintOnSuccess","uploadLengthDeferred","uploadDataDuringCreation","urlStorage","fileReader","httpStack","_urlStorage","_req","_fingerprint","_urlStorageKey","_offset","_aborted","_size","_source","_retryAttempt","_retryTimeout","_offsetBeforeRetry","_parallelUploads","_parallelUploadUrls","terminate","openRequest","sendRequest","shouldRetry","delay","remainingDelays","newOptions","setTimeout","findPreviousUploads","findUploadsByFingerprint","resumeFromPreviousUpload","previousUpload","parallelUploadUrls","urlStorageKey","_emitError","optionName","openFile","_startParallelUpload","_startSingleUpload","totalSize","totalProgress","partCount","partSize","splitSizeIntoParts","uploads","lastPartProgress","newPartProgress","_emitProgress","_saveUploadInUrlStorage","all","_openRequest","setHeader","encodeMetadata","_sendRequest","inStatusCategory","_emitHttpError","resolveUrl","_emitSuccess","_resumeUpload","_createUpload","shouldTerminate","clearTimeout","_removeFromUrlStorage","lastResponse","bytesSent","bytesTotal","_emitChunkComplete","bytesAccepted","promise","_addChunkToRequest","_handleUploadResponse","_performUpload","offset","parseInt","setProgressHandler","valueSize","newSize","removeUpload","storedUpload","creationTime","Date","addUpload","Base64","category","createRequest","r","random","retryAttempt","online","onLine","isOnline","link","URL","isReactNative","product","FileSource","_file","PhoneGap","Cordova","cordova","chunk","reader","FileReader","onload","onerror","readAsArrayBuffer","blobOrArray","StreamSource","_buffer","_bufferOffset","_reader","_done","_readUntilEnoughDataOrDone","hasEnoughData","_getDataFromBuffer","read","Blob","hasAllDataBeenRead","cancel","Request","_xhr","_method","_url","_headers","header","setRequestHeader","progressHandler","onprogress","Response","getUnderlyingObject","responseText","hasStorage","originalValue","localStorage","getItem","setItem","removeItem","SECURITY_ERR","QUOTA_EXCEEDED_ERR","canStoreURLs","getName","uri","blob","isFinite","findAllUploads","results","_findEntries","round","_e","listAllUploads","_upload","exifHash","exif","hashCode","reactNativeFingerprint","lastModified","Upload","deleteUpload","TusUpload","formId","handleAfterReponse","addCsrTokenToRequest","handleProgress","handleSucces","request","_request","resourceId","bytesUploaded","BaseUploadedFile","PlaceholderFile","initialFile","ExistingFile","UploadedS3File","UploadedTusFile","FileField","callbacks","eventEmitter","initial","multiple","supportDropArea","disabled","nextUploadIndex","filesContainer","initDropArea","addInitialFiles","checkDropHint","onChange","handleClick","initialFiles","addInitialFile","createUploadedFile","emitEvent","eventName","emit","metaDataField","getMetaDataField","findUploadByName","find","getMetadataFieldName","getUploadByIndex","handleCancel","removeUploadFromList","getUpload","dataIndex","getAttribute","removeExistingUpload","onClick","handleInvalidFiles","handleSuccess","updatePlaceholderInput","onDelete","placeholdersInfo","uploadFile","existingUpload","newUploadIndex","initUploadFields","getPrefix","getInputValue","querySelectorAll","uploaderDiv","matchesPrefix","getInitialFiles","dataTranslations","autoInitFileForms","initFormSet","optionsParam","totalFormsValue","formCount","subFormPrefix"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5,6,7,8,9,12,16,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37]}