tweb/public/687.e9f93733bf343790b37d.ch...

1 line
32 KiB
Plaintext

{"version":3,"file":"687.e9f93733bf343790b37d.chunk.js","mappings":"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","sources":["webpack://tweb/./src/helpers/object/getDeepProperty.ts","webpack://tweb/./src/helpers/object/validateInitObject.ts","webpack://tweb/./src/helpers/compareVersion.ts","webpack://tweb/./src/lib/appManagers/appStateManager.ts","webpack://tweb/./src/helpers/getTimeFormat.ts","webpack://tweb/./src/helpers/object/setDeepProperty.ts"],"sourcesContent":["export default function getDeepProperty(object: any, key: string) {\n const splitted = key.split('.');\n let o: any = object;\n splitted.forEach(key => {\n if(!key) {\n return;\n }\n \n // @ts-ignore\n o = o[key];\n });\n \n return o;\n}\n","import copy from \"./copy\";\nimport isObject from \"./isObject\";\n\nexport default function validateInitObject(initObject: any, currentObject: any, onReplace?: (key: string) => void, previousKey?: string) {\n for(const key in initObject) {\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\n currentObject[key] = copy(initObject[key]);\n onReplace && onReplace(previousKey || key);\n } else if(isObject(initObject[key])) {\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key);\n }\n }\n}\n","export default function compareVersion(v1: string, v2: string): number {\n v1 = v1.split(' ', 1)[0];\n v2 = v2.split(' ', 1)[0];\n const s1 = v1.split('.');\n const s2 = v2.split('.');\n\n for(let i = 0; i < s1.length; ++i) {\n const v1 = +s1[i];\n const v2 = +s2[i];\n if(v1 > v2) return 1;\n else if(v1 < v2) return -1;\n }\n\n return 0;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Dialog } from './appMessagesManager';\nimport { NULL_PEER_ID, UserAuth } from '../mtproto/mtproto_config';\nimport type { MyTopPeer, TopPeerType, User } from './appUsersManager';\nimport type { AuthState } from '../../types';\nimport type FiltersStorage from '../storages/filters';\nimport type DialogsStorage from '../storages/dialogs';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport rootScope from '../rootScope';\nimport stateStorage from '../stateStorage';\nimport { logger } from '../logger';\nimport App from '../../config/app';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport AppStorage from '../storage';\nimport { AutoDownloadSettings, Chat, NotifyPeer, PeerNotifySettings } from '../../layer';\nimport { IS_MOBILE } from '../../environment/userAgent';\nimport DATABASE_STATE from '../../config/databases/state';\nimport sessionStorage from '../sessionStorage';\nimport { nextRandomUint } from '../../helpers/random';\nimport compareVersion from '../../helpers/compareVersion';\nimport getTimeFormat from '../../helpers/getTimeFormat';\nimport copy from '../../helpers/object/copy';\nimport setDeepProperty from '../../helpers/object/setDeepProperty';\nimport validateInitObject from '../../helpers/object/validateInitObject';\n\nconst REFRESH_EVERY = 24 * 60 * 60 * 1000; // 1 day\n// const REFRESH_EVERY = 1e3;\n//const REFRESH_EVERY_WEEK = 24 * 60 * 60 * 1000 * 7; // 7 days\nconst STATE_VERSION = App.version;\nconst BUILD = App.build;\n\nexport type Background = {\n type?: 'color' | 'image' | 'default', // ! DEPRECATED\n blur: boolean,\n highlightningColor?: string,\n color?: string, \n slug?: string, // image slug\n intensity?: number, // pattern intensity\n id: string | number, // wallpaper id\n};\n\nexport type Theme = {\n name: 'day' | 'night' | 'system',\n background: Background\n};\n\nexport type AutoDownloadPeerTypeSettings = {\n contacts: boolean,\n private: boolean,\n groups: boolean,\n channels: boolean\n};\n\nexport type State = {\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\n pinnedOrders: DialogsStorage['pinnedOrders'],\n contactsList: UserId[],\n updates: Partial<{\n seq: number,\n pts: number,\n date: number\n }>,\n filters: FiltersStorage['filters'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\n topPeersCache: {\n [type in TopPeerType]?: {\n peers: MyTopPeer[],\n cachedTime: number\n }\n },\n recentSearch: PeerId[],\n version: typeof STATE_VERSION,\n build: typeof BUILD,\n authState: AuthState,\n hiddenPinnedMessages: {[peerId: PeerId]: number},\n settings: {\n messagesTextSize: number,\n distanceUnit: 'kilometers' | 'miles',\n sendShortcut: 'enter' | 'ctrlEnter',\n animationsEnabled: boolean,\n autoDownload: {\n contacts?: boolean, // ! DEPRECATED\n private?: boolean, // ! DEPRECATED\n groups?: boolean, // ! DEPRECATED\n channels?: boolean, // ! DEPRECATED\n photo: AutoDownloadPeerTypeSettings,\n video: AutoDownloadPeerTypeSettings,\n file: AutoDownloadPeerTypeSettings\n },\n autoDownloadNew: AutoDownloadSettings,\n autoPlay: {\n gifs: boolean,\n videos: boolean\n },\n stickers: {\n suggest: boolean,\n loop: boolean\n },\n emoji: {\n suggest: boolean,\n big: boolean\n },\n background?: Background, // ! DEPRECATED\n themes: Theme[],\n theme: Theme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n timeFormat: 'h12' | 'h23'\n },\n keepSigned: boolean,\n chatContextMenuHintWasShown: boolean,\n stateId: number,\n notifySettings: {[k in Exclude<NotifyPeer['_'], 'notifyPeer'>]?: PeerNotifySettings.peerNotifySettings}\n};\n\nexport const STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n contactsList: [],\n updates: {},\n filters: {},\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n topPeersCache: {},\n recentSearch: [],\n version: STATE_VERSION,\n build: BUILD,\n authState: {\n _: IS_MOBILE ? 'authStateSignIn' : 'authStateSignQr'\n },\n hiddenPinnedMessages: {},\n settings: {\n messagesTextSize: 16,\n distanceUnit: 'kilometers',\n sendShortcut: 'enter',\n animationsEnabled: true,\n autoDownload: {\n photo: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n video: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n file: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n }\n },\n autoDownloadNew: {\n _: 'autoDownloadSettings',\n file_size_max: 3145728,\n pFlags: {\n video_preload_large: true,\n audio_preload_next: true\n },\n photo_size_max: 1048576,\n video_size_max: 15728640,\n video_upload_maxbitrate: 100\n },\n autoPlay: {\n gifs: true,\n videos: true\n },\n stickers: {\n suggest: true,\n loop: true\n },\n emoji: {\n suggest: true,\n big: true\n },\n themes: [{\n name: 'day',\n background: {\n blur: false,\n slug: 'pattern',\n color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n intensity: 50,\n id: '1'\n }\n }, {\n name: 'night',\n background: {\n blur: false,\n slug: 'pattern',\n // color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n color: '#fec496,#dd6cb9,#962fbf,#4f5bd5',\n highlightningColor: 'hsla(299.142857, 44.166666%, 37.470588%, .4)',\n intensity: -50,\n id: '-1'\n }\n }],\n theme: 'system',\n notifications: {\n sound: false\n },\n timeFormat: getTimeFormat()\n },\n keepSigned: true,\n chatContextMenuHintWasShown: false,\n stateId: nextRandomUint(32),\n notifySettings: {}\n};\n\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array<keyof State>;\n\nconst REFRESH_KEYS = ['contactsList', 'stateCreatedTime',\n 'maxSeenMsgId', 'filters', 'topPeers'] as any as Array<keyof State>;\n\nexport type StatePeerType = 'recentSearch' | 'topPeer' | 'dialog' | 'contact' | 'topMessage' | 'self';\n\n//const REFRESH_KEYS_WEEK = ['dialogs', 'allDialogsLoaded', 'updates', 'pinnedOrders'] as any as Array<keyof State>;\n\nexport class AppStateManager extends EventListenerBase<{\n save: (state: State) => Promise<void>,\n peerNeeded: (peerId: PeerId) => void,\n peerUnneeded: (peerId: PeerId) => void\n}> {\n public static STATE_INIT = STATE_INIT;\n private loaded: Promise<State>;\n private log = logger('STATE'/* , LogLevels.error */);\n\n private state: State;\n\n private neededPeers: Map<PeerId, Set<string>> = new Map();\n private singlePeerMap: Map<string, PeerId> = new Map();\n\n public storages = {\n users: new AppStorage<Record<UserId, User>, typeof DATABASE_STATE>(DATABASE_STATE, 'users'),\n chats: new AppStorage<Record<ChatId, Chat>, typeof DATABASE_STATE>(DATABASE_STATE, 'chats'),\n dialogs: new AppStorage<Record<PeerId, Dialog>, typeof DATABASE_STATE>(DATABASE_STATE, 'dialogs')\n };\n\n public storagesResults: {\n users: User[],\n chats: Chat[],\n dialogs: Dialog[]\n } = {} as any;\n\n public storage = stateStorage;\n\n public newVersion: string;\n\n constructor() {\n super();\n this.loadSavedState();\n\n rootScope.addEventListener('user_auth', () => {\n this.requestPeerSingle(rootScope.myId, 'self');\n });\n }\n\n public loadSavedState(): Promise<State> {\n if(this.loaded) return this.loaded;\n console.time('load state');\n this.loaded = new Promise((resolve) => {\n const storagesKeys = Object.keys(this.storages) as Array<keyof AppStateManager['storages']>;\n const storagesPromises: Promise<any>[] = storagesKeys.map(key => this.storages[key].getAll());\n\n const promises/* : Promise<any>[] */ = ALL_KEYS.map(key => stateStorage.get(key))\n .concat(sessionStorage.get('user_auth'), sessionStorage.get('state_id'))\n .concat(stateStorage.get('user_auth')) // support old webk format\n .concat(storagesPromises);\n\n Promise.all(promises).then(async(arr) => {\n // await new Promise((resolve) => setTimeout(resolve, 3e3));\n /* const self = this;\n const skipHandleKeys = new Set(['isProxy', 'filters', 'drafts']);\n const getHandler = (path?: string) => {\n return {\n get(target: any, key: any) {\n if(key === 'isProxy') {\n return true;\n }\n\n const prop = target[key];\n\n if(prop !== undefined && !skipHandleKeys.has(key) && !prop.isProxy && typeof(prop) === 'object') {\n target[key] = new Proxy(prop, getHandler(path || key));\n return target[key];\n }\n \n return prop;\n },\n set(target: any, key: any, value: any) {\n console.log('Setting', target, `.${key} to equal`, value, path);\n \n target[key] = value;\n\n // @ts-ignore\n self.pushToState(path || key, path ? self.state[path] : value, false);\n\n return true;\n }\n };\n }; */\n\n let state: State = this.state = {} as any;\n\n // ! then can't store false values\n for(let i = 0, length = ALL_KEYS.length; i < length; ++i) {\n const key = ALL_KEYS[i];\n const value = arr[i];\n if(value !== undefined) {\n // @ts-ignore\n state[key] = value;\n } else {\n this.pushToState(key, copy(STATE_INIT[key]));\n }\n }\n\n arr.splice(0, ALL_KEYS.length);\n\n // * Read auth\n let auth = arr.shift() as UserAuth | number;\n const stateId = arr.shift() as number;\n const shiftedWebKAuth = arr.shift() as UserAuth | number;\n if(!auth && shiftedWebKAuth) { // support old webk auth\n auth = shiftedWebKAuth;\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance'];\n for(let i = 1; i <= 5; ++i) {\n keys.push(`dc${i}_server_salt`);\n keys.push(`dc${i}_auth_key`);\n }\n\n const values = await Promise.all(keys.map(key => stateStorage.get(key as any)));\n keys.push('user_auth');\n values.push(typeof(auth) === 'number' || typeof(auth) === 'string' ? {dcID: values[0] || App.baseDcId, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} as UserAuth : auth);\n\n let obj: any = {};\n keys.forEach((key, idx) => {\n obj[key] = values[idx];\n });\n\n await sessionStorage.set(obj);\n }\n \n /* if(!auth) { // try to read Webogram's session from localStorage\n try {\n const keys = Object.keys(localStorage);\n for(let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n let value: any;\n try {\n value = localStorage.getItem(key);\n value = JSON.parse(value);\n } catch(err) {\n //console.error(err);\n }\n\n sessionStorage.set({\n [key as any]: value\n });\n }\n\n auth = sessionStorage.getFromCache('user_auth');\n } catch(err) {\n this.log.error('localStorage import error', err);\n }\n } */\n\n if(auth) {\n // ! Warning ! DON'T delete this\n state.authState = {_: 'authStateSignedIn'};\n rootScope.dispatchEvent('user_auth', typeof(auth) === 'number' || typeof(auth) === 'string' ? \n {dcID: 0, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} : \n auth); // * support old version\n }\n\n // * Read storages\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\n this.storagesResults[storagesKeys[i]] = arr[i] as any;\n }\n\n arr.splice(0, storagesKeys.length);\n\n if(state.stateId !== stateId) {\n if(stateId !== undefined) {\n const preserve: Map<keyof State, State[keyof State]> = new Map([\n ['authState', undefined],\n ['stateId', undefined]\n ]);\n \n preserve.forEach((_, key) => {\n preserve.set(key, copy(state[key]));\n });\n \n state = this.state = copy(STATE_INIT);\n \n preserve.forEach((value, key) => {\n // @ts-ignore\n state[key] = value;\n });\n\n for(const key in this.storagesResults) {\n this.storagesResults[key as keyof AppStateManager['storagesResults']].length = 0;\n }\n\n this.storage.set(state);\n }\n\n await sessionStorage.set({\n state_id: state.stateId\n });\n }\n\n const time = Date.now();\n if((state.stateCreatedTime + REFRESH_EVERY) < time) {\n if(DEBUG) {\n this.log('will refresh state', state.stateCreatedTime, time);\n }\n\n const r = (keys: typeof REFRESH_KEYS) => {\n keys.forEach(key => {\n this.pushToState(key, copy(STATE_INIT[key]));\n \n // @ts-ignore\n const s = this.storagesResults[key];\n if(s && s.length) {\n s.length = 0;\n }\n });\n };\n \n r(REFRESH_KEYS);\n\n /* if((state.stateCreatedTime + REFRESH_EVERY_WEEK) < time) {\n if(DEBUG) {\n this.log('will refresh updates');\n }\n\n r(REFRESH_KEYS_WEEK);\n } */\n }\n \n //state = this.state = new Proxy(state, getHandler());\n\n // * support old version\n if(!state.settings.hasOwnProperty('theme') && state.settings.hasOwnProperty('nightTheme')) {\n state.settings.theme = state.settings.nightTheme ? 'night' : 'day';\n this.pushToState('settings', state.settings);\n }\n\n // * support old version\n if(!state.settings.hasOwnProperty('themes') && state.settings.background) {\n state.settings.themes = copy(STATE_INIT.settings.themes);\n const theme = state.settings.themes.find(t => t.name === state.settings.theme);\n if(theme) {\n theme.background = state.settings.background;\n this.pushToState('settings', state.settings);\n }\n }\n\n // * migrate auto download settings\n const autoDownloadSettings = state.settings.autoDownload;\n if(autoDownloadSettings?.private !== undefined) {\n const oldTypes = [\n 'contacts' as const, \n 'private' as const, \n 'groups' as const, \n 'channels' as const\n ];\n\n const mediaTypes = [\n 'photo' as const,\n 'video' as const,\n 'file' as const\n ];\n\n mediaTypes.forEach(mediaType => {\n const peerTypeSettings: AutoDownloadPeerTypeSettings = autoDownloadSettings[mediaType] = {} as any;\n oldTypes.forEach(peerType => {\n peerTypeSettings[peerType] = autoDownloadSettings[peerType];\n });\n });\n\n oldTypes.forEach(peerType => {\n delete autoDownloadSettings[peerType];\n });\n\n this.pushToState('settings', state.settings);\n }\n\n validateInitObject(STATE_INIT, state, (missingKey) => {\n // @ts-ignore\n this.pushToState(missingKey, state[missingKey]);\n });\n\n if(state.version !== STATE_VERSION || state.build !== BUILD/* || true */) {\n // reset filters and dialogs if version is older\n if(compareVersion(state.version, '0.8.7') === -1) {\n this.state.allDialogsLoaded = copy(STATE_INIT.allDialogsLoaded);\n this.state.filters = copy(STATE_INIT.filters);\n const result = this.storagesResults.dialogs;\n if(result?.length) {\n result.length = 0;\n }\n }\n\n // * migrate backgrounds (March 13, 2022; to version 1.3.0)\n if(compareVersion(state.version, '1.3.0') === -1) {\n let migrated = false;\n state.settings.themes.forEach((theme, idx, arr) => {\n if((\n theme.name === 'day' && \n theme.background.slug === 'ByxGo2lrMFAIAAAAmkJxZabh8eM' && \n theme.background.type === 'image' \n ) || (\n theme.name === 'night' && \n theme.background.color === '#0f0f0f' && \n theme.background.type === 'color' \n )) {\n const newTheme = STATE_INIT.settings.themes.find(newTheme => newTheme.name === theme.name);\n if(newTheme) {\n arr[idx] = copy(newTheme);\n migrated = true;\n }\n }\n });\n\n if(migrated) {\n this.pushToState('settings', state.settings);\n }\n }\n \n if(compareVersion(state.version, STATE_VERSION) !== 0) {\n this.newVersion = STATE_VERSION;\n }\n\n this.pushToState('version', STATE_VERSION);\n this.pushToState('build', BUILD);\n }\n\n // ! probably there is better place for it\n rootScope.settings = state.settings;\n\n if(DEBUG) {\n this.log('state res', state, copy(state));\n }\n \n //return resolve();\n\n console.timeEnd('load state');\n resolve(state);\n }).catch(resolve);\n });\n\n return this.loaded;\n }\n\n public getState() {\n return this.state === undefined ? this.loadSavedState() : Promise.resolve(this.state);\n }\n\n public setByKey(key: string, value: any) {\n setDeepProperty(this.state, key, value);\n rootScope.dispatchEvent('settings_updated', {key, value});\n\n const first = key.split('.')[0];\n // @ts-ignore\n this.pushToState(first, this.state[first]);\n }\n\n public pushToState<T extends keyof State>(key: T, value: State[T], direct = true) {\n if(direct) {\n this.state[key] = value;\n }\n\n this.setKeyValueToStorage(key, value);\n }\n\n public setKeyValueToStorage<T extends keyof State>(key: T, value: State[T] = this.state[key]) {\n this.storage.set({\n [key]: value\n });\n }\n\n public requestPeer(peerId: PeerId, type: StatePeerType, limit?: number) {\n let set = this.neededPeers.get(peerId);\n if(set && set.has(type)) {\n return;\n }\n\n if(!set) {\n set = new Set();\n this.neededPeers.set(peerId, set);\n }\n\n set.add(type);\n\n this.dispatchEvent('peerNeeded', peerId);\n\n if(limit !== undefined) {\n this.keepPeerSingle(peerId, type);\n }\n }\n\n public requestPeerSingle(peerId: PeerId, type: StatePeerType, keepPeerIdSingle: PeerId = peerId) {\n return this.requestPeer(peerId, type + '_' + keepPeerIdSingle as any, 1);\n }\n\n public releaseSinglePeer(peerId: PeerId, type: StatePeerType) {\n return this.keepPeerSingle(NULL_PEER_ID, type + '_' + peerId as any);\n }\n\n public isPeerNeeded(peerId: PeerId) {\n return this.neededPeers.has(peerId);\n }\n\n public keepPeerSingle(peerId: PeerId, type: StatePeerType) {\n const existsPeerId = this.singlePeerMap.get(type);\n if(existsPeerId && existsPeerId !== peerId && this.neededPeers.has(existsPeerId)) {\n const set = this.neededPeers.get(existsPeerId);\n set.delete(type);\n\n if(!set.size) {\n this.neededPeers.delete(existsPeerId);\n this.dispatchEvent('peerUnneeded', existsPeerId);\n }\n }\n\n if(peerId) {\n this.singlePeerMap.set(type, peerId);\n } else {\n this.singlePeerMap.delete(type);\n }\n }\n\n /* public resetState() {\n for(let i in this.state) {\n // @ts-ignore\n this.state[i] = false;\n }\n sessionStorage.set(this.state).then(() => {\n location.reload();\n });\n } */\n}\n\n//console.trace('appStateManager include');\n\nconst appStateManager = new AppStateManager();\nMOUNT_CLASS_TO.appStateManager = appStateManager;\nexport default appStateManager;\n","export default function getTimeFormat(): 'h12' | 'h23' {\n // try {\n // const resolvedOptions = Intl.DateTimeFormat(navigator.language, {hour: 'numeric'}).resolvedOptions();\n // if('hourCycle' in resolvedOptions) {\n // return (resolvedOptions as any).hourCycle === 'h12' ? 'h12' : 'h23';\n // } else {\n // return resolvedOptions.hour12 ? 'h12' : 'h23';\n // }\n // } catch(err) {\n return new Date().toLocaleString().match(/\\s(AM|PM)/) ? 'h12' : 'h23';\n // }\n}\n","import getDeepProperty from \"./getDeepProperty\";\n\nexport default function setDeepProperty(object: any, key: string, value: any) {\n const splitted = key.split('.');\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\n}\n"],"names":["getDeepProperty","object","key","splitted","split","o","forEach","validateInitObject","initObject","currentObject","onReplace","previousKey","compareVersion","v1","v2","s1","s2","i","length","STATE_VERSION","BUILD","STATE_INIT","allDialogsLoaded","pinnedOrders","contactsList","updates","filters","maxSeenMsgId","stateCreatedTime","Date","now","recentEmoji","topPeersCache","recentSearch","version","build","authState","_","IS_MOBILE","hiddenPinnedMessages","settings","messagesTextSize","distanceUnit","sendShortcut","animationsEnabled","autoDownload","photo","contacts","private","groups","channels","video","file","autoDownloadNew","file_size_max","pFlags","video_preload_large","audio_preload_next","photo_size_max","video_size_max","video_upload_maxbitrate","autoPlay","gifs","videos","stickers","suggest","loop","emoji","big","themes","name","background","blur","slug","color","highlightningColor","intensity","id","theme","notifications","sound","timeFormat","toLocaleString","match","keepSigned","chatContextMenuHintWasShown","stateId","notifySettings","ALL_KEYS","Object","keys","REFRESH_KEYS","AppStateManager","constructor","super","log","logger","neededPeers","Map","singlePeerMap","storages","users","chats","dialogs","storagesResults","storage","stateStorage","this","loadSavedState","rootScope","requestPeerSingle","loaded","console","time","Promise","resolve","storagesKeys","storagesPromises","map","getAll","promises","concat","sessionStorage","all","then","arr","state","value","undefined","pushToState","copy","splice","auth","shift","shiftedWebKAuth","push","values","dcID","date","toPeerId","obj","idx","preserve","set","state_id","s","r","hasOwnProperty","nightTheme","find","t","autoDownloadSettings","oldTypes","mediaType","peerTypeSettings","peerType","missingKey","result","migrated","type","newTheme","newVersion","timeEnd","catch","getState","setByKey","slice","join","pop","setDeepProperty","first","direct","setKeyValueToStorage","requestPeer","peerId","limit","get","has","Set","add","dispatchEvent","keepPeerSingle","keepPeerIdSingle","releaseSinglePeer","isPeerNeeded","existsPeerId","delete","size","appStateManager"],"sourceRoot":""}