{"version":3,"file":"common-min-3996adb7.js","sources":["../../../src/api/common/Env.ts","../../../src/api/common/Logger.ts","../../packages/tutanota-utils/dist/Utils.js","../../packages/tutanota-utils/dist/DateUtils.js","../../packages/tutanota-utils/dist/ArrayUtils.js","../../packages/tutanota-utils/dist/MathUtils.js","../../packages/tutanota-utils/dist/PromiseUtils.js","../../../src/api/common/TutanotaConstants.ts","../../../src/api/common/utils/Utils.ts","../../packages/tutanota-utils/dist/Encoding.js","../../packages/tutanota-utils/dist/CollectionUtils.js","../../packages/tutanota-utils/dist/StringUtils.js","../../packages/tutanota-utils/dist/TypeRef.js","../../packages/tutanota-utils/dist/Csv.js","../../packages/tutanota-utils/dist/MapUtils.js","../../../src/api/common/error/RestError.ts","../../../src/api/common/error/TutanotaError.ts","../../../src/api/common/error/ProgrammingError.ts","../../packages/tutanota-utils/dist/AsyncResult.js","../../packages/tutanota-utils/dist/PromiseMap.js","../../packages/tutanota-utils/dist/LazyLoaded.js","../../packages/tutanota-utils/dist/SortedArray.js","../../libs/stream.js","../../../src/api/common/error/CryptoError.ts","../../../src/api/common/error/SessionKeyNotFoundError.ts","../../../src/api/common/error/RecipientsNotFoundError.ts","../../../src/api/common/error/RecipientNotResolvedError.ts","../../../src/api/common/error/OutOfSyncError.ts","../../../src/api/common/error/DbError.ts","../../../src/api/common/error/IndexingNotSupportedError.ts","../../../src/api/common/error/QuotaExceededError.ts","../../../src/api/common/error/CancelledError.ts","../../../src/api/common/error/FileOpenError.ts","../../../src/api/common/error/PermissionError.ts","../../../src/api/common/error/FileNotFoundError.ts","../../../src/api/common/error/DeviceStorageUnavailableError.ts","../../../src/api/common/error/MailBodyTooLargeError.ts","../../../src/api/common/error/CredentialAuthenticationError.ts","../../../src/api/common/error/KeyPermanentlyInvalidatedError.ts","../../../src/api/common/error/ImportError.ts","../../../src/api/common/error/WebauthnError.ts","../../../src/api/common/error/SuspensionError.ts","../../../src/api/common/error/LoginIncompleteError.ts","../../../src/api/common/error/OfflineDbClosedError.ts","../../../src/api/common/error/SseError.ts","../../../src/api/common/error/SetupMultipleError.ts","../../../src/api/common/error/ParsingError.ts","../../../src/api/common/error/InvalidDatabaseStateError.ts","../../../src/api/common/error/MembershipRemovedError.ts"],"sourcesContent":["//@bundleInto:common-min\n\nimport { ProgrammingError } from \"./error/ProgrammingError.js\"\n\n// keep in sync with LaunchHtml.js meta tag title\nexport const LOGIN_TITLE = \"Mail. Done. Right. Tutanota Login & Sign up for an Ad-free Mailbox\"\nexport const Mode: Record<EnvMode, EnvMode> = Object.freeze({\n\tBrowser: \"Browser\",\n\tApp: \"App\",\n\tTest: \"Test\",\n\tPlayground: \"Playground\",\n\tDesktop: \"Desktop\",\n\tAdmin: \"Admin\",\n})\n\nexport function getWebsocketOrigin(): string {\n\treturn (\n\t\tgetApiOrigin()\n\t\t\t// replaces http: with ws: and https: with wss:\n\t\t\t.replace(/^http/, \"ws\")\n\t\t\t// for ios app custom protocol\n\t\t\t.replace(/^api/, \"ws\")\n\t)\n}\n\n/** Returns the origin which should be used for API requests. */\nexport function getApiOrigin(): string {\n\tif (env.staticUrl) {\n\t\tif (isIOSApp()) {\n\t\t\t// http:// -> api:// and https:// -> apis://\n\t\t\treturn env.staticUrl.replace(/^http/, \"api\")\n\t\t} else {\n\t\t\treturn env.staticUrl\n\t\t}\n\t} else {\n\t\treturn location.protocol + \"//\" + location.hostname + (location.port ? \":\" + location.port : \"\")\n\t}\n}\n\n/**\n * root used for gift cards, referral links, and as the webauthn registered domain\n */\nexport function getWebRoot(): string {\n\tif (!env.staticUrl) {\n\t\treturn location.protocol + \"//\" + location.hostname + (location.port ? \":\" + location.port : \"\")\n\t}\n\n\tlet origin = env.staticUrl\n\tif (origin.startsWith(\"http://localhost:\") || origin.startsWith(\"https://local.tutanota.com:\")) {\n\t\torigin += \"/client/build\"\n\t}\n\treturn origin\n}\n\nexport function getPaymentWebRoot(): string {\n\tif (env.staticUrl === \"mail.tutanota.com\") {\n\t\treturn \"https://pay.tutanota.com\"\n\t} else if (env.staticUrl === \"test.tutanota.com\") {\n\t\treturn \"https://pay.test.tutanota.com\"\n\t} else {\n\t\treturn getWebRoot()\n\t}\n}\n\nexport function isTutanotaDomain(hostname: string): boolean {\n\t// *.tutanota.com or without dots (e.g. localhost). otherwise it is a custom domain\n\treturn hostname.endsWith(\"tutanota.com\") || hostname.indexOf(\".\") === -1\n}\n\nexport function isIOSApp(): boolean {\n\tif (isApp() && env.platformId == null) {\n\t\tthrow new ProgrammingError(\"PlatformId is not set!\")\n\t}\n\treturn env.mode === Mode.App && env.platformId === \"ios\"\n}\n\nexport function isAndroidApp(): boolean {\n\tif (isApp() && env.platformId == null) {\n\t\tthrow new ProgrammingError(\"PlatformId is not set!\")\n\t}\n\n\treturn env.mode === Mode.App && env.platformId === \"android\"\n}\n\nexport function isApp(): boolean {\n\treturn env.mode === Mode.App\n}\n\nexport function isDesktop(): boolean {\n\treturn env.mode === Mode.Desktop\n}\n\nexport function isBrowser(): boolean {\n\treturn env.mode === Mode.Browser\n}\n\nexport function ifDesktop<T>(obj: T | null): T | null {\n\treturn isDesktop() ? obj : null\n}\n\nlet worker = typeof WorkerGlobalScope !== \"undefined\" && self instanceof WorkerGlobalScope\nlet node = typeof process === \"object\" && typeof process.versions === \"object\" && typeof process.versions.node !== \"undefined\"\n\nexport function isMain(): boolean {\n\treturn !worker && !node\n}\n\nexport function isWebClient() {\n\treturn env.mode === Mode.Browser\n}\n\nexport function isAdminClient(): boolean {\n\treturn env.mode === Mode.Admin\n}\n\nexport function isElectronClient(): boolean {\n\treturn isDesktop() || isAdminClient()\n}\n\nexport function isMainOrNode(): boolean {\n\treturn !worker || node || env.mode === Mode.Test\n}\n\nexport function isWorkerOrNode(): boolean {\n\treturn worker || node || env.mode === Mode.Test\n}\n\nexport function isWorker(): boolean {\n\treturn worker\n}\n\nexport function isTest(): boolean {\n\treturn env.mode === Mode.Test\n}\n\nexport function isDesktopMainThread(): boolean {\n\treturn node && typeof env !== \"undefined\" && (env.mode === Mode.Desktop || env.mode === Mode.Admin)\n}\n\nlet boot = !isDesktopMainThread() && !isWorker()\n\n/**\n * A hackaround set by esbuild.\n * We have to bundle our project with esbuild now which puts everything together which means it won't be loaded at correct time and/or some thing might get\n * included where they shouldn't so for debug builds we set this flag to not take care of this.\n */\ndeclare var NO_THREAD_ASSERTIONS: boolean\nconst assertionsEnabled = typeof NO_THREAD_ASSERTIONS === \"undefined\" || !NO_THREAD_ASSERTIONS\n\nexport function assertMainOrNode() {\n\tif (!assertionsEnabled) return\n\n\tif (!isMainOrNode()) {\n\t\tthrow new Error(\"this code must not run in the worker thread\")\n\t}\n\n\tif (boot) {\n\t\tthrow new Error(\"this main code must not be loaded at boot time\")\n\t}\n}\n\nexport function assertMainOrNodeBoot() {\n\tif (!assertionsEnabled) return\n\n\tif (!isMainOrNode()) {\n\t\tthrow new Error(\"this code must not run in the worker thread\")\n\t}\n}\n\nexport function assertWorkerOrNode() {\n\tif (!assertionsEnabled) return\n\n\tif (!isWorkerOrNode()) {\n\t\tthrow new Error(\"this code must not run in the gui thread\")\n\t}\n}\n\nexport function bootFinished() {\n\tboot = false\n}\n\n/**\n * Whether or not we will be using an offline cache (doesn't take into account if credentials are stored)\n */\nexport function isOfflineStorageAvailable(): boolean {\n\treturn !isBrowser()\n}\n\nexport function assertOfflineStorageAvailable() {\n\tif (!isOfflineStorageAvailable()) {\n\t\tthrow new Error(\"Offline storage is not available\")\n\t}\n\treturn isDesktop()\n}\n","//@bundleInto:common-min\n\nimport { errorToString, stringToUtf8Uint8Array } from \"@tutao/tutanota-utils\"\nimport { DataFile } from \"./DataFile\"\n\nexport const LOG_SIZE = 1000\n\nexport class Logger {\n\t// Circular buffer with next writable position pointed by _index\n\t_entries: Array<Array<any>>\n\t_index: number\n\t_dateProvider: () => Date\n\n\tconstructor(dateProvider: () => Date = () => new Date()) {\n\t\tthis._entries = new Array(LOG_SIZE)\n\t\tthis._index = 0\n\t\tthis._dateProvider = dateProvider\n\t}\n\n\tlogInfo(...args: Array<any>) {\n\t\tthis.log(\"I\", args)\n\t}\n\n\tlogError(...args: Array<any>) {\n\t\tthis.log(\"E\", args)\n\t}\n\n\tlogWarn(...args: Array<any>) {\n\t\tthis.log(\"W\", args)\n\t}\n\n\tlog(level: string, args: Array<any>) {\n\t\tconst entry = [this._dateProvider(), level]\n\t\tentry.push(...args)\n\t\tthis._entries[this._index] = entry\n\t\tthis._index++\n\n\t\tif (this._index === LOG_SIZE) {\n\t\t\tthis._index = 0\n\t\t}\n\t}\n\n\tformatLogEntry(date: Date, level: string, ...rest: Array<any>): string {\n\t\tconst formattedArgs = rest.map((obj) => {\n\t\t\ttry {\n\t\t\t\treturn obj instanceof Error ? errorToString(Object.assign({ stack: null }, obj)) : JSON.stringify(obj)\n\t\t\t} catch (e) {\n\t\t\t\treturn \"[cyclic object]\"\n\t\t\t}\n\t\t})\n\t\tconst message = formattedArgs.join(\",\")\n\t\treturn `${date.toISOString()} ${level} ${message}`\n\t}\n\n\tgetEntries(): Array<string> {\n\t\tconst newerPart = this._entries.slice(0, this._index)\n\n\t\tconst olderPart = this._entries.slice(this._index)\n\n\t\treturn olderPart\n\t\t\t.concat(newerPart)\n\t\t\t.filter(Boolean)\n\t\t\t.map(([date, level, ...rest]) => {\n\t\t\t\treturn this.formatLogEntry(date, level, ...rest)\n\t\t\t})\n\t}\n}\n\nexport function createLogFile(content: string, scope: string, timestamp?: number): DataFile {\n\tconst data = stringToUtf8Uint8Array(content)\n\tconst timestampString = timestamp ? timestamp + \"_\" : \"\"\n\treturn {\n\t\t_type: \"DataFile\",\n\t\tname: timestampString + scope + \"_tutanota.log\",\n\t\tmimeType: \"text/plain\",\n\t\tdata,\n\t\tsize: data.byteLength,\n\t\tid: undefined,\n\t}\n}\n\nexport function replaceNativeLogger(global: any, loggerInstance: Logger, force: boolean = false) {\n\t// Replace native logger only when enabled because we lose line numbers\n\tif (force || global.env.dist || global.debug) {\n\t\tglobal.logger = loggerInstance\n\t\tconst globalConsole = global.console\n\t\tglobal.console = {\n\t\t\tlog(...args: any[]) {\n\t\t\t\tglobalConsole.log(...args)\n\t\t\t\tloggerInstance.logInfo(...args)\n\t\t\t},\n\n\t\t\twarn(...args: any[]) {\n\t\t\t\tglobalConsole.warn(...args)\n\t\t\t\tloggerInstance.logWarn(...args)\n\t\t\t},\n\n\t\t\terror(...args: any[]) {\n\t\t\t\tglobalConsole.error(...args)\n\t\t\t\tloggerInstance.logError(...args)\n\t\t\t},\n\n\t\t\ttrace(...args: any[]) {\n\t\t\t\tglobalConsole.trace(...args)\n\t\t\t},\n\t\t\tinfo(...args: any[]) {\n\t\t\t\tglobalConsole.info(...args)\n\t\t\t},\n\t\t}\n\t}\n}\n","import { TypeRef } from \"./TypeRef.js\";\nexport function defer() {\n    let ret = {};\n    ret.promise = new Promise((resolve, reject) => {\n        ret.resolve = resolve;\n        ret.reject = reject;\n    });\n    return ret;\n}\nexport function deferWithHandler(handler) {\n    const deferred = {};\n    deferred.promise = new Promise((resolve, reject) => {\n        deferred.resolve = resolve;\n        deferred.reject = reject;\n    }).then(handler);\n    return deferred;\n}\nexport async function asyncFind(array, finder) {\n    for (let i = 0; i < array.length; i++) {\n        const item = array[i];\n        if (await finder(item, i, array.length)) {\n            return item;\n        }\n    }\n    return null;\n}\nexport async function asyncFindAndMap(array, finder) {\n    for (let i = 0; i < array.length; i++) {\n        const item = array[i];\n        const mapped = await finder(item, i, array.length);\n        if (mapped) {\n            return mapped;\n        }\n    }\n    return null;\n}\n/**\n * Calls an executor function for slices of nbrOfElementsInGroup items of the given array until the executor function returns false.\n */\nexport function executeInGroups(array, nbrOfElementsInGroup, executor) {\n    if (array.length > 0) {\n        let nextSlice = Math.min(array.length, nbrOfElementsInGroup);\n        return executor(array.slice(0, nextSlice)).then((doContinue) => {\n            if (doContinue) {\n                return executeInGroups(array.slice(nextSlice), nbrOfElementsInGroup, executor);\n            }\n        });\n    }\n    else {\n        return Promise.resolve();\n    }\n}\nexport function neverNull(object) {\n    return object;\n}\n/**\n * returns its argument if it is not null, throws otherwise.\n * @param value the value to check\n * @param message optional error message\n */\nexport function assertNotNull(value, message = \"null\") {\n    if (value == null) {\n        throw new Error(\"AssertNotNull failed : \" + message);\n    }\n    return value;\n}\n/**\n * assertion function that only returns if the argument is non-null\n * (acts as a type guard)\n * @param value the value to check\n * @param message optional error message\n */\nexport function assertNonNull(value, message = \"null\") {\n    if (value == null) {\n        throw new Error(\"AssertNonNull failed: \" + message);\n    }\n}\nexport function isNotNull(t) {\n    return t != null;\n}\nexport function assert(assertion, message) {\n    if (!resolveMaybeLazy(assertion)) {\n        throw new Error(`Assertion failed: ${message}`);\n    }\n}\nexport function downcast(object) {\n    return object;\n}\nexport function clone(instance) {\n    if (instance instanceof Uint8Array) {\n        return downcast(instance.slice());\n    }\n    else if (instance instanceof Array) {\n        return downcast(instance.map((i) => clone(i)));\n    }\n    else if (instance instanceof Date) {\n        return new Date(instance.getTime());\n    }\n    else if (instance instanceof TypeRef) {\n        return instance;\n    }\n    else if (instance instanceof Object) {\n        // Can only pass null or Object, cannot pass undefined\n        const copy = Object.create(Object.getPrototypeOf(instance) || null);\n        Object.assign(copy, instance);\n        for (let key of Object.keys(copy)) {\n            copy[key] = clone(copy[key]);\n        }\n        return copy;\n    }\n    else {\n        return instance;\n    }\n}\n/**\n * Function which accepts another function. On first invocation\n * of this resulting function result will be remembered and returned\n * on consequent invocations.\n */\nexport function lazyMemoized(source) {\n    // Using separate variable for tracking because value can be undefined and we want to the function call only once\n    let cached = false;\n    let value;\n    return () => {\n        if (cached) {\n            return value;\n        }\n        else {\n            cached = true;\n            return (value = source());\n        }\n    };\n}\n/**\n * accept a function taking exactly one argument and returning nothing and return a version of it\n * that will call the original function on the first call and ignore any further calls.\n * @param fn a function taking one argument and returning nothing\n */\nexport function makeSingleUse(fn) {\n    let called = false;\n    return (arg) => {\n        if (!called) {\n            called = true;\n            fn(arg);\n        }\n    };\n}\n/**\n * Returns a cached version of {@param fn}.\n * Cached function checks that argument is the same (with ===) and if it is then it returns the cached result.\n * If the cached argument has changed then {@param fn} will be called with new argument and result will be cached again.\n * Only remembers the last argument.\n */\nexport function memoized(fn) {\n    let lastArg;\n    let lastResult;\n    let didCache = false;\n    return (arg) => {\n        if (!didCache || arg !== lastArg) {\n            lastArg = arg;\n            didCache = true;\n            lastResult = fn(arg);\n        }\n        return lastResult;\n    };\n}\n/**\n * Like {@link memoized} but the argument is passed in via {@param argumentProvider}.\n * Useful for the cases where we want to keep only one field around e.g. for lazy getters\n */\nexport function memoizedWithHiddenArgument(argumentProvider, computationFunction) {\n    const memoizedComputation = memoized(computationFunction);\n    return () => memoizedComputation(argumentProvider());\n}\n/**\n * Function which returns what was passed into it\n */\nexport function identity(t) {\n    return t;\n}\n/**\n * Function which does nothing.\n */\nexport function noOp() { }\n/**\n * Return a function, which executed {@param toThrottle} only after it is not invoked for {@param timeout} ms.\n * Executes function with the last passed arguments\n * @return {Function}\n */\nexport function debounce(timeout, toThrottle) {\n    let timeoutId;\n    let toInvoke;\n    return downcast((...args) => {\n        if (timeoutId) {\n            clearTimeout(timeoutId);\n        }\n        toInvoke = toThrottle.bind(null, ...args);\n        timeoutId = setTimeout(toInvoke, timeout);\n    });\n}\n/**\n * Returns a debounced function. When invoked for the first time, will just invoke\n * {@param toThrottle}. On subsequent invocations it will either invoke it right away\n * (if {@param timeout} has passed) or will schedule it to be run after {@param timeout}.\n * So the first and the last invocations in a series of invocations always take place\n * but ones in the middle (which happen too often) are discarded.}\n */\nexport function debounceStart(timeout, toThrottle) {\n    let timeoutId;\n    let lastInvoked = 0;\n    return downcast((...args) => {\n        if (Date.now() - lastInvoked < timeout) {\n            timeoutId && clearTimeout(timeoutId);\n            timeoutId = setTimeout(() => {\n                timeoutId = null;\n                toThrottle.apply(null, args);\n            }, timeout);\n        }\n        else {\n            toThrottle.apply(null, args);\n        }\n        lastInvoked = Date.now();\n    });\n}\nexport function randomIntFromInterval(min, max) {\n    return Math.floor(Math.random() * (max - min + 1) + min);\n}\nexport function errorToString(error) {\n    let errorString = error.name ? error.name : \"?\";\n    if (error.message) {\n        errorString += `\\n Error message: ${error.message}`;\n    }\n    if (error.stack) {\n        // the error id is included in the stacktrace\n        errorString += `\\nStacktrace: \\n${error.stack}`;\n    }\n    return errorString;\n}\n/**\n * Like {@link Object.entries} but preserves the type of the key and value\n */\nexport function objectEntries(object) {\n    return downcast(Object.entries(object));\n}\n/**\n * modified deepEquals from ospec is only needed as long as we use custom classes (TypeRef) and Date is not properly handled\n */\nexport function deepEqual(a, b) {\n    if (a === b)\n        return true;\n    if (xor(a === null, b === null) || xor(a === undefined, b === undefined))\n        return false;\n    if (typeof a === \"object\" && typeof b === \"object\") {\n        const aIsArgs = isArguments(a), bIsArgs = isArguments(b);\n        if (a.length === b.length && ((a instanceof Array && b instanceof Array) || (aIsArgs && bIsArgs))) {\n            const aKeys = Object.getOwnPropertyNames(a), bKeys = Object.getOwnPropertyNames(b);\n            if (aKeys.length !== bKeys.length)\n                return false;\n            for (let i = 0; i < aKeys.length; i++) {\n                if (!hasOwn.call(b, aKeys[i]) || !deepEqual(a[aKeys[i]], b[aKeys[i]]))\n                    return false;\n            }\n            return true;\n        }\n        if (a instanceof Date && b instanceof Date)\n            return a.getTime() === b.getTime();\n        if (a instanceof Object && b instanceof Object && !aIsArgs && !bIsArgs) {\n            for (let i in a) {\n                if (!(i in b) || !deepEqual(a[i], b[i]))\n                    return false;\n            }\n            for (let i in b) {\n                if (!(i in a))\n                    return false;\n            }\n            return true;\n        }\n        // @ts-ignore: we would need to include all @types/node for this to work or import it explicitly. Should probably be rewritten for all typed arrays.\n        if (typeof Buffer === \"function\" && a instanceof Buffer && b instanceof Buffer) {\n            for (let i = 0; i < a.length; i++) {\n                if (a[i] !== b[i])\n                    return false;\n            }\n            return true;\n        }\n        if (a.valueOf() === b.valueOf())\n            return true;\n    }\n    return false;\n}\nfunction xor(a, b) {\n    const aBool = !!a;\n    const bBool = !!b;\n    return (aBool && !bBool) || (bBool && !aBool);\n}\nfunction isArguments(a) {\n    if (\"callee\" in a) {\n        for (let i in a)\n            if (i === \"callee\")\n                return false;\n        return true;\n    }\n}\nconst hasOwn = {}.hasOwnProperty;\n/**\n * returns an array of top-level properties that are in both objA and objB, but differ in value\n * does not handle functions or circular references\n * treats undefined and null as equal\n */\nexport function getChangedProps(objA, objB) {\n    if (objA == null || objB == null || objA === objB)\n        return [];\n    return Object.keys(objA)\n        .filter((k) => Object.keys(objB).includes(k))\n        .filter((k) => ![null, undefined].includes(objA[k]) || ![null, undefined].includes(objB[k]))\n        .filter((k) => !deepEqual(objA[k], objB[k]));\n}\n/**\n * Disallow set, delete and clear on Map.\n * Important: It is *not* a deep freeze.\n * @param myMap\n * @return {unknown}\n */\nexport function freezeMap(myMap) {\n    function mapSet(key, value) {\n        throw new Error(\"Can't add property \" + key + \", map is not extensible\");\n    }\n    function mapDelete(key) {\n        throw new Error(\"Can't delete property \" + key + \", map is frozen\");\n    }\n    function mapClear() {\n        throw new Error(\"Can't clear map, map is frozen\");\n    }\n    const anyMap = downcast(myMap);\n    anyMap.set = mapSet;\n    anyMap.delete = mapDelete;\n    anyMap.clear = mapClear;\n    Object.freeze(anyMap);\n    return anyMap;\n}\nexport function addressDomain(senderAddress) {\n    return senderAddress.slice(senderAddress.lastIndexOf(\"@\") + 1);\n}\n/**\n * Ignores the fact that Object.keys returns also not owned properties.\n */\nexport function typedKeys(obj) {\n    return downcast(Object.keys(obj));\n}\n/**\n * Ignores the fact that Object.keys returns also not owned properties.\n */\nexport function typedEntries(obj) {\n    return downcast(Object.entries(obj));\n}\n/**\n * Ignores the fact that Object.keys returns also not owned properties.\n */\nexport function typedValues(obj) {\n    return downcast(Object.values(obj));\n}\nexport function resolveMaybeLazy(maybe) {\n    return typeof maybe === \"function\" ? maybe() : maybe;\n}\nexport function getAsLazy(maybe) {\n    return typeof maybe === \"function\" ? downcast(maybe) : () => maybe;\n}\nexport function mapLazily(maybe, mapping) {\n    return () => mapping(resolveMaybeLazy(maybe));\n}\n/**\n * Stricter version of parseInt() from MDN. parseInt() allows some arbitrary characters at the end of the string.\n * Returns NaN in case there's anything non-number in the string.\n */\nexport function filterInt(value) {\n    if (/^\\d+$/.test(value)) {\n        return parseInt(value, 10);\n    }\n    else {\n        return NaN;\n    }\n}\nexport function insideRect(point, rect) {\n    return point.x >= rect.left && point.x < rect.right && point.y >= rect.top && point.y < rect.bottom;\n}\n/**\n * If val is non null, returns the result of val passed to action, else null\n */\nexport function mapNullable(val, action) {\n    if (val != null) {\n        const result = action(val);\n        if (result != null) {\n            return result;\n        }\n    }\n    return null;\n}\nexport function mapObject(mapper, obj) {\n    const newObj = {};\n    for (const key of Object.keys(obj)) {\n        const typedKey = key;\n        newObj[typedKey] = mapper(obj[typedKey]);\n    }\n    return newObj;\n}\n","/**\n * @file DateUtils which do not use Luxon. Used in worker as well as in client parts.\n * As functions here do not use Luxon it cannot be used for calculating things in different time zones, they\n * are dependent on the system time zone.\n */\nexport const DAY_IN_MILLIS = 1000 * 60 * 60 * 24;\n/**\n * dates from before this year have negative timestamps and are currently considered edge cases\n */\nexport const TIMESTAMP_ZERO_YEAR = 1970;\n/**\n * Provides a date representing the beginning of the next day of the given date in local time.\n */\nexport function getStartOfNextDay(date) {\n    let d = new Date(date.getTime());\n    d.setDate(date.getDate() + 1);\n    d.setHours(0, 0, 0, 0); // sets the beginning of the day in local time\n    return d;\n}\n/**\n * Provides a date representing the end of the given date in local time.\n */\nexport function getEndOfDay(date) {\n    let d = new Date(date.getTime());\n    d.setHours(23, 59, 59, 999);\n    return d;\n}\n/**\n * Provides a date representing the beginning of the given date in local time.\n */\nexport function getStartOfDay(date) {\n    return getHourOfDay(date, 0);\n}\n/**\n * Provides a date representing the day of the given date at the given hour in local time.\n */\nexport function getHourOfDay(date, hour) {\n    let d = new Date(date.getTime());\n    d.setHours(hour, 0, 0, 0);\n    return d;\n}\nexport function isStartOfDay(date) {\n    return date.getHours() === 0 && date.getMinutes() === 0;\n}\n/**\n * Returns true if the given date is today in local time.\n */\nexport function isToday(date) {\n    return new Date().toDateString() === date.toDateString();\n}\n/**\n * Returns true if the given dates represent the same day (time of day is ignored).\n */\nexport function isSameDay(date1, date2) {\n    return date1.toDateString() === date2.toDateString();\n}\n/**\n * Creates new date in with {@param days} added to it as if the days are just fixed\n * periods of time and are not subject to daylight saving.\n */\nexport function getDayShifted(date, days) {\n    return new Date(date.getTime() + days * DAY_IN_MILLIS);\n}\n/**\n * Increment the date in place and return it\n */\nexport function incrementDate(date, byValue) {\n    date.setDate(date.getDate() + byValue);\n    return date;\n}\nexport function incrementMonth(d, byValue) {\n    const date = new Date(d);\n    date.setMonth(date.getMonth() + byValue);\n    return date;\n}\nexport function isSameDayOfDate(date1, date2) {\n    return ((!date1 && !date2) ||\n        (date1 != null &&\n            date2 != null &&\n            date1.getFullYear() === date2.getFullYear() &&\n            date1.getMonth() === date2.getMonth() &&\n            date1.getDate() === date2.getDate()));\n}\n/**\n * Formats as yyyy-mm-dd\n */\nexport function formatSortableDate(date) {\n    const month = (\"0\" + (date.getMonth() + 1)).slice(-2);\n    const day = (\"0\" + date.getDate()).slice(-2);\n    return `${date.getFullYear()}-${month}-${day}`;\n}\n/**\n * Formats as yyyy-mm-dd-<hh>h-<mm>m-<ss>\n */\nexport function formatSortableDateTime(date) {\n    const hours = (\"0\" + date.getHours()).slice(-2);\n    const minutes = (\"0\" + date.getMinutes()).slice(-2);\n    const seconds = (\"0\" + date.getSeconds()).slice(-2);\n    return `${formatSortableDate(date)}-${hours}h${minutes}m${seconds}s`;\n}\n/**\n * @returns {string} sortableDateTime of the current time\n */\nexport function sortableTimestamp() {\n    return formatSortableDateTime(new Date());\n}\nexport function isValidDate(date) {\n    return !isNaN(date.getTime());\n}\n/**\n * not interested in any fancy calendar edge cases, only use this where approximation is ok\n */\nexport function millisToDays(millis) {\n    return millis / DAY_IN_MILLIS;\n}\nexport function daysToMillis(days) {\n    return days * DAY_IN_MILLIS;\n}\n","import { downcast, identity, neverNull } from \"./Utils.js\";\nimport { getFromMap } from \"./MapUtils.js\";\nexport function concat(...arrays) {\n    let length = arrays.reduce((previous, current) => previous + current.length, 0);\n    let result = new Uint8Array(length);\n    let index = 0;\n    arrays.forEach((array) => {\n        result.set(array, index);\n        index += array.length;\n    });\n    return result;\n}\n/**\n * Create an array filled with the numbers min..max (inclusive)\n */\nexport function numberRange(min, max) {\n    return [...Array(max + 1).keys()].slice(min);\n}\n/**\n * Compares two arrays for equality based on ===.\n * @param {Array} a1 The first array.\n * @param {Array} a2 The second array.\n * @return {boolean} True if the arrays are equal, false otherwise.\n *\n * It is valid to compare Uint8Array to Array<T>, don't restrict it to be one type\n */\nexport function arrayEquals(a1, a2) {\n    if (a1 === a2) {\n        return true;\n    }\n    if (a1.length === a2.length) {\n        for (let i = 0; i < a1.length; i++) {\n            if (a1[i] !== a2[i]) {\n                return false;\n            }\n        }\n        return true;\n    }\n    return false;\n}\n/**\n * Compares two arrays for equality based on a predicate\n * @param a1\n * @param a2\n * @param predicate\n * @returns {boolean}\n */\nexport function arrayEqualsWithPredicate(a1, a2, predicate) {\n    if (a1.length === a2.length) {\n        for (let i = 0; i < a1.length; i++) {\n            if (!predicate(a1[i], a2[i])) {\n                return false;\n            }\n        }\n        return true;\n    }\n    return false;\n}\nexport function arrayHash(array) {\n    let hash = 0;\n    hash |= 0;\n    for (let i = 0; i < array.length; i++) {\n        hash = (hash << 5) - hash + array[i];\n        hash |= 0; // Convert to 32bit integer\n    }\n    return hash;\n}\n/**\n * Remove the element from theArray if it is contained in the array.\n * @param theArray The array to remove the element from.\n * @param elementToRemove The element to remove from the array.\n * @return True if the element was removed, false otherwise.\n */\nexport function remove(theArray, elementToRemove) {\n    let i = theArray.indexOf(elementToRemove);\n    if (i !== -1) {\n        theArray.splice(i, 1);\n        return true;\n    }\n    else {\n        return false;\n    }\n}\n/**\n * truncates the array and discards all elements\n */\nexport function clear(theArray) {\n    theArray.length = 0;\n}\n/**\n * Find all items in an array that pass the given predicate\n */\nexport function findAll(theArray, finder) {\n    const found = [];\n    for (let element of theArray) {\n        if (finder(element)) {\n            found.push(element);\n        }\n    }\n    return found;\n}\n/**\n * @param theArray\n * @param finder\n * @return {boolean} if the element was found\n */\nexport function findAndRemove(theArray, finder) {\n    const index = theArray.findIndex(finder);\n    if (index !== -1) {\n        theArray.splice(index, 1);\n        return true;\n    }\n    else {\n        return false;\n    }\n}\nexport function findAllAndRemove(theArray, finder, startIndex = 0) {\n    var removedElement = false;\n    for (let i = theArray.length - 1; i >= startIndex; i--) {\n        if (finder(theArray[i])) {\n            theArray.splice(i, 1);\n            removedElement = true;\n        }\n    }\n    return removedElement;\n}\nexport function replace(theArray, oldElement, newElement) {\n    let i = theArray.indexOf(oldElement);\n    if (i !== -1) {\n        theArray.splice(i, 1, newElement);\n        return true;\n    }\n    else {\n        return false;\n    }\n}\n/**\n * Same as filterMap in some languages. Apply mapper and then only include non-nullable items.\n */\nexport function mapAndFilterNull(array, mapper) {\n    const resultList = [];\n    for (const item of array) {\n        const resultItem = mapper(item);\n        if (resultItem != null) {\n            resultList.push(resultItem);\n        }\n    }\n    return resultList;\n}\nexport function filterNull(array) {\n    return downcast(array.filter((item) => item != null));\n}\n/**\n * Provides the last element of the given array.\n * @param theArray The array.\n * @return The last element of the array.\n */\nexport function last(theArray) {\n    return theArray[theArray.length - 1];\n}\nexport function isEmpty(array) {\n    return array.length === 0;\n}\nexport function lastThrow(array) {\n    if (isEmpty(array)) {\n        throw new RangeError(\"Array is empty\");\n    }\n    return neverNull(last(array));\n}\n/**\n * get first item or throw if there is none\n */\nexport function getFirstOrThrow(array) {\n    if (isEmpty(array)) {\n        throw new RangeError(\"Array is empty\");\n    }\n    return array[0];\n}\nexport function first(array) {\n    return array[0] || null;\n}\nexport function findLast(array, predicate) {\n    const index = findLastIndex(array, predicate);\n    if (index !== -1) {\n        return array[index];\n    }\n    return null;\n}\nexport function findLastIndex(array, predicate) {\n    for (let i = array.length - 1; i >= 0; i--) {\n        if (predicate(array[i])) {\n            return i;\n        }\n    }\n    return -1;\n}\nexport function contains(theArray, elementToCheck) {\n    return theArray.indexOf(elementToCheck) !== -1;\n}\n/**\n * count how many of the items in {@param theArray} return true when passed to the predicate {@param pred}\n */\nexport function count(theArray, pred) {\n    return theArray.reduce((acc, next) => (pred(next) ? ++acc : acc), 0);\n}\nexport function addAll(array, elements) {\n    array.push(...elements);\n}\nexport function removeAll(array, elements) {\n    elements.forEach((element) => {\n        remove(array, element);\n    });\n}\n/**\n * Group an array based on the given discriminator, but each group will have only unique items\n */\nexport function groupByAndMapUniquely(iterable, discriminator, mapper) {\n    const map = new Map();\n    for (let el of iterable) {\n        const key = discriminator(el);\n        getFromMap(map, key, () => new Set()).add(mapper(el));\n    }\n    return map;\n}\n/**\n * convert an Array of T's into a Map of Arrays of E's by\n * * grouping them based on a discriminator\n * * mapping them from T to E\n * @param iterable the array to split into groups\n * @param discriminator a function that produces the keys to group the elements by\n * @param mapper a function that maps the array elements before they get added to the group\n * @returns {Map<R, Array<E>>}\n */\nexport function groupByAndMap(iterable, discriminator, mapper) {\n    const map = new Map();\n    for (let el of iterable) {\n        const key = discriminator(el);\n        getFromMap(map, key, () => []).push(mapper(el));\n    }\n    return map;\n}\n/**\n * Group array elements based on keys produced by a discriminator\n * @param iterable the array to split into groups\n * @param discriminator a function that produces the keys to group the elements by\n * @returns {NodeJS.Global.Map<R, Array<T>>}\n */\nexport function groupBy(iterable, discriminator) {\n    return groupByAndMap(iterable, discriminator, identity);\n}\n/**\n * split an array into chunks of a given size.\n * the last chunk will be smaller if there are less than chunkSize elements left.\n * @param chunkSize\n * @param array\n * @returns {Array<Array<T>>}\n */\nexport function splitInChunks(chunkSize, array) {\n    return downcast(_chunk(chunkSize, array));\n}\nexport function splitUint8ArrayInChunks(chunkSize, array) {\n    return downcast(_chunk(chunkSize, array));\n}\nfunction _chunk(chunkSize, array) {\n    if (chunkSize < 1) {\n        return [];\n    }\n    let chunkNum = 0;\n    const chunks = [];\n    let end;\n    do {\n        let start = chunkNum * chunkSize;\n        end = start + chunkSize;\n        chunks[chunkNum] = array.slice(start, end);\n        chunkNum++;\n    } while (end < array.length);\n    return chunks;\n}\nexport function flat(arrays) {\n    return arrays.flat();\n}\n/**\n * Maps an array into a nested array and then flattens it\n * @param array\n * @param mapper\n * @returns {T|*[]}\n */\nexport function flatMap(array, mapper) {\n    const result = [];\n    for (const item of array) {\n        const mapped = mapper(item);\n        result.push(...mapped);\n    }\n    return result;\n}\n/**\n * Inserts element into the sorted array. Will find <b>the last</b> matching position.\n * Might add or replace element based on {@param replaceIf} identity check.\n * Equality per {@param comparator} is precondition for replacement.\n * @param element to place\n * @param array where element should be placed\n * @param comparator for sorting\n * @param replaceIf identity comparison for replacement\n */\nexport function insertIntoSortedArray(element, array, comparator, replaceIf = () => false) {\n    let i = 0;\n    while (i < array.length) {\n        const compareResult = comparator(array[i], element);\n        // We need to check for replacement for each element that is equal or we might miss it\n        if (compareResult === 0 && replaceIf(element, array[i])) {\n            array.splice(i, 1, element);\n            return;\n        }\n        else if (compareResult <= 0) {\n            // We continue searching until the last suitable position\n            i++;\n        }\n        else {\n            break;\n        }\n    }\n    // This also handles empty array\n    array.splice(i, 0, element);\n}\nexport function zip(arr1, arr2) {\n    const zipped = [];\n    for (let i = 0; i < Math.min(arr1.length, arr2.length); i++) {\n        zipped.push([arr1[i], arr2[i]]);\n    }\n    return zipped;\n}\nexport function deduplicate(arr, comp = (a, b) => a === b) {\n    const deduplicated = [];\n    arr.forEach((a) => {\n        const isDuplicate = deduplicated.some((b) => comp(a, b));\n        if (!isDuplicate) {\n            deduplicated.push(a);\n        }\n    });\n    return deduplicated;\n}\n/**\n * http://jsfiddle.net/aryzhov/pkfst550/\n * Binary search in JavaScript.\n * Returns the index of the element in a sorted array or (-n-1) where n is the insertion point for the new element.\n * Parameters:\n *     array - A sorted array\n *     element - An element to search for\n *     compareFn - A comparator function. The function takes two arguments: (a, b) and returns:\n *        a negative number  if a is less than b;\n *        0 if a is equal to b;\n *        a positive number of a is greater than b.\n * The array may contain duplicate elements. If there are more than one equal elements in the array,\n * the returned value can be the index of any one of the equal elements.\n */\nexport function binarySearch(array, element, compareFn) {\n    let m = 0;\n    let n = array.length - 1;\n    while (m <= n) {\n        const k = (n + m) >> 1;\n        const cmp = compareFn(element, array[k]);\n        if (cmp > 0) {\n            m = k + 1;\n        }\n        else if (cmp < 0) {\n            n = k - 1;\n        }\n        else {\n            return k;\n        }\n    }\n    return -m - 1;\n}\nexport function lastIndex(array) {\n    if (array.length === 0) {\n        return 0;\n    }\n    else {\n        return array.length - 1;\n    }\n}\n/**\n * All of the elements in all of the arguments combined, and deduplicated\n */\nexport function union(...iterables) {\n    return new Set(...iterables.map((iterable) => Array.from(iterable)));\n}\n/**\n * return a new array containing every item from array1 that isn't in array2\n * @template T\n * @param array1\n * @param array2\n * @param compare: compare items in the array for equality\n * @returns {Array<T>}\n */\nexport function difference(array1, array2, compare = (a, b) => a === b) {\n    return array1.filter((element1) => !array2.some((element2) => compare(element1, element2)));\n}\n/**\n * Returns a set with elements that are *not* in both sets.\n *\n * {a, b, c} △ {b, c, d} == {a, d}\n */\nexport function symmetricDifference(set1, set2) {\n    const diff = new Set();\n    for (const el of set1) {\n        if (!set2.has(el)) {\n            diff.add(el);\n        }\n    }\n    for (const el of set2) {\n        if (!set1.has(el)) {\n            diff.add(el);\n        }\n    }\n    return diff;\n}\n/**\n * Splits an array into two based on a predicate, where elements that match the predicate go into the left side\n * @param array\n * @param predicate\n */\nexport function partition(array, predicate) {\n    const left = [];\n    const right = [];\n    for (let item of array) {\n        if (predicate(item)) {\n            left.push(item);\n        }\n        else {\n            right.push(item);\n        }\n    }\n    return [left, right];\n}\n/**\n * like partition(), but async\n * rejects if any of the predicates reject.\n * @param array\n * @param predicate\n */\nexport async function partitionAsync(array, predicate) {\n    const mask = await Promise.all(array.map(predicate));\n    const [left, right] = partition(zip(mask, array), (item) => item[0]);\n    return [left.map((i) => i[1]), right.map((i) => i[1])];\n}\n/**\n * Create an array with n elements by calling the provided factory\n */\nexport function arrayOf(n, factory) {\n    return numberRange(0, n - 1).map(factory);\n}\n","export function mod(n, m) {\n    return ((n % m) + m) % m;\n}\n/**\n * Clamp value to between min and max (inclusive)\n */\nexport function clamp(value, min, max) {\n    return Math.max(min, Math.min(value, max));\n}\n","import { pMap as promiseMap } from \"./PromiseMap.js\";\n/**\n * Map array of values to promise of arrays or array. Mapper function may return promise or value. If value is returned,\n * we avoid promise scheduling.\n *\n * This is needed to run the whole operation in one microtask (e.g. keep IndexedDB transaction active, which is closed in\n * some browsers (e.g. Safari) when event loop iteration ends).\n */\nexport function mapInCallContext(values, callback) {\n    return new PromisableWrapper(_mapInCallContext(values, callback, 0, []));\n}\nfunction _mapInCallContext(values, callback, index, acc) {\n    if (index >= values.length) {\n        return acc;\n    }\n    let mappedValue = callback(values[index], index);\n    if (mappedValue instanceof Promise) {\n        return mappedValue.then((v) => {\n            acc.push(v);\n            return _mapInCallContext(values, callback, index + 1, acc);\n        });\n    }\n    else {\n        acc.push(mappedValue);\n        return _mapInCallContext(values, callback, index + 1, acc);\n    }\n}\nexport { pMap as promiseMap } from \"./PromiseMap.js\";\nfunction mapNoFallback(values, callback, options) {\n    return PromisableWrapper.from(promiseMap(values, callback, options));\n}\n/** Factory function which gives you ack promiseMap implementation. {@see mapInCallContext} for what it means. */\nexport function promiseMapCompat(useMapInCallContext) {\n    return useMapInCallContext ? mapInCallContext : mapNoFallback;\n}\nfunction flatWrapper(value) {\n    return value instanceof PromisableWrapper ? value.value : value;\n}\n// It kinda implements 'thenable' protocol so you can freely pass it around as a generic promise\nexport class PromisableWrapper {\n    static from(value) {\n        return new PromisableWrapper(value);\n    }\n    constructor(value) {\n        this.value = value instanceof Promise ? value.then(flatWrapper) : flatWrapper(value);\n    }\n    thenOrApply(onFulfill, onReject) {\n        if (this.value instanceof Promise) {\n            const v = this.value.then(onFulfill, onReject);\n            return new PromisableWrapper(v);\n        }\n        else {\n            try {\n                return new PromisableWrapper(onFulfill(this.value));\n            }\n            catch (e) {\n                if (onReject) {\n                    return new PromisableWrapper(onReject(e));\n                }\n                throw e;\n            }\n        }\n    }\n    toPromise() {\n        return Promise.resolve(this.value);\n    }\n}\nexport function delay(ms) {\n    if (Number.isNaN(ms) || ms < 0) {\n        throw new Error(`Invalid delay: ${ms}`);\n    }\n    return new Promise((resolve) => {\n        setTimeout(resolve, ms);\n    });\n}\n/**\n * Pass to Promise.then to perform an action while forwarding on the result\n * @param action\n */\nexport function tap(action) {\n    return function (value) {\n        action(value);\n        return value;\n    };\n}\n/**\n * Helper utility intended to be used with typed exceptions and .catch() method of promise like so:\n *\n * ```js\n *  class SpecificError extends Error {}\n *\n *  Promise.reject(new SpecificError())\n *      .catch(ofClass(SpecificError, (e) => console.log(\"some error\", e)))\n *      .catch((e) => console.log(\"generic error\", e))\n * ```\n *\n * @param cls Class which will be caught\n * @param catcher to handle only errors of type cls\n * @returns handler which either forwards to catcher or rethrows\n */\nexport function ofClass(cls, catcher) {\n    return async (e) => {\n        if (e instanceof cls) {\n            return catcher(e);\n        }\n        else {\n            // It's okay to rethrow because:\n            // 1. It preserves the original stacktrace\n            // 2. Because of 1. it is not that expensive\n            throw e;\n        }\n    };\n}\n/**\n * Filter iterable. Just like Array.prototype.filter but callback can return promises\n */\nexport async function promiseFilter(iterable, filter) {\n    let index = 0;\n    const result = [];\n    for (let item of iterable) {\n        if (await filter(item, index)) {\n            result.push(item);\n        }\n        index++;\n    }\n    return result;\n}\n/** Call the handler for both resolution and rejection. Unlike finally() will not propagate the error. */\nexport function settledThen(promise, handler) {\n    return promise.then(handler, handler);\n}\n","//@bundleInto:common-min\n\nimport { downcast } from \"@tutao/tutanota-utils\"\nimport type { CertificateInfo, CreditCard, EmailSenderListElement, GroupMembership } from \"../entities/sys/TypeRefs.js\"\nimport { AccountingInfo, Customer } from \"../entities/sys/TypeRefs.js\"\nimport type { CalendarEventAttendee, UserSettingsGroupRoot } from \"../entities/tutanota/TypeRefs.js\"\nimport { ContactSocialId, MailFolder } from \"../entities/tutanota/TypeRefs.js\"\nimport { isApp, isElectronClient } from \"./Env\"\nimport type { Country } from \"./CountryList\"\nimport { ProgrammingError } from \"./error/ProgrammingError\"\n\nexport const MAX_NBR_MOVE_DELETE_MAIL_SERVICE = 50\n\n// visible for testing\nexport const MAX_BLOB_SIZE_BYTES = 1024 * 1024 * 10\nexport const REQUEST_SIZE_LIMIT_DEFAULT = 1024 * 1024\nexport const REQUEST_SIZE_LIMIT_MAP: Map<string, number> = new Map([\n\t[\"/rest/storage/blobservice\", MAX_BLOB_SIZE_BYTES + 100], // overhead for encryption\n\t[\"/rest/tutanota/filedataservice\", 1024 * 1024 * 25],\n\t[\"/rest/tutanota/draftservice\", 1024 * 1024], // should be large enough\n])\n\nexport const getMailFolderType = (folder: MailFolder): MailFolderType => downcast(folder.folderType)\n\ntype ObjectPropertyKey = string | number | symbol\nexport const reverse = <K extends ObjectPropertyKey, V extends ObjectPropertyKey>(objectMap: Record<K, V>): Record<V, K> =>\n\tObject.keys(objectMap).reduce((r, k) => {\n\t\t// @ts-ignore\n\t\tconst v = objectMap[downcast(k)]\n\t\treturn Object.assign(r, { [v]: k })\n\t}, {} as Record<V, K>)\n\nexport const enum OutOfOfficeNotificationMessageType {\n\tDefault = \"0\",\n\tInsideOrganization = \"1\",\n}\n\nexport const OUT_OF_OFFICE_SUBJECT_PREFIX = \"Auto-reply: \"\n\nexport enum GroupType {\n\tUser = \"0\",\n\tAdmin = \"1\",\n\tMailingList = \"2\",\n\tCustomer = \"3\",\n\tExternal = \"4\",\n\tMail = \"5\",\n\tContact = \"6\",\n\tFile = \"7\",\n\tLocalAdmin = \"8\",\n\tCalendar = \"9\",\n\tTemplate = \"10\",\n}\n\nexport const GroupTypeNameByCode = reverse(GroupType)\n\nexport const getMembershipGroupType = (membership: GroupMembership): GroupType => downcast(membership.groupType)\n\n/**\n * Permission is a kind of a metadata instance. Primarily used for two purposes:\n *  - key sharing\n *  - reference counting in the db\n * */\nexport const enum PermissionType {\n\t/** Used in combination with bucket permission to send multiple things encrypted with the same public key. */\n\tPublic = \"0\",\n\t/** Used to encrypt an instance for another group (which we are member of). */\n\tSymmetric = \"1\",\n\t/** Used to updating public permission with symmetric key. */\n\tPublic_Symmetric = \"2\",\n\t/** Instances without ownerEncSessionKey (e.g. MailBody, FileData) after asymmetric decryption, used for reference counting. */\n\tUnencrypted = \"3\",\n\t/** Sending parts of email for external users. */\n\tExternal = \"5\",\n\t/** Used to mark the owner of the list. */\n\tOwner_List = \"8\",\n}\n\nexport const enum BucketPermissionType {\n\tPublic = \"2\",\n\tExternal = \"3\",\n}\n\nexport enum MailFolderType {\n\tCUSTOM = \"0\",\n\tINBOX = \"1\",\n\tSENT = \"2\",\n\tTRASH = \"3\",\n\tARCHIVE = \"4\",\n\tSPAM = \"5\",\n\tDRAFT = \"6\",\n}\n\nexport const enum ReplyType {\n\tNONE = \"0\",\n\tREPLY = \"1\",\n\tFORWARD = \"2\",\n\tREPLY_FORWARD = \"3\",\n}\n\nexport const enum ContactAddressType {\n\tPRIVATE = \"0\",\n\tWORK = \"1\",\n\tOTHER = \"2\",\n\tCUSTOM = \"3\",\n}\n\nexport const enum ContactPhoneNumberType {\n\tPRIVATE = \"0\",\n\tWORK = \"1\",\n\tMOBILE = \"2\",\n\tFAX = \"3\",\n\tOTHER = \"4\",\n\tCUSTOM = \"5\",\n}\n\nexport const enum ContactSocialType {\n\tTWITTER = \"0\",\n\tFACEBOOK = \"1\",\n\tXING = \"2\",\n\tLINKED_IN = \"3\",\n\tOTHER = \"4\",\n\tCUSTOM = \"5\",\n}\n\nexport const getContactSocialType = (contactSocialId: ContactSocialId): ContactSocialType => downcast(contactSocialId.type)\n\nexport const enum OperationType {\n\tCREATE = \"0\",\n\tUPDATE = \"1\",\n\tDELETE = \"2\",\n}\n\nexport enum AccountType {\n\tSYSTEM = \"0\",\n\tFREE = \"1\",\n\tSTARTER = \"2\",\n\tPREMIUM = \"3\",\n\tEXTERNAL = \"5\",\n}\n\nexport const AccountTypeNames: Record<AccountType, string> = {\n\t[AccountType.SYSTEM]: \"System\",\n\t[AccountType.FREE]: \"Free\",\n\t[AccountType.STARTER]: \"Outlook\",\n\t[AccountType.PREMIUM]: \"Premium\",\n\t[AccountType.EXTERNAL]: \"External\",\n}\n\nexport enum CustomDomainType {\n\tNONE = \"0\",\n\tONE = \"1\",\n\tTHREE = \"2\",\n\tTEN = \"3\",\n\tUNLIMITED = \"4\",\n}\n\nexport const CustomDomainTypeCount: Record<CustomDomainType, number> = {\n\t[CustomDomainType.NONE]: 0,\n\t[CustomDomainType.ONE]: 1,\n\t[CustomDomainType.THREE]: 3,\n\t[CustomDomainType.TEN]: 10,\n\t[CustomDomainType.UNLIMITED]: -1,\n}\n\nexport const CustomDomainTypeCountName: Record<CustomDomainType, string> = {\n\t[CustomDomainType.NONE]: \"0\",\n\t[CustomDomainType.ONE]: \"1\",\n\t[CustomDomainType.THREE]: \"3\",\n\t[CustomDomainType.TEN]: \"10\",\n\t[CustomDomainType.UNLIMITED]: \"∞\",\n}\n\nexport enum PlanType {\n\tPremium = \"0\",\n\tPro = \"2\",\n\tTeams = \"3\",\n\tPremiumBusiness = \"4\",\n\tTeamsBusiness = \"5\",\n\tRevolutionary = \"6\",\n\tLegend = \"7\",\n\tEssential = \"8\",\n\tAdvanced = \"9\",\n\tUnlimited = \"10\",\n\tFree = \"11\",\n}\n\nexport type PlanName = keyof typeof PlanType\nexport type AvailablePlanType = Exclude<PlanType, PlanType.Premium | PlanType.Pro | PlanType.Teams | PlanType.PremiumBusiness | PlanType.TeamsBusiness>\nexport const AvailablePlans: AvailablePlanType[] = [\n\tPlanType.Free,\n\tPlanType.Revolutionary,\n\tPlanType.Legend,\n\tPlanType.Essential,\n\tPlanType.Advanced,\n\tPlanType.Unlimited,\n]\nexport const NewPaidPlans: AvailablePlanType[] = [PlanType.Revolutionary, PlanType.Legend, PlanType.Essential, PlanType.Advanced, PlanType.Unlimited]\nexport const NewBusinessPlans: AvailablePlanType[] = [PlanType.Essential, PlanType.Advanced, PlanType.Unlimited]\nexport const NewPersonalPlans: AvailablePlanType[] = [PlanType.Free, PlanType.Revolutionary, PlanType.Legend]\n\nexport const LegacyPlans = [PlanType.Premium, PlanType.PremiumBusiness, PlanType.Teams, PlanType.TeamsBusiness, PlanType.Pro]\nexport const HighlightedPlans: AvailablePlanType[] = [PlanType.Revolutionary, PlanType.Advanced]\n\nexport const PlanTypeToName = reverse(PlanType)\n\nexport enum BookingItemFeatureType {\n\tLegacyUsers = \"0\",\n\tStorage = \"1\",\n\tAlias = \"2\",\n\tSharedMailGroup = \"3\",\n\tWhitelabel = \"4\",\n\tContactForm = \"5\",\n\tWhitelabelChild = \"6\",\n\tLocalAdminGroup = \"7\",\n\tDiscount = \"8\",\n\tSharing = \"9\",\n\tBusiness = \"10\",\n\tRevolutionary = \"11\",\n\tLegend = \"12\",\n\tEssential = \"13\",\n\tAdvanced = \"14\",\n\tUnlimited = \"15\",\n}\n\nexport const BookingItemFeatureByCode = reverse(BookingItemFeatureType)\nexport const getPaymentMethodType = (accountingInfo: AccountingInfo): PaymentMethodType => downcast<PaymentMethodType>(accountingInfo.paymentMethod)\n\nexport enum PaymentMethodType {\n\tInvoice = \"0\",\n\tCreditCard = \"1\",\n\tSepa = \"2\",\n\tPaypal = \"3\",\n\tAccountBalance = \"4\",\n}\n\nexport const PaymentMethodTypeToName = reverse(PaymentMethodType)\n\nexport const Const = {\n\tUPGRADE_REMINDER_INTERVAL: 14 * 24 * 60 * 60 * 1000,\n\tMEMORY_GB_FACTOR: 1000000000,\n\tMEMORY_WARNING_FACTOR: 0.9,\n\t// Sets the current date for testing date dependent services. Only available in test environments.\n\tCURRENT_DATE: null,\n\tCURRENCY_SYMBOL_EUR: \"€\",\n} as const\n\nexport const TUTANOTA_MAIL_ADDRESS_DOMAINS = [\"tutanota.com\", \"tutanota.de\", \"tutamail.com\", \"tuta.io\", \"keemail.me\"]\n\nexport const enum ConversationType {\n\tNEW = \"0\",\n\tREPLY = \"1\",\n\tFORWARD = \"2\",\n\t/**  a message for which no mail exists in Tutanota (unknown external mail or deleted mail) */\n\tUNKNOWN = \"3\",\n}\n\nexport const enum MailState {\n\tDRAFT = \"0\",\n\tSENT = \"1\",\n\tRECEIVED = \"2\",\n\tSENDING = \"3\",\n}\n\n// Keep non-const for admin\nexport enum ApprovalStatus {\n\tREGISTRATION_APPROVED = \"0\",\n\tREGISTRATION_APPROVAL_NEEDED = \"1\",\n\tSEND_MAILS_APPROVED = \"2\",\n\tINVOICE_NOT_PAID = \"3\",\n\tSPAM_SENDER = \"4\",\n\tDELAYED = \"5\",\n\tDELAYED_AND_INITIALLY_ACCESSED = \"6\",\n\tREGISTRATION_APPROVAL_NEEDED_AND_INITIALLY_ACCESSED = \"7\",\n\tPAID_SUBSCRIPTION_NEEDED = \"8\",\n\tINITIAL_PAYMENT_PENDING = \"9\",\n\tNO_ACTIVITY = \"10\",\n}\n\nexport function getCustomerApprovalStatus(customer: Customer): ApprovalStatus {\n\treturn downcast(customer.approvalStatus)\n}\n\nexport const enum InboxRuleType {\n\tFROM_EQUALS = \"0\",\n\tRECIPIENT_TO_EQUALS = \"1\",\n\tRECIPIENT_CC_EQUALS = \"2\",\n\tRECIPIENT_BCC_EQUALS = \"3\",\n\tSUBJECT_CONTAINS = \"4\",\n\tMAIL_HEADER_CONTAINS = \"5\",\n}\n\nexport enum SpamRuleType {\n\tWHITELIST = \"1\",\n\tBLACKLIST = \"2\",\n\tDISCARD = \"3\",\n}\n\nexport function getSpamRuleType(spamRule: EmailSenderListElement): SpamRuleType | null {\n\treturn getAsEnumValue(SpamRuleType, spamRule.type)\n}\n\nexport const enum SpamRuleFieldType {\n\tFROM = \"0\",\n\tTO = \"1\",\n\tCC = \"2\",\n\tBCC = \"3\",\n}\n\nexport function getSpamRuleField(spamRule: EmailSenderListElement): SpamRuleFieldType {\n\treturn downcast(spamRule.field)\n}\n\nexport const enum ReportMovedMailsType {\n\tALWAYS_ASK = \"0\",\n\tAUTOMATICALLY_ONLY_SPAM = \"1\",\n\tNEVER = \"3\",\n}\n\nexport const enum EmailSignatureType {\n\tEMAIL_SIGNATURE_TYPE_DEFAULT = \"0\",\n\tEMAIL_SIGNATURE_TYPE_CUSTOM = \"1\",\n\tEMAIL_SIGNATURE_TYPE_NONE = \"2\",\n}\n\nexport enum CustomDomainValidationResult {\n\tCUSTOM_DOMAIN_VALIDATION_RESULT_OK = \"0\",\n\tCUSTOM_DOMAIN_VALIDATION_RESULT_DNS_LOOKUP_FAILED = \"1\",\n\tCUSTOM_DOMAIN_VALIDATION_RESULT_DOMAIN_NOT_FOUND = \"2\",\n\tCUSTOM_DOMAIN_VALIDATION_RESULT_NAMESERVER_NOT_FOUND = \"3\",\n\tCUSTOM_DOMAIN_VALIDATION_RESULT_DOMAIN_NOT_AVAILABLE = \"4\",\n\tCUSTOM_DOMAIN_VALIDATION_RESULT_VALIDATION_FAILED = \"5\",\n}\n\nexport enum CustomDomainCheckResult {\n\tCUSTOM_DOMAIN_CHECK_RESULT_OK = \"0\",\n\tCUSTOM_DOMAIN_CHECK_RESULT_DNS_LOOKUP_FAILED = \"1\",\n\tCUSTOM_DOMAIN_CHECK_RESULT_DOMAIN_NOT_FOUND = \"2\",\n\tCUSTOM_DOMAIN_CHECK_RESULT_NAMESERVER_NOT_FOUND = \"3\",\n}\n\nexport const enum DnsRecordType {\n\tDNS_RECORD_TYPE_MX = \"0\",\n\tDNS_RECORD_TYPE_TXT_SPF = \"1\",\n\tDNS_RECORD_TYPE_CNAME_DKIM = \"2\",\n\tDNS_RECORD_TYPE_TXT_DMARC = \"3\",\n\tDNS_RECORD_TYPE_CNAME_MTA_STS = \"4\",\n\tDNS_RECORD_TYPE_TXT_VERIFY = \"5\",\n}\n\nexport const enum SessionState {\n\tSESSION_STATE_ACTIVE = \"0\",\n\tSESSION_STATE_EXPIRED = \"1\",\n\tSESSION_STATE_DELETED = \"2\",\n\tSESSION_STATE_PENDING = \"3\",\n}\n\nexport const enum PushServiceType {\n\tANDROID = \"0\",\n\tIOS = \"1\",\n\tEMAIL = \"2\",\n\tSSE = \"3\",\n}\n\nexport const enum InputFieldType {\n\tTEXT = \"0\",\n\tNUMBER = \"1\",\n\tENUM = \"2\",\n}\n\nexport enum SecondFactorType {\n\tu2f = \"0\",\n\ttotp = \"1\",\n\twebauthn = \"2\",\n}\n\nexport const SecondFactorTypeNames = [\"U2F\", \"TOTP\"]\nexport const MAX_ATTACHMENT_SIZE = 1024 * 1024 * 25\nexport const MAX_LOGO_SIZE = 1024 * 100\nexport const MAX_BASE64_IMAGE_SIZE = MAX_LOGO_SIZE\nexport const ALLOWED_IMAGE_FORMATS = [\"png\", \"jpg\", \"jpeg\", \"svg\"]\n\n// Keep non-const for admin\nexport enum FeatureType {\n\tDisableContacts = \"0\",\n\tDisableMailExport = \"1\",\n\tInternalCommunication = \"2\",\n\tDeleteMailsOnPasswordReset = \"3\",\n\tWhitelabelParent = \"4\",\n\tWhitelabelChild = \"5\",\n\tReplyOnly = \"6\",\n\tDisableDefaultSignature = \"7\",\n\tHideBuyDialogs = \"8\",\n\tDisableCalendar = \"9\",\n\tExternalEmailProvider = \"10\",\n\n\t/** This is required for non admin users because they are not allowed to access the bookings. */\n\tBusinessFeatureEnabled = \"11\",\n\tPremiumLegacy = \"12\",\n\tKnowledgeBase = \"13\",\n\tNewsletter = \"14\",\n\tBlobs = \"15\", // enables blob attachments for mails\n\tMailDetails = \"16\", // enable new mail model support\n\tMultipleUsers = \"17\", // Multi-user support for new personal plans.\n}\n\nexport const enum BootstrapFeatureType {\n\tDisableSavePassword = \"0\",\n}\n\nexport const FULL_INDEXED_TIMESTAMP: number = 0\nexport const NOTHING_INDEXED_TIMESTAMP: number = Math.pow(2, 42) - 1 // maximum Timestamp is 42 bit long (see GeneratedIdData.java)\n\nexport const ENTITY_EVENT_BATCH_TTL_DAYS: number = 45 // 45 days (see InstanceDbMapperEventNotifier.java)\n\nexport const enum PaymentDataResultType {\n\tOK = \"0\",\n\tCOUNTRY_MISMATCH = \"1\",\n\tINVALID_VATID_NUMBER = \"2\",\n\tCREDIT_CARD_DECLINED = \"3\",\n\tCREDIT_CARD_CVV_INVALID = \"4\",\n\tPAYMENT_PROVIDER_NOT_AVAILABLE = \"5\",\n\tOTHER_PAYMENT_PROVIDER_ERROR = \"6\",\n\tOTHER_PAYMENT_ACCOUNT_REJECTED = \"7\",\n\tCOULD_NOT_VERIFY_VATID = \"8\",\n\tCREDIT_CARD_DATE_INVALID = \"9\",\n\tCREDIT_CARD_NUMBER_INVALID = \"10\",\n\tCREDIT_CARD_VERIFICATION_LIMIT_REACHED = \"11\",\n}\n\nexport const enum ContactComparisonResult {\n\tUnique = \"unique\",\n\tSimilar = \"similar\",\n\tEqual = \"equal\",\n}\n\nexport const enum IndifferentContactComparisonResult {\n\tOneEmpty = \"oneEmpty\",\n\tBothEmpty = \"bothEmpty\",\n}\n\nexport const enum ContactMergeAction {\n\tDeleteFirst = \"deleteFirst\",\n\tDeleteSecond = \"deleteSecond\",\n\tMerge = \"merge\",\n\tSkip = \"skip\",\n\tCancel = \"cancel\",\n}\n\nexport const enum InvoiceStatus {\n\tCREATED = \"0\",\n\tPUBLISHEDFORAUTOMATIC = \"1\",\n\tPUBLISHEDFORMANUAL = \"2\",\n\tPAID = \"3\",\n\tDEBITFAILED = \"4\",\n\tDISPUTED = \"5\",\n\tCANCELLED = \"6\",\n\tPARTNERMANAGED = \"7\",\n\tFIRSTREMINDER = \"8\",\n\tREFUNDED = \"9\",\n\tDISPUTEACCEPTED = \"10\",\n\tSECONDREMINDER = \"11\",\n}\n\nexport const enum CloseEventBusOption {\n\tTerminate = \"terminate\",\n\tReconnect = \"reconnect\",\n\tPause = \"pause\",\n}\n\nexport const enum Announcement {\n\tNone = \"0\",\n\tStorageDeletion = \"1\",\n}\n\nexport const enum CertificateState {\n\tVALID = \"0\",\n\tVALIDATING = \"1\",\n\tINVALID = \"2\",\n}\n\nexport const enum CertificateType {\n\tMANUAL = \"0\",\n\tLETS_ENCRYPT = \"1\",\n}\n\nexport function getCertificateType(certificateInfo: CertificateInfo): CertificateType {\n\treturn downcast(certificateInfo.type)\n}\n\nexport enum RepeatPeriod {\n\tDAILY = \"0\",\n\tWEEKLY = \"1\",\n\tMONTHLY = \"2\",\n\tANNUALLY = \"3\",\n}\n\nexport const enum EndType {\n\tNever = \"0\",\n\tCount = \"1\",\n\tUntilDate = \"2\",\n}\n\nexport const defaultCalendarColor = \"2196f3\"\n\n// keep non-const for iteration/filtering\nexport enum AlarmInterval {\n\tFIVE_MINUTES = \"5M\",\n\tTEN_MINUTES = \"10M\",\n\tTHIRTY_MINUTES = \"30M\",\n\tONE_HOUR = \"1H\",\n\tONE_DAY = \"1D\",\n\tTWO_DAYS = \"2D\",\n\tTHREE_DAYS = \"3D\",\n\tONE_WEEK = \"1W\",\n}\n\nexport const enum EventTextTimeOption {\n\tSTART_TIME = \"startTime\",\n\tEND_TIME = \"endTime\",\n\tSTART_END_TIME = \"startAndEndTime\",\n}\n\nexport const enum TimeFormat {\n\tTWENTY_FOUR_HOURS = \"0\",\n\tTWELVE_HOURS = \"1\",\n}\n\nexport const enum WeekStart {\n\tMONDAY = \"0\",\n\tSUNDAY = \"1\",\n\tSATURDAY = \"2\",\n}\n\nexport function getWeekStart(userSettings: UserSettingsGroupRoot): WeekStart {\n\treturn downcast(userSettings.startOfTheWeek)\n}\n\nexport const enum ShareCapability {\n\tRead = \"0\",\n\tWrite = \"1\",\n\tInvite = \"2\",\n}\n\nexport const SECOND_MS = 1000\n\nexport const enum PostingType {\n\tGeneric = \"0\",\n\tUsageFee = \"1\",\n\tCredit = \"2\",\n\tDispute = \"3\",\n\tSuspension = \"4\",\n\tPayment = \"5\",\n\tRefund = \"6\",\n\tSuspensionCancel = \"7\",\n\tGiftCard = \"8\",\n\tSalesCommission = \"9\",\n}\n\nexport enum CounterType {\n\tDefault = \"0\",\n\tSignup = \"1\",\n\tUnreadMails = \"2\",\n\tUserStorageLegacy = \"3\",\n\tGroupStorageLegacy = \"4\",\n\tUserStorage = \"5\",\n\tGroupStorage = \"6\",\n}\n\nexport const CounterTypeToName = reverse(CounterType)\n\nexport const enum UnsubscribeFailureReason {\n\tTOO_MANY_ENABLED_USERS = \"unsubscribe.too_many_users\",\n\tCUSTOM_MAIL_ADDRESS = \"unsubscribe.custom_mail_address\",\n\tTOO_MANY_CALENDARS = \"unsubscribe.too_many_calendars\",\n\tCALENDAR_TYPE = \"unsubscirbe.invalid_calendar_type\",\n\tTOO_MANY_ALIASES = \"unsubscribe.too_many_aliases\",\n\tTOO_MUCH_STORAGE_USED = \"unsubscribe.too_much_storage\",\n\tTOO_MANY_DOMAINS = \"unsubscribe.too_many_domains\",\n\tHAS_TEMPLATE_GROUP = \"unsubscribe.has_template_group\",\n\tWHITELABEL_DOMAIN_ACTIVE = \"unsubscribe.whitelabel_domain_active\",\n\tSHARED_GROUP_ACTIVE = \"unsubscribe.shared_group_active\",\n\tHAS_CONTACT_FORM = \"unsubscribe.has_contact_form\",\n\tNOT_ENOUGH_CREDIT = \"unsubscribe.not_enough_credit\",\n\tINVOICE_NOT_PAID = \"unsubscribe.invoice_not_paid\",\n}\n\n// legacy, should be deleted after clients older than 3.114 have been disabled.\nexport const enum BookingFailureReason {\n\tTOO_MANY_DOMAINS = \"bookingservice.too_many_domains\",\n\tTOO_MANY_ALIASES = \"bookingservice.too_many_aliases\",\n\tTOO_MUCH_STORAGE_USED = \"bookingservice.too_much_storage_used\",\n\tSHARED_GROUP_ACTIVE = \"bookingservice.shared_group_active\",\n\tWHITELABEL_DOMAIN_ACTIVE = \"bookingservice.whitelabel_domain_active\",\n\tHAS_TEMPLATE_GROUP = \"bookingservice.has_template_group\",\n}\n\nexport const Keys = Object.freeze({\n\tNONE: {\n\t\tcode: -1,\n\t\tname: \"\",\n\t},\n\tRETURN: {\n\t\tcode: 13,\n\t\tname: \"⏎\",\n\t},\n\tBACKSPACE: {\n\t\tcode: 8,\n\t\tname: \"BACKSPACE\",\n\t},\n\tTAB: {\n\t\tcode: 9,\n\t\tname: \"↹\",\n\t},\n\tSHIFT: {\n\t\tcode: 16,\n\t\tname: \"⇧\",\n\t},\n\tCTRL: {\n\t\tcode: 17,\n\t\tname: \"CTRL\",\n\t},\n\tALT: {\n\t\tcode: 17,\n\t\tname: \"ALT\",\n\t},\n\tMETA: {\n\t\tcode: 91,\n\t\tname: \"\\u2318\",\n\t},\n\t// command key (left) (OSX)\n\tESC: {\n\t\tcode: 27,\n\t\tname: \"ESC\",\n\t},\n\tSPACE: {\n\t\tcode: 32,\n\t\tname: \"Space\",\n\t},\n\tPAGE_UP: {\n\t\tcode: 33,\n\t\tname: \"Page ↑\",\n\t},\n\tPAGE_DOWN: {\n\t\tcode: 34,\n\t\tname: \"Page ↓\",\n\t},\n\tEND: {\n\t\tcode: 35,\n\t\tname: \"End\",\n\t},\n\tHOME: {\n\t\tcode: 36,\n\t\tname: \"Home\",\n\t},\n\tLEFT: {\n\t\tcode: 37,\n\t\tname: \"←\",\n\t},\n\tUP: {\n\t\tcode: 38,\n\t\tname: \"↑\",\n\t},\n\tRIGHT: {\n\t\tcode: 39,\n\t\tname: \"→\",\n\t},\n\tDOWN: {\n\t\tcode: 40,\n\t\tname: \"↓\",\n\t},\n\tDELETE: {\n\t\tcode: 46,\n\t\tname: \"DEL\",\n\t},\n\t\"0\": {\n\t\tcode: 48,\n\t\tname: \"0\",\n\t},\n\tONE: {\n\t\tcode: 49,\n\t\tname: \"1\",\n\t},\n\tTWO: {\n\t\tcode: 50,\n\t\tname: \"2\",\n\t},\n\tTHREE: {\n\t\tcode: 51,\n\t\tname: \"3\",\n\t},\n\tFOUR: {\n\t\tcode: 52,\n\t\tname: \"4\",\n\t},\n\tFIVE: {\n\t\tcode: 53,\n\t\tname: \"5\",\n\t},\n\tSIX: {\n\t\tcode: 54,\n\t\tname: \"6\",\n\t},\n\tA: {\n\t\tcode: 65,\n\t\tname: \"A\",\n\t},\n\tB: {\n\t\tcode: 66,\n\t\tname: \"B\",\n\t},\n\tC: {\n\t\tcode: 67,\n\t\tname: \"C\",\n\t},\n\tD: {\n\t\tcode: 68,\n\t\tname: \"D\",\n\t},\n\tE: {\n\t\tcode: 69,\n\t\tname: \"E\",\n\t},\n\tF: {\n\t\tcode: 70,\n\t\tname: \"F\",\n\t},\n\tH: {\n\t\tcode: 72,\n\t\tname: \"H\",\n\t},\n\tI: {\n\t\tcode: 73,\n\t\tname: \"I\",\n\t},\n\tJ: {\n\t\tcode: 74,\n\t\tname: \"J\",\n\t},\n\tK: {\n\t\tcode: 75,\n\t\tname: \"K\",\n\t},\n\tL: {\n\t\tcode: 76,\n\t\tname: \"L\",\n\t},\n\tM: {\n\t\tcode: 77,\n\t\tname: \"M\",\n\t},\n\tN: {\n\t\tcode: 78,\n\t\tname: \"N\",\n\t},\n\tO: {\n\t\tcode: 79,\n\t\tname: \"O\",\n\t},\n\tP: {\n\t\tcode: 80,\n\t\tname: \"P\",\n\t},\n\tQ: {\n\t\tcode: 81,\n\t\tname: \"Q\",\n\t},\n\tR: {\n\t\tcode: 82,\n\t\tname: \"R\",\n\t},\n\tS: {\n\t\tcode: 83,\n\t\tname: \"S\",\n\t},\n\tT: {\n\t\tcode: 84,\n\t\tname: \"T\",\n\t},\n\tU: {\n\t\tcode: 85,\n\t\tname: \"U\",\n\t},\n\tV: {\n\t\tcode: 86,\n\t\tname: \"V\",\n\t},\n\tF1: {\n\t\tcode: 112,\n\t\tname: \"F1\",\n\t},\n\tF5: {\n\t\tcode: 116,\n\t\tname: \"F5\",\n\t},\n\tF11: {\n\t\tcode: 122,\n\t\tname: \"F11\",\n\t},\n\tF12: {\n\t\tcode: 123,\n\t\tname: \"F12\",\n\t},\n})\n\n// See: https://webaim.org/techniques/keyboard/tabindex#overview\n\nexport const enum TabIndex {\n\tProgrammatic = \"-1\",\n\t// focus on element can only be set programmatically\n\tDefault = \"0\", // regular tab order\n}\n\n// Keep non-const for admin\nexport enum ReportedMailFieldType {\n\t/**\n\t * From header address, authenticated.\n\t */\n\tFROM_ADDRESS = \"0\",\n\n\t/**\n\t * From header address, not authenticated with DMARC.\n\t */\n\tFROM_ADDRESS_NON_AUTH = \"1\",\n\n\t/**\n\t * From header address domain\n\t */\n\tFROM_DOMAIN = \"2\",\n\n\t/**\n\t * From header address domain, not authenticated not authenticated with DMARC.\n\t */\n\tFROM_DOMAIN_NON_AUTH = \"3\",\n\n\t/**\n\t * Email subject\n\t */\n\tSUBJECT = \"4\",\n\n\t/**\n\t * Link in the body of email\n\t */\n\tLINK = \"5\",\n\n\t/**\n\t * Domain of the link in the body\n\t */\n\tLINK_DOMAIN = \"6\",\n}\n\nexport const enum MailPhishingStatus {\n\tUNKNOWN = \"0\",\n\tSUSPICIOUS = \"1\",\n\tWHITELISTED = \"2\",\n}\n\nexport const enum PhishingMarkerStatus {\n\tACTIVE = \"0\",\n\tINACTIVE = \"1\",\n}\n\n// Keep non-const for admin\nexport enum MailAuthenticationStatus {\n\t/**\n\t * Disposition: None. All checks have passed.\n\t */\n\tAUTHENTICATED = \"0\",\n\n\t/**\n\t * Authentication has failed because of the domain policy or because of the SPF.\n\t */\n\tHARD_FAIL = \"1\",\n\n\t/**\n\t * Authentication has failed because of our own policy, most commonly authentication is \"missing\".\n\t */\n\tSOFT_FAIL = \"2\",\n\n\t/**\n\t * Authentication has failed because From header is not valid so we couldn't do authentication checks.\n\t */\n\tINVALID_MAIL_FROM = \"3\",\n\n\t/**\n\t * Authentication has failed because From header is missing. Most likely it is some technical message like bounce mail.\n\t */\n\tMISSING_MAIL_FROM = \"4\",\n}\n\nexport const enum MailReportType {\n\tPHISHING = \"0\",\n\tSPAM = \"1\",\n}\n\nexport const enum DnsRecordValidation {\n\tOK = \"✓\",\n\tBAD = \"✗\",\n}\n\nexport enum CalendarAttendeeStatus {\n\t/** invite is not sent yet */\n\tADDED = \"0\",\n\n\t/** already invited but did not respond */\n\tNEEDS_ACTION = \"1\",\n\tACCEPTED = \"2\",\n\tDECLINED = \"3\",\n\tTENTATIVE = \"4\",\n}\n\nexport function getAttendeeStatus(attendee: CalendarEventAttendee): CalendarAttendeeStatus {\n\treturn downcast(attendee.status)\n}\n\nexport enum CalendarMethod {\n\tPUBLISH = \"PUBLISH\",\n\tREQUEST = \"REQUEST\",\n\tREPLY = \"REPLY\",\n\tADD = \"ADD\",\n\tCANCEL = \"CANCEL\",\n\tREFRESH = \"REFRESH\",\n\tCOUNTER = \"COUNTER\",\n\tDECLINECOUNTER = \"DECLINECOUNTER\",\n}\n\nexport const enum MailMethod {\n\tNONE = \"0\",\n\tICAL_PUBLISH = \"1\",\n\tICAL_REQUEST = \"2\",\n\tICAL_REPLY = \"3\",\n\tICAL_ADD = \"4\",\n\tICAL_CANCEL = \"5\",\n\tICAL_REFRESH = \"6\",\n\tICAL_COUNTER = \"7\",\n\tICAL_DECLINECOUNTER = \"8\",\n}\n\nexport function mailMethodToCalendarMethod(mailMethod: MailMethod): CalendarMethod {\n\tswitch (mailMethod) {\n\t\tcase MailMethod.ICAL_PUBLISH:\n\t\t\treturn CalendarMethod.PUBLISH\n\t\tcase MailMethod.ICAL_REQUEST:\n\t\t\treturn CalendarMethod.REQUEST\n\t\tcase MailMethod.ICAL_REPLY:\n\t\t\treturn CalendarMethod.REPLY\n\t\tcase MailMethod.ICAL_ADD:\n\t\t\treturn CalendarMethod.ADD\n\t\tcase MailMethod.ICAL_CANCEL:\n\t\t\treturn CalendarMethod.CANCEL\n\t\tcase MailMethod.ICAL_REFRESH:\n\t\t\treturn CalendarMethod.REFRESH\n\t\tcase MailMethod.ICAL_COUNTER:\n\t\t\treturn CalendarMethod.COUNTER\n\t\tcase MailMethod.ICAL_DECLINECOUNTER:\n\t\t\treturn CalendarMethod.DECLINECOUNTER\n\t\tdefault:\n\t\t\tthrow new ProgrammingError(\"Unhandled MailMethod: \" + mailMethod)\n\t}\n}\n\nexport function getAsEnumValue<K extends keyof any, V>(enumValues: Record<K, V>, value: string): V | null {\n\tfor (const key of Object.getOwnPropertyNames(enumValues)) {\n\t\t// @ts-ignore\n\t\tconst enumValue = enumValues[key]\n\n\t\tif (enumValue === value) {\n\t\t\treturn enumValue\n\t\t}\n\t}\n\n\treturn null\n}\n\nexport function assertEnumValue<K extends keyof any, V>(enumValues: Record<K, V>, value: string): V {\n\tfor (const key of Object.getOwnPropertyNames(enumValues)) {\n\t\t// @ts-ignore\n\t\tconst enumValue = enumValues[key]\n\n\t\tif (enumValue === value) {\n\t\t\treturn enumValue\n\t\t}\n\t}\n\n\tthrow new Error(`Invalid enum value ${value} for ${JSON.stringify(enumValues)}`)\n}\n\nexport function assertEnumKey<K extends string, V>(obj: Record<K, V>, key: string): K {\n\tif (key in obj) {\n\t\treturn downcast(key)\n\t} else {\n\t\tthrow Error(\"Not valid enum value: \" + key)\n\t}\n}\n\nexport const enum ClientType {\n\tBrowser = \"0\",\n\tDesktop = \"1\",\n\tApp = \"2\",\n}\n\nexport function getClientType(): ClientType {\n\treturn isApp() ? ClientType.App : isElectronClient() ? ClientType.Desktop : ClientType.Browser\n}\n\nexport const enum ExternalImageRule {\n\tNone = \"0\",\n\tAllow = \"1\",\n\tBlock = \"2\",\n}\n\nexport type PayPalData = {\n\taccount: string\n}\n\nexport type InvoiceData = {\n\tinvoiceAddress: string\n\tcountry: Country | null\n\tvatNumber: string // only for EU countries otherwise empty\n}\n\nexport type PaymentData = {\n\tpaymentMethod: PaymentMethodType\n\tcreditCardData: CreditCard | null\n}\n\nexport enum UsageTestState {\n\tCreated = \"0\",\n\tLive = \"1\",\n\tPaused = \"2\",\n\tFinished = \"3\",\n}\n\nexport const UsageTestStateToName = reverse(UsageTestState)\n\nexport enum UsageTestMetricType {\n\tNumber = \"0\",\n\tEnum = \"1\",\n\tLikert = \"2\",\n}\n\nexport const UsageTestMetricTypeToName = reverse(UsageTestMetricType)\n\nexport const enum ArchiveDataType {\n\tAuthorityRequests = \"0\",\n\tAttachments = \"1\",\n\tMailDetails = \"2\",\n}\n\nexport const OFFLINE_STORAGE_DEFAULT_TIME_RANGE_DAYS = 31\n\nexport enum UsageTestParticipationMode {\n\tOnce = \"0\",\n\tUnlimited = \"1\",\n}\n\nexport const UsageTestParticipationModeToName = reverse(UsageTestParticipationMode)\n\nexport enum TerminationPeriodOptions {\n\tEndOfCurrentPeriod = \"0\",\n\tFutureDate = \"1\",\n}\n","//@bundleInto:common-min\n\nimport type { EntityUpdateData } from \"../../main/EventController\"\nimport type { Customer, CustomerInfo, DomainInfo, EntityUpdate } from \"../../entities/sys/TypeRefs.js\"\nimport type { Header, MailHeaders } from \"../../entities/tutanota/TypeRefs.js\"\nimport {\n\tAccessBlockedError,\n\tAccessDeactivatedError,\n\tAccessExpiredError,\n\tBadGatewayError,\n\tBadRequestError,\n\tConnectionError,\n\tInsufficientStorageError,\n\tInternalServerError,\n\tInvalidDataError,\n\tInvalidSoftwareVersionError,\n\tLimitReachedError,\n\tLockedError,\n\tMethodNotAllowedError,\n\tNotAuthenticatedError,\n\tNotAuthorizedError,\n\tNotFoundError,\n\tPayloadTooLargeError,\n\tPreconditionFailedError,\n\tRequestTimeoutError,\n\tResourceError,\n\tServiceUnavailableError,\n\tSessionExpiredError,\n\tTooManyRequestsError,\n} from \"../error/RestError\"\nimport { CryptoError } from \"../error/CryptoError\"\nimport { SessionKeyNotFoundError } from \"../error/SessionKeyNotFoundError\"\nimport { SseError } from \"../error/SseError\"\nimport { ProgrammingError } from \"../error/ProgrammingError\"\nimport { RecipientsNotFoundError } from \"../error/RecipientsNotFoundError\"\nimport { RecipientNotResolvedError } from \"../error/RecipientNotResolvedError\"\nimport { OutOfSyncError } from \"../error/OutOfSyncError\"\nimport { DbError } from \"../error/DbError\"\nimport { IndexingNotSupportedError } from \"../error/IndexingNotSupportedError\"\nimport { QuotaExceededError } from \"../error/QuotaExceededError\"\nimport { CancelledError } from \"../error/CancelledError\"\nimport { FileOpenError } from \"../error/FileOpenError\"\nimport { PermissionError } from \"../error/PermissionError\"\nimport { FileNotFoundError } from \"../error/FileNotFoundError\"\nimport { DeviceStorageUnavailableError } from \"../error/DeviceStorageUnavailableError\"\nimport { MailBodyTooLargeError } from \"../error/MailBodyTooLargeError\"\nimport { CredentialAuthenticationError } from \"../error/CredentialAuthenticationError\"\nimport { KeyPermanentlyInvalidatedError } from \"../error/KeyPermanentlyInvalidatedError\"\nimport type { FeatureType, OperationType } from \"../TutanotaConstants\"\nimport { ImportError } from \"../error/ImportError\"\nimport { WebauthnError } from \"../error/WebauthnError\"\nimport { SuspensionError } from \"../error/SuspensionError.js\"\nimport { LoginIncompleteError } from \"../error/LoginIncompleteError.js\"\nimport { OfflineDbClosedError } from \"../error/OfflineDbClosedError.js\"\nimport Stream from \"mithril/stream\"\n\nexport function getWhitelabelDomain(customerInfo: CustomerInfo, domainName?: string): DomainInfo | null {\n\treturn customerInfo.domainInfos.find((info) => info.whitelabelConfig != null && (domainName == null || info.domain === domainName)) ?? null\n}\n\nexport function getCustomMailDomains(customerInfo: CustomerInfo): Array<DomainInfo> {\n\treturn customerInfo.domainInfos.filter((di) => di.whitelabelConfig == null)\n}\n\nexport function containsEventOfType(events: ReadonlyArray<EntityUpdateData>, type: OperationType, elementId: Id): boolean {\n\treturn events.find((event) => event.operation === type && event.instanceId === elementId) != null\n}\n\nexport function getEventOfType(events: ReadonlyArray<EntityUpdate>, type: OperationType, elementId: Id): EntityUpdate | null {\n\treturn events.find((event) => event.operation === type && event.instanceId === elementId) ?? null\n}\n\nexport function getLegacyMailHeaders(headers: MailHeaders): string {\n\treturn headers.compressedHeaders ?? headers.headers ?? \"\"\n}\n\nexport function getMailHeaders(headers: Header): string {\n\treturn headers.compressedHeaders ?? headers.headers ?? \"\"\n}\n\n//If importing fails it is a good idea to bundle the error into common-min which can be achieved by annotating the module with \"@bundleInto:common-min\"\nconst ErrorNameToType = {\n\tConnectionError,\n\tBadRequestError,\n\tNotAuthenticatedError,\n\tSessionExpiredError,\n\tNotAuthorizedError,\n\tNotFoundError,\n\tMethodNotAllowedError,\n\tPreconditionFailedError,\n\tLockedError,\n\tTooManyRequestsError,\n\tAccessDeactivatedError,\n\tAccessExpiredError,\n\tAccessBlockedError,\n\tInvalidDataError,\n\tInvalidSoftwareVersionError,\n\tLimitReachedError,\n\tInternalServerError,\n\tBadGatewayError,\n\tResourceError,\n\tRequestTimeoutError,\n\tInsufficientStorageError,\n\tCryptoError,\n\tSessionKeyNotFoundError,\n\tSseError,\n\tProgrammingError,\n\tRecipientsNotFoundError,\n\tRecipientNotResolvedError,\n\tOfflineDbClosedError,\n\tOutOfSyncError,\n\tServiceUnavailableError,\n\tDbError,\n\tIndexingNotSupportedError,\n\tQuotaExceededError,\n\tCancelledError,\n\tFileOpenError,\n\tPayloadTooLargeError,\n\tDeviceStorageUnavailableError,\n\tMailBodyTooLargeError,\n\tImportError,\n\tWebauthnError,\n\tSuspensionError,\n\tLoginIncompleteError,\n\tError,\n\t\"java.net.SocketTimeoutException\": ConnectionError,\n\t\"java.net.SocketException\": ConnectionError,\n\t\"java.net.ConnectException\": ConnectionError,\n\t\"javax.net.ssl.SSLException\": ConnectionError,\n\t\"javax.net.ssl.SSLHandshakeException\": ConnectionError,\n\t\"java.io.EOFException\": ConnectionError,\n\t\"java.net.UnknownHostException\": ConnectionError,\n\t\"java.lang.SecurityException\": PermissionError,\n\t\"java.io.FileNotFoundException\": FileNotFoundError,\n\t\"de.tutao.tutanota.CryptoError\": CryptoError,\n\t// Android app exception class name\n\t\"de.tutao.tutanota.TutCrypto\": CryptoError,\n\t// iOS app crypto error domain\n\t\"android.content.ActivityNotFoundException\": FileOpenError,\n\t\"de.tutao.tutanota.TutFileViewer\": FileOpenError,\n\tNSURLErrorDomain: ConnectionError,\n\t\"de.tutao.tutanota.CredentialAuthenticationException\": CredentialAuthenticationError,\n\t\"android.security.keystore.KeyPermanentlyInvalidatedException\": KeyPermanentlyInvalidatedError,\n\t\"de.tutao.tutanota.KeyPermanentlyInvalidatedError\": KeyPermanentlyInvalidatedError,\n\t\"de.tutao.tutanota.CredentialAuthenticationError\": CredentialAuthenticationError,\n\t\"de.tutao.tutanota.offline.OfflineDbClosedError\": OfflineDbClosedError,\n\t\"de.tutao.tutanota.CancelledError\": CancelledError,\n\t\"de.tutao.tutanota.webauthn.WebauthnError\": WebauthnError,\n\t\"de.tutao.tutanota.Webauthn\": WebauthnError,\n}\n\nexport function isCustomizationEnabledForCustomer(customer: Customer, feature: FeatureType): boolean {\n\treturn !!customer.customizations.find((customization) => customization.feature === feature)\n}\n\nexport function isSecurityError(e: any): boolean {\n\treturn e instanceof DOMException && (e.name === \"SecurityError\" || e.code === e.SECURITY_ERR)\n}\n\nexport function isNotSupportedError(e: any): boolean {\n\treturn e instanceof DOMException && (e.name === \"NotSupportedError\" || e.code === e.NOT_SUPPORTED_ERR)\n}\n\nexport function objToError(o: Record<string, any>): Error {\n\t// @ts-ignore\n\tlet errorType = ErrorNameToType[o.name]\n\tlet e = (errorType != null ? new errorType(o.message) : new Error(o.message)) as any\n\te.name = o.name\n\te.stack = o.stack || e.stack\n\te.data = o.data\n\treturn e\n}\n","// TODO rename methods according to their JAVA counterparts (e.g. Uint8Array == bytes, Utf8Uint8Array == bytes...)\nexport function uint8ArrayToArrayBuffer(uint8Array) {\n    if (uint8Array.byteLength === uint8Array.buffer.byteLength) {\n        return uint8Array.buffer;\n    }\n    else {\n        return new Uint8Array(uint8Array).buffer; // create a new instance with the correct length, if uint8Array is only a DataView on a longer Array.buffer\n    }\n}\n/**\n * Converts a hex coded string into a base64 coded string.\n *\n * @param hex A hex encoded string.\n * @return A base64 encoded string.\n */\nexport function hexToBase64(hex) {\n    return uint8ArrayToBase64(hexToUint8Array(hex));\n}\n/**\n * Converts a base64 coded string into a hex coded string.\n *\n * @param base64 A base64 encoded string.\n * @return A hex encoded string.\n */\nexport function base64ToHex(base64) {\n    return uint8ArrayToHex(base64ToUint8Array(base64));\n}\n/**\n * Converts a base64 string to a url-conform base64 string. This is used for\n * base64 coded url parameters.\n *\n * @param base64 The base64 string.\n * @return The base64url string.\n */\nexport function base64ToBase64Url(base64) {\n    let base64url = base64.replace(/\\+/g, \"-\");\n    base64url = base64url.replace(/\\//g, \"_\");\n    base64url = base64url.replace(/=/g, \"\");\n    return base64url;\n}\nfunction makeLookup(str) {\n    const lookup = {};\n    for (let i = 0; i < str.length; i++) {\n        lookup[str.charAt(i)] = i;\n    }\n    return lookup;\n}\nconst base64Alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nconst base64Lookup = makeLookup(base64Alphabet);\nconst base64extAlphabet = \"-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz\";\nconst base64ExtLookup = makeLookup(base64extAlphabet);\n/**\n * Converts a base64 string to a base64ext string. Base64ext uses another character set than base64 in order to make it sortable.\n *\n *\n * @param base64 The base64 string.\n * @return The base64Ext string.\n */\nexport function base64ToBase64Ext(base64) {\n    base64 = base64.replace(/=/g, \"\");\n    let base64ext = \"\";\n    for (let i = 0; i < base64.length; i++) {\n        let index = base64Lookup[base64.charAt(i)];\n        base64ext += base64extAlphabet[index];\n    }\n    return base64ext;\n}\n/**\n * Converts a Base64Ext string to a Base64 string and appends the padding if needed.\n * @param base64ext The base64Ext string\n * @returns The base64 string\n */\nexport function base64ExtToBase64(base64ext) {\n    let base64 = \"\";\n    for (let i = 0; i < base64ext.length; i++) {\n        const index = base64ExtLookup[base64ext.charAt(i)];\n        base64 += base64Alphabet[index];\n    }\n    let padding;\n    if (base64.length % 4 === 2) {\n        padding = \"==\";\n    }\n    else if (base64.length % 4 === 3) {\n        padding = \"=\";\n    }\n    else {\n        padding = \"\";\n    }\n    return base64 + padding;\n}\n/**\n * Converts a base64 url string to a \"normal\" base64 string. This is used for\n * base64 coded url parameters.\n *\n * @param base64url The base64 url string.\n * @return The base64 string.\n */\nexport function base64UrlToBase64(base64url) {\n    let base64 = base64url.replace(/-/g, \"+\");\n    base64 = base64.replace(/_/g, \"/\");\n    let nbrOfRemainingChars = base64.length % 4;\n    if (nbrOfRemainingChars === 0) {\n        return base64;\n    }\n    else if (nbrOfRemainingChars === 2) {\n        return base64 + \"==\";\n    }\n    else if (nbrOfRemainingChars === 3) {\n        return base64 + \"=\";\n    }\n    throw new Error(\"Illegal base64 string.\");\n}\n// just for edge, as it does not support TextEncoder yet\nexport function _stringToUtf8Uint8ArrayLegacy(string) {\n    let fixedString;\n    try {\n        fixedString = encodeURIComponent(string);\n    }\n    catch (e) {\n        fixedString = encodeURIComponent(_replaceLoneSurrogates(string)); // we filter lone surrogates as trigger URIErrors, otherwise (see https://github.com/tutao/tutanota/issues/618)\n    }\n    let utf8 = unescape(fixedString);\n    let uint8Array = new Uint8Array(utf8.length);\n    for (let i = 0; i < utf8.length; i++) {\n        uint8Array[i] = utf8.charCodeAt(i);\n    }\n    return uint8Array;\n}\nconst REPLACEMENT_CHAR = \"\\uFFFD\";\nexport function _replaceLoneSurrogates(s) {\n    if (s == null) {\n        return \"\";\n    }\n    let result = [];\n    for (let i = 0; i < s.length; i++) {\n        let code = s.charCodeAt(i);\n        let char = s.charAt(i);\n        if (0xd800 <= code && code <= 0xdbff) {\n            if (s.length === i) {\n                // replace high surrogate without following low surrogate\n                result.push(REPLACEMENT_CHAR);\n            }\n            else {\n                let next = s.charCodeAt(i + 1);\n                if (0xdc00 <= next && next <= 0xdfff) {\n                    result.push(char);\n                    result.push(s.charAt(i + 1));\n                    i++; // valid high and low surrogate, skip next low surrogate check\n                }\n                else {\n                    result.push(REPLACEMENT_CHAR);\n                }\n            }\n        }\n        else if (0xdc00 <= code && code <= 0xdfff) {\n            // replace low surrogate without preceding high surrogate\n            result.push(REPLACEMENT_CHAR);\n        }\n        else {\n            result.push(char);\n        }\n    }\n    return result.join(\"\");\n}\nconst encoder = typeof TextEncoder == \"function\"\n    ? new TextEncoder()\n    : {\n        encode: _stringToUtf8Uint8ArrayLegacy,\n    };\nconst decoder = typeof TextDecoder == \"function\"\n    ? new TextDecoder()\n    : {\n        decode: _utf8Uint8ArrayToStringLegacy,\n    };\n/**\n * Converts a string to a Uint8Array containing a UTF-8 string data.\n *\n * @param string The string to convert.\n * @return The array.\n */\nexport function stringToUtf8Uint8Array(string) {\n    return encoder.encode(string);\n}\n// just for edge, as it does not support TextDecoder yet\nexport function _utf8Uint8ArrayToStringLegacy(uint8Array) {\n    let stringArray = [];\n    stringArray.length = uint8Array.length;\n    for (let i = 0; i < uint8Array.length; i++) {\n        stringArray[i] = String.fromCharCode(uint8Array[i]);\n    }\n    return decodeURIComponent(escape(stringArray.join(\"\")));\n}\n/**\n * Converts an Uint8Array containing UTF-8 string data into a string.\n *\n * @param uint8Array The Uint8Array.\n * @return The string.\n */\nexport function utf8Uint8ArrayToString(uint8Array) {\n    return decoder.decode(uint8Array);\n}\nexport function hexToUint8Array(hex) {\n    let bufView = new Uint8Array(hex.length / 2);\n    for (let i = 0; i < bufView.byteLength; i++) {\n        bufView[i] = parseInt(hex.substring(i * 2, i * 2 + 2), 16);\n    }\n    return bufView;\n}\nconst hexDigits = \"0123456789abcdef\";\nexport function uint8ArrayToHex(uint8Array) {\n    let hex = \"\";\n    for (let i = 0; i < uint8Array.byteLength; i++) {\n        let value = uint8Array[i];\n        hex += hexDigits[value >> 4] + hexDigits[value & 15];\n    }\n    return hex;\n}\n/**\n * Converts an Uint8Array to a Base64 encoded string.\n *\n * @param bytes The bytes to convert.\n * @return The Base64 encoded string.\n */\nexport function uint8ArrayToBase64(bytes) {\n    if (bytes.length < 512) {\n        // Apply fails on big arrays fairly often. We tried it with 60000 but if you're already\n        // deep in the stack than we cannot allocate such a big argument array.\n        return btoa(String.fromCharCode(...bytes));\n    }\n    let binary = \"\";\n    const len = bytes.byteLength;\n    for (let i = 0; i < len; i++) {\n        binary += String.fromCharCode(bytes[i]);\n    }\n    return btoa(binary);\n}\nexport function int8ArrayToBase64(bytes) {\n    // Values 0 to 127 are the same for signed and unsigned bytes\n    // and -128 to -1 are mapped to the same chars as 128 to 255.\n    let converted = new Uint8Array(bytes);\n    return uint8ArrayToBase64(converted);\n}\n/**\n * Converts a base64 encoded string to a Uint8Array.\n *\n * @param base64 The Base64 encoded string.\n * @return The bytes.\n */\nexport function base64ToUint8Array(base64) {\n    if (base64.length % 4 !== 0) {\n        throw new Error(`invalid base64 length: ${base64} (${base64.length})`);\n    }\n    const binaryString = atob(base64);\n    const result = new Uint8Array(binaryString.length);\n    for (let i = 0; i < binaryString.length; i++) {\n        result[i] = binaryString.charCodeAt(i);\n    }\n    return result;\n}\n/**\n * Converts a Uint8Array containing string data into a string, given the charset the data is in.\n * @param charset The charset. Must be supported by TextDecoder.\n * @param bytes The string data\n * @trhows RangeError if the charset is not supported\n * @return The string\n */\nexport function uint8ArrayToString(charset, bytes) {\n    const decoder = new TextDecoder(charset);\n    return decoder.decode(bytes);\n}\n/**\n * Decodes a quoted-printable piece of text in a given charset.\n * This was copied and modified from https://github.com/mathiasbynens/quoted-printable/blob/master/src/quoted-printable.js (MIT licensed)\n *\n * @param charset Must be supported by TextEncoder\n * @param input The encoded text\n * @throws RangeError if the charset is not supported\n * @returns The text as a JavaScript string\n */\nexport function decodeQuotedPrintable(charset, input) {\n    return (input // https://tools.ietf.org/html/rfc2045#section-6.7, rule 3:\n        // “Therefore, when decoding a `Quoted-Printable` body, any trailing white\n        // space on a line must be deleted, as it will necessarily have been added\n        // by intermediate transport agents.”\n        .replace(/[\\t\\x20]$/gm, \"\") // Remove hard line breaks preceded by `=`. Proper `Quoted-Printable`-\n        // encoded data only contains CRLF line  endings, but for compatibility\n        // reasons we support separate CR and LF too.\n        .replace(/=(?:\\r\\n?|\\n|$)/g, \"\") // Decode escape sequences of the form `=XX` where `XX` is any\n        // combination of two hexidecimal digits. For optimal compatibility,\n        // lowercase hexadecimal digits are supported as well. See\n        // https://tools.ietf.org/html/rfc2045#section-6.7, note 1.\n        .replace(/(=([a-fA-F0-9]{2}))+/g, (match) => {\n        const hexValues = match.split(/=/);\n        // splitting on '=' is convenient, but adds an empty string at the start due to the first byte\n        hexValues.shift();\n        const intArray = hexValues.map((char) => parseInt(char, 16));\n        const bytes = Uint8Array.from(intArray);\n        return uint8ArrayToString(charset, bytes);\n    }));\n}\nexport function decodeBase64(charset, input) {\n    return uint8ArrayToString(charset, base64ToUint8Array(input));\n}\nexport function stringToBase64(str) {\n    return uint8ArrayToBase64(stringToUtf8Uint8Array(str));\n}\n","import { identity } from \"./Utils.js\";\n/**\n * Everything that is in both array1 and array2\n * This is a naive implementation, don't use it on large inputs\n */\nexport function intersection(set1, set2) {\n    return new Set(Array.from(set1).filter((item) => set2.has(item)));\n}\nexport function min(set) {\n    return minBy(set, identity);\n}\nexport function minBy(collection, selector) {\n    let min = null;\n    for (const item of collection) {\n        const value = selector(item);\n        if (min == null || value < min.value) {\n            min = { item, value };\n        }\n    }\n    return min ? min.item : null;\n}\nexport function max(set) {\n    return maxBy(set, identity);\n}\nexport function maxBy(collection, selector) {\n    let max = null;\n    for (const item of collection) {\n        const value = selector(item);\n        if (max == null || value > max.value) {\n            max = { item, value };\n        }\n    }\n    return max ? max.item : null;\n}\nexport function setAddAll(set, toAdd) {\n    for (const item of toAdd) {\n        set.add(item);\n    }\n}\n/**\n * Returns an element of the {@param collection} if it satisfies {@param selector} or {@code null} otherwise.\n */\nexport function findBy(collection, selector) {\n    for (const item of collection) {\n        if (selector(item)) {\n            return item;\n        }\n    }\n    return null;\n}\nexport function mapWith(map, key, value) {\n    const newMap = new Map(map);\n    newMap.set(key, value);\n    return newMap;\n}\nexport function mapWithout(map, key) {\n    const newMap = new Map(map);\n    newMap.delete(key);\n    return newMap;\n}\n/**\n * diff two maps by keys\n * @param before the map that's considered the old contents\n * @param after the map that's representing the current contents.\n * @returns arrays containing the kept, added, and deleted values.\n */\nexport function trisectingDiff(before, after) {\n    const kept = [];\n    const added = [];\n    const deleted = [];\n    const beforeScratch = new Map(before);\n    const afterScratch = new Map(after);\n    for (const [k, v] of beforeScratch.entries()) {\n        beforeScratch.delete(k);\n        if (afterScratch.has(k)) {\n            afterScratch.delete(k);\n            kept.push(v);\n        }\n        else {\n            deleted.push(v);\n        }\n    }\n    for (const v of afterScratch.values()) {\n        added.push(v);\n    }\n    return { kept, added, deleted };\n}\n","/**\n * Returns a string which contains the given number padded with 0s.\n * @param num The number to pad.\n * @param size The number of resulting digits.\n * @return The padded number as string.\n */\nexport function pad(num, size) {\n    var s = num + \"\";\n    while (s.length < size)\n        s = \"0\" + s;\n    return s;\n}\n/**\n * Checks if a string starts with another string.\n * @param string The string to test.\n * @param substring If the other string begins with this one, we return true.\n * @return True if string begins with substring, false otherwise.\n */\nexport function startsWith(string, substring) {\n    return string.startsWith(substring);\n}\n/**\n * uppercase the first letter of a string, lowercase the rest\n * @param str string to transform\n * @returns {string} str in lowercase with first letter Capitalized\n */\nexport function capitalizeFirstLetter(str) {\n    return str[0].toUpperCase() + str.toLowerCase().slice(1);\n}\n/**\n * Checks if a string ends with another string.\n * @param string The string to test.\n * @param substring If the other string ends with this one, we return true.\n * @return True if string ends with substring, false otherwise.\n */\nexport function endsWith(string, substring) {\n    return string.endsWith(substring);\n}\nexport function lazyStringValue(valueOrLazy) {\n    return typeof valueOrLazy === \"function\" ? valueOrLazy() : valueOrLazy;\n}\nexport function repeat(value, length) {\n    let result = \"\";\n    for (let i = 0; i < length; i++) {\n        result += value;\n    }\n    return result;\n}\nexport function cleanMatch(s1, s2) {\n    return s1.toLowerCase().trim() === s2.toLowerCase().trim();\n}\n/**\n * Non-breaking space character\n */\nexport const NBSP = \"\\u00A0\";\n/**\n * split a string at a given index\n * @param str\n * @param index\n */\nexport function splitAt(str, index) {\n    return [str.substring(0, index), str.substring(index)];\n}\n/**\n * Wrapper around String.prototype.toLowerCase, nice for calls to Array.prototype.map\n * @param str\n */\nexport function toLowerCase(str) {\n    return str.toLowerCase();\n}\n/**\n * Wrapper around String.prototype.localeCompare, for passing to Array.prototype.sort\n * @param a\n * @param b\n * @returns {number}\n */\nexport function localeCompare(a, b) {\n    return a.localeCompare(b);\n}\nexport function byteLength(str) {\n    if (str == null)\n        return 0;\n    // returns the byte length of an utf8 string\n    var s = str.length;\n    for (var i = str.length - 1; i >= 0; i--) {\n        var code = str.charCodeAt(i);\n        if (code > 0x7f && code <= 0x7ff) {\n            s++;\n        }\n        else if (code > 0x7ff && code <= 0xffff)\n            s += 2;\n        if (code >= 0xdc00 && code <= 0xdfff)\n            i--; //trail surrogate\n    }\n    return s;\n}\n/**\n * replace all instances of substr in str with replacement\n */\nexport function replaceAll(str, substr, replacement) {\n    const regex = escapedStringRegExp(substr, \"g\");\n    return str.replace(regex, replacement);\n}\n/**\n * Create a regex to exactly match a given string, by escaping any special regex characters\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping\n * */\nfunction escapedStringRegExp(str, flags) {\n    return new RegExp(str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"), flags);\n}\n","/**\n * T should be restricted to Entity.\n */\nexport class TypeRef {\n    constructor(app, type) {\n        /**\n         * Field that is never set. Used to make two TypeRefs incompatible (they are structurally compared otherwise).\n         * Cannot be private.\n         */\n        this.phantom = null;\n        this.app = app;\n        this.type = type;\n        Object.freeze(this);\n    }\n    /**\n     * breaks when the object passes worker barrier\n     */\n    toString() {\n        return `[TypeRef ${this.app} ${this.type}]`;\n    }\n}\nexport function getTypeId(typeRef) {\n    return typeRef.app + \"/\" + typeRef.type;\n}\nexport function isSameTypeRefByAttr(typeRef, app, type) {\n    return typeRef.app === app && typeRef.type === type;\n}\nexport function isSameTypeRef(typeRef1, typeRef2) {\n    return isSameTypeRefByAttr(typeRef1, typeRef2.app, typeRef2.type);\n}\nexport function isSameTypeRefNullable(typeRef1, typeRef2) {\n    return (typeRef1 == null && typeRef2 == null) || (typeRef1 != null && typeRef2 !== null && isSameTypeRef(typeRef1, typeRef2));\n}\n","import { replaceAll } from \"./StringUtils.js\";\nexport function renderCsv(header, rows, separator = \";\") {\n    // fields containing newlines, double quotes or the separator need to be escaped\n    // by wrapping the whole field in double quotes, and then duplicating any double quotes in the field\n    const escapeColumn = (column) => {\n        if (!column.includes(separator) && !column.includes(\"\\n\") && !column.includes('\"')) {\n            return column;\n        }\n        return `\"${replaceAll(column, '\"', '\"\"')}\"`;\n    };\n    return [header]\n        .concat(rows)\n        .map((row) => row.map(escapeColumn).join(separator))\n        .join(\"\\n\");\n}\n","import { neverNull } from \"./Utils.js\";\n/**\n * Merges multiple maps into a single map with lists of values.\n * @param maps\n */\nexport function mergeMaps(maps) {\n    return maps.reduce((mergedMap, map) => {\n        // merge same key of multiple attributes\n        map.forEach((value, key) => {\n            if (mergedMap.has(key)) {\n                neverNull(mergedMap.get(key)).push(value);\n            }\n            else {\n                mergedMap.set(key, [value]);\n            }\n        });\n        return mergedMap;\n    }, new Map());\n}\nexport function getFromMap(map, key, byDefault) {\n    let value = map.get(key);\n    if (!value) {\n        value = byDefault();\n        map.set(key, value);\n    }\n    return value;\n}\n/** Creates a new map with key and value added to {@param map}. It is like set() but for immutable map. */\nexport function addMapEntry(map, key, value) {\n    const newMap = new Map(map);\n    newMap.set(key, value);\n    return newMap;\n}\nexport function deleteMapEntry(map, key) {\n    const newMap = new Map(map);\n    newMap.delete(key);\n    return newMap;\n}\n","//@bundleInto:common-min\n\nimport { TutanotaError } from \"./TutanotaError\"\n\nexport class ConnectionError extends TutanotaError {\n\tstatic CODE: number = 0\n\n\tconstructor(msg: string) {\n\t\tsuper(\"ConnectionError\", msg)\n\t}\n}\n\nexport class BadRequestError extends TutanotaError {\n\tstatic CODE: number = 400\n\n\tconstructor(msg: string) {\n\t\tsuper(\"BadRequestError\", msg)\n\t}\n}\n\nexport class NotAuthenticatedError extends TutanotaError {\n\tstatic CODE: number = 401\n\n\tconstructor(msg: string) {\n\t\tsuper(\"NotAuthenticatedError\", msg)\n\t}\n}\n\nexport class NotAuthorizedError extends TutanotaError {\n\tstatic CODE: number = 403\n\n\tconstructor(msg: string) {\n\t\tsuper(\"NotAuthorizedError\", msg)\n\t}\n}\n\nexport class NotFoundError extends TutanotaError {\n\tstatic CODE: number = 404\n\n\tconstructor(msg: string) {\n\t\tsuper(\"NotFoundError\", msg)\n\t}\n}\n\nexport class MethodNotAllowedError extends TutanotaError {\n\tstatic CODE: number = 405\n\n\tconstructor(msg: string) {\n\t\tsuper(\"MethodNotAllowedError\", msg)\n\t}\n}\n\nexport class RequestTimeoutError extends TutanotaError {\n\tstatic CODE: number = 408\n\n\tconstructor(msg: string) {\n\t\tsuper(\"RequestTimeoutError\", msg)\n\t}\n}\n\nexport class PreconditionFailedError extends TutanotaError {\n\tstatic CODE: number = 412\n\t// data field is respected by the WorkerProtocol. Other fields might not be passed\n\tdata: string | null\n\n\tconstructor(msg: string, reason: string | null) {\n\t\tsuper(\"PreconditionFailedError\", msg)\n\t\tthis.data = reason\n\t}\n}\n\nexport class LockedError extends TutanotaError {\n\tstatic CODE: number = 423\n\n\tconstructor(msg: string) {\n\t\tsuper(\"LockedError\", msg)\n\t}\n}\n\nexport class TooManyRequestsError extends TutanotaError {\n\tstatic CODE: number = 429\n\n\tconstructor(msg: string) {\n\t\tsuper(\"TooManyRequestsError\", msg)\n\t}\n}\n\nexport class SessionExpiredError extends TutanotaError {\n\tstatic CODE: number = 440\n\n\tconstructor(msg: string) {\n\t\tsuper(\"SessionExpiredError\", msg)\n\t}\n}\n\nexport class AccessDeactivatedError extends TutanotaError {\n\tstatic CODE: number = 470\n\n\tconstructor(msg: string) {\n\t\tsuper(\"AccessDeactivatedError\", msg)\n\t}\n}\n\n/** External users only, related to password changes. */\nexport class AccessExpiredError extends TutanotaError {\n\tstatic CODE: number = 471\n\n\tconstructor(msg: string) {\n\t\tsuper(\"AccessExpiredError\", msg)\n\t}\n}\n\nexport class AccessBlockedError extends TutanotaError {\n\tstatic CODE: number = 472\n\n\tconstructor(msg: string) {\n\t\tsuper(\"AccessBlockedError\", msg)\n\t}\n}\n\nexport class InvalidDataError extends TutanotaError {\n\tstatic CODE: number = 473\n\n\tconstructor(msg: string) {\n\t\tsuper(\"InvalidDataError\", msg)\n\t}\n}\n\nexport class InvalidSoftwareVersionError extends TutanotaError {\n\tstatic CODE: number = 474\n\n\tconstructor(msg: string) {\n\t\tsuper(\"InvalidSoftwareVersionError\", msg)\n\t}\n}\n\nexport class LimitReachedError extends TutanotaError {\n\tstatic CODE: number = 475\n\n\tconstructor(msg: string) {\n\t\tsuper(\"LimitReachedError\", msg)\n\t}\n}\n\nexport class InternalServerError extends TutanotaError {\n\tstatic CODE: number = 500\n\n\tconstructor(msg: string) {\n\t\tsuper(\"InternalServerError\", msg)\n\t}\n}\n\nexport class BadGatewayError extends TutanotaError {\n\tstatic CODE: number = 502\n\n\tconstructor(msg: string) {\n\t\tsuper(\"BadGatewayError\", msg)\n\t}\n}\n\nexport class ServiceUnavailableError extends TutanotaError {\n\tstatic CODE: number = 503\n\n\tconstructor(msg: string) {\n\t\tsuper(\"ServiceUnavailableError\", msg)\n\t}\n}\n\nexport class InsufficientStorageError extends TutanotaError {\n\tstatic CODE: number = 507\n\n\tconstructor(msg: string) {\n\t\tsuper(\"InsufficientStorageError\", msg)\n\t}\n}\n\nexport class ResourceError extends TutanotaError {\n\tconstructor(msg: string) {\n\t\tsuper(\"ResourceError\", msg)\n\t}\n}\n\nexport class PayloadTooLargeError extends TutanotaError {\n\tstatic CODE: number = 413\n\n\tconstructor(msg: string) {\n\t\tsuper(\"PayloadTooLargeError\", msg)\n\t}\n}\n\n/**\n * Attention: When adding an Error also add it in WorkerProtocol.ErrorNameToType.\n */\nexport function handleRestError(errorCode: number, path?: string, errorId?: string | null, precondition?: string | null): TutanotaError {\n\tlet message = `${errorCode}: ${errorId ? errorId + \" \" : \"\"}${precondition ? precondition + \" \" : \"\"}${path}`\n\n\tswitch (errorCode) {\n\t\tcase ConnectionError.CODE:\n\t\t\treturn new ConnectionError(message)\n\n\t\tcase BadRequestError.CODE:\n\t\t\treturn new BadRequestError(message)\n\n\t\tcase NotAuthenticatedError.CODE:\n\t\t\treturn new NotAuthenticatedError(message)\n\n\t\tcase NotAuthorizedError.CODE:\n\t\t\treturn new NotAuthorizedError(message)\n\n\t\tcase NotFoundError.CODE:\n\t\t\treturn new NotFoundError(message)\n\n\t\tcase MethodNotAllowedError.CODE:\n\t\t\treturn new MethodNotAllowedError(message)\n\n\t\tcase PreconditionFailedError.CODE:\n\t\t\treturn new PreconditionFailedError(message, precondition ?? null)\n\n\t\tcase LockedError.CODE:\n\t\t\treturn new LockedError(message)\n\n\t\tcase TooManyRequestsError.CODE:\n\t\t\treturn new TooManyRequestsError(message)\n\n\t\tcase SessionExpiredError.CODE:\n\t\t\treturn new SessionExpiredError(message)\n\n\t\tcase AccessDeactivatedError.CODE:\n\t\t\treturn new AccessDeactivatedError(message)\n\n\t\tcase AccessExpiredError.CODE:\n\t\t\treturn new AccessExpiredError(message)\n\n\t\tcase AccessBlockedError.CODE:\n\t\t\treturn new AccessBlockedError(message)\n\n\t\tcase InvalidDataError.CODE:\n\t\t\treturn new InvalidDataError(message)\n\n\t\tcase InvalidSoftwareVersionError.CODE:\n\t\t\treturn new InvalidSoftwareVersionError(message)\n\n\t\tcase LimitReachedError.CODE:\n\t\t\treturn new LimitReachedError(message)\n\n\t\tcase InternalServerError.CODE:\n\t\t\treturn new InternalServerError(message)\n\n\t\tcase BadGatewayError.CODE:\n\t\t\treturn new BadGatewayError(message)\n\n\t\tcase ServiceUnavailableError.CODE:\n\t\t\treturn new ServiceUnavailableError(message)\n\n\t\tcase InsufficientStorageError.CODE:\n\t\t\treturn new InsufficientStorageError(message)\n\n\t\tcase PayloadTooLargeError.CODE:\n\t\t\treturn new PayloadTooLargeError(message)\n\n\t\tcase RequestTimeoutError.CODE:\n\t\t\treturn new RequestTimeoutError(message)\n\n\t\tdefault:\n\t\t\treturn new ResourceError(message)\n\t}\n}\n","//@bundleInto:common-min\n\n/**\n * Base class for all errors in Tutanota. Provides the handling of error stacks for chrome (captureStackTrace) and others.\n * Implemented using ES5 inheritance as babel does not support extending builtin types\n * @see http://stackoverflow.com/questions/33870684/why-doesnt-instanceof-work-on-instances-of-error-subclasses-under-babel-node\n *\n * Note that passing errors between worker and main thread requires all fields of the error to be serializable.\n * Currently those are name, message, stack and data. See (errorToObj() and objToError()).\n *\n * In order to correctly set the class type of the error after deserialization\n * (needed for e instanceof CustomError to work), the error class needs to be\n * added to the ErrorNameToType map in Utils.js.\n */\nconst ExtendableErrorF = function ExtendableError() {\n\t// @ts-ignore\n\tError.apply(this, arguments)\n}\n\n// Warning: huge type hack\n// You can't import downcast here\nExtendableErrorF.prototype = Object.create(Error.prototype)\n// @ts-ignore\nconst ExtendableError: Class<Error> = ExtendableErrorF as any\n\nexport class TutanotaError extends ExtendableError {\n\tname: string\n\tmessage: string\n\n\tconstructor(name: string, message: string) {\n\t\tsuper(message)\n\t\tthis.name = name\n\t\tthis.message = message\n\n\t\tif (typeof Error.captureStackTrace === \"function\") {\n\t\t\tError.captureStackTrace(this, this.constructor)\n\t\t} else {\n\t\t\tlet error = new Error()\n\n\t\t\tif (!error.stack) {\n\t\t\t\t// fill the stack trace on ios devices\n\t\t\t\ttry {\n\t\t\t\t\tthrow error\n\t\t\t\t} catch (e) {}\n\t\t\t}\n\n\t\t\tthis.stack = this.name + \". \" + this.message\n\n\t\t\tif (error.stack) {\n\t\t\t\t// not existing in IE9\n\t\t\t\tlet stackLines = error.stack.split(\"\\n\")\n\n\t\t\t\twhile (stackLines[0] && !stackLines[0].match(this.name)) {\n\t\t\t\t\tstackLines = stackLines.slice(1) // removes line from stack\n\t\t\t\t}\n\n\t\t\t\tif (stackLines.length === 0) {\n\t\t\t\t\tthis.stack = error.stack\n\t\t\t\t} else {\n\t\t\t\t\tthis.stack += \"\\n\" + stackLines.join(\"\\n\")\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","//@bundleInto:common-min\n\nimport { TutanotaError } from \"./TutanotaError\"\n\nexport class ProgrammingError extends TutanotaError {\n\tconstructor(m?: string) {\n\t\tsuper(\"ProgrammingError\", m ?? \"Unkown programming error\")\n\t}\n}\n","/**\n * Represents a resource that is either not ready, ready, or error\n * Sort of fills a similar role to LazyLoaded, usage is more verbose but also more typesafe. maybe this should be reconciled.\n */\nexport class AsyncResult {\n    constructor(promise) {\n        this._state = pending(promise);\n        promise.then((result) => (this._state = complete(result))).catch((error) => (this._state = failure(error)));\n    }\n    state() {\n        return this._state;\n    }\n}\nfunction pending(promise) {\n    return {\n        status: \"pending\",\n        promise,\n    };\n}\nfunction complete(result) {\n    return {\n        status: \"complete\",\n        result,\n    };\n}\nfunction failure(error) {\n    return {\n        status: \"failure\",\n        error,\n    };\n}\n","/**\n    @param iterable - Iterated over concurrently in the `mapper` function.\n    @param mapper - Function which is called for every item in `input`. Expected to return a `Promise` or value.\n    @param options\n    @returns A `Promise` that is fulfilled when all promises in `input` and ones returned from `mapper` are fulfilled, or rejects if any of the promises reject. The fulfilled value is an `Array` of the fulfilled values returned from `mapper` in `input` order.\n    @example\n    ```\n    import pMap from 'p-map';\n    import got from 'got';\n    const sites = [\n        getWebsiteFromUsername('sindresorhus'), //=> Promise\n        'https://avajs.dev',\n        'https://github.com'\n    ];\n    const mapper = async site => {\n        const {requestUrl} = await got.head(site);\n        return requestUrl;\n    };\n    const result = await pMap(sites, mapper, {concurrency: 2});\n    console.log(result);\n    //=> ['https://sindresorhus.com/', 'https://avajs.dev/', 'https://github.com/']\n    ```\n */\nexport async function pMap(iterable, mapper, options = {}) {\n    const { concurrency = 1 } = options;\n    return new Promise((resolve, reject) => {\n        if (typeof mapper !== \"function\") {\n            throw new TypeError(\"Mapper function is required\");\n        }\n        if (!((Number.isSafeInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency >= 1)) {\n            throw new TypeError(`Expected \\`concurrency\\` to be an integer from 1 and up or \\`Infinity\\`, got \\`${concurrency}\\` (${typeof concurrency})`);\n        }\n        const result = [];\n        const errors = [];\n        const iterator = iterable[Symbol.iterator]();\n        let isRejected = false;\n        let isIterableDone = false;\n        let resolvingCount = 0;\n        let currentIndex = 0;\n        const next = () => {\n            if (isRejected) {\n                return;\n            }\n            const nextItem = iterator.next();\n            const index = currentIndex;\n            currentIndex++;\n            if (nextItem.done) {\n                isIterableDone = true;\n                if (resolvingCount === 0) {\n                    resolve(result);\n                }\n                return;\n            }\n            resolvingCount++;\n            (async () => {\n                try {\n                    const element = await nextItem.value;\n                    result[index] = await mapper(element, index);\n                    resolvingCount--;\n                    next();\n                }\n                catch (error) {\n                    isRejected = true;\n                    reject(error);\n                }\n            })();\n        };\n        for (let index = 0; index < concurrency; index++) {\n            next();\n            if (isIterableDone) {\n                break;\n            }\n        }\n    });\n}\n","import { neverNull } from \"./Utils.js\";\n/**\n * A wrapper for an object that shall be lazy loaded asynchronously. If loading the object is triggered in parallel (getAsync()) the object is actually only loaded once but returned to all calls of getAsync().\n * If the object was loaded once it is not loaded again.\n */\nexport class LazyLoaded {\n    /**\n     * @param loadFunction The function that actually loads the object as soon as getAsync() is called the first time.\n     * @param defaultValue The value that shall be returned by getSync() or getLoaded() as long as the object is not loaded yet.\n     */\n    constructor(loadFunction, defaultValue) {\n        this._isLoaded = false;\n        this._loadFunction = loadFunction;\n        this._loadingPromise = null;\n        this._loadedObject = defaultValue !== null && defaultValue !== void 0 ? defaultValue : null;\n    }\n    load() {\n        this.getAsync();\n        return this;\n    }\n    isLoaded() {\n        return this._isLoaded;\n    }\n    /**\n     * Loads the object if it is not loaded yet. May be called in parallel and takes care that the load function is only called once.\n     */\n    getAsync() {\n        if (this.isLoaded()) {\n            return Promise.resolve(neverNull(this._loadedObject));\n        }\n        else {\n            if (!this._loadingPromise) {\n                this._loadingPromise = this._loadFunction()\n                    .catch((e) => {\n                    this._loadingPromise = null;\n                    throw e;\n                })\n                    .then((result) => {\n                    this._loadedObject = result;\n                    this._isLoaded = true;\n                    return result;\n                });\n            }\n            return this._loadingPromise;\n        }\n    }\n    /**\n     * Returns null if the object is not loaded yet.\n     */\n    getSync() {\n        return this._loadedObject;\n    }\n    /**\n     * Only call this function if you know that the object is already loaded.\n     */\n    getLoaded() {\n        return neverNull(this._loadedObject);\n    }\n    /**\n     * Removes the currently loaded object, so it will be loaded again with the next getAsync() call. Does not set any default value.\n     */\n    reset() {\n        this._isLoaded = false;\n        this._loadingPromise = null;\n        this._loadedObject = null;\n    }\n    /**\n     * Loads the object again and replaces the current one\n     */\n    async reload() {\n        return this._loadFunction().then((result) => {\n            this._isLoaded = true;\n            this._loadedObject = result;\n            return result;\n        });\n    }\n}\n","import { findAndRemove, insertIntoSortedArray } from \"./ArrayUtils.js\";\n/**\n * Compared based on the type's natural ordering\n */\nfunction numberCompare(a, b) {\n    return a < b ? -1 : a > b ? 1 : 0;\n}\n/**\n * An array that keeps itself sorted\n */\nexport class SortedArray {\n    constructor(contents, compareFn) {\n        this.contents = contents;\n        this.compareFn = compareFn;\n    }\n    static fromNumbers(array) {\n        return SortedArray.from(array, numberCompare);\n    }\n    static empty(compareFn) {\n        return new SortedArray([], compareFn);\n    }\n    static from(array, compareFn) {\n        const list = new SortedArray([], compareFn);\n        list.insertAll(array);\n        return list;\n    }\n    get length() {\n        return this.contents.length;\n    }\n    get array() {\n        return this.contents;\n    }\n    get(index) {\n        return this.contents[index];\n    }\n    insertAll(array) {\n        this.contents.push(...array);\n        this.contents.sort(this.compareFn);\n    }\n    insert(item) {\n        insertIntoSortedArray(item, this.contents, this.compareFn);\n    }\n    removeFirst(finder) {\n        return findAndRemove(this.contents, finder);\n    }\n}\n","/* eslint-disable */\n;(function() {\n\"use strict\"\n/* eslint-enable */\nStream.SKIP = {}\nStream.lift = lift\nStream.scan = scan\nStream.merge = merge\nStream.combine = combine\nStream.scanMerge = scanMerge\nStream[\"fantasy-land/of\"] = Stream\n\nvar warnedHalt = false\nObject.defineProperty(Stream, \"HALT\", {\n\tget: function() {\n\t\twarnedHalt || console.log(\"HALT is deprecated and has been renamed to SKIP\");\n\t\twarnedHalt = true\n\t\treturn Stream.SKIP\n\t}\n})\n\nfunction Stream(value) {\n\tvar dependentStreams = []\n\tvar dependentFns = []\n\n\tfunction stream(v) {\n\t\tif (arguments.length && v !== Stream.SKIP) {\n\t\t\tvalue = v\n\t\t\tif (open(stream)) {\n\t\t\t\tstream._changing()\n\t\t\t\tstream._state = \"active\"\n\t\t\t\t// Cloning the list to ensure it's still iterated in intended\n\t\t\t\t// order\n\t\t\t\tdependentStreams.slice().forEach(function(s, i) {\n\t\t\t\t\tif (open(s)) s(this[i](value))\n\t\t\t\t}, dependentFns.slice())\n\t\t\t}\n\t\t}\n\n\t\treturn value\n\t}\n\n\tstream.constructor = Stream\n\tstream._state = arguments.length && value !== Stream.SKIP ? \"active\" : \"pending\"\n\tstream._parents = []\n\n\tstream._changing = function() {\n\t\tif (open(stream)) stream._state = \"changing\"\n\t\tdependentStreams.forEach(function(s) {\n\t\t\ts._changing()\n\t\t})\n\t}\n\n\tstream._map = function(fn, ignoreInitial) {\n\t\tvar target = ignoreInitial ? Stream() : Stream(fn(value))\n\t\ttarget._parents.push(stream)\n\t\tdependentStreams.push(target)\n\t\tdependentFns.push(fn)\n\t\treturn target\n\t}\n\n\tstream.map = function(fn) {\n\t\treturn stream._map(fn, stream._state !== \"active\")\n\t}\n\n\tvar end\n\tfunction createEnd() {\n\t\tend = Stream()\n\t\tend.map(function(value) {\n\t\t\tif (value === true) {\n\t\t\t\tstream._parents.forEach(function (p) {p._unregisterChild(stream)})\n\t\t\t\tstream._state = \"ended\"\n\t\t\t\tstream._parents.length = dependentStreams.length = dependentFns.length = 0\n\t\t\t}\n\t\t\treturn value\n\t\t})\n\t\treturn end\n\t}\n\n\tstream.toJSON = function() { return value != null && typeof value.toJSON === \"function\" ? value.toJSON() : value }\n\n\tstream[\"fantasy-land/map\"] = stream.map\n\tstream[\"fantasy-land/ap\"] = function(x) { return combine(function(s1, s2) { return s1()(s2()) }, [x, stream]) }\n\n\tstream._unregisterChild = function(child) {\n\t\tvar childIndex = dependentStreams.indexOf(child)\n\t\tif (childIndex !== -1) {\n\t\t\tdependentStreams.splice(childIndex, 1)\n\t\t\tdependentFns.splice(childIndex, 1)\n\t\t}\n\t}\n\n\tObject.defineProperty(stream, \"end\", {\n\t\tget: function() { return end || createEnd() }\n\t})\n\n\treturn stream\n}\n\nfunction combine(fn, streams) {\n\tvar ready = streams.every(function(s) {\n\t\tif (s.constructor !== Stream)\n\t\t\tthrow new Error(\"Ensure that each item passed to stream.combine/stream.merge/lift is a stream.\")\n\t\treturn s._state === \"active\"\n\t})\n\tvar stream = ready\n\t\t? Stream(fn.apply(null, streams.concat([streams])))\n\t\t: Stream()\n\n\tvar changed = []\n\n\tvar mappers = streams.map(function(s) {\n\t\treturn s._map(function(value) {\n\t\t\tchanged.push(s)\n\t\t\tif (ready || streams.every(function(s) { return s._state !== \"pending\" })) {\n\t\t\t\tready = true\n\t\t\t\tstream(fn.apply(null, streams.concat([changed])))\n\t\t\t\tchanged = []\n\t\t\t}\n\t\t\treturn value\n\t\t}, true)\n\t})\n\n\tvar endStream = stream.end.map(function(value) {\n\t\tif (value === true) {\n\t\t\tmappers.forEach(function(mapper) { mapper.end(true) })\n\t\t\tendStream.end(true)\n\t\t}\n\t\treturn undefined\n\t})\n\n\treturn stream\n}\n\nfunction merge(streams) {\n\treturn combine(function() { return streams.map(function(s) { return s() }) }, streams)\n}\n\nfunction scan(fn, acc, origin) {\n\tvar stream = origin.map(function(v) {\n\t\tvar next = fn(acc, v)\n\t\tif (next !== Stream.SKIP) acc = next\n\t\treturn next\n\t})\n\tstream(acc)\n\treturn stream\n}\n\nfunction scanMerge(tuples, seed) {\n\tvar streams = tuples.map(function(tuple) { return tuple[0] })\n\n\tvar stream = combine(function() {\n\t\tvar changed = arguments[arguments.length - 1]\n\t\tstreams.forEach(function(stream, i) {\n\t\t\tif (changed.indexOf(stream) > -1)\n\t\t\t\tseed = tuples[i][1](seed, stream())\n\t\t})\n\n\t\treturn seed\n\t}, streams)\n\n\tstream(seed)\n\n\treturn stream\n}\n\nfunction lift() {\n\tvar fn = arguments[0]\n\tvar streams = Array.prototype.slice.call(arguments, 1)\n\treturn merge(streams).map(function(streams) {\n\t\treturn fn.apply(undefined, streams)\n\t})\n}\n\nfunction open(s) {\n\treturn s._state === \"pending\" || s._state === \"active\" || s._state === \"changing\"\n}\n\nif (typeof module !== \"undefined\") module[\"exports\"] = Stream\nelse if (typeof window.m === \"function\" && !(\"stream\" in window.m)) window.m.stream = Stream\nelse window.m = {stream : Stream}\n\n}());\n","//@bundleInto:common-min\n\nimport { TutanotaError } from \"./TutanotaError\"\n\nexport class CryptoError extends TutanotaError {\n\t/**\n\t * A crypto exception is thrown whenever an encryption/decryption or conversion of keys fails.\n\t * @param message An information about the exception.\n\t * @param error The original error that was thrown.\n\t */\n\tconstructor(message: string, error?: Error) {\n\t\tsuper(\"CryptoError\", error ? message + \"> \" + (error.stack ? error.stack : error.message) : message)\n\t}\n}\n","//@bundleInto:common-min\n\nimport { TutanotaError } from \"./TutanotaError\"\n\nexport class SessionKeyNotFoundError extends TutanotaError {\n\tconstructor(message: string) {\n\t\tsuper(\"SessionKeyNotFoundError\", message)\n\t}\n}\n","//@bundleInto:common-min\n\nimport { TutanotaError } from \"./TutanotaError\"\n\nexport class RecipientsNotFoundError extends TutanotaError {\n\tconstructor(m: string) {\n\t\tsuper(\"RecipientsNotFoundError\", m)\n\t}\n}\n","//@bundleInto:common-min\n\nimport { TutanotaError } from \"./TutanotaError\"\n\nexport class RecipientNotResolvedError extends TutanotaError {\n\tconstructor(m: string) {\n\t\tsuper(\"RecipientNotResolvedError\", m)\n\t}\n}\n","//@bundleInto:common-min\n\nimport { TutanotaError } from \"./TutanotaError\"\n\nexport class OutOfSyncError extends TutanotaError {\n\tconstructor(message: string) {\n\t\tsuper(\"OutOfSyncError\", message)\n\t}\n}\n","//@bundleInto:common-min\n\nimport { TutanotaError } from \"./TutanotaError\"\n\nexport class DbError extends TutanotaError {\n\terror: Error | null\n\n\t/**\n\t * A db error is thrown from indexeddb\n\t * @param message An information about the exception.\n\t * @param error The original error that was thrown.\n\t */\n\tconstructor(message: string, error?: Error) {\n\t\tsuper(\"DbError\", error ? message + `: ${error.name}, ${error.message}> ` + (error.stack ? error.stack : error.message) : message)\n\t\tthis.error = error ?? null\n\t}\n}\n","//@bundleInto:common-min\n\nimport { DbError } from \"./DbError\"\n\nexport class IndexingNotSupportedError extends DbError {\n\tconstructor(message: string, error?: Error) {\n\t\tsuper(message, error)\n\t\tthis.name = \"IndexingNotSupportedError\"\n\t}\n}\n","//@bundleInto:common-min\n\nimport { DbError } from \"./DbError\"\n\n/**\n * Error used to indicate that there's insufficient space on the device.\n */\nexport class QuotaExceededError extends DbError {\n\tconstructor(message: string, error: Error | null) {\n\t\tsuper(message, error ?? undefined)\n\t\tthis.name = \"QuotaExceededError\"\n\t}\n}\n","//@bundleInto:common-min\n\nimport { TutanotaError } from \"./TutanotaError\"\n\nexport class CancelledError extends TutanotaError {\n\t/**\n\t * A cancelled error is thrown when a async action is aborted\n\t * @param message An information about the exception.\n\t * @param error The original error that was thrown.\n\t */\n\tconstructor(message: string) {\n\t\tsuper(\"CancelledError\", message)\n\t}\n}\n","//@bundleInto:common-min\n\nimport { TutanotaError } from \"./TutanotaError\"\n\nexport class FileOpenError extends TutanotaError {\n\tconstructor(message: string) {\n\t\tsuper(\"FileOpenError\", message)\n\t}\n}\n","//@bundleInto:common-min\n\nimport { TutanotaError } from \"./TutanotaError\"\n\nexport class PermissionError extends TutanotaError {\n\tconstructor(m: string) {\n\t\tsuper(\"PermissionError\", m)\n\t}\n}\n","//@bundleInto:common-min\n\nimport { TutanotaError } from \"./TutanotaError\"\n\nexport class FileNotFoundError extends TutanotaError {\n\tconstructor(msg: string) {\n\t\tsuper(\"FileNotFoundError\", msg)\n\t}\n}\n","//@bundleInto:common-min\n\nimport { TutanotaError } from \"./TutanotaError.js\"\n\n/**\n * this error is thrown when the client fails to get access to a safe storage for\n * credentials, pushIdentifiers and alarms.\n */\nexport class DeviceStorageUnavailableError extends TutanotaError {\n\tconstructor(msg: string, error: Error | null) {\n\t\tconst message = error ? msg + \"> \" + (error.stack ? error.stack : error.message) : msg\n\t\tsuper(\"DeviceStorageUnavailableError\", message)\n\t}\n}\n","//@bundleInto:common-min\n\nimport { TutanotaError } from \"./TutanotaError\"\n\nexport class MailBodyTooLargeError extends TutanotaError {\n\tconstructor(message: string) {\n\t\tsuper(\"MailBodyTooLargeError\", message)\n\t}\n}\n","//@bundleInto:common-min\n\nexport class CredentialAuthenticationError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message)\n\t}\n}\n","//@bundleInto:common-min\n\nexport class KeyPermanentlyInvalidatedError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message)\n\t}\n}\n","//@bundleInto:common-min\n\nimport { TutanotaError } from \"./TutanotaError\"\n\nexport class ImportError extends TutanotaError {\n\tdata: {\n\t\tnumFailed: number\n\t}\n\n\tconstructor(error: Error, message: string, numFailed: number) {\n\t\tsuper(\n\t\t\t\"ImportError\",\n\t\t\t`${message}\nNumber of failed imports: ${numFailed} First error: ${error}`,\n\t\t)\n\t\tthis.data = {\n\t\t\tnumFailed,\n\t\t}\n\t}\n\n\tget numFailed(): number {\n\t\treturn this.data.numFailed\n\t}\n}\n","//@bundleInto:common-min\n\nimport { TutanotaError } from \"./TutanotaError.js\"\n\nexport class WebauthnError extends TutanotaError {\n\tconstructor(error: Error) {\n\t\tsuper(\"WebauthnError\", `${error.name} ${String(error)}`)\n\t}\n}\n","//@bundleInto:common-min\n\nimport { TutanotaError } from \"./TutanotaError.js\"\n\nexport class SuspensionError extends TutanotaError {\n\tconstructor(message: string) {\n\t\tsuper(\"SuspensionError\", message)\n\t}\n}\n","//@bundleInto:common-min\n\nimport { TutanotaError } from \"./TutanotaError\"\n\nexport class LoginIncompleteError extends TutanotaError {\n\tconstructor(message: string) {\n\t\tsuper(\"LoginIncompleteError\", message)\n\t}\n}\n","//@bundleInto:common-min\n\nimport { TutanotaError } from \"./TutanotaError.js\"\n\nexport class OfflineDbClosedError extends TutanotaError {\n\tconstructor(msg?: string) {\n\t\tsuper(\"OfflineDbClosedError\", msg ?? \"Offline db is closed\")\n\t}\n}\n","//@bundleInto:common-min\n\nimport { TutanotaError } from \"./TutanotaError\"\n\nexport class SseError extends TutanotaError {\n\tconstructor(m: string) {\n\t\tsuper(\"SseError\", m)\n\t}\n}\n","//@bundleInto:common-min\n\nimport { TutanotaError } from \"./TutanotaError\"\n\n//Error cannot be serialized to be passed between worker and main thread\nexport class SetupMultipleError<T> extends TutanotaError {\n\terrors: Error[]\n\tfailedInstances: Array<T>\n\n\tconstructor(message: string, errors: Error[], instances: Array<T>) {\n\t\tsuper(\n\t\t\t\"SetupMultipleError\",\n\t\t\t`${message}\nNumber of errors: ${errors.length}\nFirst error: ${errors[0]}`,\n\t\t)\n\t\tthis.errors = errors\n\t\tthis.failedInstances = instances\n\t}\n}\n","//@bundleInto:common-min\n\nimport { TutanotaError } from \"./TutanotaError\"\n\nexport class ParsingError extends TutanotaError {\n\tconstructor(m: string) {\n\t\tsuper(\"ParsingError\", m)\n\t}\n}\n","//@bundleInto:common-min\n\nimport { TutanotaError } from \"./TutanotaError\"\n\nexport class InvalidDatabaseStateError extends TutanotaError {\n\tconstructor(message: string) {\n\t\tsuper(\"InvalidDatabaseStateError\", message)\n\t}\n}\n","//@bundleInto:common-min\n\nimport { TutanotaError } from \"./TutanotaError\"\n\nexport class MembershipRemovedError extends TutanotaError {\n\tconstructor(message: string) {\n\t\tsuper(\"MembershipRemovedError\", message)\n\t}\n}\n"],"names":["hostname","endsWith","indexOf","global","loggerInstance","force","env","dist","debug","logger","globalConsole","console","log","args","logInfo","warn","logWarn","error","logError","trace","info","isBrowser","boot","ret","promise","Promise","resolve","reject","date","byValue","setDate","getDate","array","isEmpty","RangeError","last","value","min","max","Math","d","Date","setMonth","getMonth","cls","catcher","async","e","date1","date2","toDateString","arrays","flat","Array","keys","slice","hour","getTime","setHours","getHourOfDay","val","action","result","attendee","status","assertionsEnabled","isMainOrNode","Error","mailMethod","CalendarMethod","PUBLISH","REQUEST","REPLY","ADD","CANCEL","REFRESH","COUNTER","DECLINECOUNTER","ProgrammingError","clone","instance","Uint8Array","map","i","TypeRef","Object","copy","create","getPrototypeOf","assign","key","customer","feature","customizations","find","customization","myMap","anyMap","set","delete","clear","freeze","userSettings","startOfTheWeek","iterable","discriminator","mapper","Map","el","getFromMap","Set","add","charset","input","uint8ArrayToString","base64ToUint8Array","replace","match","hexValues","split","shift","intArray","char","parseInt","bytes","from","theArray","length","isNaN","test","NaN","getFullYear","enumValues","getOwnPropertyNames","enumValue","JSON","stringify","finder","found","element","push","before","after","kept","added","deleted","beforeScratch","afterScratch","k","v","entries","has","values","a1","a2","predicate","set1","set2","diff","groupByAndMap","identity","startIndex","removedElement","splice","base64ext","padding","base64","index","base64ExtLookup","charAt","base64Alphabet","base64url","uint8Array","decoder","decode","nbrOfRemainingChars","base64Lookup","base64extAlphabet","hex","uint8ArrayToBase64","hexToUint8Array","num","size","s","str","toLowerCase","filter","item","assertion","message","resolveMaybeLazy","chunkSize","_chunk","valueOrLazy","maybe","mapping","timeout","toThrottle","timeoutId","toInvoke","clearTimeout","bind","setTimeout","source","cached","t","formatSortableDateTime","isApp","platformId","mode","Mode","App","elementToCheck","elements","pred","reduce","acc","next","newMap","fn","called","arg","string","substring","headers","_b","_a","compressedHeaders","stringToUtf8Uint8Array","startsWith","s1","s2","trim","arr","comp","a","b","deduplicated","forEach","some","events","type","elementId","event","operation","instanceId","mask","all","left","right","partition","arr1","arr2","zipped","zip","lastInvoked","now","apply","days","DAY_IN_MILLIS","typeRef1","typeRef2","isSameTypeRef","spamRule","getAsEnumValue","SpamRuleType","field","object","customerInfo","domainInfos","di","whitelabelConfig","isElectronClient","toUpperCase","domainName","domain","obj","content","scope","timestamp","data","_type","name","mimeType","byteLength","id","undefined","approvalStatus","compareFn","m","n","cmp","argumentProvider","computationFunction","memoizedComputation","memoized","handler","then","toAdd","findLastIndex","collection","selector","staticUrl","getWebRoot","array1","array2","compare","element1","element2","localeCompare","header","rows","separator","escapeColumn","column","includes","replaceAll","concat","row","join","useMapInCallContext","mapInCallContext","mapNoFallback","maps","mergedMap","get","hash","millis","worker","node","Test","errorCode","path","errorId","precondition","ConnectionError","CODE","BadRequestError","NotAuthenticatedError","NotAuthorizedError","NotFoundError","MethodNotAllowedError","PreconditionFailedError","LockedError","TooManyRequestsError","SessionExpiredError","AccessDeactivatedError","AccessExpiredError","AccessBlockedError","InvalidDataError","InvalidSoftwareVersionError","LimitReachedError","InternalServerError","BadGatewayError","ServiceUnavailableError","InsufficientStorageError","PayloadTooLargeError","RequestTimeoutError","ResourceError","floor","random","buffer","previous","current","uint8ArrayToHex","Browser","typeRef","app","newObj","typedKey","getApiOrigin","code","charCodeAt","senderAddress","lastIndexOf","mapped","elementToRemove","resultList","resultItem","point","rect","x","y","top","bottom","ms","Number","o","errorType","ErrorNameToType","stack","DOMException","SECURITY_ERR","NOT_SUPPORTED_ERR","ExtendableErrorF","this","arguments","prototype","ExtendableError","TutanotaError","constructor","super","captureStackTrace","stackLines","exports","Playground","Desktop","Admin","isIOSApp","location","protocol","port","origin","isDesktop","WorkerGlobalScope","self","process","versions","isAdminClient","isWorker","NO_THREAD_ASSERTIONS","phantom","toString","isSameTypeRefByAttr","neverNull","downcast","lastArg","lastResult","didCache","errorToString","errorString","byDefault","findAndRemove","findIndex","chunkNum","chunks","end","start","insertIntoSortedArray","comparator","replaceIf","compareResult","_state","pending","complete","catch","failure","state","formatSortableDate","month","day","hours","getHours","minutes","getMinutes","seconds","getSeconds","makeLookup","lookup","REPLACEMENT_CHAR","encoder","TextEncoder","encode","fixedString","encodeURIComponent","_replaceLoneSurrogates","utf8","unescape","TextDecoder","stringArray","String","fromCharCode","decodeURIComponent","escape","bufView","hexDigits","btoa","binary","len","binaryString","atob","pMap","options","concurrency","TypeError","isSafeInteger","POSITIVE_INFINITY","iterator","Symbol","isRejected","isIterableDone","resolvingCount","currentIndex","nextItem","done","callback","PromisableWrapper","_mapInCallContext","mappedValue","promiseMap","flatWrapper","loadFunction","defaultValue","_isLoaded","_loadFunction","_loadingPromise","_loadedObject","load","getAsync","isLoaded","getSync","getLoaded","reset","static","thenOrApply","onFulfill","onReject","toPromise","numberCompare","SortedArray","contents","list","insertAll","sort","insert","removeFirst","substr","replacement","regex","flags","RegExp","escapedStringRegExp","Stream","SKIP","lift","streams","call","merge","scan","stream","combine","scanMerge","tuples","seed","tuple","changed","warnedHalt","dependentStreams","dependentFns","open","_changing","_parents","_map","ignoreInitial","target","toJSON","_unregisterChild","child","childIndex","defineProperty","p","ready","every","mappers","endStream","module","MAX_BLOB_SIZE_BYTES","reverse","folder","folderType","objectMap","r","GroupType","membership","groupType","MailFolderType","contactSocialId","AccountType","SYSTEM","FREE","STARTER","PREMIUM","EXTERNAL","CustomDomainType","NONE","ONE","THREE","TEN","UNLIMITED","PlanType","Free","Revolutionary","Legend","Essential","Advanced","Unlimited","Premium","PremiumBusiness","Teams","TeamsBusiness","Pro","BookingItemFeatureType","accountingInfo","paymentMethod","PaymentMethodType","UPGRADE_REMINDER_INTERVAL","MEMORY_GB_FACTOR","MEMORY_WARNING_FACTOR","CURRENT_DATE","CURRENCY_SYMBOL_EUR","ApprovalStatus","CustomDomainValidationResult","CustomDomainCheckResult","SecondFactorType","MAX_LOGO_SIZE","FeatureType","pow","RepeatPeriod","AlarmInterval","CounterType","RETURN","BACKSPACE","TAB","SHIFT","CTRL","ALT","META","ESC","SPACE","PAGE_UP","PAGE_DOWN","END","HOME","LEFT","UP","RIGHT","DOWN","DELETE","TWO","FOUR","FIVE","SIX","A","B","C","D","E","F","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","F1","F5","F11","F12","ReportedMailFieldType","MailAuthenticationStatus","CalendarAttendeeStatus","UsageTestState","UsageTestMetricType","UsageTestParticipationMode","TerminationPeriodOptions","dateProvider","_entries","_index","_dateProvider","level","entry","formatLogEntry","rest","toISOString","getEntries","newerPart","Boolean","msg","reason","CryptoError","SessionKeyNotFoundError","RecipientsNotFoundError","RecipientNotResolvedError","OutOfSyncError","DbError","IndexingNotSupportedError","QuotaExceededError","CancelledError","FileOpenError","PermissionError","FileNotFoundError","DeviceStorageUnavailableError","MailBodyTooLargeError","CredentialAuthenticationError","KeyPermanentlyInvalidatedError","ImportError","numFailed","WebauthnError","SuspensionError","LoginIncompleteError","OfflineDbClosedError","SseError","NSURLErrorDomain","errors","instances","failedInstances"],"mappings":"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"}