mirror of
https://github.com/danog/telegram-tt.git
synced 2024-12-02 17:48:34 +01:00
1 line
667 KiB
Plaintext
1 line
667 KiB
Plaintext
{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/lib/teact/teact.ts","webpack:///./src/lib/teact/teactn.tsx","webpack:///./src/config.ts","webpack:///./src/util/iteratees.ts","webpack:///./src/modules/helpers/messages.ts","webpack:///./src/modules/helpers/messageMedia.ts","webpack:///./src/modules/helpers/localSearch.ts","webpack:///./src/api/gramjs/worker/provider.ts","webpack:///./src/util/environmentWebp.ts","webpack:///./src/util/environmentSystemTheme.ts","webpack:///./src/util/environment.ts","webpack:///./src/modules/selectors/users.ts","webpack:///./src/modules/selectors/settings.ts","webpack:///./src/modules/selectors/chats.ts","webpack:///./src/modules/selectors/symbols.ts","webpack:///./src/modules/selectors/messages.ts","webpack:///./src/modules/selectors/localSearch.ts","webpack:///./src/modules/selectors/management.ts","webpack:///./src/modules/selectors/ui.ts","webpack:///./src/modules/selectors/globalSearch.ts","webpack:///./src/modules/selectors/payments.ts","webpack:///./src/api/types/index.ts","webpack:///./src/util/buildClassName.ts","webpack:///./src/util/schedulers.ts","webpack:///./src/modules/reducers/chats.ts","webpack:///./src/modules/reducers/messages.ts","webpack:///./src/modules/reducers/symbols.ts","webpack:///./src/modules/reducers/users.ts","webpack:///./src/modules/reducers/globalSearch.ts","webpack:///./src/modules/reducers/localSearch.ts","webpack:///./src/modules/reducers/management.ts","webpack:///./src/modules/reducers/settings.ts","webpack:///./src/modules/reducers/twoFaSettings.ts","webpack:///./src/modules/reducers/payments.ts","webpack:///./src/util/cacheApi.ts","webpack:///./src/types/index.ts","webpack:///./src/util/langProvider.ts","webpack:///./src/util/callbacks.ts","webpack:///./src/util/moduleLoader.ts","webpack:///./src/hooks/useLang.ts","webpack:///./src/util/files.ts","webpack:///./node_modules/idb-keyval/dist/esm/index.js","webpack:///./src/util/sessions.ts","webpack:///./src/lib/twemojiRegex.js","webpack:///./src/components/ui/Loading.tsx","webpack:///./src/components/ui/Button.tsx","webpack:///./src/components/common/helpers/renderText.tsx","webpack:///./src/util/countries.ts","webpack:///./src/util/phoneNumber.ts","webpack:///./src/hooks/useModuleLoader.ts","webpack:///./src/hooks/useFlag.ts","webpack:///./src/components/ui/Spinner.tsx","webpack:///./src/util/handleError.ts","webpack:///./src/util/arePropsShallowEqual.ts","webpack:///./src/util/dateFormat.ts","webpack:///./src/hooks/usePrevious.ts","webpack:///./src/hooks/useForceUpdate.ts","webpack:///./src/components/ui/Link.tsx","webpack:///./src/util/generateIdFor.ts","webpack:///./src/util/notifications.ts","webpack:///./src/modules/helpers/users.ts","webpack:///./src/modules/helpers/chats.ts","webpack:///./src/lib/teact/dom-events.ts","webpack:///./src/hooks/useHistoryBack.ts","webpack:///./src/hooks/useShowTransition.ts","webpack:///./src/util/trimText.ts","webpack:///./src/components/ui/MenuItem.tsx","webpack:///./src/components/ui/RippleEffect.tsx","webpack:///./src/util/switchTheme.ts","webpack:///./src/util/webpToPng.ts","webpack:///./src/components/ui/InputText.tsx","webpack:///./src/components/ui/Checkbox.tsx","webpack:///./src/util/captureEscKeyListener.ts","webpack:///./src/util/textFormat.ts","webpack:///./src/util/memo.ts","webpack:///./src/hooks/useHeavyAnimationCheck.ts","webpack:///./src/hooks/useOnChange.ts","webpack:///./src/util/searchWords.ts","webpack:///./src/util/windowSize.ts","webpack:///./src/components/ui/Menu.tsx","webpack:///./src/util/captureKeyboardListeners.ts","webpack:///./src/util/oggToWav.ts","webpack:///./src/util/mediaLoader.ts","webpack:///./src/hooks/useEffectWithPrevDeps.ts","webpack:///./src/lib/punycode.js","webpack:///./src/components/common/SafeLink.tsx","webpack:///./src/components/common/helpers/documentInfo.ts","webpack:///./src/modules/helpers/payments.ts","webpack:///./src/util/animation.ts","webpack:///./src/components/ui/DropdownMenu.tsx","webpack:///./src/hooks/useKeyboardListNavigation.ts","webpack:///./src/components/common/helpers/parseEmojiOnlyString.ts","webpack:///./src/util/emoji.ts","webpack:///./src/lib/teact/teact-dom.ts","webpack:///./src/components/common/UserLink.tsx","webpack:///./src/components/common/MessageLink.tsx","webpack:///./src/components/common/ChatLink.tsx","webpack:///./src/components/common/helpers/renderActionMessageText.tsx","webpack:///./src/api/types/messages.ts","webpack:///./src/api/types/media.ts","webpack:///./src/components/middle/message/MentionLink.tsx","webpack:///./src/util/appBadge.ts","webpack:///./src/hooks/useVirtualBackdrop.ts","webpack:///./src/api/gramjs/worker/worker.ts","webpack:///./node_modules/opus-recorder/dist/decoderWorker.min.js","webpack:///./node_modules/opus-recorder/dist/waveWorker.min.js","webpack:///./src/lib/webp/webp_wasm.worker.js","webpack:///./src/modules/actions/ui/initial.ts","webpack:///./src/modules/actions/ui/settings.ts","webpack:///./src/modules/actions/api/initial.ts","webpack:///./src/modules/actions/api/settings.ts","webpack:///./src/modules/actions/apiUpdaters/initial.ts","webpack:///./src/serviceWorker.ts","webpack:///./src/util/setupServiceWorker.ts","webpack:///./src/global/initial.ts","webpack:///./src/global/cache.ts","webpack:///./src/global/index.ts","webpack:///./src/util/activeTabMonitor.ts","webpack:///./src/util/fonts.ts","webpack:///./src/assets/telegram-logo.svg","webpack:///./src/assets/monkey.svg","webpack:///./src/components/common/UiLoader.tsx","webpack:///./src/hooks/useLangString.ts","webpack:///./src/components/auth/helpers/getSuggestedLanguage.ts","webpack:///./src/components/auth/CountryCodeInput.tsx","webpack:///./src/components/auth/AuthPhoneNumber.tsx","webpack:///./src/components/auth/AuthCode.async.tsx","webpack:///./src/components/auth/AuthPassword.async.tsx","webpack:///./src/components/auth/AuthRegister.async.tsx","webpack:///./node_modules/qr-creator/dist/qr-creator.es6.min.js","webpack:///./src/components/auth/AuthQrCode.tsx","webpack:///./src/components/auth/Auth.tsx","webpack:///./src/components/main/Main.async.tsx","webpack:///./src/assets/app-inactive.png","webpack:///./src/components/main/AppInactive.tsx","webpack:///./src/App.tsx","webpack:///./src/index.tsx"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","installedModules","installedCssChunks","2","__webpack_require__","exports","module","l","e","promises","Promise","resolve","reject","href","fullhref","p","existingLinkTags","document","getElementsByTagName","dataHref","tag","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","code","parentNode","removeChild","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","jsonpScriptSrc","error","clearTimeout","chunk","errorType","realSrc","message","name","undefined","setTimeout","head","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","console","jsonpArray","window","oldJsonpFunction","slice","s","VirtualElementTypesEnum","Fragment","renderingInstance","isEmptyElement","$element","Empty","isTextElement","Text","isTagElement","Tag","isComponentElement","Component","isRealElement","source","props","children","flatten","parsedChildren","componentInstance","isMounted","hooks","state","cursor","byCursor","effects","memos","buildComponentElement","createComponentInstance","dropEmptyTail","map","buildChildElement","buildTagElement","isEmptyPlaceholder","child","String","DEBUG_components","renderComponent","newRenderedValue","DEBUG_startAt","DEBUG","componentName","renderCount","renderTimes","DEBUG_MORE","log","performance","now","renderTime","warn","Math","round","handleError","renderedValue","newChild","hasElementChanged","$old","$new","unmountTree","forEach","hook","current","cleanup","effect","dependencies","nextValue","setter","forceUpdate","onUpdate","helpGc","unmountComponent","removeAllDelegatedListeners","mountComponent","forceUpdateComponent","currentElement","getTarget","setTarget","useState","initial","newValue","prepareForFrame","throttleWithPrimaryRaf","prepareComponentForFrame","throttleWithRaf","DEBUG_contentComponentName","useLayoutEffectBase","schedulerFn","exec","some","dependency","useEffect","fastRaf","useLayoutEffect","onTickEnd","useMemo","resolver","debugKey","getUnequalProps","join","useCallback","newCallback","useRef","memo","areEqual","arePropsShallowEqual","withDebug","propsRef","renderedRef","addEventListener","orderBy","values","React","currentGlobal","reducers","callbacks","container","containers","mapStateToProps","mapReducersToProps","ownProps","mappedProps","newMappedProps","setGlobal","actions","Number","isNaN","DEBUG_componentName","keys","areMappedPropsChanged","DEBUG_updates","updateTime","Map","runCallbacks","cb","runCallbacksThrottled","newGlobal","noThrottle","getGlobal","getDispatch","addReducer","reducer","payload","onDispatch","addCallback","removeCallback","index","indexOf","splice","withGlobal","TeactNContainer","id","generateIdFor","useForceUpdate","delete","set","Array","from","PAGE_TITLE","INACTIVE_MARKER","APP_NAME","process","APP_VERSION","IS_TEST","DEBUG_ALERT_MSG","SESSION_USER_KEY","LEGACY_SESSION_KEY","GLOBAL_STATE_CACHE_DISABLED","GLOBAL_STATE_CACHE_KEY","GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT","GLOBAL_STATE_CACHE_USER_LIST_LIMIT","MEDIA_CACHE_DISABLED","MEDIA_CACHE_NAME","MEDIA_CACHE_NAME_AVATARS","MEDIA_PROGRESSIVE_CACHE_NAME","CUSTOM_BG_CACHE_NAME","LANG_CACHE_NAME","isBigScreen","innerHeight","MIN_PASSWORD_LENGTH","MESSAGE_LIST_SENSITIVE_AREA","MESSAGE_LIST_SLICE","MESSAGE_LIST_VIEWPORT_LIMIT","CHAT_HEIGHT_PX","CHAT_LIST_SLICE","CHAT_LIST_LOAD_SLICE","SHARED_MEDIA_SLICE","MESSAGE_SEARCH_SLICE","GLOBAL_SEARCH_SLICE","MEMBERS_SLICE","MEMBERS_LOAD_SLICE","PROFILE_SENSITIVE_AREA","TOP_CHAT_MESSAGES_PRELOAD_LIMIT","ALL_CHATS_PRELOAD_DISABLED","ANIMATION_LEVEL_MIN","ANIMATION_LEVEL_MAX","ANIMATION_LEVEL_DEFAULT","DEFAULT_MESSAGE_TEXT_SIZE_PX","DRAFT_DEBOUNCE","EDITABLE_INPUT_ID","EDITABLE_INPUT_MODAL_ID","SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","SAFE_SCREEN_WIDTH_FOR_CHAT_INFO","MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN","MOBILE_SCREEN_MAX_WIDTH","MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH","MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT","LOCAL_MESSAGE_ID_BASE","ANIMATION_END_DELAY","FAST_SMOOTH_MAX_DISTANCE","FAST_SMOOTH_MIN_DURATION","FAST_SMOOTH_MAX_DURATION","FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE","STICKER_SIZE_INLINE_DESKTOP_FACTOR","Set","STICKER_SIZE_INLINE_MOBILE_FACTOR","STICKER_SIZE_AUTH","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_PICKER","STICKER_SIZE_GENERAL_SETTINGS","STICKER_SIZE_PICKER_HEADER","STICKER_SIZE_SEARCH","STICKER_SIZE_MODAL","STICKER_SIZE_TWO_FA","STICKER_SIZE_DISCUSSION_GROUPS","STICKER_SIZE_FOLDER_SETTINGS","STICKER_SIZE_INLINE_BOT_RESULT","MEMOJI_STICKER_ID","BASE_EMOJI_KEYWORD_LANG","MENU_TRANSITION_DURATION","SLIDE_TRANSITION_DURATION","CONTENT_TYPES_FOR_QUICK_UPLOAD","RE_LINK_TEMPLATE","RE_MENTION_TEMPLATE","RE_TME_LINK","RE_TME_INVITE_LINK","SERVICE_NOTIFICATIONS_USER_ID","ALL_FOLDER_ID","ARCHIVED_FOLDER_ID","MAX_MEDIA_FILES_FOR_ALBUM","MAX_ACTIVE_PINNED_CHATS","SCHEDULED_WHEN_ONLINE","DEFAULT_LANG_CODE","DEFAULT_LANG_PACK","LANG_PACKS","TIPS_USERNAME","FEEDBACK_URL","LIGHT_THEME_BG_COLOR","DARK_THEME_BG_COLOR","DARK_THEME_PATTERN_COLOR","DEFAULT_PATTERN_COLOR","buildCollectionByKey","collection","reduce","byKey","member","mapValues","callback","newByKey","pick","result","pickTruthy","omit","stringKeys","filter","has","orderKey","sort","a","b","isArray","mode1","mode2","orderKey1","orderKey2","aValue1","bValue1","aValue2","bValue2","aValue","bValue","array","concat","unique","compact","Boolean","areSortedArraysEqual","array1","array2","every","item","areSortedArraysIntersecting","findIntersectionWithSet","split","chunkSize","cloneDeep","acc","findLast","predicate","RE_LINK","RegExp","getMessageKey","chatId","parseMessageKey","match","messageId","getMessageOriginalId","previousLocalId","getMessageSummaryText","lang","noEmoji","text","photo","video","audio","voice","sticker","contact","poll","invoice","content","truncatedText","substr","groupedId","isGif","emoji","trim","getMessageAudioCaption","fileName","summary","question","getMessageText","webPage","getMessageCustomShape","isRound","parseEmojiOnlyString","getMessageSingleEmoji","getFirstLinkInMessage","entities","link","find","entity","ApiMessageEntityTypes","TextUrl","url","Url","offset","substring","domain","isOwnMessage","isOutgoing","isReplyMessage","replyToMessageId","isForwardedMessage","forwardInfo","isActionMessage","action","isServiceNotificationMessage","isMessageLocal","isAnonymousOwnMessage","senderId","getSenderTitle","sender","getUserFullName","getChatTitle","getSendingState","sendingState","isHistoryClearMessage","title","performer","getMessageContent","hasMessageMedia","getMessagePhoto","getMessageVideo","getMessageDocument","getMessageSticker","getMessageContact","getMessagePoll","getMessageAction","getMessageAudio","getMessageVoice","getMessageRoundVideo","isMessageDocumentPhoto","mediaType","isMessageDocumentVideo","getMessageInvoice","getMessageWebPage","getMessageWebPagePhoto","getMessageWebPageVideo","getMessageMediaThumbDataUri","thumbnail","media","getMessageMediaThumbnail","dataUri","getMessageMediaHash","webPagePhoto","webPageVideo","messageVideo","messagePhoto","base","hasMessageLocalBlobUrl","getVideoOrAudioBaseHash","getDocumentHasPreview","IS_PROGRESSIVE_SUPPORTED","IS_SAFARI","size","mimeType","getMessageMediaFormat","fullVideo","isAnimated","ApiMediaFormat","Lottie","Progressive","IS_OPUS_SUPPORTED","BlobUrl","getMessageFileName","date","getMessageFileSize","blobUrl","previewBlobUrl","getChatMediaMessageIds","messages","listedIds","isFromSharedMedia","ids","getMessageContentIds","reverse","getPhotoFullDimensions","sizes","getPhotoInlineDimensions","getVideoDimensions","width","height","getMediaTransferState","progress","isDownloadNeeded","isUploading","isTransferring","transferProgress","messageIds","contentType","validator","matchLinkInMessageText","getMediaDuration","duration","buildChatThreadKey","threadId","worker","requestStates","requestStatesByCallback","initApi","initialArgs","Worker","update","requestState","response","callbackArgs","subscribeToWorker","makeRequest","args","callApi","fnName","cancelApiProgress","progressCallback","isCanceled","postMessage","assign","pop","catch","finally","isWebpSupportedCache","isWebpSupported","webp","Image","handleLoadOrError","hasWebp","systemThemeCache","matchMedia","matches","getSystemTheme","handleSystemThemeChange","mql","addListener","PLATFORM_ENV","userAgent","platform","navigator","os","test","getPlatform","IS_MAC_OS","IS_IOS","IS_ANDROID","IS_PWA","standalone","referrer","includes","IS_TOUCH_ENV","IS_SINGLE_COLUMN_LAYOUT","innerWidth","IS_TABLET_COLUMN_LAYOUT","IS_VOICE_RECORDING_SUPPORTED","mediaDevices","AudioContext","webkitAudioContext","IS_EMOJI_SUPPORTED","documentElement","style","IS_SERVICE_WORKER_SUPPORTED","Audio","canPlayType","IS_CANVAS_FILTER_SUPPORTED","getContext","LAYERS_ANIMATION_NAME","DPR","devicePixelRatio","MASK_IMAGE_DISABLED","selectUser","global","userId","users","byId","selectIsUserBlocked","user","fullInfo","isBlocked","selectNotifySettings","settings","selectNotifyExceptions","notifyExceptions","selectChat","chats","selectChatUser","chat","getPrivateChatUserId","selectIsChatWithSelf","currentUserId","selectIsChatWithBot","isUserBot","selectSupportChat","isSupport","selectChatOnlineCount","isChatPrivate","isChatChannel","members","onlineCount","isUserOnline","selectChatBot","selectIsChatBotNotStarted","bot","lastMessage","messageInfo","byChatId","threadsById","MAIN_THREAD_ID","selectAreActiveChatsLoaded","listIds","active","selectIsChatListed","targetList","list","selectChatListType","folderId","selectChatFolder","chatFolders","selectIsChatPinned","archived","orderedPinnedIds","chatFoldersById","pinnedChatIds","selectChatByUsername","username","usernameLowered","toLowerCase","selectCountNotMutedUnread","activeChatIds","unreadCount","selectIsChatMuted","selectCurrentStickerSearch","stickers","search","selectCurrentGifSearch","gifs","selectStickerSet","setsById","selectStickersForEmoji","stickerSets","stickersForEmoji","packs","selectAnimatedEmoji","animatedEmojis","cleanedEmoji","replace","selectCurrentMessageList","messageLists","selectCurrentChat","selectChatMessages","selectScheduledMessages","scheduledMessages","selectThreadParam","thread","selectListedIds","selectOutlyingIds","selectCurrentMessageIds","messageListType","selectViewportIds","selectPinnedIds","selectScheduledIds","selectScrollOffset","selectReplyingToId","selectEditingId","selectEditingScheduledId","selectDraft","selectNoWebPage","selectThreadInfo","selectFirstMessageId","selectReplyStack","selectThreadOriginChat","threadInfo","originChannelId","selectThreadTopMessageId","topMessageId","selectThreadByMessage","replyToTopMessageId","isMessageInCurrentMessageList","currentMessageList","selectIsViewportNewest","viewportIds","lastMessageId","selectChatMessage","chatMessages","selectScheduledMessage","selectEditingMessage","selectChatMessageByPollId","pollId","messageWithPoll","selectFocusedMessageId","focusedChatId","focusedMessage","selectIsMessageFocused","focusedId","selectOutgoingStatus","isScheduledList","lastReadOutboxMessageId","selectIsMessageUnread","selectSender","selectForwardedSender","isChannelPost","fromChatId","senderUserId","selectAllowedMessageActions","serverTimeOffset","isRestricted","isPrivate","isChatWithSelf","isBasicGroup","isChatBasicGroup","isSuperGroup","isChatSuperGroup","isChannel","isServiceNotification","isOwn","isAction","isMessageEditable","getHasAdminRight","Date","viaBotId","canReply","getCanPostInChat","hasPinPermission","isCreator","isUserRightBanned","canPin","canUnpin","pinnedMessageIds","canDelete","canReport","canDeleteForAll","canEdit","canForward","hasSticker","hasFavoriteSticker","favorite","selectIsStickerFavorite","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","noOptions","ability","selectCanDeleteSelectedMessages","selectedMessageIds","selectedMessages","messageActions","selectCanReportSelectedMessages","selectUploadProgress","fileTransfer","fileUploads","byMessageLocalId","selectRealLastReadId","lastReadInboxMessageId","min","Infinity","selectFirstUnreadId","outlyingIds","lastReadId","isNotJoined","found","isFromScheduled","selectIsForwardModalOpen","forwardMessages","isModalShown","selectCommonBoxChatId","fromLastMessage","isCommonBoxChat","selectIsInSelectMode","selectIsMessageSelected","selectForwardedMessageIdsByGroupId","fromMessageId","selectMessageIdsByGroupId","selectIsDocumentGroupSelected","selectedIds","groupIds","selectSelectedMessagesCount","selectNewestMessageWithBotKeyboardButtons","keyboardButtons","replyHideMessageId","shouldHideKeyboardButtons","selectShouldAutoLoadMedia","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","isChatGroup","userOrChat","contactList","userIds","selectIsUserOrChatContact","selectShouldAutoPlayMedia","shouldAutoPlayVideos","shouldAutoPlayGifs","asGif","selectShouldLoopStickers","shouldLoopStickers","selectCurrentTextSearch","chatThreadKey","currentSearch","localTextSearch","byChatThreadKey","isActive","selectCurrentMediaSearchPeerId","localMediaSearch","currentProfileUserId","selectedId","selectCurrentMediaSearch","peerId","selectManagement","management","selectCurrentManagementType","selectIsMediaViewerOpen","mediaViewer","avatarOwnerId","selectRightColumnContentKey","isChatInfoShown","newChatMembersProgress","isAddingChatMembersShown","NewChatMembersProgress","Closed","isPollResults","pollResults","selectIsPollResultsOpen","isSearch","isManagement","currentManagement","selectCurrentManagement","isStickerSearch","query","isGifSearch","currentChatId","areActiveChatsLoaded","isUserInfo","isChatInfo","RightColumnContent","PollResults","Search","Management","StickerSearch","GifSearch","AddingMembers","UserInfo","ChatInfo","selectIsRightColumnShown","selectTheme","theme","shouldUseSystemTheme","selectCurrentGlobalSearchQuery","globalSearch","selectPaymentMessageId","payment","selectPaymentRequestId","formId","selectProviderPublishableKey","nativeParams","publishableKey","selectStripeCredentials","stripeCredentials","parts","debounce","fn","ms","shouldRunFirst","shouldRunLast","waitingTimeout","self","throttle","interval","isPending","_args","setInterval","clearInterval","throttleWith","fastPrimaryRaf","waiting","onIdle","requestIdleCallback","pause","rafPromise","fastRafCallbacks","fastRafPrimaryCallbacks","beforeUnloadCallbacks","isPrimary","requestAnimationFrame","currentCallbacks","currentPrimaryCallbacks","onBeforeUnload","isLast","unshift","replaceChatListIds","newIds","updateChatListIds","idsUpdate","replaceChats","newById","getUpdatedChat","chatUpdate","shouldOmitMinInfo","isMin","updatedChat","photos","updateChat","updateChats","updatedById","updatedChats","addChats","addedById","isAdded","addedChats","updateChatListType","listType","currentListIds","listTypeKey","currentFolderList","updateChatListSecondaryInfo","info","totalCountKey","totalCount","totalChatCount","isFullyLoaded","updateCurrentMessageList","replaceChatMessages","updateMessageStore","replaceThreadParam","paramName","threadUpdate","updateThread","addMessages","addedByChatId","messagesByChatId","addChatMessagesById","newId","updateChatMessage","messageUpdate","updatedMessage","updateScheduledMessage","replaceScheduledMessages","deleteChatMessages","deletedForwardedPosts","isLinkedChannelPost","pinnedIds","newMessageCount","messagesCount","canDeleteCurrentThread","currentThreadId","originalPost","deleteChatScheduledMessages","scheduledIds","updateListedIds","orderHistoryIds","updateOutlyingIds","addViewportId","safeReplaceViewportIds","newViewportIds","updateThreadInfo","newThreadInfo","updateThreadInfos","updates","hash","updateScheduledMessages","updateFocusedMessage","noHighlight","updateFocusDirection","direction","enterMessageSelectMode","toggleMessageSelection","childMessageIds","withShift","oldSelectedMessages","newMessageIds","newSelectedMessageIds","prevIndex","currentIndex","to","max","exitMessageSelectMode","updateStickerSets","category","sets","resultIds","updatedSets","stickerSet","existing","setIds","updateStickerSet","stickerSetId","currentStickerSet","updateGifSearch","isNew","results","nextOffset","currentResults","newResults","currentIds","gif","replaceAnimatedEmojis","updateStickersForEmoji","remoteStickers","allStickers","uniqueIds","forEmoji","rebuildStickersForEmoji","replaceUsers","getUpdatedUser","userUpdate","updatedUser","updateContactList","updatedUsers","contactUserIds","newContactUserIds","isContact","updateUser","updateUsers","addUsers","addedUsers","updateSelectedUserId","deleteUser","MEMO_EMPTY_ARRAY","updateUserSearch","searchStatePartial","userSearch","updateUserSearchFetchingStatus","newState","fetchingStatus","updateUserBlockedState","getComplexKey","updateGlobalSearch","updateGlobalSearchContent","currentContent","updateGlobalSearchResults","newFoundMessages","nextRate","resultsByType","newFoundMessagesById","foundIdsForType","foundIds","updateGlobalSearchFetchingStatus","prevFoundIds","newFoundIds","foundOrPrevFoundIds","nextOffsetId","replaceLocalTextSearch","searchParams","updateLocalTextSearch","replaceLocalTextSearchResults","updateLocalTextSearchResults","orderFoundIds","replaceLocalMediaSearch","updateLocalMediaSearchType","currentType","updateLocalMediaSearchResults","replaceLocalMediaSearchResults","updateManagementProgress","updateManagement","replaceSettings","newSettings","replaceThemeSettings","themes","addNotifyExceptions","notifyException","exceptionData","addNotifyException","updateNotifySettings","peerType","isSilent","shouldShowPreviews","hasPrivateChatsNotifications","hasPrivateChatsMessagePreview","hasGroupNotifications","hasGroupMessagePreview","hasBroadcastNotifications","hasBroadcastMessagePreview","addBlockedContact","contactId","blocked","removeBlockedContact","updateTwoFaSettings","twoFaSettings","updateShippingOptions","shippingOptions","setRequestInfoId","setPaymentStep","step","setInvoiceMessageInfo","description","photoUrl","invoiceContent","setStripeCardInfo","cardInfo","setPaymentForm","form","setReceipt","receipt","messageInvoice","clearPayment","closeInvoice","isPaymentModalOpen","cacheApi","caches","Type","async","fetch","cacheName","Request","cache","open","Blob","blob","headers","Json","json","save","cacheData","JSON","stringify","Response","put","clear","LoadMoreDirection","FocusDirection","SettingsScreens","LeftColumnContent","GlobalSearchContent","MediaViewerOrigin","ChatCreationProgress","ProfileEditProgress","ManagementProgress","ProfileState","PaymentStep","UPLOADING_WALLPAPER_SLUG","ManagementScreens","SUBSTITUTION_REGEX","PLURAL_OPTIONS","PLURAL_RULES","en","ar","ca","de","es","fa","fr","it","ko","nl","pl","pt_BR","ru","tr","uk","uz","langPack","fallbackLangPack","createCallbackManager","currentLangCode","getTranslation","format","cacheValue","cached","langString","processTranslation","importFallbackLangPack","getTranslationForLangString","langCode","translateString","remoteLangPack","remote","fetchRemoteString","setLanguage","withFallback","newLangPack","sourceLangPacks","fetchRemote","languages","langInfo","isRtl","rtl","default","template","amount","optionIndex","getPluralOption","translationSlices","initialValue","str","processTemplate","formatInteger","Bundles","LOAD_PROMISES","MEMORY_CACHE","loadModule","bundleName","moduleName","Auth","Main","Extra","handleBundleLoad","bundle","getModuleFromMemory","listeners","addLoadListener","listener","useOnChange","langProvider","File","constructor","fileBits","options","rest","super","this","dataUriToBlob","arr","mime","bstr","atob","u8arr","Uint8Array","charCodeAt","blobToDataUri","reader","FileReader","readAsDataURL","blobToFile","lastModified","preloadImage","img","preloadVideo","volume","onloadedmetadata","createPosterForVideo","race","onseeked","videoWidth","videoHeight","canvas","drawImage","toDataURL","currentTime","fetchBlob","imgToCanvas","promisifyRequest","oncomplete","onsuccess","onabort","defaultGetStoreFunc","defaultGetStore","dbName","storeName","indexedDB","onupgradeneeded","createObjectStore","dbp","txMode","db","transaction","objectStore","createStore","eachCursor","customStore","store","openCursor","continue","DC_IDS","hasStoredSession","withLegacy","localStorage","getItem","userAuthJson","userAuth","parse","dcID","storeSession","sessionData","mainDcId","hashes","setItem","dcId","clearStoredSession","removeItem","loadStoredSession","importLegacySession","sessionId","sessionJson","idb","clearLegacySessions","idbKeys","items","k","startsWith","vs16RegExp","zeroWidthJoiner","fromCharCode","removeVS16s","rawEmoji","color","className","withBackground","Button","ref","onClick","onContextMenu","onMouseDown","onMouseEnter","onMouseLeave","onFocus","pill","fluid","isText","isLoading","ariaLabel","download","disabled","ripple","faded","tabIndex","elementRef","isClicked","setIsClicked","fullClassName","buildClassName","handleClick","handleMouseDown","preventDefault","dir","aria-label","RE_LETTER_OR_DIGIT","SIMPLE_MARKDOWN_REGEX","renderText","part","filters","params","textParts","divEl","innerText","innerHTML","escapeHtml","EMOJI_REGEX","lastIndex","replaceEmojis","addLineBreaks","highlight","lowerCaseText","queryPosition","nextSymbol","newParts","links","nextLink","endsWith","addLinks","replaceSimpleMarkdown","emojis","emojiResult","nativeToUnfified","alt","line","trimmedLine","trimLeft","indentLength","repeat","entityResult","formatsCache","defaultPhoneNumberFormat","parsed","flag","phoneFormat","formatValue","phoneNumberFormat","phoneNumberGroups","count","getPhoneNumberFormat","getCountryById","countryList","getCountryFromPhoneNumber","input","phoneNumber","possibleCountries","country","formatPhoneNumber","_","p1","p2","p3","p4","p5","separator","output","formatPhoneNumberWithCode","numberWithPlus","noLoad","autoUpdate","setValue","Spinner","handleErrorEvent","ErrorEvent","reason","alert","currentProps","newProps","currentKeys","currentKeysLength","prop","WEEKDAYS_FULL","MONTHS_FULL","MONTHS_FULL_LOWERCASE","month","getDayStart","datetime","setHours","getDayStartAt","getTime","toYearMonth","timestamp","getFullYear","getMonth","toIsoString","getDate","formatTime","getHours","padStart","getMinutes","formatPastTimeShort","today","weekAgo","setDate","getDay","withYear","formatDate","formatFullDate","formatMonthAndYear","isShort","formatHumanDate","noWeekdays","lowerFirst","upperFirst","yesterday","weekAhead","weekDay","day","monthIndex","formatMediaDateTime","formatMediaDuration","hours","floor","minutes","seconds","string","formatVoiceRecordDuration","durationInMs","milliseconds","formatDateToString","locale","toLocaleString","year","isValidDate","MAX_MONTH_IN_YEAR","parseDateString","matchStringDate","matchEuropeStringDate","matchNumberDate","dateParts","findIndex","timestampPlusDay","MILISECONDS_IN_DAY","toUpperCase","usePrevious","next","shouldSkipUndefined","setTrigger","trigger","Link","random","getDeviceToken","subscription","toJSON","endpoint","checkIfPushSupported","ServiceWorkerRegistration","Notification","permission","requestPermission","unsubscribeFromPush","dispatch","deviceToken","unsubscribe","deleteDeviceToken","serviceWorkerRegistration","serviceWorker","ready","pushManager","getSubscription","areSettingsLoaded","subscribe","subscribedAt","checkIfShouldResubscribe","userVisibleOnly","setDeviceToken","DOMException","ABORT_ERR","showNewMessageNotification","isActiveChat","resultSettings","resultExceptions","loadNotificationSettings","isListed","hasFocus","checkIfShouldNotify","body","messageSender","messageAction","actionTargetMessage","targetUserIds","actionTargetUserIds","targetChatId","actionTargetChatId","actionTargetUsers","privateChatUserId","privateChatUser","actionOrigin","renderActionMessageText","asPlain","senderName","getMessageSenderName","getNotificationContent","controller","icon","badge","toString","vibrate","notification","onclick","close","focusMessage","focus","notifyClientReady","USER_COLOR_KEYS","getUserFirstOrLastName","firstName","lastName","isDeletedUser","getUserStatus","status","wasOnline","wasOnlineDate","diff","sortUserIds","usersById","priorityIds","expires","getUserColorKey","peer","abs","FOREVER_BANNED_DATE","getChatTypeString","isSelf","getChatDescription","about","getChatLink","inviteLink","getChatAvatarHash","owner","avatarHash","isChatSummaryOnly","isChatAdmin","adminRights","currentUserBannedRights","defaultBannedRights","migratedTo","getAllowedAttachmentOptions","isChatWithBot","canAttachMedia","canAttachPolls","canSendStickers","canSendGifs","canAttachEmbedLinks","isAdmin","getMessageSendingRestrictionReason","sendMessages","untilDate","getChatSlowModeOptions","slowMode","getChatOrder","joinDate","draftDate","isChatArchived","notifySettings","isMuted","getCanDeleteChat","prepareFolderListIds","chatsById","folder","chatIdsCache","excludedChatIds","includedChatIds","excludeArchived","excludeMuted","unreadMentionsCount","hasUnreadMark","excludeRead","bots","contacts","nonContacts","groups","channels","filterChatFolder","prepareChatList","folderType","chatFilter","listedChats","listIdsSet","pinnedChats","otherChats","getFolderUnreadDialogs","unreadDialogsCount","total","hasActiveDialogs","getFolderDescriptionText","emoticon","getFolderChatsCount","isChat","chatOrUser","sortChatIds","chatIds","shouldPrioritizeVerified","priority","isVerified","NON_BUBBLEABLE_EVENTS","delegationRegistry","delegatedEventsByElement","documentEventCounters","element","propName","handler","asCapture","eventName","resolveEventName","canUseEventDelegation","handleEvent","resolveDelegationRegistryForName","newSet","resolveDelegatedEventsForElement","add","addDelegatedListener","removeEventListener","removeDelegatedListener","tagName","realEventName","eventNames","realEvent","events","furtherCallsPrevented","stopPropagation","Proxy","Reflect","historyState","nextStateIndexToReplace","isHistoryAltered","isDisabled","isEdge","currentIndexes","disableHistoryBack","handleTouchStart","x","touches","pageX","handleTouchEnd","useHistoryBack","onBack","onForward","currentState","shouldReplaceNext","indexRef","isForward","prevIsActive","isClosed","handlePopState","prev","disableHistoryAnimations","history","back","replaceState","isOpen","onCloseTransitionEnd","noOpenTransition","noCloseTransition","setIsClosed","closeTimeoutRef","hasOpenClassName","setHasOpenClassName","shouldHaveOpenClassName","isClosing","shouldRender","transitionClassNames","trimText","MenuItem","destructive","useLang","handleKeyDown","keyCode","data-char","location","origin","role","onKeyDown","ripples","setRipples","cleanUpDebounced","button","currentTarget","position","getBoundingClientRect","rippleSize","offsetWidth","clientX","y","clientY","isInitialized","HEX_COLOR_REGEX","lerp","start","end","interpolationRatio","colors","themeColors","hexToRgb","hex","parseInt","g","applyColorAnimationStep","startIndex","endIndex","propertyColors","setProperty","withAnimation","isDarkTheme","shouldAnimate","startAt","themeColorTag","querySelector","classList","remove","animateSingle","transition","EMPTY_IMAGE_DATA_URI","webpToPng","initWebpWorker","wasmReady","requests","getDecodePromise","ImageData","putImageData","toBlob","createPng","webpToPngBase64","pngBlob","WebpWorker","onmessage","handleLibWebpMessage","label","success","readOnly","placeholder","autoComplete","inputMode","maxLength","onChange","onInput","onKeyPress","onBlur","onPaste","labelText","htmlFor","subLabel","checked","blocking","onCheck","handleChange","captureEscKeyListener","captureKeyboardListener","onEsc","formatFixedNumber","number","toFixed","formatIntegerCompact","views","getFirstLetters","phrase","word","isAnimating","dispatchHeavyAnimationEvent","dispatchEvent","Event","handleAnimationStart","handleAnimationEnd","prevDeps","RE_NOT_LETTER","searchWords","haystack","needle","haystackWords","needleWord","haystackWord","IS_LANDSCAPE","isLandscape","initialHeight","windowSize","updateSizes","isRefreshDisabled","handleResize","reload","vh","getIsKeyboardVisible","disableRefresh","enableRefresh","Menu","containerRef","positionX","positionY","autoClose","footer","noCloseOnBackdrop","onCloseAnimationEnd","onClose","shouldSkipTransition","menuRef","backdropContainerRef","useShowTransition","useEffectWithPrevDeps","prevIsOpen","useKeyboardListNavigation","useVirtualBackdrop","bubbleClassName","keyToHandlerName","Enter","Backspace","Delete","Esc","Escape","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Tab","handlers","onEnter","onDelete","onBackspace","onUp","onDown","onLeft","onRight","onTab","captureKeyboardListeners","hasActiveHandlers","handlerName","currentEventHandlers","releaseKeyboardListener","keyHandlers","oggToWav","opusData","arrayBuffer","typedArray","decoderWorker","DecoderWorker","wavWorker","WavWorker","command","buffers","buffer","page","terminate","wavBitDepth","wavSampleRate","decoderSampleRate","outputBufferSampleRate","pages","asCacheApiType","DataUri","Stream","memoryCache","fetchPromises","mediaFormat","onProgress","progressiveUrl","getProgressive","mediaPng","prepared","prepareMedia","mediaSource","MediaSource","streamUrl","URL","createObjectURL","sourceBuffer","addSourceBuffer","endOfStream","appendBuffer","revokeObjectURL","fetchFromCacheOrRemote","getFromMemory","cancelProgress","mediaData","fullSize","utf16","len","RangeError","adapt","delta","numpoints","firsttime","decode","preserveCase","case_flags","input_length","out","bias","basic","j","ic","oldi","w","digit","lastIndexOf","cp","toUnicode","domain_array","ensureProtocol","getDomain","decodedHref","decodeURI","convertPunycode","toggleSafeLinkModal","openTelegramLink","isNotSafe","ctrlKey","altKey","shiftKey","metaKey","classNames","getFileSizeString","bytes","ONE_GIGABYTE","ONE_MEGABYTE","getDocumentExtension","getFileExtension","getColorFromExtension","extension","STRIPE_ERRORS","missing_payment_information","field","fieldError","invalid_number","exp_year","exp_month","invalid_expiry_year","invalid_expiry_month","cvc","invalid_cvc","getStripeError","param","SHIPPING_ERRORS","ADDRESS_STREET_LINE1_INVALID","ADDRESS_STREET_LINE2_INVALID","ADDRESS_CITY_INVALID","ADDRESS_COUNTRY_INVALID","ADDRESS_POSTCODE_INVALID","ADDRESS_STATE_INVALID","REQ_INFO_NAME_INVALID","REQ_INFO_PHONE_INVALID","REQ_INFO_EMAIL_INVALID","getShippingErrors","dialogs","cur","hasErrorKey","currentInstance","tick","instance","isCancelled","animate","DropdownMenu","forceOpen","onOpen","dropdownRef","setIsOpen","menu","focusedElement","activeElement","elementChildren","onTrigger","onSelectWithEnter","itemSelector","noCaptureFocus","focusedIndex","setFocusedIndex","querySelectorAll","newIndex","RE_EMOJI_ONLY","twemojiRegex","DETECT_UP_TO","emojiCount","EXCLUDE_EMOJIS","unifiedToNative","unified","codePoints","fromCodePoint","pairs","uncompressEmoji","emojiData","categories","emojiRaw","names","native","image","FILTERED_ATTRIBUTES","HTML_ATTRIBUTES","MAPPED_ATTRIBUTES","autoPlay","headsByElement","renderWithVirtual","parentEl","$current","$parent","skipComponentUpdate","forceIndex","fragment","moveDirection","updateComponent","setupComponentUpdateListener","initComponent","node","createNode","childNodes","insertBefore","replaceChild","areComponents","nextSibling","newKeys","removeAttribute","addAttribute","oldValue","updateAttribute","updateAttributes","currentEl","teactFastList","$newChild","currentRemainingIndex","remainingByKey","$currentChild","newChildKey","order","teactOrderKey","fragmentQueue","fragmentIndex","newChildren","currentPreservedIndex","currentChildInfo","flushFragmentQueue","shouldMoveNode","isMovingDown","renderFastListChildren","createDocumentFragment","renderChildren","$firstChild","createTextNode","$child","$fragmentChild","cssText","render","headId","$head","openUserInfo","handleMessageClick","openChat","targetUsers","targetMessage","translationValues","textOptions","maxTextLength","unprocessed","processed","processPlaceholder","isEmbedded","renderChatContent","renderUserContent","renderOriginContent","showQuotes","messageText","renderMessageContent","renderProductContent","renderMigratedContent","replaceValue","placeholderPosition","MESSAGE_DELETED","openChatByUsername","updateAppBadge","setAppBadge","contains","currentThemeMatch","currentTheme","nextTheme","animationLevel","switchTheme","subscribeToSystemThemeChange","messageTextSize","language","uiReadyState","authPhoneNumber","authRememberMe","authError","shouldSkipHistoryAnimations","apiUpdate","authIsLoading","password","file","authIsLoadingQrCode","reset","langCachePrefix","langCacheVersion","init","connectionState","authNearestCountry","buildInputPrivacyRules","visibility","allowedIds","deniedIds","rules","collectUsers","accessHash","collectChats","allowedUsers","allowedChats","blockedUsers","blockedChats","bio","profileEdit","InProgress","currentUser","Complete","Idle","isUsernameAvailable","loadedWallpapers","wallpapers","slug","wallpaper","firstWallpaper","withLocalMedia","blockedIds","activeSessions","session","isCurrent","hasContactJoinedNotifications","phoneNumberSettings","lastSeenSettings","profilePhotoSettings","forwardsSettings","chatInviteSettings","privacy","lastSeen","profilePhoto","forwards","chatInvite","privacyKey","allowUserIds","allowChatIds","blockUserIds","blockChatIds","isAllowList","contactsIds","isSensitiveEnabled","onUpdateApiReady","wasAuthReady","authState","authorizationState","isLoggingOut","authIsCodeViaApp","isCodeViaApp","authHint","hint","authQrCode","qrCode","lastSyncTime","onUpdateAuthorizationState","onUpdateAuthorizationError","sync","signOut","onUpdateConnectionState","isEmpty","saveSession","onUpdateSession","onUpdateServerTimeOffset","sessionUserAuth","updateSessionUserId","onUpdateCurrentUser","showDialog","ServiceWorkerNoSupportError","setPrototypeOf","scriptUrl","handleWorkerMessage","register","INITIAL_STATE","isLeftColumnShown","activeChatFolder","recentEmojis","added","recent","featured","emojiKeywords","saved","inlineBots","byUsername","topPeers","topInlineBots","audioPlayer","notifications","messageSendKeyCombo","shouldSuggestStickers","light","isBlurred","patternColor","dark","shouldShowContextMenuHint","updateCacheThrottled","updateCache","unsubscribeFromBeforeUnload","isCaching","loadCache","initialState","setupCaching","time","timeEnd","readCache","clearCaching","reducedGlobal","reduceShowChatInfo","reduceUsers","reduceChats","reduceMessages","recentlyFoundChatIds","reduceSettings","reduceChatFolders","idsToSave","cid","chatIdsToSave","mainThread","tabKey","SITE_FONTS","preloadFonts","font","fonts","load","preloadAvatars","mediaLoader","preloadTasks","main","telegramLogoPath","authCode","monkeyPath","authPassword","background","backgroundColor","hasCustomBackground","hasCustomBackgroundColor","isRightColumnShown","setIsUiReady","isReady","markReady","useFlag","shouldRenderMask","safePreload","translation","setTranslation","getSuggestedLanguage","suggestedLanguage","MENU_HIDING_DURATION","inputRef","setFilter","filteredList","setFilteredList","updateFilter","filterValue","getFilteredList","countryId","firstElementChild","dataset","handleInput","handleInputKeyDown","handleTrigger","select","formEl","getElementById","scrollTo","top","scrollHeight","behavior","inputValue","data-country-id","isPreloadInitiated","setAuthPhoneNumber","setAuthRememberMe","loadNearestCountry","clearAuthError","goToAuthQrCode","setSettingOption","continueText","useLangString","setCountry","setPhoneNumber","isTouched","setIsTouched","lastSelection","setLastSelection","markIsLoading","unmarkIsLoading","fullNumber","canSubmit","parseFullNumber","newFullNumber","suggestedCountry","selectedCountry","handleLangChange","setSelectionRange","isJustPastedRef","handlePaste","handlePhoneNumberChange","selectionStart","selectionEnd","shouldFixSafariAutoComplete","handleKeepSessionChange","isAuthReady","onSubmit","InputText","Checkbox","Loading","AuthCode","useModuleLoader","AuthPassword","AuthRegister","G","H","B","QrCreator","h","u","J","level","version","O","C","f","lineTo","arcTo","moveTo","z","v","N","K","P","fillStyle","fillRect","left","beginPath","q","D","E","R","I","F","fill","colorStops","createLinearGradient","apply","createRadialGradient","addColorStop","A","minVersion","maxVersion","ecLevel","radius","quiet","HTMLCanvasElement","clearRect","write","S","multiply","L","M","Q","returnToAuthPhoneNumber","qrCodeRef","token","isMobile","AuthQrCode","AppInactive","appInactivePath","renderMain","disconnect","isInactive","markInactive","TeactDOM"],"mappings":"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G,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GACnf,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EACrf,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAChf,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAClf,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG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","file":"main.17afd76820bdadd8f135.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t};\n\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded CSS chunks\n \tvar installedCssChunks = {\n \t\t2: 0\n \t}\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t2: 0\n \t};\n\n\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + chunkId + \".\" + {\"0\":\"f2808a011513b284cd67\",\"1\":\"6353d6a04e28df4a75fd\",\"3\":\"4fb864b3e2b33dcf0b8a\",\"4\":\"b7a430c75ea63b53a164\",\"5\":\"f92fec3044f3df22aff9\",\"6\":\"9279f2ee67ec521a576b\",\"7\":\"b70f0c59ec0a7012dc0e\",\"8\":\"8ea35852507a4021d5f6\",\"9\":\"4d7529aff26ad636465f\",\"10\":\"2a1df14974ef4d87b768\"}[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// mini-css-extract-plugin CSS loading\n \t\tvar cssChunks = {\"0\":1,\"3\":1,\"4\":1,\"5\":1,\"6\":1};\n \t\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n \t\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n \t\t\tpromises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {\n \t\t\t\tvar href = \"\" + ({}[chunkId]||chunkId) + \".\" + {\"0\":\"f2808a011513b284cd67\",\"1\":\"6353d6a04e28df4a75fd\",\"3\":\"4fb864b3e2b33dcf0b8a\",\"4\":\"b7a430c75ea63b53a164\",\"5\":\"f92fec3044f3df22aff9\",\"6\":\"9279f2ee67ec521a576b\",\"7\":\"b70f0c59ec0a7012dc0e\",\"8\":\"8ea35852507a4021d5f6\",\"9\":\"4d7529aff26ad636465f\",\"10\":\"2a1df14974ef4d87b768\"}[chunkId] + \".css\";\n \t\t\t\tvar fullhref = __webpack_require__.p + href;\n \t\t\t\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n \t\t\t\tfor(var i = 0; i < existingLinkTags.length; i++) {\n \t\t\t\t\tvar tag = existingLinkTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n \t\t\t\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return resolve();\n \t\t\t\t}\n \t\t\t\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n \t\t\t\tfor(var i = 0; i < existingStyleTags.length; i++) {\n \t\t\t\t\tvar tag = existingStyleTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\");\n \t\t\t\t\tif(dataHref === href || dataHref === fullhref) return resolve();\n \t\t\t\t}\n \t\t\t\tvar linkTag = document.createElement(\"link\");\n \t\t\t\tlinkTag.rel = \"stylesheet\";\n \t\t\t\tlinkTag.type = \"text/css\";\n \t\t\t\tlinkTag.onload = resolve;\n \t\t\t\tlinkTag.onerror = function(event) {\n \t\t\t\t\tvar request = event && event.target && event.target.src || fullhref;\n \t\t\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + request + \")\");\n \t\t\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n \t\t\t\t\terr.request = request;\n \t\t\t\t\tdelete installedCssChunks[chunkId]\n \t\t\t\t\tlinkTag.parentNode.removeChild(linkTag)\n \t\t\t\t\treject(err);\n \t\t\t\t};\n \t\t\t\tlinkTag.href = fullhref;\n\n \t\t\t\tvar head = document.getElementsByTagName(\"head\")[0];\n \t\t\t\thead.appendChild(linkTag);\n \t\t\t}).then(function() {\n \t\t\t\tinstalledCssChunks[chunkId] = 0;\n \t\t\t}));\n \t\t}\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 104);\n","import { DEBUG, DEBUG_MORE } from '../../config';\nimport {\n fastRaf, onTickEnd, throttleWithPrimaryRaf, throttleWithRaf,\n} from '../../util/schedulers';\nimport { flatten, orderBy } from '../../util/iteratees';\nimport arePropsShallowEqual, { getUnequalProps } from '../../util/arePropsShallowEqual';\nimport { handleError } from '../../util/handleError';\nimport { removeAllDelegatedListeners } from './dom-events';\n\nexport type Props = AnyLiteral;\nexport type FC<P extends Props = any> = (props: P) => any;\nexport type FC_withDebug = FC & {\n DEBUG_contentComponentName?: string;\n};\n\nexport enum VirtualElementTypesEnum {\n Empty,\n Text,\n Tag,\n Component,\n}\n\ninterface VirtualElementEmpty {\n type: VirtualElementTypesEnum.Empty;\n target?: Node;\n}\n\ninterface VirtualElementText {\n type: VirtualElementTypesEnum.Text;\n target?: Node;\n value: string;\n}\n\nexport interface VirtualElementTag {\n type: VirtualElementTypesEnum.Tag;\n target?: Node;\n tag: string;\n props: Props;\n children: VirtualElementChildren;\n}\n\nexport interface VirtualElementComponent {\n type: VirtualElementTypesEnum.Component;\n componentInstance: ComponentInstance;\n props: Props;\n children: VirtualElementChildren;\n}\n\nexport type StateHookSetter<T> = (newValue: ((current: T) => T) | T) => void;\n\ninterface ComponentInstance {\n $element: VirtualElementComponent;\n Component: FC;\n name: string;\n props: Props;\n renderedValue?: any;\n isMounted: boolean;\n hooks: {\n state: {\n cursor: number;\n byCursor: {\n value: any;\n nextValue: any;\n setter: StateHookSetter<any>;\n }[];\n };\n effects: {\n cursor: number;\n byCursor: {\n effect: () => void;\n dependencies?: any[];\n cleanup?: Function;\n }[];\n };\n memos: {\n cursor: number;\n byCursor: {\n current: any;\n dependencies: any[];\n }[];\n };\n };\n prepareForFrame?: () => void;\n forceUpdate?: () => void;\n onUpdate?: () => void;\n}\n\nexport type VirtualElement =\n VirtualElementEmpty\n | VirtualElementText\n | VirtualElementTag\n | VirtualElementComponent;\nexport type VirtualRealElement =\n VirtualElementTag\n | VirtualElementComponent;\nexport type VirtualElementChildren = VirtualElement[];\n\nconst Fragment = Symbol('Fragment');\n\nlet renderingInstance: ComponentInstance;\n\nexport function isEmptyElement($element: VirtualElement): $element is VirtualElementEmpty {\n return $element.type === VirtualElementTypesEnum.Empty;\n}\n\nexport function isTextElement($element: VirtualElement): $element is VirtualElementText {\n return $element.type === VirtualElementTypesEnum.Text;\n}\n\nexport function isTagElement($element: VirtualElement): $element is VirtualElementTag {\n return $element.type === VirtualElementTypesEnum.Tag;\n}\n\nexport function isComponentElement($element: VirtualElement): $element is VirtualElementComponent {\n return $element.type === VirtualElementTypesEnum.Component;\n}\n\nexport function isRealElement($element: VirtualElement): $element is VirtualRealElement {\n return isTagElement($element) || isComponentElement($element);\n}\n\nfunction createElement(\n source: string | FC | typeof Fragment,\n props: Props,\n ...children: any[]\n): VirtualRealElement | VirtualElementChildren {\n if (!props) {\n props = {};\n }\n\n children = flatten(children);\n\n if (source === Fragment) {\n return children;\n } else if (typeof source === 'function') {\n return createComponentInstance(source, props, children);\n } else {\n return buildTagElement(source, props, children);\n }\n}\n\nfunction createComponentInstance(Component: FC, props: Props, children: any[]): VirtualElementComponent {\n let parsedChildren: any | any[] | undefined;\n if (children.length === 0) {\n parsedChildren = undefined;\n } else if (children.length === 1) {\n [parsedChildren] = children;\n } else {\n parsedChildren = children;\n }\n\n const componentInstance: ComponentInstance = {\n $element: {} as VirtualElementComponent,\n Component,\n name: Component.name,\n props: {\n ...props,\n ...(parsedChildren && { children: parsedChildren }),\n },\n isMounted: false,\n hooks: {\n state: {\n cursor: 0,\n byCursor: [],\n },\n effects: {\n cursor: 0,\n byCursor: [],\n },\n memos: {\n cursor: 0,\n byCursor: [],\n },\n },\n };\n\n componentInstance.$element = buildComponentElement(componentInstance);\n\n return componentInstance.$element;\n}\n\nfunction buildComponentElement(\n componentInstance: ComponentInstance,\n children: VirtualElementChildren = [],\n): VirtualElementComponent {\n const { props } = componentInstance;\n\n return {\n componentInstance,\n type: VirtualElementTypesEnum.Component,\n props,\n children,\n };\n}\n\nfunction buildTagElement(tag: string, props: Props, children: any[]): VirtualElementTag {\n return {\n type: VirtualElementTypesEnum.Tag,\n tag,\n props,\n children: dropEmptyTail(children).map(buildChildElement),\n };\n}\n\n// We only need placeholders in the middle of collection (to ensure other elements order).\nfunction dropEmptyTail(children: any[]) {\n let i = children.length - 1;\n\n for (; i >= 0; i--) {\n if (!isEmptyPlaceholder(children[i])) {\n break;\n }\n }\n\n return i + 1 < children.length ? children.slice(0, i + 1) : children;\n}\n\nfunction isEmptyPlaceholder(child: any) {\n // eslint-disable-next-line no-null/no-null\n return child === false || child === null || child === undefined;\n}\n\nfunction buildChildElement(child: any): VirtualElement {\n if (isEmptyPlaceholder(child)) {\n return buildEmptyElement();\n } else if (isRealElement(child)) {\n return child;\n } else {\n return buildTextElement(child);\n }\n}\n\nfunction buildTextElement(value: any): VirtualElementText {\n return {\n type: VirtualElementTypesEnum.Text,\n value: String(value),\n };\n}\n\nfunction buildEmptyElement(): VirtualElementEmpty {\n return { type: VirtualElementTypesEnum.Empty };\n}\n\nconst DEBUG_components: AnyLiteral = {};\n\ndocument.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('COMPONENTS', orderBy(Object.values(DEBUG_components), 'renderCount', 'desc'));\n});\n\nexport function renderComponent(componentInstance: ComponentInstance) {\n renderingInstance = componentInstance;\n componentInstance.hooks.state.cursor = 0;\n componentInstance.hooks.effects.cursor = 0;\n componentInstance.hooks.memos.cursor = 0;\n\n const { Component, props } = componentInstance;\n let newRenderedValue;\n\n try {\n let DEBUG_startAt: number | undefined;\n if (DEBUG) {\n const componentName = componentInstance.name;\n if (!DEBUG_components[componentName]) {\n DEBUG_components[componentName] = {\n componentName,\n renderCount: 0,\n renderTimes: [],\n };\n }\n\n if (DEBUG_MORE) {\n if (componentName !== 'TeactMemoWrapper' && componentName !== 'TeactNContainer') {\n // eslint-disable-next-line no-console\n console.log(`[Teact] Render ${componentName}`);\n }\n }\n\n DEBUG_startAt = performance.now();\n }\n\n newRenderedValue = Component(props);\n\n if (DEBUG) {\n const renderTime = performance.now() - DEBUG_startAt!;\n const componentName = componentInstance.name;\n if (renderTime > 7) {\n // eslint-disable-next-line no-console\n console.warn(`[Teact] Slow component render: ${componentName}, ${Math.round(renderTime)} ms`);\n }\n DEBUG_components[componentName].renderTimes.push(renderTime);\n DEBUG_components[componentName].renderCount++;\n }\n } catch (err) {\n handleError(err);\n\n newRenderedValue = componentInstance.renderedValue;\n }\n\n if (componentInstance.isMounted && newRenderedValue === componentInstance.renderedValue) {\n return componentInstance.$element;\n }\n\n componentInstance.renderedValue = newRenderedValue;\n\n const newChild = buildChildElement(newRenderedValue);\n componentInstance.$element = buildComponentElement(componentInstance, [newChild]);\n\n return componentInstance.$element;\n}\n\nexport function hasElementChanged($old: VirtualElement, $new: VirtualElement) {\n if (typeof $old !== typeof $new) {\n return true;\n } else if ($old.type !== $new.type) {\n return true;\n } else if (isTextElement($old) && isTextElement($new)) {\n return $old.value !== $new.value;\n } else if (isTagElement($old) && isTagElement($new)) {\n return ($old.tag !== $new.tag) || ($old.props.key !== $new.props.key);\n } else if (isComponentElement($old) && isComponentElement($new)) {\n return (\n $old.componentInstance.Component !== $new.componentInstance.Component\n ) || (\n $old.props.key !== $new.props.key\n );\n }\n\n return false;\n}\n\nexport function unmountTree($element: VirtualElement) {\n if (!isRealElement($element)) {\n return;\n }\n\n if (isComponentElement($element)) {\n unmountComponent($element.componentInstance);\n } else if ($element.target) {\n removeAllDelegatedListeners($element.target as HTMLElement);\n // Trying to help GC\n // eslint-disable-next-line no-null/no-null\n $element.target = null as any;\n }\n\n $element.children.forEach(unmountTree);\n}\n\nexport function mountComponent(componentInstance: ComponentInstance) {\n renderComponent(componentInstance);\n componentInstance.isMounted = true;\n return componentInstance.$element;\n}\n\nfunction unmountComponent(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted) {\n return;\n }\n\n componentInstance.hooks.memos.byCursor.forEach((hook) => {\n // eslint-disable-next-line no-null/no-null\n hook.current = null;\n });\n\n componentInstance.hooks.effects.byCursor.forEach(({ cleanup }) => {\n if (typeof cleanup === 'function') {\n try {\n cleanup();\n } catch (err) {\n handleError(err);\n }\n }\n });\n\n componentInstance.isMounted = false;\n\n helpGc(componentInstance);\n}\n\n// We force cleaning as many objects as possible. Not sure this is needed at all.\nfunction helpGc(componentInstance: ComponentInstance) {\n /* eslint-disable no-null/no-null */\n\n componentInstance.hooks.effects.byCursor.forEach((hook) => {\n hook.cleanup = null as any;\n hook.effect = null as any;\n hook.dependencies = null as any;\n });\n\n componentInstance.hooks.state.byCursor.forEach((hook) => {\n hook.value = null as any;\n hook.nextValue = null as any;\n hook.setter = null as any;\n });\n\n componentInstance.hooks.memos.byCursor.forEach((hook) => {\n hook.dependencies = null as any;\n });\n\n componentInstance.hooks = null as any;\n componentInstance.$element = null as any;\n componentInstance.Component = null as any;\n componentInstance.props = null as any;\n componentInstance.forceUpdate = null as any;\n componentInstance.onUpdate = null as any;\n\n /* eslint-enable no-null/no-null */\n}\n\nfunction prepareComponentForFrame(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted) {\n return;\n }\n\n componentInstance.hooks.state.byCursor.forEach((hook) => {\n hook.value = hook.nextValue;\n });\n\n componentInstance.prepareForFrame = throttleWithPrimaryRaf(() => prepareComponentForFrame(componentInstance));\n componentInstance.forceUpdate = throttleWithRaf(() => forceUpdateComponent(componentInstance));\n}\n\nfunction forceUpdateComponent(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted || !componentInstance.onUpdate) {\n return;\n }\n\n const currentElement = componentInstance.$element;\n\n renderComponent(componentInstance);\n\n if (componentInstance.$element !== currentElement) {\n componentInstance.onUpdate();\n }\n}\n\nexport function getTarget($element: VirtualElement): Node | undefined {\n if (isComponentElement($element)) {\n return getTarget($element.children[0]);\n } else {\n return $element.target;\n }\n}\n\nexport function setTarget($element: VirtualElement, target: Node) {\n if (isComponentElement($element)) {\n setTarget($element.children[0], target);\n } else {\n $element.target = target;\n }\n}\n\nexport function useState<T>(initial?: T): [T, StateHookSetter<T>] {\n const { cursor, byCursor } = renderingInstance.hooks.state;\n\n if (byCursor[cursor] === undefined) {\n byCursor[cursor] = {\n value: initial,\n nextValue: initial,\n setter: ((componentInstance) => (newValue: ((current: T) => T) | T) => {\n if (byCursor[cursor].nextValue !== newValue) {\n byCursor[cursor].nextValue = typeof newValue === 'function'\n ? (newValue as (current: T) => T)(byCursor[cursor].value)\n : newValue;\n\n if (!componentInstance.prepareForFrame || !componentInstance.forceUpdate) {\n componentInstance.prepareForFrame = throttleWithPrimaryRaf(\n () => prepareComponentForFrame(componentInstance),\n );\n componentInstance.forceUpdate = throttleWithRaf(\n () => forceUpdateComponent(componentInstance),\n );\n }\n\n componentInstance.prepareForFrame();\n componentInstance.forceUpdate();\n\n if (DEBUG_MORE) {\n // eslint-disable-next-line no-console\n console.log(\n '[Teact.useState]',\n componentInstance.name,\n // `componentInstance.Component` may be set to `null` by GC helper\n componentInstance.Component && (componentInstance.Component as FC_withDebug).DEBUG_contentComponentName\n ? `> ${(componentInstance.Component as FC_withDebug).DEBUG_contentComponentName}`\n : '',\n `Forced update at cursor #${cursor}, next value: `,\n byCursor[cursor].nextValue,\n );\n }\n }\n })(renderingInstance),\n };\n }\n\n renderingInstance.hooks.state.cursor++;\n\n return [\n byCursor[cursor].value,\n byCursor[cursor].setter,\n ];\n}\n\nfunction useLayoutEffectBase(\n schedulerFn: typeof onTickEnd | typeof requestAnimationFrame,\n effect: () => Function | void,\n dependencies?: any[],\n) {\n const { cursor, byCursor } = renderingInstance.hooks.effects;\n const componentInstance = renderingInstance;\n\n const exec = () => {\n if (!componentInstance.isMounted) {\n return;\n }\n\n const { cleanup } = byCursor[cursor];\n if (typeof cleanup === 'function') {\n try {\n cleanup();\n } catch (err) {\n handleError(err);\n }\n }\n\n byCursor[cursor].cleanup = effect() as Function;\n };\n\n if (byCursor[cursor] !== undefined && dependencies && byCursor[cursor].dependencies) {\n if (dependencies.some((dependency, i) => dependency !== byCursor[cursor].dependencies![i])) {\n schedulerFn(exec);\n }\n } else {\n schedulerFn(exec);\n }\n\n byCursor[cursor] = {\n effect,\n dependencies,\n cleanup: byCursor[cursor] ? byCursor[cursor].cleanup : undefined,\n };\n\n renderingInstance.hooks.effects.cursor++;\n}\n\nexport function useEffect(effect: () => Function | void, dependencies?: any[]) {\n return useLayoutEffectBase(fastRaf, effect, dependencies);\n}\n\nexport function useLayoutEffect(effect: () => Function | void, dependencies?: any[]) {\n return useLayoutEffectBase(onTickEnd, effect, dependencies);\n}\n\nexport function useMemo<T extends any>(resolver: () => T, dependencies: any[], debugKey?: string): T {\n const { cursor, byCursor } = renderingInstance.hooks.memos;\n let { current } = byCursor[cursor] || {};\n\n if (\n byCursor[cursor] === undefined\n || dependencies.some((dependency, i) => dependency !== byCursor[cursor].dependencies[i])\n ) {\n if (DEBUG && debugKey) {\n // eslint-disable-next-line no-console\n console.log(\n `[Teact.useMemo] ${renderingInstance.name} (${debugKey}): Update is caused by:`,\n byCursor[cursor]\n ? getUnequalProps(dependencies, byCursor[cursor].dependencies).join(', ')\n : '[first render]',\n );\n }\n\n current = resolver();\n }\n\n byCursor[cursor] = {\n current,\n dependencies,\n };\n\n renderingInstance.hooks.memos.cursor++;\n\n return current;\n}\n\nexport function useCallback<F extends AnyFunction>(newCallback: F, dependencies: any[]): F {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => newCallback, dependencies);\n}\n\nexport function useRef<T>(initial: T): { current: T };\nexport function useRef<T>(): { current: T | undefined }; // TT way (empty is `undefined`)\nexport function useRef<T>(initial: null): { current: T | null }; // React way (empty is `null`)\n// eslint-disable-next-line no-null/no-null\nexport function useRef<T>(initial?: T | null) {\n return useMemo(() => ({\n current: initial,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }), []);\n}\n\nexport function memo<T extends FC>(Component: T, areEqual = arePropsShallowEqual, withDebug = false) {\n return function TeactMemoWrapper(props: Props) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const propsRef = useRef(props);\n const renderedRef = useRef();\n\n if (!renderedRef.current || (propsRef.current && !areEqual(propsRef.current, props))) {\n if (DEBUG && withDebug) {\n // eslint-disable-next-line no-console\n console.log(\n `[Teact.memo] ${Component.name}: Update is caused by:`,\n getUnequalProps(propsRef.current!, props).join(', '),\n );\n }\n\n propsRef.current = props;\n renderedRef.current = createElement(Component, props) as VirtualElementComponent;\n }\n\n return renderedRef.current;\n } as T;\n}\n\n// We need to keep it here for JSX.\nexport default {\n createElement,\n Fragment,\n};\n","import React, {\n FC, FC_withDebug, Props, useEffect, useState,\n} from './teact';\n\nimport { DEBUG, DEBUG_MORE } from '../../config';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport generateIdFor from '../../util/generateIdFor';\nimport { throttleWithRaf } from '../../util/schedulers';\nimport arePropsShallowEqual, { getUnequalProps } from '../../util/arePropsShallowEqual';\nimport { orderBy } from '../../util/iteratees';\nimport { GlobalState, GlobalActions, ActionTypes } from '../../global/types';\nimport { handleError } from '../../util/handleError';\n\nexport default React;\n\ntype ActionPayload = AnyLiteral;\n\ntype Reducer = (\n global: GlobalState,\n actions: GlobalActions,\n payload: any,\n) => GlobalState | void;\n\ntype MapStateToProps<OwnProps = undefined> = ((global: GlobalState, ownProps: OwnProps) => AnyLiteral | null);\ntype MapActionsToProps = ((setGlobal: Function, actions: GlobalActions) => Partial<GlobalActions> | null);\n\nlet currentGlobal = {} as GlobalState;\n\nconst reducers: Record<string, Reducer[]> = {};\nconst callbacks: Function[] = [updateContainers];\nconst actions = {} as GlobalActions;\nconst containers = new Map<string, {\n mapStateToProps: MapStateToProps<any>;\n mapReducersToProps: MapActionsToProps;\n ownProps: Props;\n mappedProps?: Props;\n forceUpdate: Function;\n areMappedPropsChanged: boolean;\n DEBUG_updates: number;\n DEBUG_componentName: string;\n}>();\n\nfunction runCallbacks() {\n callbacks.forEach((cb) => cb(currentGlobal));\n}\n\nconst runCallbacksThrottled = throttleWithRaf(runCallbacks);\n\n// `noThrottle = true` is used as a workaround for iOS gesture history navigation\nexport function setGlobal(newGlobal?: GlobalState, noThrottle = false) {\n if (typeof newGlobal === 'object' && newGlobal !== currentGlobal) {\n currentGlobal = newGlobal;\n if (!noThrottle) {\n runCallbacksThrottled();\n } else {\n runCallbacks();\n }\n }\n}\n\nexport function getGlobal() {\n return currentGlobal;\n}\n\nexport function getDispatch() {\n return actions;\n}\n\nfunction onDispatch(name: string, payload?: ActionPayload, noThrottle?: boolean) {\n if (reducers[name]) {\n reducers[name].forEach((reducer) => {\n const newGlobal = reducer(currentGlobal, actions, payload);\n if (newGlobal) {\n setGlobal(newGlobal, noThrottle);\n }\n });\n }\n}\n\nfunction updateContainers() {\n let DEBUG_startAt: number | undefined;\n if (DEBUG) {\n DEBUG_startAt = performance.now();\n }\n\n // eslint-disable-next-line no-restricted-syntax\n for (const container of containers.values()) {\n const {\n mapStateToProps, mapReducersToProps, ownProps, mappedProps, forceUpdate,\n } = container;\n\n let newMappedProps;\n\n try {\n newMappedProps = {\n ...mapStateToProps(currentGlobal, ownProps),\n ...mapReducersToProps(setGlobal, actions),\n };\n } catch (err) {\n handleError(err);\n\n return;\n }\n\n if (DEBUG) {\n if (Object.values(newMappedProps).some(Number.isNaN)) {\n // eslint-disable-next-line no-console\n console.warn(\n // eslint-disable-next-line max-len\n `[TeactN] Some of \\`${container.DEBUG_componentName}\\` mappers contain NaN values. This may cause redundant updates because of incorrect equality check.`,\n );\n }\n }\n\n if (Object.keys(newMappedProps).length && !arePropsShallowEqual(mappedProps!, newMappedProps)) {\n if (DEBUG_MORE) {\n // eslint-disable-next-line no-console\n console.log(\n '[TeactN] Will update',\n container.DEBUG_componentName,\n 'caused by',\n getUnequalProps(mappedProps!, newMappedProps).join(', '),\n );\n }\n\n container.mappedProps = newMappedProps;\n container.areMappedPropsChanged = true;\n container.DEBUG_updates++;\n\n forceUpdate();\n }\n }\n\n if (DEBUG) {\n const updateTime = performance.now() - DEBUG_startAt!;\n if (updateTime > 7) {\n // eslint-disable-next-line no-console\n console.warn(`[TeactN] Slow containers update: ${Math.round(updateTime)} ms`);\n }\n }\n}\n\nexport function addReducer(name: ActionTypes, reducer: Reducer) {\n if (!reducers[name]) {\n reducers[name] = [];\n\n actions[name] = (payload?: ActionPayload, noThrottle = false) => {\n onDispatch(name, payload, noThrottle);\n };\n }\n\n reducers[name].push(reducer);\n}\n\nexport function addCallback(cb: Function) {\n callbacks.push(cb);\n}\n\nexport function removeCallback(cb: Function) {\n const index = callbacks.indexOf(cb);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n}\n\nexport function withGlobal<OwnProps>(\n mapStateToProps: MapStateToProps<OwnProps> = () => ({}),\n mapReducersToProps: MapActionsToProps = () => ({}),\n) {\n return (Component: FC) => {\n return function TeactNContainer(props: OwnProps) {\n (TeactNContainer as FC_withDebug).DEBUG_contentComponentName = Component.name;\n\n const [id] = useState(generateIdFor(containers));\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n return () => {\n containers.delete(id);\n };\n }, [id]);\n\n let container = containers.get(id);\n if (!container) {\n container = {\n mapStateToProps,\n mapReducersToProps,\n ownProps: props,\n areMappedPropsChanged: false,\n forceUpdate,\n DEBUG_updates: 0,\n DEBUG_componentName: Component.name,\n };\n\n containers.set(id, container);\n }\n\n if (container.areMappedPropsChanged) {\n container.areMappedPropsChanged = false;\n }\n\n if (!container.mappedProps || !arePropsShallowEqual(container.ownProps, props)) {\n container.ownProps = props;\n\n try {\n container.mappedProps = {\n ...mapStateToProps(currentGlobal, props),\n ...mapReducersToProps(setGlobal, actions),\n };\n } catch (err) {\n handleError(err);\n }\n }\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return <Component {...container.mappedProps} {...props} />;\n };\n };\n}\n\nif (DEBUG) {\n (window as any).getGlobal = getGlobal;\n\n document.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log(\n 'GLOBAL CONTAINERS',\n orderBy(\n Array.from(containers.values())\n .map(({ DEBUG_componentName, DEBUG_updates }) => ({ DEBUG_componentName, DEBUG_updates })),\n 'DEBUG_updates',\n 'desc',\n ),\n );\n });\n}\n","export const PAGE_TITLE = 'Telegram';\nexport const INACTIVE_MARKER = ' [Inactive]';\n\nexport const APP_NAME = process.env.APP_NAME || 'Telegram WebZ';\nexport const APP_VERSION = process.env.APP_VERSION || 'dev';\n\nexport const DEBUG = (\n process.env.APP_ENV !== 'production' && process.env.APP_ENV !== 'perf' && process.env.APP_ENV !== 'test'\n);\nexport const DEBUG_MORE = false;\n\nexport const IS_TEST = process.env.APP_ENV === 'test';\nexport const IS_PERF = process.env.APP_ENV === 'perf';\n\nexport const DEBUG_ALERT_MSG = 'Shoot!\\nSomething went wrong, please see the error details in Dev Tools Console.';\nexport const DEBUG_GRAMJS = false;\n\nexport const SESSION_USER_KEY = 'user_auth';\nexport const LEGACY_SESSION_KEY = 'GramJs:sessionId';\n\nexport const GLOBAL_STATE_CACHE_DISABLED = false;\nexport const GLOBAL_STATE_CACHE_KEY = 'tt-global-state';\nexport const GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT = 30;\nexport const GLOBAL_STATE_CACHE_USER_LIST_LIMIT = 5000;\n\nexport const MEDIA_CACHE_DISABLED = false;\nexport const MEDIA_CACHE_NAME = 'tt-media';\nexport const MEDIA_CACHE_NAME_AVATARS = 'tt-media-avatars';\nexport const MEDIA_PROGRESSIVE_CACHE_DISABLED = false;\nexport const MEDIA_PROGRESSIVE_CACHE_NAME = 'tt-media-progressive';\nexport const MEDIA_CACHE_MAX_BYTES = 512 * 1024; // 512 KB\nexport const CUSTOM_BG_CACHE_NAME = 'tt-custom-bg';\nexport const LANG_CACHE_NAME = 'tt-lang-packs-v5';\nexport const ASSET_CACHE_NAME = 'tt-assets';\n\nexport const DOWNLOAD_WORKERS = 16;\nexport const UPLOAD_WORKERS = 16;\n\nconst isBigScreen = typeof window !== 'undefined' && window.innerHeight >= 900;\n\nexport const MIN_PASSWORD_LENGTH = 1;\n\nexport const MESSAGE_LIST_SENSITIVE_AREA = 750;\nexport const MESSAGE_LIST_SLICE = isBigScreen ? 60 : 40;\nexport const MESSAGE_LIST_VIEWPORT_LIMIT = MESSAGE_LIST_SLICE * 2;\n\nexport const CHAT_HEIGHT_PX = 72;\nexport const CHAT_LIST_SLICE = isBigScreen ? 30 : 25;\nexport const CHAT_LIST_LOAD_SLICE = 100;\nexport const SHARED_MEDIA_SLICE = 42;\nexport const MESSAGE_SEARCH_SLICE = 42;\nexport const GLOBAL_SEARCH_SLICE = 20;\nexport const MEMBERS_SLICE = 30;\nexport const MEMBERS_LOAD_SLICE = 200;\nexport const PINNED_MESSAGES_LIMIT = 50;\nexport const BLOCKED_LIST_LIMIT = 100;\nexport const PROFILE_PHOTOS_LIMIT = 40;\nexport const PROFILE_SENSITIVE_AREA = 500;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 20;\nexport const ALL_CHATS_PRELOAD_DISABLED = false;\n\nexport const ANIMATION_LEVEL_MIN = 0;\nexport const ANIMATION_LEVEL_MED = 1;\nexport const ANIMATION_LEVEL_MAX = 2;\nexport const ANIMATION_LEVEL_DEFAULT = ANIMATION_LEVEL_MAX;\n\nexport const DEFAULT_MESSAGE_TEXT_SIZE_PX = 16;\n\nexport const DRAFT_DEBOUNCE = 10000; // 10s\n\nexport const EDITABLE_INPUT_ID = 'editable-message-text';\nexport const EDITABLE_INPUT_MODAL_ID = 'editable-message-text-modal';\n\n// Screen width where Pinned Message / Audio Player in the Middle Header can be safely displayed\nexport const SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1440; // px\n// Screen width where Pinned Message / Audio Player in the Middle Header shouldn't collapse with ChatInfo\nexport const SAFE_SCREEN_WIDTH_FOR_CHAT_INFO = 1150; // px\n\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1275; // px\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN = 925; // px\nexport const MOBILE_SCREEN_MAX_WIDTH = 600; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH = 950; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT = 450; // px\n\nexport const LOCAL_MESSAGE_ID_BASE = 1e9;\n\nexport const ANIMATION_END_DELAY = 100;\n\nexport const FAST_SMOOTH_MAX_DISTANCE = 1500;\nexport const FAST_SMOOTH_MIN_DURATION = 250;\nexport const FAST_SMOOTH_MAX_DURATION = 600;\nexport const FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE = 500; // px\n\n// Average duration of message sending animation\nexport const API_UPDATE_THROTTLE = Math.round((FAST_SMOOTH_MIN_DURATION + FAST_SMOOTH_MAX_DURATION) / 2);\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\n\nexport const STICKER_SIZE_INLINE_DESKTOP_FACTOR = 13;\nexport const STICKER_SIZE_INLINE_MOBILE_FACTOR = 11;\nexport const STICKER_SIZE_AUTH = 160;\nexport const STICKER_SIZE_AUTH_MOBILE = 120;\nexport const STICKER_SIZE_PICKER = 64;\nexport const STICKER_SIZE_GENERAL_SETTINGS = 48;\nexport const STICKER_SIZE_PICKER_HEADER = 32;\nexport const STICKER_SIZE_SEARCH = 64;\nexport const STICKER_SIZE_MODAL = 64;\nexport const STICKER_SIZE_TWO_FA = 160;\nexport const STICKER_SIZE_DISCUSSION_GROUPS = 140;\nexport const STICKER_SIZE_FOLDER_SETTINGS = 80;\nexport const STICKER_SIZE_INLINE_BOT_RESULT = 100;\nexport const RECENT_STICKERS_LIMIT = 20;\nexport const MEMOJI_STICKER_ID = 'MEMOJI_STICKER';\n\nexport const BASE_EMOJI_KEYWORD_LANG = 'en';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\n\nexport const CONTENT_TYPES_FOR_QUICK_UPLOAD = new Set([\n 'image/png', 'image/gif', 'image/jpeg', 'video/mp4', 'video/avi', 'video/quicktime',\n]);\n\n// eslint-disable-next-line max-len\nexport const RE_LINK_TEMPLATE = '((ftp|https?):\\\\/\\\\/)?((www\\\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\\\.[a-zA-Z0-9()]{1,63})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_MENTION_TEMPLATE = '(@[\\\\w\\\\d_-]+)';\nexport const RE_TME_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/)([\\d\\w_]+)(?:\\/([\\d]+))?$/gm;\nexport const RE_TME_INVITE_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/joinchat\\/)([\\d\\w_-]+)?$/gm;\n\n// MTProto constants\nexport const SERVICE_NOTIFICATIONS_USER_ID = 777000;\nexport const ALL_FOLDER_ID = 0;\nexport const ARCHIVED_FOLDER_ID = 1;\nexport const DELETED_COMMENTS_CHANNEL_ID = 777;\nexport const MAX_MEDIA_FILES_FOR_ALBUM = 10;\nexport const MAX_ACTIVE_PINNED_CHATS = 5;\nexport const SCHEDULED_WHEN_ONLINE = 0x7FFFFFFE;\nexport const DEFAULT_LANG_CODE = 'en';\nexport const DEFAULT_LANG_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios', 'tdesktop', 'macos'] as const;\nexport const TIPS_USERNAME = 'TelegramTips';\nexport const FEEDBACK_URL = 'https://bugs.telegram.org/?tag_ids=41&sort=time';\nexport const LIGHT_THEME_BG_COLOR = '#A2AF8E';\nexport const DARK_THEME_BG_COLOR = '#0F0F0F';\nexport const DARK_THEME_PATTERN_COLOR = '#0a0a0a8c';\nexport const DEFAULT_PATTERN_COLOR = 'rgba(90, 110, 70, 0.6)';\n","type CollectionByKey<Member> = Record<number | string, Member>;\n\ntype OrderDirection = 'asc' | 'desc';\n\ninterface OrderCallback<T> {\n (member: T): any;\n}\n\nexport function buildCollectionByKey<T extends AnyLiteral>(collection: T[], key: keyof T) {\n return collection.reduce((byKey: CollectionByKey<T>, member: T) => {\n byKey[member[key]] = member;\n\n return byKey;\n }, {});\n}\n\nexport function mapValues<R extends any, M extends any>(\n byKey: CollectionByKey<M>,\n callback: (member: M, key: string, index: number, originalByKey: CollectionByKey<M>) => R,\n): CollectionByKey<R> {\n return Object.keys(byKey).reduce((newByKey: CollectionByKey<R>, key, index) => {\n newByKey[key] = callback(byKey[key], key, index, byKey);\n return newByKey;\n }, {});\n}\n\nexport function pick<T, K extends keyof T>(object: T, keys: K[]) {\n return keys.reduce((result, key) => {\n result[key] = object[key];\n return result;\n }, {} as Pick<T, K>);\n}\n\nexport function pickTruthy<T, K extends keyof T>(object: T, keys: K[]) {\n return keys.reduce((result, key) => {\n if (object[key]) {\n result[key] = object[key];\n }\n\n return result;\n }, {} as Pick<T, K>);\n}\n\nexport function omit<T, K extends keyof T>(object: T, keys: K[]) {\n const stringKeys = new Set(keys.map(String));\n const savedKeys = Object.keys(object)\n .filter((key) => !stringKeys.has(key)) as Array<Exclude<keyof T, K>>;\n\n return pick(object, savedKeys);\n}\n\nexport function orderBy<T>(\n collection: T[],\n orderKey: (keyof T) | OrderCallback<T> | ((keyof T) | OrderCallback<T>)[],\n mode: OrderDirection | [OrderDirection, OrderDirection] = 'asc',\n): T[] {\n return collection.sort((a, b) => {\n if (Array.isArray(orderKey)) {\n const [mode1, mode2] = Array.isArray(mode) ? mode : [mode, mode];\n const [orderKey1, orderKey2] = orderKey;\n\n let aValue1;\n let bValue1;\n\n if (typeof orderKey1 === 'function') {\n aValue1 = orderKey1(a) || 0;\n bValue1 = orderKey1(b) || 0;\n } else if (typeof orderKey1 === 'string') {\n aValue1 = a[orderKey1] || 0;\n bValue1 = b[orderKey1] || 0;\n }\n\n if (aValue1 !== bValue1) {\n return mode1 === 'asc' ? aValue1 - bValue1 : bValue1 - aValue1;\n } else {\n let aValue2;\n let bValue2;\n\n if (typeof orderKey2 === 'function') {\n aValue2 = orderKey2(a) || 0;\n bValue2 = orderKey2(b) || 0;\n } else if (typeof orderKey2 === 'string') {\n aValue2 = a[orderKey2] || 0;\n bValue2 = b[orderKey2] || 0;\n }\n\n return mode2 === 'asc' ? aValue2 - bValue2 : bValue2 - aValue2;\n }\n }\n\n let aValue;\n let bValue;\n\n if (typeof orderKey === 'function') {\n aValue = orderKey(a) || 0;\n bValue = orderKey(b) || 0;\n } else if (typeof orderKey === 'string') {\n aValue = a[orderKey] || 0;\n bValue = b[orderKey] || 0;\n }\n\n return mode === 'asc' ? aValue - bValue : bValue - aValue;\n });\n}\n\nexport function flatten(array: any[]) {\n return array.reduce((result, member) => {\n if (Array.isArray(member)) {\n return result.concat(member);\n } else {\n result.push(member);\n return result;\n }\n }, []);\n}\n\nexport function unique<T extends any>(array: T[]): T[] {\n return Array.from(new Set(array));\n}\n\nexport function compact(array: any[]) {\n return array.filter(Boolean);\n}\n\nexport function areSortedArraysEqual(array1: any[], array2: any[]) {\n if (array1.length !== array2.length) {\n return false;\n }\n\n return array1.every((item, i) => item === array2[i]);\n}\n\nexport function areSortedArraysIntersecting(array1: any[], array2: any[]) {\n return array1[0] <= array2[array2.length - 1] && array1[array1.length - 1] >= array2[0];\n}\n\nexport function findIntersectionWithSet<T>(array: T[], set: Set<T>): T[] {\n return array.filter((a) => set.has(a));\n}\n\nexport function split(array: any[], chunkSize: number) {\n const result = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n result.push(array.slice(i, i + chunkSize));\n }\n\n return result;\n}\n\nexport function cloneDeep<T>(value: T): T {\n if (typeof value !== 'object') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map(cloneDeep) as typeof value;\n }\n\n return Object.keys(value).reduce((acc, key) => {\n acc[key as keyof T] = cloneDeep(value[key as keyof T]);\n return acc;\n }, {} as T);\n}\n\n/**\n * Returns the index of the last element in the array where predicate is true, and -1 otherwise.\n *\n * @param array The source array to search in\n * @param predicate find calls predicate once for each element of the array, in descending\n * order, until it finds one where predicate returns true. If such an element is found,\n * findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1.\n */\nexport function findLast<T>(array: Array<T>, predicate: (value: T, index: number, obj: T[]) => boolean): T | undefined {\n let cursor = array.length;\n\n while (cursor--) {\n if (predicate(array[cursor], cursor, array)) {\n return array[cursor];\n }\n }\n\n return undefined;\n}\n","import {\n ApiChat, ApiMessage, ApiMessageEntityTypes, ApiUser,\n} from '../../api/types';\nimport { LangFn } from '../../hooks/useLang';\n\nimport { LOCAL_MESSAGE_ID_BASE, SERVICE_NOTIFICATIONS_USER_ID, RE_LINK_TEMPLATE } from '../../config';\nimport parseEmojiOnlyString from '../../components/common/helpers/parseEmojiOnlyString';\nimport { getUserFullName } from './users';\nimport { getChatTitle } from './chats';\n\nconst CONTENT_NOT_SUPPORTED = 'The message is not supported on this version of Telegram';\nconst RE_LINK = new RegExp(RE_LINK_TEMPLATE, 'i');\nconst TRUNCATED_SUMMARY_LENGTH = 80;\n\nexport function getMessageKey(message: ApiMessage) {\n const { chatId, id } = message;\n\n return `msg${chatId}-${id}`;\n}\n\nexport function parseMessageKey(key: string) {\n const match = key.match(/^msg(-?\\d+)-(\\d+)/)!;\n\n return { chatId: Number(match[1]), messageId: Number(match[2]) };\n}\n\nexport function getMessageOriginalId(message: ApiMessage) {\n return message.previousLocalId || message.id;\n}\n\nexport function getMessageSummaryText(lang: LangFn, message: ApiMessage, noEmoji = false) {\n const {\n text, photo, video, audio, voice, document, sticker, contact, poll, invoice,\n } = message.content;\n\n const truncatedText = text && text.text.substr(0, TRUNCATED_SUMMARY_LENGTH);\n\n if (message.groupedId) {\n return `${noEmoji ? '' : '🖼 '}${truncatedText || lang('lng_in_dlg_album')}`;\n }\n\n if (photo) {\n return `${noEmoji ? '' : '🖼 '}${truncatedText || lang('AttachPhoto')}`;\n }\n\n if (video) {\n return `${noEmoji ? '' : '📹 '}${truncatedText || lang(video.isGif ? 'AttachGif' : 'AttachVideo')}`;\n }\n\n if (sticker) {\n return `${sticker.emoji || ''} ${lang('AttachSticker')}`.trim();\n }\n\n if (audio) {\n return `${noEmoji ? '' : '🎧 '}${getMessageAudioCaption(message) || lang('AttachMusic')}`;\n }\n\n if (voice) {\n return `${noEmoji ? '' : '🎤 '}${truncatedText || lang('AttachAudio')}`;\n }\n\n if (document) {\n return `${noEmoji ? '' : '📎 '}${truncatedText || document.fileName}`;\n }\n\n if (contact) {\n return lang('AttachContact');\n }\n\n if (poll) {\n return `${noEmoji ? '' : '📊 '}${poll.summary.question}`;\n }\n\n if (invoice) {\n return 'Invoice';\n }\n\n if (text) {\n return truncatedText;\n }\n\n return CONTENT_NOT_SUPPORTED;\n}\n\nexport function getMessageText(message: ApiMessage) {\n const {\n text, sticker, photo, video, audio, voice, document, poll, webPage, contact, invoice,\n } = message.content;\n\n if (text) {\n return text.text;\n }\n\n if (sticker || photo || video || audio || voice || document || contact || poll || webPage || invoice) {\n return undefined;\n }\n\n return CONTENT_NOT_SUPPORTED;\n}\n\nexport function getMessageCustomShape(message: ApiMessage): boolean | number {\n const {\n text, sticker, photo, video, audio, voice, document, poll, webPage, contact,\n } = message.content;\n\n if (sticker || (video && video.isRound)) {\n return true;\n }\n\n if (!text || photo || video || audio || voice || document || poll || webPage || contact) {\n return false;\n }\n\n // This is a \"dual-intent\" method used to limit calls of `parseEmojiOnlyString`.\n return parseEmojiOnlyString(text.text) || false;\n}\n\nexport function getMessageSingleEmoji(message: ApiMessage) {\n const { text } = message.content;\n if (!(text && text.text.length <= 6)) {\n return undefined;\n }\n\n if (getMessageCustomShape(message) !== 1) {\n return undefined;\n }\n\n return text.text;\n}\n\nexport function getFirstLinkInMessage(message: ApiMessage) {\n const { text } = message.content;\n\n let match: RegExpMatchArray | null | undefined;\n if (text && text.entities) {\n let link = text.entities.find((entity) => entity.type === ApiMessageEntityTypes.TextUrl);\n if (link) {\n match = link.url!.match(RE_LINK);\n }\n\n if (!match) {\n link = text.entities.find((entity) => entity.type === ApiMessageEntityTypes.Url);\n if (link) {\n const { offset, length } = link;\n match = text.text.substring(offset, offset + length).match(RE_LINK);\n }\n }\n }\n\n if (!match && text) {\n match = text.text.match(RE_LINK);\n }\n\n if (!match) {\n return undefined;\n }\n\n return {\n url: match[0],\n domain: match[3],\n };\n}\n\nexport function matchLinkInMessageText(message: ApiMessage) {\n const { text } = message.content;\n const match = text && text.text.match(RE_LINK);\n\n if (!match) {\n return undefined;\n }\n\n return {\n url: match[0],\n domain: match[3],\n };\n}\n\nexport function isOwnMessage(message: ApiMessage) {\n return message.isOutgoing;\n}\n\nexport function isReplyMessage(message: ApiMessage) {\n return Boolean(message.replyToMessageId);\n}\n\nexport function isForwardedMessage(message: ApiMessage) {\n return Boolean(message.forwardInfo);\n}\n\nexport function isActionMessage(message: ApiMessage) {\n return !!message.content.action;\n}\n\nexport function isServiceNotificationMessage(message: ApiMessage) {\n return message.chatId === SERVICE_NOTIFICATIONS_USER_ID && isMessageLocal(message);\n}\n\nexport function isAnonymousOwnMessage(message: ApiMessage) {\n return Boolean(message.senderId) && message.senderId! < 0 && isOwnMessage(message);\n}\n\nexport function getSenderTitle(lang: LangFn, sender: ApiUser | ApiChat) {\n return sender.id > 0 ? getUserFullName(sender as ApiUser) : getChatTitle(lang, sender as ApiChat);\n}\n\nexport function getSendingState(message: ApiMessage) {\n if (!message.sendingState) {\n return 'succeeded';\n }\n\n return message.sendingState === 'messageSendingStateFailed' ? 'failed' : 'pending';\n}\n\nexport function isMessageLocal(message: ApiMessage) {\n return message.id >= LOCAL_MESSAGE_ID_BASE;\n}\n\nexport function isHistoryClearMessage(message: ApiMessage) {\n return message.content.action && message.content.action.type === 'historyClear';\n}\n\nexport function getMessageAudioCaption(message: ApiMessage) {\n const { audio, text } = message.content;\n\n return (audio && [audio.title, audio.performer].filter(Boolean).join(' — ')) || (text && text.text);\n}\n","import {\n ApiAudio, ApiMediaFormat, ApiMessage, ApiMessageSearchType, ApiPhoto, ApiVideo, ApiDimensions,\n} from '../../api/types';\n\nimport { IS_OPUS_SUPPORTED, IS_PROGRESSIVE_SUPPORTED, IS_SAFARI } from '../../util/environment';\nimport { getMessageKey, isMessageLocal, matchLinkInMessageText } from './messages';\nimport { getDocumentHasPreview } from '../../components/common/helpers/documentInfo';\n\ntype Target =\n 'micro'\n | 'pictogram'\n | 'inline'\n | 'viewerPreview'\n | 'viewerFull'\n | 'download';\n\n\nexport function getMessageContent(message: ApiMessage) {\n return message.content;\n}\n\nexport function hasMessageMedia(message: ApiMessage) {\n return Boolean((\n getMessagePhoto(message)\n || getMessageVideo(message)\n || getMessageDocument(message)\n || getMessageSticker(message)\n || getMessageContact(message)\n || getMessagePoll(message)\n || getMessageAction(message)\n || getMessageAudio(message)\n || getMessageVoice(message)\n ));\n}\n\nexport function getMessagePhoto(message: ApiMessage) {\n return message.content.photo;\n}\n\nexport function getMessageVideo(message: ApiMessage) {\n return message.content.video;\n}\n\nexport function getMessageRoundVideo(message: ApiMessage) {\n const { video } = message.content;\n\n return video && video.isRound ? video : undefined;\n}\n\nexport function getMessageAction(message: ApiMessage) {\n return message.content.action;\n}\n\nexport function getMessageAudio(message: ApiMessage) {\n return message.content.audio;\n}\n\nexport function getMessageVoice(message: ApiMessage) {\n return message.content.voice;\n}\n\nexport function getMessageSticker(message: ApiMessage) {\n return message.content.sticker;\n}\n\nexport function getMessageDocument(message: ApiMessage) {\n return message.content.document;\n}\n\nexport function isMessageDocumentPhoto(message: ApiMessage) {\n const document = getMessageDocument(message);\n return document ? document.mediaType === 'photo' : undefined;\n}\n\nexport function isMessageDocumentVideo(message: ApiMessage) {\n const document = getMessageDocument(message);\n return document ? document.mediaType === 'video' : undefined;\n}\n\nexport function getMessageContact(message: ApiMessage) {\n return message.content.contact;\n}\n\nexport function getMessagePoll(message: ApiMessage) {\n return message.content.poll;\n}\n\nexport function getMessageInvoice(message: ApiMessage) {\n return message.content.invoice;\n}\n\nexport function getMessageWebPage(message: ApiMessage) {\n return message.content.webPage;\n}\n\nexport function getMessageWebPagePhoto(message: ApiMessage) {\n const webPage = getMessageWebPage(message);\n return webPage ? webPage.photo : undefined;\n}\n\nexport function getMessageWebPageDocument(message: ApiMessage) {\n const webPage = getMessageWebPage(message);\n return webPage ? webPage.document : undefined;\n}\n\nexport function getMessageWebPageVideo(message: ApiMessage): ApiVideo | undefined {\n const webPage = getMessageWebPage(message);\n if (!webPage) return undefined;\n return webPage.video;\n}\n\nexport function getMessageMediaThumbnail(message: ApiMessage) {\n const media = getMessagePhoto(message)\n || getMessageVideo(message)\n || getMessageDocument(message)\n || getMessageSticker(message)\n || getMessageWebPagePhoto(message)\n || getMessageWebPageVideo(message);\n\n if (!media) {\n return undefined;\n }\n\n return media.thumbnail;\n}\n\nexport function getMessageMediaThumbDataUri(message: ApiMessage) {\n const thumbnail = getMessageMediaThumbnail(message);\n\n return thumbnail ? thumbnail.dataUri : undefined;\n}\n\nexport function getMessageMediaHash(\n message: ApiMessage,\n target: Target,\n) {\n const {\n photo, video, sticker, audio, voice, document,\n } = message.content;\n const webPagePhoto = getMessageWebPagePhoto(message);\n const webPageVideo = getMessageWebPageVideo(message);\n\n const messageVideo = video || webPageVideo;\n const messagePhoto = photo || webPagePhoto;\n\n if (!(messagePhoto || messageVideo || sticker || audio || voice || document)) {\n return undefined;\n }\n\n const base = getMessageKey(message);\n\n if (messageVideo) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n return !hasMessageLocalBlobUrl(message) ? getVideoOrAudioBaseHash(messageVideo, base) : undefined;\n case 'viewerPreview':\n return `${base}?size=m`;\n case 'viewerFull':\n return getVideoOrAudioBaseHash(messageVideo, base);\n case 'download':\n return `${base}?download`;\n }\n }\n\n if (messagePhoto) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n return !hasMessageLocalBlobUrl(message) ? `${base}?size=x` : undefined;\n case 'viewerPreview':\n return `${base}?size=x`;\n case 'viewerFull':\n return `${base}?size=z`;\n }\n }\n\n if (document) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n case 'inline':\n case 'viewerPreview':\n if (!getDocumentHasPreview(document) || hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n return `${base}?size=m`;\n default:\n return base;\n }\n }\n\n if (sticker) {\n switch (target) {\n case 'micro':\n return undefined;\n case 'pictogram':\n return `${base}?size=m`;\n default:\n return base;\n }\n }\n\n if (audio) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return undefined;\n case 'download':\n return `${base}?download`;\n default:\n return getVideoOrAudioBaseHash(audio, base);\n }\n }\n\n if (voice) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return undefined;\n default:\n return base;\n }\n }\n\n return undefined;\n}\n\nfunction getVideoOrAudioBaseHash(media: ApiAudio | ApiVideo, base: string) {\n if (IS_PROGRESSIVE_SUPPORTED && IS_SAFARI) {\n return `${base}?fileSize=${media.size}&mimeType=${media.mimeType}`;\n }\n\n return base;\n}\n\nexport function getMessageMediaFormat(\n message: ApiMessage, target: Target,\n): Exclude<ApiMediaFormat, ApiMediaFormat.Lottie>;\nexport function getMessageMediaFormat(message: ApiMessage, target: Target, canBeLottie: true): ApiMediaFormat;\nexport function getMessageMediaFormat(\n message: ApiMessage, target: Target,\n): ApiMediaFormat {\n const {\n sticker, video, audio, voice,\n } = message.content;\n\n const fullVideo = video || getMessageWebPageVideo(message);\n\n if (sticker && target === 'inline' && sticker.isAnimated) {\n return ApiMediaFormat.Lottie;\n } else if (fullVideo && IS_PROGRESSIVE_SUPPORTED && (\n target === 'viewerFull' || target === 'inline'\n )) {\n return ApiMediaFormat.Progressive;\n } else if (audio || voice) {\n // Safari\n if (voice && !IS_OPUS_SUPPORTED) {\n return ApiMediaFormat.BlobUrl;\n }\n\n return ApiMediaFormat.Progressive;\n }\n\n return ApiMediaFormat.BlobUrl;\n}\n\nexport function getMessageFileName(message: ApiMessage) {\n const {\n photo, video, document,\n } = message.content;\n const webPagePhoto = getMessageWebPagePhoto(message);\n const webPageVideo = getMessageWebPageVideo(message);\n\n if (photo || webPagePhoto) {\n return `photo${message.date}.jpeg`;\n }\n\n const { fileName } = video || webPageVideo || document || {};\n\n return fileName;\n}\n\nexport function getMessageFileSize(message: ApiMessage) {\n const { video, document } = message.content;\n const webPageVideo = getMessageWebPageVideo(message);\n const { size } = video || webPageVideo || document || {};\n\n return size;\n}\n\nexport function hasMessageLocalBlobUrl(message: ApiMessage) {\n const { photo, video, document } = message.content;\n\n return (photo && photo.blobUrl) || (video && video.blobUrl) || (document && document.previewBlobUrl);\n}\n\nexport function getChatMediaMessageIds(\n messages: Record<number, ApiMessage>, listedIds: number[], isFromSharedMedia = false,\n) {\n const ids = getMessageContentIds(messages, listedIds, isFromSharedMedia ? 'media' : 'inlineMedia');\n\n return isFromSharedMedia ? ids.reverse() : ids;\n}\n\nexport function getPhotoFullDimensions(photo: ApiPhoto): ApiDimensions | undefined {\n return (\n photo.sizes.find((size) => size.type === 'z')\n || photo.sizes.find((size) => size.type === 'y')\n || getPhotoInlineDimensions(photo)\n );\n}\n\nexport function getPhotoInlineDimensions(photo: ApiPhoto): ApiDimensions | undefined {\n return (\n photo.sizes.find((size) => size.type === 'x')\n || photo.sizes.find((size) => size.type === 'm')\n || photo.sizes.find((size) => size.type === 's')\n || photo.thumbnail\n );\n}\n\nexport function getVideoDimensions(video: ApiVideo): ApiDimensions | undefined {\n if (video.width && video.height) {\n return video as ApiDimensions;\n }\n\n return undefined;\n}\n\nexport function getMediaTransferState(message: ApiMessage, progress?: number, isDownloadNeeded = false) {\n const isUploading = isMessageLocal(message);\n const isTransferring = isUploading || isDownloadNeeded;\n const transferProgress = Number(progress);\n\n return {\n isUploading, isTransferring, transferProgress,\n };\n}\n\nexport function getMessageContentIds(\n messages: Record<number, ApiMessage>, messageIds: number[], contentType: ApiMessageSearchType | 'inlineMedia',\n) {\n let validator: Function;\n\n switch (contentType) {\n case 'media':\n validator = (message: ApiMessage) => {\n const video = getMessageVideo(message);\n return getMessagePhoto(message) || (video && !video.isRound && !video.isGif);\n };\n break;\n\n case 'documents':\n validator = getMessageDocument;\n break;\n\n case 'links':\n validator = (message: ApiMessage) => getMessageWebPage(message) || matchLinkInMessageText(message);\n break;\n\n case 'audio':\n validator = getMessageAudio;\n break;\n\n case 'inlineMedia':\n validator = (message: ApiMessage) => {\n const video = getMessageVideo(message);\n return (\n getMessagePhoto(message)\n || (video && !video.isRound && !video.isGif)\n || isMessageDocumentPhoto(message)\n || isMessageDocumentVideo(message)\n );\n };\n break;\n\n default:\n return [] as Array<number>;\n }\n\n return messageIds.reduce((result, messageId) => {\n if (messages[messageId] && validator(messages[messageId])) {\n result.push(messageId);\n }\n\n return result;\n }, [] as Array<number>);\n}\n\nexport function getMediaDuration(message: ApiMessage) {\n const { audio, voice, video } = getMessageContent(message);\n const media = audio || voice || video || getMessageWebPageVideo(message);\n if (!media) {\n return undefined;\n }\n\n return media.duration;\n}\n","export function buildChatThreadKey(chatId: number, threadId: number) {\n return `${chatId}_${threadId}`;\n}\n","import Worker from 'worker-loader!./worker';\n\nimport { ApiInitialArgs, ApiOnProgress, OnApiUpdate } from '../../types';\nimport { Methods, MethodArgs, MethodResponse } from '../methods/types';\nimport { WorkerMessageEvent, ThenArg, OriginRequest } from './types';\n\nimport { DEBUG } from '../../../config';\nimport generateIdFor from '../../../util/generateIdFor';\n\ntype RequestStates = {\n messageId: string;\n resolve: Function;\n reject: Function;\n callback?: AnyToVoidFunction;\n};\n\nlet worker: Worker;\nconst requestStates = new Map<string, RequestStates>();\nconst requestStatesByCallback = new Map<AnyToVoidFunction, RequestStates>();\n\n// TODO Re-use `util/WorkerConnector.ts`\n\nexport function initApi(onUpdate: OnApiUpdate, initialArgs: ApiInitialArgs) {\n if (!worker) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START LOAD WORKER');\n }\n\n worker = new Worker();\n subscribeToWorker(onUpdate);\n }\n\n return makeRequest({\n type: 'initApi',\n args: [initialArgs],\n });\n}\n\nexport function callApi<T extends keyof Methods>(fnName: T, ...args: MethodArgs<T>) {\n if (!worker) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('API is not initialized');\n }\n\n return undefined;\n }\n\n return makeRequest({\n type: 'callMethod',\n name: fnName,\n args,\n }) as MethodResponse<T>;\n}\n\nexport function cancelApiProgress(progressCallback: ApiOnProgress) {\n progressCallback.isCanceled = true;\n\n const { messageId } = requestStatesByCallback.get(progressCallback) || {};\n if (!messageId) {\n return;\n }\n\n worker.postMessage({\n type: 'cancelProgress',\n messageId,\n });\n}\n\nfunction subscribeToWorker(onUpdate: OnApiUpdate) {\n worker.addEventListener('message', ({ data }: WorkerMessageEvent) => {\n if (data.type === 'update') {\n onUpdate(data.update);\n } else if (data.type === 'methodResponse') {\n const requestState = requestStates.get(data.messageId);\n if (requestState) {\n if (data.error) {\n requestState.reject(data.error);\n } else {\n requestState.resolve(data.response);\n }\n }\n } else if (data.type === 'methodCallback') {\n const requestState = requestStates.get(data.messageId);\n if (requestState && requestState.callback) {\n requestState.callback(...data.callbackArgs);\n }\n } else if (data.type === 'unhandledError') {\n throw data.error;\n }\n });\n}\n\nfunction makeRequest(message: OriginRequest) {\n const messageId = generateIdFor(requestStates);\n const payload: OriginRequest = {\n messageId,\n ...message,\n };\n\n const requestState = { messageId } as RequestStates;\n\n // Re-wrap type because of `postMessage`\n const promise: Promise<ThenArg<MethodResponse<keyof Methods>>> = new Promise((resolve, reject) => {\n Object.assign(requestState, { resolve, reject });\n });\n\n if (typeof payload.args[1] === 'function') {\n const callback = payload.args.pop() as AnyToVoidFunction;\n requestState.callback = callback;\n requestStatesByCallback.set(callback, requestState);\n }\n\n requestStates.set(messageId, requestState);\n promise\n .catch(() => undefined)\n .finally(() => {\n requestStates.delete(messageId);\n\n if (requestState.callback) {\n requestStatesByCallback.delete(requestState.callback);\n }\n });\n\n worker.postMessage(payload);\n\n return promise;\n}\n","let isWebpSupportedCache: boolean | undefined;\n\nexport function isWebpSupported() {\n return Boolean(isWebpSupportedCache);\n}\n\nfunction testWebp(): Promise<boolean> {\n return new Promise((resolve) => {\n const webp = new Image();\n // eslint-disable-next-line max-len\n webp.src = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';\n const handleLoadOrError = () => {\n resolve(webp.height === 2);\n };\n webp.onload = handleLoadOrError;\n webp.onerror = handleLoadOrError;\n });\n}\n\ntestWebp().then((hasWebp) => {\n isWebpSupportedCache = hasWebp;\n});\n","import { ThemeKey } from '../types';\n\nlet systemThemeCache: ThemeKey = (\n window && window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches\n) ? 'dark' : 'light';\n\nexport function getSystemTheme() {\n return systemThemeCache;\n}\n\nfunction handleSystemThemeChange(e: MediaQueryListEventMap['change']) {\n systemThemeCache = e.matches ? 'dark' : 'light';\n}\n\nconst mql = window.matchMedia('(prefers-color-scheme: dark)');\nif (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', handleSystemThemeChange);\n} else if (typeof mql.addListener === 'function') {\n mql.addListener(handleSystemThemeChange);\n}\n","import {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT,\n MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH,\n IS_TEST,\n} from '../config';\n\nexport * from './environmentWebp';\n\nexport * from './environmentSystemTheme';\n\nexport function getPlatform() {\n const { userAgent, platform } = window.navigator;\n const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'];\n const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'];\n const iosPlatforms = ['iPhone', 'iPad', 'iPod'];\n let os: 'macOS' | 'iOS' | 'Windows' | 'Android' | 'Linux' | undefined;\n\n if (macosPlatforms.indexOf(platform) !== -1) {\n os = 'macOS';\n } else if (iosPlatforms.indexOf(platform) !== -1) {\n os = 'iOS';\n } else if (windowsPlatforms.indexOf(platform) !== -1) {\n os = 'Windows';\n } else if (/Android/.test(userAgent)) {\n os = 'Android';\n } else if (/Linux/.test(platform)) {\n os = 'Linux';\n }\n\n return os;\n}\n\nexport const PLATFORM_ENV = getPlatform();\nexport const IS_MAC_OS = PLATFORM_ENV === 'macOS';\nexport const IS_IOS = PLATFORM_ENV === 'iOS';\nexport const IS_ANDROID = PLATFORM_ENV === 'Android';\nexport const IS_SAFARI = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\nexport const IS_PWA = window.matchMedia('(display-mode: standalone)').matches\n|| (window.navigator as any).standalone\n|| document.referrer.includes('android-app://');\n\nexport const IS_TOUCH_ENV = window.matchMedia('(pointer: coarse)').matches;\n// Keep in mind the landscape orientation\nexport const IS_SINGLE_COLUMN_LAYOUT = window.innerWidth <= MOBILE_SCREEN_MAX_WIDTH || (\n window.innerWidth <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH && window.innerHeight <= MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT\n);\n// Special layout, 1 column while chat opened, 2 columns while collapsed\nexport const IS_TABLET_COLUMN_LAYOUT = !IS_SINGLE_COLUMN_LAYOUT && (\n window.innerWidth <= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n);\nexport const IS_VOICE_RECORDING_SUPPORTED = (navigator.mediaDevices && 'getUserMedia' in navigator.mediaDevices && (\n window.AudioContext || (window as any).webkitAudioContext\n));\nexport const IS_SMOOTH_SCROLL_SUPPORTED = 'scrollBehavior' in document.documentElement.style;\nexport const IS_EMOJI_SUPPORTED = PLATFORM_ENV && (IS_MAC_OS || IS_IOS);\nexport const IS_SERVICE_WORKER_SUPPORTED = 'serviceWorker' in navigator;\n// TODO Consider failed service worker\nexport const IS_PROGRESSIVE_SUPPORTED = IS_SERVICE_WORKER_SUPPORTED;\nexport const IS_STREAMING_SUPPORTED = 'MediaSource' in window;\nexport const IS_OPUS_SUPPORTED = Boolean((new Audio()).canPlayType('audio/ogg; codecs=opus'));\nexport const IS_CANVAS_FILTER_SUPPORTED = (\n !IS_TEST && 'filter' in (document.createElement('canvas').getContext('2d') || {})\n);\nexport const LAYERS_ANIMATION_NAME = IS_ANDROID ? 'slide-fade' : IS_IOS ? 'slide-layers' : 'push-slide';\n\nexport const DPR = window.devicePixelRatio || 1;\n\nexport const MASK_IMAGE_DISABLED = true;\n","import { GlobalState } from '../../global/types';\nimport { ApiChat, ApiUser } from '../../api/types';\n\nexport function selectUser(global: GlobalState, userId: number): ApiUser | undefined {\n return global.users.byId[userId];\n}\n\nexport function selectIsUserBlocked(global: GlobalState, userId: number) {\n const user = selectUser(global, userId);\n\n return user && user.fullInfo && user.fullInfo.isBlocked;\n}\n\n// Slow, not to be used in `withGlobal`\nexport function selectUserByUsername(global: GlobalState, username: string) {\n const usernameLowered = username.toLowerCase();\n return Object.values(global.users.byId).find(\n (user) => user.username.toLowerCase() === usernameLowered,\n );\n}\n\nexport function selectIsUserOrChatContact(global: GlobalState, userOrChat: ApiUser | ApiChat) {\n return global.contactList && global.contactList.userIds.includes(userOrChat.id);\n}\n","import { GlobalState } from '../../global/types';\n\nexport function selectNotifySettings(global: GlobalState) {\n return global.settings.byKey;\n}\n\nexport function selectNotifyExceptions(global: GlobalState) {\n return global.settings.notifyExceptions;\n}\n","import { ApiChat, MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalState } from '../../global/types';\n\nimport {\n getPrivateChatUserId, isChatChannel, isChatPrivate, isHistoryClearMessage, isUserBot, isUserOnline, selectIsChatMuted,\n} from '../helpers';\nimport { selectUser } from './users';\nimport { ALL_FOLDER_ID, ARCHIVED_FOLDER_ID, MEMBERS_LOAD_SLICE } from '../../config';\nimport { selectNotifyExceptions, selectNotifySettings } from './settings';\n\nexport function selectChat(global: GlobalState, chatId: number): ApiChat | undefined {\n return global.chats.byId[chatId];\n}\n\nexport function selectChatUser(global: GlobalState, chat: ApiChat) {\n const userId = getPrivateChatUserId(chat);\n if (!userId) {\n return false;\n }\n\n return selectUser(global, userId);\n}\n\nexport function selectIsChatWithSelf(global: GlobalState, chatId: number) {\n return chatId === global.currentUserId;\n}\n\nexport function selectIsChatWithBot(global: GlobalState, chat: ApiChat) {\n const user = selectChatUser(global, chat);\n return user && isUserBot(user);\n}\n\nexport function selectSupportChat(global: GlobalState) {\n return Object.values(global.chats.byId).find(({ isSupport }: ApiChat) => isSupport);\n}\n\nexport function selectChatOnlineCount(global: GlobalState, chat: ApiChat) {\n if (isChatPrivate(chat.id) || isChatChannel(chat) || !chat.fullInfo) {\n return undefined;\n }\n\n if (!chat.fullInfo.members || chat.fullInfo.members.length === MEMBERS_LOAD_SLICE) {\n return chat.fullInfo.onlineCount;\n }\n\n return chat.fullInfo.members.reduce((onlineCount, { userId }) => {\n if (global.users.byId[userId] && isUserOnline(global.users.byId[userId]) && userId !== global.currentUserId) {\n return onlineCount + 1;\n }\n\n return onlineCount;\n }, 0);\n}\n\nexport function selectChatBot(global: GlobalState, chatId: number) {\n const chat = selectChat(global, chatId);\n const userId = chat && getPrivateChatUserId(chat);\n const user = userId && selectUser(global, userId);\n if (!user || !isUserBot(user)) {\n return undefined;\n }\n\n return user;\n}\n\nexport function selectIsChatBotNotStarted(global: GlobalState, chatId: number) {\n const chat = selectChat(global, chatId);\n const bot = selectChatBot(global, chatId);\n if (!chat || !bot) {\n return false;\n }\n\n if (chat.lastMessage && isHistoryClearMessage(chat.lastMessage)) {\n return true;\n }\n\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return false;\n }\n\n const { listedIds } = messageInfo.threadsById[MAIN_THREAD_ID] || {};\n return listedIds && !listedIds.length;\n}\n\nexport function selectAreActiveChatsLoaded(global: GlobalState): boolean {\n return Boolean(global.chats.listIds.active);\n}\n\nexport function selectIsChatListed(global: GlobalState, chatId: number, type?: 'active' | 'archived'): boolean {\n const { listIds } = global.chats;\n if (type) {\n const targetList = listIds[type];\n return Boolean(targetList && targetList.includes(chatId));\n }\n\n return Object.values(listIds).some((list) => list && list.includes(chatId));\n}\n\nexport function selectChatListType(global: GlobalState, chatId: number): 'active' | 'archived' | undefined {\n const chat = selectChat(global, chatId);\n if (!chat || !selectIsChatListed(global, chatId)) {\n return undefined;\n }\n\n return chat.folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active';\n}\n\nexport function selectChatFolder(global: GlobalState, folderId: number) {\n return global.chatFolders.byId[folderId];\n}\n\nexport function selectTotalChatCount(global: GlobalState, listType: 'active' | 'archived'): number {\n const { totalCount } = global.chats;\n const allChatsCount = totalCount.all;\n const archivedChatsCount = totalCount.archived || 0;\n\n if (listType === 'archived') {\n return archivedChatsCount;\n }\n\n return allChatsCount ? allChatsCount - archivedChatsCount : 0;\n}\n\nexport function selectIsChatPinned(global: GlobalState, chatId: number, folderId = ALL_FOLDER_ID): boolean {\n const { active, archived } = global.chats.orderedPinnedIds;\n\n if (folderId === ALL_FOLDER_ID) {\n return !!active && active.includes(chatId);\n }\n\n if (folderId === ARCHIVED_FOLDER_ID) {\n return !!archived && archived.includes(chatId);\n }\n\n const { byId: chatFoldersById } = global.chatFolders;\n\n const { pinnedChatIds } = chatFoldersById[folderId] || {};\n return !!pinnedChatIds && pinnedChatIds.includes(chatId);\n}\n\n// Slow, not to be used in `withGlobal`\nexport function selectChatByUsername(global: GlobalState, username: string) {\n const usernameLowered = username.toLowerCase();\n return Object.values(global.chats.byId).find(\n (chat) => chat.username && chat.username.toLowerCase() === usernameLowered,\n );\n}\n\nexport function selectCountNotMutedUnread(global: GlobalState) {\n const activeChatIds = global.chats.listIds.active;\n if (!activeChatIds) {\n return 0;\n }\n\n const chats = global.chats.byId;\n\n return activeChatIds.reduce((acc, chatId) => {\n const chat = chats[chatId];\n\n if (\n chat\n && chat.unreadCount\n && !selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global))\n ) {\n return acc + chat.unreadCount;\n }\n\n return acc;\n }, 0);\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiSticker } from '../../api/types';\n\nexport function selectIsStickerFavorite(global: GlobalState, sticker: ApiSticker) {\n const { stickers } = global.stickers.favorite;\n return stickers && stickers.some(({ id }) => id === sticker.id);\n}\n\nexport function selectCurrentStickerSearch(global: GlobalState) {\n return global.stickers.search;\n}\n\nexport function selectCurrentGifSearch(global: GlobalState) {\n return global.gifs.search;\n}\n\nexport function selectStickerSet(global: GlobalState, id: string) {\n return global.stickers.setsById[id];\n}\n\nexport function selectStickersForEmoji(global: GlobalState, emoji: string) {\n const stickerSets = Object.values(global.stickers.setsById);\n let stickersForEmoji: ApiSticker[] = [];\n stickerSets.forEach(({ packs }) => {\n if (!packs) {\n return;\n }\n const stickers = packs[emoji];\n if (stickers) {\n stickersForEmoji = stickersForEmoji.concat(stickers);\n }\n });\n return stickersForEmoji;\n}\n\nexport function selectAnimatedEmoji(global: GlobalState, emoji: string) {\n const { animatedEmojis } = global;\n if (!animatedEmojis || !animatedEmojis.stickers) {\n return undefined;\n }\n\n // Some emojis (❤️ for example) with a service symbol 'VARIATION SELECTOR-16' are not recognized as animated\n const cleanedEmoji = emoji.replace('\\ufe0f', '');\n\n return animatedEmojis.stickers.find((sticker) => sticker.emoji === emoji || sticker.emoji === cleanedEmoji);\n}\n","import { GlobalState, MessageListType, Thread } from '../../global/types';\nimport {\n ApiChat,\n ApiMessage,\n ApiMessageOutgoingStatus,\n ApiUser,\n MAIN_THREAD_ID,\n} from '../../api/types';\n\nimport { LOCAL_MESSAGE_ID_BASE } from '../../config';\nimport {\n selectChat, selectIsChatWithBot, selectIsChatWithSelf,\n} from './chats';\nimport { selectIsUserOrChatContact, selectUser } from './users';\nimport {\n getSendingState,\n isChatChannel,\n isMessageLocal,\n isChatPrivate,\n isForwardedMessage,\n getCanPostInChat,\n isUserRightBanned,\n getHasAdminRight,\n isChatBasicGroup,\n isCommonBoxChat,\n isServiceNotificationMessage,\n isOwnMessage,\n isActionMessage,\n isChatGroup,\n isChatSuperGroup,\n getMessageVideo,\n getMessageWebPageVideo,\n} from '../helpers';\nimport { findLast } from '../../util/iteratees';\nimport { selectIsStickerFavorite } from './symbols';\n\nconst MESSAGE_EDIT_ALLOWED_TIME_MS = 172800000; // 48 hours\n\nexport function selectCurrentMessageList(global: GlobalState) {\n const { messageLists } = global.messages;\n\n if (messageLists && messageLists.length) {\n return messageLists[messageLists.length - 1];\n }\n\n return undefined;\n}\n\nexport function selectCurrentChat(global: GlobalState) {\n const { chatId } = selectCurrentMessageList(global) || {};\n\n return chatId ? selectChat(global, chatId) : undefined;\n}\n\nexport function selectChatMessages(global: GlobalState, chatId: number) {\n const messages = global.messages.byChatId[chatId];\n\n return messages ? messages.byId : undefined;\n}\n\nexport function selectScheduledMessages(global: GlobalState, chatId: number) {\n const messages = global.scheduledMessages.byChatId[chatId];\n\n return messages ? messages.byId : undefined;\n}\n\nexport function selectThreadParam<K extends keyof Thread>(\n global: GlobalState,\n chatId: number,\n threadId: number,\n key: K,\n) {\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return undefined;\n }\n\n const thread = messageInfo.threadsById[threadId];\n if (!thread) {\n return undefined;\n }\n\n return thread[key];\n}\n\nexport function selectListedIds(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'listedIds');\n}\n\nexport function selectOutlyingIds(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'outlyingIds');\n}\n\nexport function selectCurrentMessageIds(\n global: GlobalState, chatId: number, threadId: number, messageListType: MessageListType,\n) {\n switch (messageListType) {\n case 'thread':\n return selectViewportIds(global, chatId, threadId);\n case 'pinned':\n return selectPinnedIds(global, chatId);\n case 'scheduled':\n return selectScheduledIds(global, chatId);\n }\n\n return undefined;\n}\n\nexport function selectViewportIds(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'viewportIds');\n}\n\nexport function selectPinnedIds(global: GlobalState, chatId: number) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'pinnedIds');\n}\n\nexport function selectScheduledIds(global: GlobalState, chatId: number) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds');\n}\n\nexport function selectScrollOffset(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'scrollOffset');\n}\n\nexport function selectReplyingToId(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'replyingToId');\n}\n\nexport function selectEditingId(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'editingId');\n}\n\nexport function selectEditingScheduledId(global: GlobalState, chatId: number) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'editingScheduledId');\n}\n\nexport function selectDraft(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'draft');\n}\n\nexport function selectNoWebPage(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'noWebPage');\n}\n\nexport function selectThreadInfo(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'threadInfo');\n}\n\nexport function selectFirstMessageId(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'firstMessageId');\n}\n\nexport function selectReplyStack(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'replyStack');\n}\n\nexport function selectThreadOriginChat(global: GlobalState, chatId: number, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n return selectChat(global, chatId);\n }\n\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n return selectChat(global, threadInfo.originChannelId || chatId);\n}\n\nexport function selectThreadTopMessageId(global: GlobalState, chatId: number, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n return undefined;\n }\n\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n return threadInfo.topMessageId;\n}\n\nexport function selectThreadByMessage(global: GlobalState, chatId: number, message: ApiMessage) {\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return undefined;\n }\n\n const { replyToMessageId, replyToTopMessageId } = message;\n if (!replyToMessageId && !replyToTopMessageId) {\n return undefined;\n }\n\n return Object.values<Thread>(messageInfo.threadsById).find((thread) => {\n return thread.threadInfo && (\n (replyToMessageId && replyToMessageId === thread.threadInfo.topMessageId)\n || (replyToTopMessageId && replyToTopMessageId === thread.threadInfo.topMessageId)\n );\n });\n}\n\nexport function isMessageInCurrentMessageList(global: GlobalState, chatId: number, message: ApiMessage) {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return false;\n }\n\n const { threadInfo } = selectThreadByMessage(global, chatId, message) || {};\n return (\n chatId === currentMessageList.chatId\n && (\n (currentMessageList.threadId === MAIN_THREAD_ID)\n || (threadInfo && currentMessageList.threadId === threadInfo.threadId)\n )\n );\n}\n\nexport function selectIsViewportNewest(global: GlobalState, chatId: number, threadId: number) {\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (!viewportIds || !viewportIds.length) {\n return true;\n }\n\n let lastMessageId: number;\n\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n if (!chat || !chat.lastMessage) {\n return true;\n }\n\n lastMessageId = chat.lastMessage.id;\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo || !threadInfo.lastMessageId) {\n return undefined;\n }\n\n lastMessageId = threadInfo.lastMessageId;\n }\n\n // Edge case: outgoing `lastMessage` is updated with a delay to optimize animation\n if (lastMessageId >= LOCAL_MESSAGE_ID_BASE && !selectChatMessage(global, chatId, lastMessageId)) {\n return true;\n }\n\n return viewportIds[viewportIds.length - 1] >= lastMessageId;\n}\n\nexport function selectChatMessage(global: GlobalState, chatId: number, messageId: number) {\n const chatMessages = selectChatMessages(global, chatId);\n\n return chatMessages ? chatMessages[messageId] : undefined;\n}\n\nexport function selectScheduledMessage(global: GlobalState, chatId: number, messageId: number) {\n const chatMessages = selectScheduledMessages(global, chatId);\n\n return chatMessages ? chatMessages[messageId] : undefined;\n}\n\nexport function selectEditingMessage(\n global: GlobalState, chatId: number, threadId: number, messageListType: MessageListType,\n) {\n if (messageListType === 'scheduled') {\n const messageId = selectEditingScheduledId(global, chatId);\n return messageId ? selectScheduledMessage(global, chatId, messageId) : undefined;\n } else {\n const messageId = selectEditingId(global, chatId, threadId);\n return messageId ? selectChatMessage(global, chatId, messageId) : undefined;\n }\n}\n\nexport function selectChatMessageByPollId(global: GlobalState, pollId: string) {\n let messageWithPoll: ApiMessage | undefined;\n\n // eslint-disable-next-line no-restricted-syntax\n for (const chatMessages of Object.values(global.messages.byChatId)) {\n const { byId } = chatMessages;\n messageWithPoll = Object.values(byId).find((message) => {\n return message.content.poll && message.content.poll.id === pollId;\n });\n if (messageWithPoll) {\n break;\n }\n }\n\n return messageWithPoll;\n}\n\nexport function selectFocusedMessageId(global: GlobalState, chatId: number) {\n const { chatId: focusedChatId, messageId } = global.focusedMessage || {};\n\n return focusedChatId === chatId ? messageId : undefined;\n}\n\nexport function selectIsMessageFocused(global: GlobalState, message: ApiMessage) {\n const focusedId = selectFocusedMessageId(global, message.chatId);\n\n return focusedId ? focusedId === message.id || focusedId === message.previousLocalId : false;\n}\n\nexport function selectIsMessageUnread(global: GlobalState, message: ApiMessage) {\n const { lastReadOutboxMessageId } = selectChat(global, message.chatId) || {};\n return isMessageLocal(message) || !lastReadOutboxMessageId || lastReadOutboxMessageId < message.id;\n}\n\nexport function selectOutgoingStatus(\n global: GlobalState, message: ApiMessage, isScheduledList = false,\n): ApiMessageOutgoingStatus {\n if (!selectIsMessageUnread(global, message) && !isScheduledList) {\n return 'read';\n }\n\n return getSendingState(message);\n}\n\nexport function selectSender(global: GlobalState, message: ApiMessage): ApiUser | ApiChat | undefined {\n const { senderId } = message;\n if (!senderId) {\n return undefined;\n }\n\n return senderId > 0 ? selectUser(global, senderId) : selectChat(global, senderId);\n}\n\nexport function selectForwardedSender(global: GlobalState, message: ApiMessage): ApiUser | ApiChat | undefined {\n const { forwardInfo } = message;\n if (!forwardInfo) {\n return undefined;\n }\n\n if (forwardInfo.isChannelPost && forwardInfo.fromChatId) {\n return selectChat(global, forwardInfo.fromChatId);\n } else if (forwardInfo.senderUserId) {\n return selectUser(global, forwardInfo.senderUserId);\n }\n\n return undefined;\n}\n\nexport function selectAllowedMessageActions(global: GlobalState, message: ApiMessage, threadId: number) {\n const { serverTimeOffset } = global;\n const chat = selectChat(global, message.chatId);\n if (!chat || chat.isRestricted) {\n return {};\n }\n\n const isPrivate = isChatPrivate(chat.id);\n const isChatWithSelf = selectIsChatWithSelf(global, message.chatId);\n const isBasicGroup = isChatBasicGroup(chat);\n const isSuperGroup = isChatSuperGroup(chat);\n const isChannel = isChatChannel(chat);\n const isServiceNotification = isServiceNotificationMessage(message);\n\n const isOwn = isOwnMessage(message);\n const isAction = isActionMessage(message);\n const { content } = message;\n const canEditMessagesIndefinitely = isChatWithSelf\n || (isSuperGroup && getHasAdminRight(chat, 'pinMessages'))\n || (isChannel && getHasAdminRight(chat, 'editMessages'));\n const isMessageEditable = (\n (canEditMessagesIndefinitely\n || Date.now() + serverTimeOffset * 1000 - message.date * 1000 < MESSAGE_EDIT_ALLOWED_TIME_MS)\n && !(\n content.sticker || content.contact || content.poll || content.action || content.audio\n || (content.video && content.video.isRound)\n )\n && !isForwardedMessage(message)\n && !message.viaBotId\n );\n\n const canReply = getCanPostInChat(chat, threadId) && !isServiceNotification;\n\n const hasPinPermission = isPrivate || (\n chat.isCreator\n || (!isChannel && !isUserRightBanned(chat, 'pinMessages'))\n || getHasAdminRight(chat, 'pinMessages')\n );\n\n let canPin = !isAction && hasPinPermission;\n let canUnpin = false;\n\n const pinnedMessageIds = selectPinnedIds(global, chat.id);\n\n if (canPin) {\n canUnpin = Boolean(pinnedMessageIds && pinnedMessageIds.includes(message.id));\n canPin = !canUnpin;\n }\n\n const canDelete = isPrivate\n || isOwn\n || isBasicGroup\n || chat.isCreator\n || getHasAdminRight(chat, 'deleteMessages');\n\n const canReport = !isPrivate && !isOwn;\n\n const canDeleteForAll = canDelete && !isServiceNotification && (\n (isPrivate && !isChatWithSelf)\n || (isBasicGroup && (\n isOwn || getHasAdminRight(chat, 'deleteMessages') || chat.isCreator\n ))\n );\n\n const canEdit = !isAction && isMessageEditable && (\n isOwn\n || (isChannel && (chat.isCreator || getHasAdminRight(chat, 'editMessages')))\n );\n\n const canForward = !isAction && !isServiceNotification;\n\n const hasSticker = Boolean(message.content.sticker);\n const hasFavoriteSticker = hasSticker && selectIsStickerFavorite(global, message.content.sticker!);\n const canFaveSticker = !isAction && hasSticker && !hasFavoriteSticker;\n const canUnfaveSticker = !isAction && hasFavoriteSticker;\n const canCopy = !isAction;\n const canCopyLink = !isAction && (isChannel || isSuperGroup);\n const canSelect = !isAction;\n const noOptions = [\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canDelete,\n canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n ].every((ability) => !ability);\n\n return {\n noOptions,\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canDelete,\n canReport,\n canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n };\n}\n\n// This selector always returns a new object which can not be safely used in shallow-equal checks\nexport function selectCanDeleteSelectedMessages(global: GlobalState) {\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const chatMessages = chatId && selectChatMessages(global, chatId);\n if (!chatMessages || !selectedMessageIds || !threadId) {\n return {};\n }\n\n const messageActions = selectedMessageIds\n .map((id) => chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId))\n .filter(Boolean);\n\n return {\n canDelete: messageActions.every((actions) => actions.canDelete),\n canDeleteForAll: messageActions.every((actions) => actions.canDeleteForAll),\n };\n}\n\nexport function selectCanReportSelectedMessages(global: GlobalState) {\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const chatMessages = chatId && selectChatMessages(global, chatId);\n if (!chatMessages || !selectedMessageIds || !threadId) {\n return false;\n }\n\n const messageActions = selectedMessageIds\n .map((id) => chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId))\n .filter(Boolean);\n\n return messageActions.every((actions) => actions.canReport);\n}\n\nexport function selectUploadProgress(global: GlobalState, message: ApiMessage) {\n const fileTransfer = global.fileUploads.byMessageLocalId[message.previousLocalId || message.id];\n\n return fileTransfer ? fileTransfer.progress : undefined;\n}\n\nexport function selectRealLastReadId(global: GlobalState, chatId: number, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n // `lastReadInboxMessageId` is empty for new chats\n if (!chat.lastReadInboxMessageId) {\n return undefined;\n }\n\n if (!chat.lastMessage) {\n return chat.lastReadInboxMessageId;\n }\n\n if (isMessageLocal(chat.lastMessage)) {\n return chat.lastMessage.id;\n }\n\n // Some previously read messages may be deleted\n return Math.min(chat.lastMessage.id, chat.lastReadInboxMessageId);\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n if (!threadInfo.lastReadInboxMessageId) {\n return threadInfo.topMessageId;\n }\n\n // Some previously read messages may be deleted\n return Math.min(threadInfo.lastReadInboxMessageId, threadInfo.lastMessageId || Infinity);\n }\n}\n\nexport function selectFirstUnreadId(global: GlobalState, chatId: number, threadId: number) {\n const chat = selectChat(global, chatId);\n\n if (threadId === MAIN_THREAD_ID) {\n if (!chat) {\n return undefined;\n }\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo || threadInfo.lastMessageId === threadInfo.lastReadInboxMessageId) {\n return undefined;\n }\n }\n\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n const listedIds = selectListedIds(global, chatId, threadId);\n const byId = selectChatMessages(global, chatId);\n if (!byId || !(outlyingIds || listedIds)) {\n return undefined;\n }\n\n const lastReadId = selectRealLastReadId(global, chatId, threadId);\n if (!lastReadId && chat && chat.isNotJoined) {\n return undefined;\n }\n\n if (outlyingIds) {\n const found = !lastReadId ? outlyingIds[0] : outlyingIds.find((id) => {\n return id > lastReadId && byId[id] && (!byId[id].isOutgoing || byId[id].isFromScheduled);\n });\n if (found) {\n return found;\n }\n }\n\n if (listedIds) {\n const found = !lastReadId ? listedIds[0] : listedIds.find((id) => {\n return id > lastReadId && byId[id] && (!byId[id].isOutgoing || byId[id].isFromScheduled);\n });\n if (found) {\n return found;\n }\n }\n\n return undefined;\n}\n\nexport function selectIsPollResultsOpen(global: GlobalState) {\n const { pollResults } = global;\n return Boolean(pollResults.messageId);\n}\n\nexport function selectIsForwardModalOpen(global: GlobalState) {\n const { forwardMessages } = global;\n return Boolean(forwardMessages.isModalShown);\n}\n\nexport function selectCommonBoxChatId(global: GlobalState, messageId: number) {\n const fromLastMessage = Object.values(global.chats.byId).find((chat) => (\n isCommonBoxChat(chat) && chat.lastMessage && chat.lastMessage.id === messageId\n ));\n if (fromLastMessage) {\n return fromLastMessage.id;\n }\n\n const { byChatId } = global.messages;\n return Number(Object.keys(byChatId).find((chatId) => {\n const chat = selectChat(global, Number(chatId));\n return chat && isCommonBoxChat(chat) && byChatId[chat.id].byId[messageId];\n }));\n}\n\nexport function selectIsInSelectMode(global: GlobalState) {\n const { selectedMessages } = global;\n\n return Boolean(selectedMessages);\n}\n\nexport function selectIsMessageSelected(global: GlobalState, messageId: number) {\n const { messageIds } = global.selectedMessages || {};\n if (!messageIds) {\n return false;\n }\n\n return messageIds.includes(messageId);\n}\n\nexport function selectForwardedMessageIdsByGroupId(global: GlobalState, chatId: number, groupedId: string) {\n const chatMessages = selectChatMessages(global, chatId);\n if (!chatMessages) {\n return undefined;\n }\n\n return Object.values(chatMessages)\n .filter((message) => message.groupedId === groupedId && message.forwardInfo)\n .map(({ forwardInfo }) => forwardInfo!.fromMessageId);\n}\n\nexport function selectMessageIdsByGroupId(global: GlobalState, chatId: number, groupedId: string) {\n const chatMessages = selectChatMessages(global, chatId);\n if (!chatMessages) {\n return undefined;\n }\n\n return Object.keys(chatMessages)\n .map(Number)\n .filter((id) => chatMessages[id].groupedId === groupedId);\n}\n\nexport function selectIsDocumentGroupSelected(global: GlobalState, chatId: number, groupedId: string) {\n const { messageIds: selectedIds } = global.selectedMessages || {};\n if (!selectedIds) {\n return false;\n }\n\n const groupIds = selectMessageIdsByGroupId(global, chatId, groupedId);\n return groupIds && groupIds.every((id) => selectedIds.includes(id));\n}\n\nexport function selectSelectedMessagesCount(global: GlobalState) {\n const { messageIds } = global.selectedMessages || {};\n\n return messageIds ? messageIds.length : 0;\n}\n\nexport function selectNewestMessageWithBotKeyboardButtons(\n global: GlobalState, chatId: number,\n): ApiMessage | undefined {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n if (!selectIsChatWithBot(global, chat)) {\n return undefined;\n }\n\n const chatMessages = selectChatMessages(global, chatId);\n const viewportIds = selectViewportIds(global, chatId, MAIN_THREAD_ID);\n if (!chatMessages || !viewportIds) {\n return undefined;\n }\n\n const messageId = findLast(viewportIds, (id) => {\n return !chatMessages[id].isOutgoing && Boolean(chatMessages[id].keyboardButtons);\n });\n\n const replyHideMessageId = findLast(viewportIds, (id) => {\n return Boolean(chatMessages[id].shouldHideKeyboardButtons);\n });\n\n if (messageId && replyHideMessageId && replyHideMessageId > messageId) {\n return undefined;\n }\n\n return messageId ? chatMessages[messageId] : undefined;\n}\n\nexport function selectShouldAutoLoadMedia(\n global: GlobalState, message: ApiMessage, chat: ApiChat, sender?: ApiChat | ApiUser,\n) {\n const {\n shouldAutoDownloadMediaFromContacts,\n shouldAutoDownloadMediaInPrivateChats,\n shouldAutoDownloadMediaInGroups,\n shouldAutoDownloadMediaInChannels,\n } = global.settings.byKey;\n\n return Boolean(\n (shouldAutoDownloadMediaInPrivateChats && isChatPrivate(chat.id))\n || (shouldAutoDownloadMediaInGroups && isChatGroup(chat))\n || (shouldAutoDownloadMediaInChannels && isChatChannel(chat))\n || (shouldAutoDownloadMediaFromContacts && sender && (\n sender.id === global.currentUserId\n || selectIsUserOrChatContact(global, sender)\n )),\n );\n}\n\nexport function selectShouldAutoPlayMedia(global: GlobalState, message: ApiMessage) {\n const video = getMessageVideo(message) || getMessageWebPageVideo(message);\n if (!video) {\n return undefined;\n }\n\n const {\n shouldAutoPlayVideos,\n shouldAutoPlayGifs,\n } = global.settings.byKey;\n\n const asGif = video.isGif || video.isRound;\n\n return (shouldAutoPlayVideos && !asGif) || (shouldAutoPlayGifs && asGif);\n}\n\nexport function selectShouldLoopStickers(global: GlobalState) {\n return global.settings.byKey.shouldLoopStickers;\n}\n","import { GlobalState } from '../../global/types';\nimport { selectCurrentMessageList } from './messages';\nimport { buildChatThreadKey } from '../helpers';\n\nexport function selectCurrentTextSearch(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n const currentSearch = global.localTextSearch.byChatThreadKey[chatThreadKey];\n if (!currentSearch || !currentSearch.isActive) {\n return undefined;\n }\n\n return currentSearch;\n}\n\nexport function selectCurrentMediaSearchPeerId(global: GlobalState) {\n const { byChatId } = global.localMediaSearch;\n const { chatId } = selectCurrentMessageList(global) || {};\n const currentProfileUserId = global.users.selectedId;\n\n return currentProfileUserId && byChatId[currentProfileUserId] ? currentProfileUserId : chatId;\n}\n\nexport function selectCurrentMediaSearch(global: GlobalState) {\n const peerId = selectCurrentMediaSearchPeerId(global);\n if (!peerId) {\n return undefined;\n }\n\n return global.localMediaSearch.byChatId[peerId];\n}\n","import { GlobalState } from '../../global/types';\n\nimport { selectCurrentMessageList } from './messages';\nimport { selectChat } from './chats';\nimport { isChatGroup, isChatPrivate } from '../helpers';\n\nexport function selectManagement(global: GlobalState, chatId: number) {\n return global.management.byChatId[chatId];\n}\n\nexport function selectCurrentManagement(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const currentManagement = global.management.byChatId[chatId];\n if (!currentManagement || !currentManagement.isActive) {\n return undefined;\n }\n\n return currentManagement;\n}\n\nexport function selectCurrentManagementType(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n if (isChatPrivate(chatId)) {\n return 'user';\n }\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n if (isChatGroup(chat)) {\n return 'group';\n }\n\n return 'channel';\n}\n","import { GlobalState } from '../../global/types';\nimport { NewChatMembersProgress, RightColumnContent } from '../../types';\n\nimport { getSystemTheme, IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { selectCurrentMessageList, selectIsPollResultsOpen } from './messages';\nimport { selectCurrentTextSearch } from './localSearch';\nimport { selectCurrentStickerSearch, selectCurrentGifSearch } from './symbols';\nimport { selectAreActiveChatsLoaded } from './chats';\nimport { selectCurrentManagement } from './management';\n\nexport function selectIsMediaViewerOpen(global: GlobalState) {\n const { mediaViewer } = global;\n return Boolean(mediaViewer.messageId || mediaViewer.avatarOwnerId);\n}\n\nexport function selectRightColumnContentKey(global: GlobalState) {\n const {\n users,\n isChatInfoShown,\n newChatMembersProgress,\n } = global;\n\n const isAddingChatMembersShown = newChatMembersProgress !== NewChatMembersProgress.Closed;\n const isPollResults = selectIsPollResultsOpen(global);\n const isSearch = Boolean(!IS_SINGLE_COLUMN_LAYOUT && selectCurrentTextSearch(global));\n const isManagement = selectCurrentManagement(global);\n const stickerSearch = selectCurrentStickerSearch(global);\n const isStickerSearch = stickerSearch.query !== undefined;\n const gifSearch = selectCurrentGifSearch(global);\n const isGifSearch = gifSearch.query !== undefined;\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const currentProfileUserId = users.selectedId;\n const areActiveChatsLoaded = selectAreActiveChatsLoaded(global);\n const isUserInfo = Boolean(currentProfileUserId && areActiveChatsLoaded);\n const isChatShown = Boolean(currentChatId && areActiveChatsLoaded);\n const isChatInfo = isChatShown && isChatInfoShown;\n\n return isPollResults ? (\n RightColumnContent.PollResults\n ) : isSearch ? (\n RightColumnContent.Search\n ) : isManagement ? (\n RightColumnContent.Management\n ) : isStickerSearch ? (\n RightColumnContent.StickerSearch\n ) : isGifSearch ? (\n RightColumnContent.GifSearch\n ) : isAddingChatMembersShown ? (\n RightColumnContent.AddingMembers\n ) : isUserInfo ? (\n RightColumnContent.UserInfo\n ) : isChatInfo ? (\n RightColumnContent.ChatInfo\n ) : undefined;\n}\n\nexport function selectIsRightColumnShown(global: GlobalState) {\n return selectRightColumnContentKey(global) !== undefined;\n}\n\nexport function selectTheme(global: GlobalState) {\n const { theme, shouldUseSystemTheme } = global.settings.byKey;\n\n return shouldUseSystemTheme ? getSystemTheme() : theme;\n}\n","import { GlobalState } from '../../global/types';\n\nexport function selectCurrentGlobalSearchQuery(global: GlobalState) {\n return global.globalSearch.query;\n}\n","\nimport { GlobalState } from '../../global/types';\n\nexport function selectPaymentMessageId(global: GlobalState) {\n return global.payment.messageId;\n}\n\nexport function selectPaymentRequestId(global: GlobalState) {\n return global.payment.formId;\n}\n\nexport function selectProviderPublishableKey(global: GlobalState) {\n return global.payment.nativeParams ? global.payment.nativeParams.publishableKey : undefined;\n}\n\nexport function selectStripeCredentials(global: GlobalState) {\n return global.payment.stripeCredentials;\n}\n","export * from './users';\nexport * from './chats';\nexport * from './messages';\nexport * from './updates';\nexport * from './media';\nexport * from './payments';\nexport * from './settings';\nexport * from './bots';\nexport * from './misc';\n","type Parts = (string | false | undefined)[];\n\nexport default (...parts: Parts) => {\n return parts.filter(Boolean).join(' ');\n};\n","type Scheduler =\n typeof requestAnimationFrame\n | typeof onTickEnd\n | typeof runNow;\n\nexport function debounce<F extends AnyToVoidFunction>(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n shouldRunLast = true,\n) {\n let waitingTimeout: number | undefined;\n\n return (...args: Parameters<F>) => {\n if (waitingTimeout) {\n clearTimeout(waitingTimeout);\n waitingTimeout = undefined;\n } else if (shouldRunFirst) {\n // @ts-ignore\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n waitingTimeout = self.setTimeout(() => {\n if (shouldRunLast) {\n // @ts-ignore\n fn(...args);\n }\n\n waitingTimeout = undefined;\n }, ms);\n };\n}\n\nexport function throttle<F extends AnyToVoidFunction>(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n) {\n let interval: number | undefined;\n let isPending: boolean;\n let args: Parameters<F>;\n\n return (..._args: Parameters<F>) => {\n isPending = true;\n args = _args;\n\n if (!interval) {\n if (shouldRunFirst) {\n isPending = false;\n // @ts-ignore\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n interval = self.setInterval(() => {\n if (!isPending) {\n // eslint-disable-next-line no-restricted-globals\n self.clearInterval(interval!);\n interval = undefined;\n return;\n }\n\n isPending = false;\n // @ts-ignore\n fn(...args);\n }, ms);\n }\n };\n}\n\nexport function throttleWithRaf<F extends AnyToVoidFunction>(fn: F) {\n return throttleWith(fastRaf, fn);\n}\n\nexport function throttleWithPrimaryRaf<F extends AnyToVoidFunction>(fn: F) {\n return throttleWith(fastPrimaryRaf, fn);\n}\n\nexport function throttleWithTickEnd<F extends AnyToVoidFunction>(fn: F) {\n return throttleWith(onTickEnd, fn);\n}\n\nexport function throttleWithNow<F extends AnyToVoidFunction>(fn: F) {\n return throttleWith(runNow, fn);\n}\n\nexport function throttleWith<F extends AnyToVoidFunction>(schedulerFn: Scheduler, fn: F) {\n let waiting = false;\n let args: Parameters<F>;\n\n return (..._args: Parameters<F>) => {\n args = _args;\n\n if (!waiting) {\n waiting = true;\n\n schedulerFn(() => {\n waiting = false;\n // @ts-ignore\n fn(...args);\n });\n }\n };\n}\n\nexport function onTickEnd(cb: NoneToVoidFunction) {\n Promise.resolve().then(cb);\n}\n\nexport function onIdle(cb: NoneToVoidFunction) {\n // eslint-disable-next-line no-restricted-globals\n if (self.requestIdleCallback) {\n // eslint-disable-next-line no-restricted-globals\n self.requestIdleCallback(cb);\n } else {\n onTickEnd(cb);\n }\n}\n\nfunction runNow(fn: NoneToVoidFunction) {\n fn();\n}\n\nexport const pause = (ms: number) => new Promise((resolve) => {\n setTimeout(() => resolve(), ms);\n});\n\nexport function rafPromise() {\n return new Promise((resolve) => {\n fastRaf(resolve);\n });\n}\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\nlet fastRafPrimaryCallbacks: NoneToVoidFunction[] | undefined;\n\n// May result in an immediate execution if called from another `requestAnimationFrame` callback\nexport function fastRaf(callback: NoneToVoidFunction, isPrimary = false) {\n if (!fastRafCallbacks) {\n fastRafCallbacks = isPrimary ? [] : [callback];\n fastRafPrimaryCallbacks = isPrimary ? [callback] : [];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n const currentPrimaryCallbacks = fastRafPrimaryCallbacks!;\n fastRafCallbacks = undefined;\n fastRafPrimaryCallbacks = undefined;\n currentPrimaryCallbacks.forEach((cb) => cb());\n currentCallbacks.forEach((cb) => cb());\n });\n } else if (isPrimary) {\n fastRafPrimaryCallbacks!.push(callback);\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nexport function fastPrimaryRaf(callback: NoneToVoidFunction) {\n fastRaf(callback, true);\n}\n\nlet beforeUnloadCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function onBeforeUnload(callback: NoneToVoidFunction, isLast = false) {\n if (!beforeUnloadCallbacks) {\n beforeUnloadCallbacks = [];\n // eslint-disable-next-line no-restricted-globals\n self.addEventListener('beforeunload', () => {\n beforeUnloadCallbacks!.forEach((cb) => cb());\n });\n }\n\n if (isLast) {\n beforeUnloadCallbacks.push(callback);\n } else {\n beforeUnloadCallbacks.unshift(callback);\n }\n\n return () => {\n beforeUnloadCallbacks = beforeUnloadCallbacks!.filter((cb) => cb !== callback);\n };\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiChat, ApiPhoto } from '../../api/types';\n\nimport { ARCHIVED_FOLDER_ID } from '../../config';\nimport { omit } from '../../util/iteratees';\n\nexport function replaceChatListIds(\n global: GlobalState,\n type: 'active' | 'archived',\n newIds: number[] | undefined,\n): GlobalState {\n return {\n ...global,\n chats: {\n ...global.chats,\n listIds: {\n ...global.chats.listIds,\n [type]: newIds,\n },\n },\n };\n}\n\nexport function updateChatListIds(global: GlobalState, type: 'active' | 'archived', idsUpdate: number[]): GlobalState {\n const { [type]: listIds } = global.chats.listIds;\n const newIds = listIds && listIds.length\n ? idsUpdate.filter((id) => !listIds.includes(id))\n : idsUpdate;\n\n if (listIds && !newIds.length) {\n return global;\n }\n\n return replaceChatListIds(global, type, [\n ...(listIds || []),\n ...newIds,\n ]);\n}\n\nexport function replaceChats(global: GlobalState, newById: Record<number, ApiChat>): GlobalState {\n return {\n ...global,\n chats: {\n ...global.chats,\n byId: newById,\n },\n };\n}\n\n// @optimization Don't spread/unspread global for each element, do it in a batch\nfunction getUpdatedChat(\n global: GlobalState, chatId: number, chatUpdate: Partial<ApiChat>, photo?: ApiPhoto,\n): ApiChat {\n const { byId } = global.chats;\n const chat = byId[chatId];\n const shouldOmitMinInfo = chatUpdate.isMin && chat && !chat.isMin;\n const updatedChat = {\n ...chat,\n ...(shouldOmitMinInfo ? omit(chatUpdate, ['isMin', 'accessHash']) : chatUpdate),\n ...(photo && { photos: [photo, ...(chat.photos || [])] }),\n };\n\n if (!updatedChat.id || !updatedChat.type) {\n return updatedChat;\n }\n\n return updatedChat;\n}\n\nexport function updateChat(\n global: GlobalState, chatId: number, chatUpdate: Partial<ApiChat>, photo?: ApiPhoto,\n): GlobalState {\n const { byId } = global.chats;\n\n const updatedChat = getUpdatedChat(global, chatId, chatUpdate, photo);\n\n return replaceChats(global, {\n ...byId,\n [chatId]: updatedChat,\n });\n}\n\nexport function updateChats(global: GlobalState, updatedById: Record<number, ApiChat>): GlobalState {\n const updatedChats = Object.keys(updatedById).map(Number).reduce<Record<number, ApiChat>>((acc, id) => {\n const updatedChat = getUpdatedChat(global, id, updatedById[id]);\n if (updatedChat) {\n acc[id] = updatedChat;\n }\n return acc;\n }, {});\n\n global = replaceChats(global, {\n ...global.chats.byId,\n ...updatedChats,\n });\n\n return global;\n}\n\n// @optimization Allows to avoid redundant updates which cause a lot of renders\nexport function addChats(global: GlobalState, addedById: Record<number, ApiChat>): GlobalState {\n const { byId } = global.chats;\n let isAdded = false;\n\n const addedChats = Object.keys(addedById).map(Number).reduce<Record<number, ApiChat>>((acc, id) => {\n if (!byId[id] || (byId[id].isMin && !addedById[id].isMin)) {\n const updatedChat = getUpdatedChat(global, id, addedById[id]);\n if (updatedChat) {\n acc[id] = updatedChat;\n\n if (!isAdded) {\n isAdded = true;\n }\n }\n }\n return acc;\n }, {});\n\n if (isAdded) {\n global = replaceChats(global, {\n ...global.chats.byId,\n ...addedChats,\n });\n }\n\n return global;\n}\n\nexport function updateChatListType(\n global: GlobalState,\n chatId: number,\n folderId?: number,\n): GlobalState {\n const listType = folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active';\n\n let currentListIds = global.chats.listIds;\n (Object.keys(currentListIds) as Array<keyof typeof currentListIds>).forEach((listTypeKey) => {\n const currentFolderList = currentListIds[listTypeKey] || [];\n if (listTypeKey === listType && !currentFolderList.includes(chatId)) {\n currentListIds = {\n ...currentListIds,\n [listTypeKey]: [...currentFolderList, chatId],\n };\n } else if (listTypeKey !== listType && currentFolderList.includes(chatId)) {\n currentListIds = {\n ...currentListIds,\n [listTypeKey]: currentFolderList.filter((id) => id !== chatId),\n };\n }\n });\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n listIds: currentListIds,\n },\n };\n\n global = updateChat(global, chatId, { folderId: folderId || undefined });\n\n return global;\n}\n\nexport function updateChatListSecondaryInfo(\n global: GlobalState,\n type: 'active' | 'archived',\n info: {\n orderedPinnedIds?: number[];\n totalChatCount: number;\n },\n): GlobalState {\n const totalCountKey = type === 'active' ? 'all' : 'archived';\n\n return {\n ...global,\n chats: {\n ...global.chats,\n ...(info.orderedPinnedIds && {\n orderedPinnedIds: {\n ...global.chats.orderedPinnedIds,\n [type]: info.orderedPinnedIds,\n },\n }),\n totalCount: {\n ...global.chats.totalCount,\n [totalCountKey]: info.totalChatCount,\n },\n isFullyLoaded: {\n ...global.chats.isFullyLoaded,\n [type]: false,\n },\n },\n };\n}\n","import { GlobalState, MessageListType, Thread } from '../../global/types';\nimport { ApiMessage, ApiThreadInfo, MAIN_THREAD_ID } from '../../api/types';\nimport { FocusDirection } from '../../types';\n\nimport { MESSAGE_LIST_SLICE, MESSAGE_LIST_VIEWPORT_LIMIT } from '../../config';\nimport {\n selectListedIds,\n selectChatMessages,\n selectViewportIds,\n selectOutlyingIds,\n selectPinnedIds,\n selectThreadInfo,\n selectMessageIdsByGroupId,\n selectScheduledMessages,\n selectScheduledIds,\n selectCurrentMessageIds,\n selectChatMessage,\n selectCurrentMessageList,\n} from '../selectors';\nimport {\n areSortedArraysEqual, omit, pickTruthy, unique,\n} from '../../util/iteratees';\n\ntype MessageStoreSections = {\n byId: Record<number, ApiMessage>;\n threadsById: Record<number, Thread>;\n};\n\nexport function updateCurrentMessageList(\n global: GlobalState,\n chatId: number | undefined,\n threadId: number = MAIN_THREAD_ID,\n type: MessageListType = 'thread',\n): GlobalState {\n return {\n ...global,\n messages: {\n ...global.messages,\n // TODO Support stack navigation\n messageLists: chatId ? [{ chatId, threadId, type }] : undefined,\n },\n };\n}\n\nfunction replaceChatMessages(global: GlobalState, chatId: number, newById: Record<number, ApiMessage>): GlobalState {\n return updateMessageStore(global, chatId, {\n byId: newById,\n });\n}\n\nfunction updateThread(\n global: GlobalState, chatId: number, threadId: number, threadUpdate: Partial<Thread>,\n): GlobalState {\n const current = global.messages.byChatId[chatId];\n\n return updateMessageStore(global, chatId, {\n threadsById: {\n ...(current && current.threadsById),\n [threadId]: {\n ...(current && current.threadsById[threadId]),\n ...threadUpdate,\n },\n },\n });\n}\n\nfunction updateMessageStore(\n global: GlobalState, chatId: number, update: Partial<MessageStoreSections>,\n): GlobalState {\n const current = global.messages.byChatId[chatId] || { byId: {}, threadsById: {} };\n\n return {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {\n ...global.messages.byChatId,\n [chatId]: {\n ...current,\n ...update,\n },\n },\n },\n };\n}\n\nexport function replaceThreadParam<T extends keyof Thread>(\n global: GlobalState, chatId: number, threadId: number, paramName: T, newValue: Thread[T] | undefined,\n) {\n return updateThread(global, chatId, threadId, { [paramName]: newValue });\n}\n\nexport function addMessages(\n global: GlobalState, messages: ApiMessage[],\n): GlobalState {\n const addedByChatId = messages.reduce((messagesByChatId, message: ApiMessage) => {\n if (!messagesByChatId[message.chatId]) {\n messagesByChatId[message.chatId] = {};\n }\n messagesByChatId[message.chatId][message.id] = message;\n\n return messagesByChatId;\n }, {} as Record<number, Record<number, ApiMessage>>);\n\n Object.keys(addedByChatId).map(Number).forEach((chatId) => {\n global = addChatMessagesById(global, chatId, addedByChatId[chatId]);\n });\n\n return global;\n}\n\nexport function addChatMessagesById(\n global: GlobalState, chatId: number, newById: Record<number, ApiMessage>,\n): GlobalState {\n const byId = selectChatMessages(global, chatId);\n\n if (byId && Object.keys(newById).every((newId) => Boolean(byId[Number(newId)]))) {\n return global;\n }\n\n return replaceChatMessages(global, chatId, {\n ...newById,\n ...byId,\n });\n}\n\nexport function updateChatMessage(\n global: GlobalState, chatId: number, messageId: number, messageUpdate: Partial<ApiMessage>,\n): GlobalState {\n const byId = selectChatMessages(global, chatId) || {};\n const message = byId[messageId];\n const updatedMessage = {\n ...message,\n ...messageUpdate,\n };\n\n if (!updatedMessage.id) {\n return global;\n }\n\n return replaceChatMessages(global, chatId, {\n ...byId,\n [messageId]: updatedMessage,\n });\n}\n\nexport function updateScheduledMessage(\n global: GlobalState, chatId: number, messageId: number, messageUpdate: Partial<ApiMessage>,\n): GlobalState {\n const byId = selectScheduledMessages(global, chatId) || {};\n const message = byId[messageId];\n const updatedMessage = {\n ...message,\n ...messageUpdate,\n };\n\n if (!updatedMessage.id) {\n return global;\n }\n\n return replaceScheduledMessages(global, chatId, {\n ...byId,\n [messageId]: updatedMessage,\n }, undefined);\n}\n\nexport function deleteChatMessages(\n global: GlobalState,\n chatId: number,\n messageIds: number[],\n): GlobalState {\n const byId = selectChatMessages(global, chatId);\n if (!byId) {\n return global;\n }\n const newById = omit(byId, messageIds);\n const deletedForwardedPosts = Object.values(pickTruthy(byId, messageIds)).filter(\n ({ forwardInfo }) => forwardInfo && forwardInfo.isLinkedChannelPost,\n );\n\n const threadIds = Object.keys(global.messages.byChatId[chatId].threadsById).map(Number);\n threadIds.forEach((threadId) => {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n\n let listedIds = selectListedIds(global, chatId, threadId);\n let outlyingIds = selectOutlyingIds(global, chatId, threadId);\n let viewportIds = selectViewportIds(global, chatId, threadId);\n let pinnedIds = selectPinnedIds(global, chatId);\n let newMessageCount = threadInfo ? threadInfo.messagesCount : undefined;\n\n messageIds.forEach((messageId) => {\n if (listedIds && listedIds.includes(messageId)) {\n listedIds = listedIds.filter((id) => id !== messageId);\n if (newMessageCount !== undefined) newMessageCount -= 1;\n }\n\n if (outlyingIds && outlyingIds.includes(messageId)) {\n outlyingIds = outlyingIds.filter((id) => id !== messageId);\n }\n\n if (viewportIds && viewportIds.includes(messageId)) {\n viewportIds = viewportIds.filter((id) => id !== messageId);\n }\n\n if (pinnedIds && pinnedIds.includes(messageId)) {\n pinnedIds = pinnedIds.filter((id) => id !== messageId);\n }\n });\n\n\n global = replaceThreadParam(global, chatId, threadId, 'listedIds', listedIds);\n global = replaceThreadParam(global, chatId, threadId, 'outlyingIds', outlyingIds);\n global = replaceThreadParam(global, chatId, threadId, 'viewportIds', viewportIds);\n global = replaceThreadParam(global, chatId, threadId, 'pinnedIds', pinnedIds);\n\n if (threadInfo && newMessageCount !== undefined) {\n global = replaceThreadParam(global, chatId, threadId, 'threadInfo', {\n ...threadInfo,\n messagesCount: newMessageCount,\n });\n }\n });\n\n if (deletedForwardedPosts.length) {\n const currentMessageList = selectCurrentMessageList(global);\n const canDeleteCurrentThread = currentMessageList && currentMessageList.chatId === chatId\n && currentMessageList.type === 'thread';\n const currentThreadId = currentMessageList && currentMessageList.threadId;\n\n deletedForwardedPosts.forEach((message) => {\n const { fromChatId, fromMessageId } = message.forwardInfo!;\n const originalPost = selectChatMessage(global, fromChatId!, fromMessageId!);\n\n if (canDeleteCurrentThread && currentThreadId === fromMessageId) {\n global = updateCurrentMessageList(global, chatId);\n }\n if (originalPost) {\n global = updateChatMessage(global, fromChatId!, fromMessageId!, { threadInfo: undefined });\n }\n });\n }\n\n global = replaceChatMessages(global, chatId, newById);\n\n return global;\n}\n\nexport function deleteChatScheduledMessages(\n global: GlobalState,\n chatId: number,\n messageIds: number[],\n): GlobalState {\n const byId = selectScheduledMessages(global, chatId);\n if (!byId) {\n return global;\n }\n const newById = omit(byId, messageIds);\n\n let scheduledIds = selectScheduledIds(global, chatId);\n if (scheduledIds) {\n messageIds.forEach((messageId) => {\n if (scheduledIds!.includes(messageId)) {\n scheduledIds = scheduledIds!.filter((id) => id !== messageId);\n }\n });\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', scheduledIds);\n }\n\n global = replaceScheduledMessages(global, chatId, newById, undefined);\n\n return global;\n}\n\nexport function updateListedIds(\n global: GlobalState,\n chatId: number,\n threadId: number,\n idsUpdate: number[],\n): GlobalState {\n const listedIds = selectListedIds(global, chatId, threadId);\n const newIds = listedIds && listedIds.length\n ? idsUpdate.filter((id) => !listedIds.includes(id))\n : idsUpdate;\n\n if (listedIds && !newIds.length) {\n return global;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'listedIds', orderHistoryIds([\n ...(listedIds || []),\n ...newIds,\n ]));\n}\n\nexport function updateOutlyingIds(\n global: GlobalState,\n chatId: number,\n threadId: number,\n idsUpdate: number[],\n): GlobalState {\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n const newIds = outlyingIds && outlyingIds.length\n ? idsUpdate.filter((id) => !outlyingIds.includes(id))\n : idsUpdate;\n\n if (outlyingIds && !newIds.length) {\n return global;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'outlyingIds', orderHistoryIds([\n ...(outlyingIds || []),\n ...newIds,\n ]));\n}\n\nfunction orderHistoryIds(listedIds: number[]) {\n return listedIds.sort((a, b) => a - b);\n}\n\nexport function addViewportId(\n global: GlobalState,\n chatId: number,\n threadId: number,\n newId: number,\n): GlobalState {\n const viewportIds = selectViewportIds(global, chatId, threadId) || [];\n if (viewportIds.includes(newId)) {\n return global;\n }\n\n const newIds = orderHistoryIds([\n ...(\n viewportIds.length < MESSAGE_LIST_VIEWPORT_LIMIT\n ? viewportIds\n : viewportIds.slice(-(MESSAGE_LIST_SLICE / 2))\n ),\n newId,\n ]);\n\n return replaceThreadParam(global, chatId, threadId, 'viewportIds', newIds);\n}\n\nexport function safeReplaceViewportIds(\n global: GlobalState,\n chatId: number,\n threadId: number,\n newViewportIds: number[],\n): GlobalState {\n const viewportIds = selectViewportIds(global, chatId, threadId) || [];\n\n return replaceThreadParam(\n global,\n chatId,\n threadId,\n 'viewportIds',\n areSortedArraysEqual(viewportIds, newViewportIds) ? viewportIds : newViewportIds,\n );\n}\n\nexport function updateThreadInfo(\n global: GlobalState, chatId: number, threadId: number, update: Partial<ApiThreadInfo> | undefined,\n): GlobalState {\n const newThreadInfo = {\n ...(selectThreadInfo(global, chatId, threadId) as ApiThreadInfo),\n ...update,\n };\n\n if (!newThreadInfo.threadId) {\n return global;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'threadInfo', newThreadInfo);\n}\n\nexport function updateThreadInfos(\n global: GlobalState, chatId: number, updates: Partial<ApiThreadInfo>[],\n): GlobalState {\n updates.forEach((update) => {\n global = updateThreadInfo(global, update.chatId!, update.threadId!, update);\n });\n\n return global;\n}\n\nexport function replaceScheduledMessages(\n global: GlobalState, chatId: number, newById: Record<number, ApiMessage>, hash: number | undefined,\n): GlobalState {\n return updateScheduledMessages(global, chatId, {\n byId: newById,\n hash,\n });\n}\n\nfunction updateScheduledMessages(\n global: GlobalState, chatId: number, update: Partial<{ byId: Record<number, ApiMessage>; hash: number }>,\n): GlobalState {\n const current = global.scheduledMessages.byChatId[chatId] || { byId: {}, hash: 0 };\n\n return {\n ...global,\n scheduledMessages: {\n byChatId: {\n ...global.scheduledMessages.byChatId,\n [chatId]: {\n ...current,\n ...update,\n },\n },\n },\n };\n}\n\nexport function updateFocusedMessage(\n global: GlobalState, chatId?: number, messageId?: number, noHighlight = false,\n): GlobalState {\n return {\n ...global,\n focusedMessage: {\n ...global.focusedMessage,\n chatId,\n messageId,\n noHighlight,\n },\n };\n}\n\nexport function updateFocusDirection(\n global: GlobalState, direction?: FocusDirection,\n): GlobalState {\n return {\n ...global,\n focusedMessage: {\n ...global.focusedMessage,\n direction,\n },\n };\n}\n\nexport function enterMessageSelectMode(\n global: GlobalState,\n chatId: number,\n messageId?: number | number[],\n): GlobalState {\n const messageIds = messageId ? Array.prototype.concat([], messageId) : [];\n return {\n ...global,\n selectedMessages: {\n chatId,\n messageIds,\n },\n };\n}\n\nexport function toggleMessageSelection(\n global: GlobalState,\n chatId: number,\n threadId: number,\n messageListType: MessageListType,\n messageId: number,\n groupedId?: string,\n childMessageIds?: number[],\n withShift = false,\n): GlobalState {\n const { selectedMessages: oldSelectedMessages } = global;\n if (groupedId) {\n childMessageIds = selectMessageIdsByGroupId(global, chatId, groupedId);\n }\n const selectedMessageIds = childMessageIds || [messageId];\n if (!oldSelectedMessages) {\n return enterMessageSelectMode(global, chatId, selectedMessageIds);\n }\n\n const { messageIds } = oldSelectedMessages;\n\n let newMessageIds;\n const newSelectedMessageIds = selectedMessageIds.filter((id) => !messageIds.includes(id));\n if (newSelectedMessageIds && !newSelectedMessageIds.length) {\n newMessageIds = messageIds.filter((id) => !selectedMessageIds.includes(id));\n } else if (withShift && messageIds.length) {\n const viewportIds = selectCurrentMessageIds(global, chatId, threadId, messageListType)!;\n const prevIndex = viewportIds.indexOf(messageIds[messageIds.length - 1]);\n const currentIndex = viewportIds.indexOf(messageId);\n const from = Math.min(prevIndex, currentIndex);\n const to = Math.max(prevIndex, currentIndex);\n const slice = viewportIds.slice(from, to + 1);\n newMessageIds = unique([...messageIds, ...slice]);\n } else {\n newMessageIds = [...messageIds, ...newSelectedMessageIds];\n }\n\n if (!newMessageIds.length) {\n return exitMessageSelectMode(global);\n }\n\n return {\n ...global,\n selectedMessages: {\n ...oldSelectedMessages,\n messageIds: newMessageIds,\n },\n };\n}\n\nexport function exitMessageSelectMode(global: GlobalState): GlobalState {\n return {\n ...global,\n selectedMessages: undefined,\n };\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiSticker, ApiStickerSet, ApiVideo } from '../../api/types';\nimport { buildCollectionByKey, unique } from '../../util/iteratees';\nimport { selectStickersForEmoji } from '../selectors';\n\nexport function updateStickerSets(\n global: GlobalState,\n category: 'added' | 'featured' | 'search',\n hash: number,\n sets: ApiStickerSet[],\n resultIds?: string[],\n): GlobalState {\n const updatedSets = sets.map((stickerSet) => {\n const existing = global.stickers.setsById[stickerSet.id];\n if (!existing) {\n return stickerSet;\n }\n\n return {\n ...existing,\n ...stickerSet,\n };\n });\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n setsById: {\n ...global.stickers.setsById,\n ...buildCollectionByKey(updatedSets, 'id'),\n },\n [category]: {\n ...global.stickers[category],\n hash,\n ...(\n category === 'search'\n ? { resultIds }\n : { setIds: sets.map(({ id }) => id) }\n ),\n },\n },\n };\n}\n\nexport function updateStickerSet(\n global: GlobalState, stickerSetId: string, update: Partial<ApiStickerSet>,\n): GlobalState {\n const currentStickerSet = global.stickers.setsById[stickerSetId] || {};\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n setsById: {\n ...global.stickers.setsById,\n [stickerSetId]: {\n ...currentStickerSet,\n ...update,\n },\n },\n },\n };\n}\n\nexport function updateGifSearch(\n global: GlobalState, isNew: boolean, results: ApiVideo[], nextOffset?: string,\n): GlobalState {\n const { results: currentResults } = global.gifs.search;\n\n let newResults!: ApiVideo[];\n if (isNew || !currentResults) {\n newResults = results;\n } else {\n const currentIds = new Set(currentResults.map((gif) => gif.id));\n newResults = [\n ...currentResults,\n ...results.filter((gif) => !currentIds.has(gif.id)),\n ];\n }\n\n return {\n ...global,\n gifs: {\n ...global.gifs,\n search: {\n ...global.gifs.search,\n offset: nextOffset,\n results: newResults,\n },\n },\n };\n}\n\nexport function replaceAnimatedEmojis(global: GlobalState, stickerSet: ApiStickerSet): GlobalState {\n return {\n ...global,\n animatedEmojis: stickerSet,\n };\n}\n\nexport function updateStickersForEmoji(\n global: GlobalState, emoji: string, remoteStickers?: ApiSticker[], hash?: number,\n): GlobalState {\n const localStickers = selectStickersForEmoji(global, emoji);\n const allStickers = [...localStickers, ...(remoteStickers || [])];\n const uniqueIds = unique(allStickers.map(({ id }) => id));\n const byId = buildCollectionByKey(allStickers, 'id');\n const stickers = uniqueIds.map((id) => byId[id]);\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n forEmoji: {\n emoji,\n stickers,\n hash,\n },\n },\n };\n}\n\nexport function rebuildStickersForEmoji(global: GlobalState): GlobalState {\n const { emoji, stickers, hash } = global.stickers.forEmoji || {};\n if (!emoji) {\n return global;\n }\n\n return updateStickersForEmoji(global, emoji, stickers, hash);\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiUser } from '../../api/types';\n\nimport { omit } from '../../util/iteratees';\nimport { MEMO_EMPTY_ARRAY } from '../../util/memo';\n\nexport function replaceUsers(global: GlobalState, newById: Record<number, ApiUser>): GlobalState {\n return {\n ...global,\n users: {\n ...global.users,\n byId: newById,\n },\n };\n}\n\n// @optimization Don't spread/unspread global for each element, do it in a batch\nfunction getUpdatedUser(global: GlobalState, userId: number, userUpdate: Partial<ApiUser>): ApiUser {\n const { byId } = global.users;\n const user = byId[userId];\n const shouldOmitMinInfo = userUpdate.isMin && user && !user.isMin;\n\n const updatedUser = {\n ...user,\n ...(shouldOmitMinInfo ? omit(userUpdate, ['isMin', 'accessHash']) : userUpdate),\n };\n\n if (!updatedUser.id || !updatedUser.type) {\n return user;\n }\n\n return updatedUser;\n}\n\nfunction updateContactList(global: GlobalState, updatedUsers: ApiUser[]): GlobalState {\n const { hash, userIds: contactUserIds } = global.contactList || {};\n\n if (!contactUserIds) return global;\n\n const newContactUserIds = updatedUsers\n .filter((user) => user && user.isContact && !contactUserIds.includes(user.id))\n .map((user) => user.id);\n\n if (newContactUserIds.length === 0) return global;\n\n return {\n ...global,\n contactList: {\n hash: hash || 0,\n userIds: [\n ...newContactUserIds,\n ...contactUserIds,\n ],\n },\n };\n}\n\nexport function updateUser(global: GlobalState, userId: number, userUpdate: Partial<ApiUser>): GlobalState {\n const { byId } = global.users;\n\n const updatedUser = getUpdatedUser(global, userId, userUpdate);\n\n global = updateContactList(global, [updatedUser]);\n\n return replaceUsers(global, {\n ...byId,\n [userId]: updatedUser,\n });\n}\n\n\nexport function updateUsers(global: GlobalState, updatedById: Record<number, ApiUser>): GlobalState {\n const updatedUsers = Object.keys(updatedById).map(Number).reduce<Record<number, ApiUser>>((acc, id) => {\n const updatedUser = getUpdatedUser(global, id, updatedById[id]);\n if (updatedUser) {\n acc[id] = updatedUser;\n }\n return acc;\n }, {});\n\n global = updateContactList(global, Object.values(updatedUsers));\n\n global = replaceUsers(global, {\n ...global.users.byId,\n ...updatedUsers,\n });\n\n return global;\n}\n\n// @optimization Allows to avoid redundant updates which cause a lot of renders\nexport function addUsers(global: GlobalState, addedById: Record<number, ApiUser>): GlobalState {\n const { byId } = global.users;\n let isAdded = false;\n\n const addedUsers = Object.keys(addedById).map(Number).reduce<Record<number, ApiUser>>((acc, id) => {\n if (!byId[id] || (byId[id].isMin && !addedById[id].isMin)) {\n const updatedUser = getUpdatedUser(global, id, addedById[id]);\n if (updatedUser) {\n acc[id] = updatedUser;\n\n if (!isAdded) {\n isAdded = true;\n }\n }\n }\n return acc;\n }, {});\n\n if (isAdded) {\n global = replaceUsers(global, {\n ...global.users.byId,\n ...addedUsers,\n });\n\n global = updateContactList(global, Object.values(addedUsers));\n }\n\n return global;\n}\n\nexport function updateSelectedUserId(global: GlobalState, selectedId?: number): GlobalState {\n if (global.users.selectedId === selectedId) {\n return global;\n }\n\n return {\n ...global,\n users: {\n ...global.users,\n selectedId,\n },\n };\n}\n\nexport function deleteUser(global: GlobalState, userId: number): GlobalState {\n const { byId } = global.users;\n const { hash, userIds } = global.contactList || {};\n delete byId[userId];\n\n global = {\n ...global,\n contactList: {\n hash: hash || 0,\n userIds: userIds ? userIds.filter((id) => id !== userId) : MEMO_EMPTY_ARRAY,\n },\n };\n\n return replaceUsers(global, byId);\n}\n\nexport function updateUserSearch(\n global: GlobalState,\n searchStatePartial: Partial<GlobalState['userSearch']>,\n) {\n return {\n ...global,\n userSearch: {\n ...global.userSearch,\n ...searchStatePartial,\n },\n };\n}\n\nexport function updateUserSearchFetchingStatus(\n global: GlobalState, newState: boolean,\n) {\n return updateUserSearch(global, {\n fetchingStatus: newState,\n });\n}\n\nexport function updateUserBlockedState(global: GlobalState, userId: number, isBlocked: boolean) {\n const { byId } = global.users;\n const user = byId[userId];\n if (!user || !user.fullInfo) {\n return global;\n }\n\n return updateUser(global, userId, {\n ...user,\n fullInfo: {\n ...user.fullInfo,\n isBlocked,\n },\n });\n}\n","import { GlobalState } from '../../global/types';\nimport { GlobalSearchContent } from '../../types';\nimport { ApiGlobalMessageSearchType, ApiMessage } from '../../api/types';\nimport { areSortedArraysEqual } from '../../util/iteratees';\n\nconst getComplexKey = (message: ApiMessage) => `${message.chatId}_${message.id}`;\n\nexport function updateGlobalSearch(\n global: GlobalState,\n searchStatePartial: Partial<GlobalState['globalSearch']>,\n) {\n return {\n ...global,\n globalSearch: {\n ...global.globalSearch,\n ...searchStatePartial,\n },\n };\n}\n\nexport function updateGlobalSearchContent(\n global: GlobalState,\n currentContent: GlobalSearchContent | undefined,\n): GlobalState {\n return updateGlobalSearch(global, { currentContent });\n}\n\nexport function updateGlobalSearchResults(\n global: GlobalState,\n newFoundMessages: ApiMessage[],\n totalCount: number,\n type: ApiGlobalMessageSearchType,\n nextRate?: number,\n): GlobalState {\n const { resultsByType } = global.globalSearch || {};\n const newFoundMessagesById = newFoundMessages.reduce((result, message) => {\n result[getComplexKey(message)] = message;\n\n return result;\n }, {} as Record<string, ApiMessage>);\n const foundIdsForType = resultsByType && resultsByType[type] ? resultsByType[type]!.foundIds : undefined;\n\n if (foundIdsForType !== undefined\n && Object.keys(newFoundMessagesById).every(\n (newId) => foundIdsForType.includes(getComplexKey(newFoundMessagesById[newId])),\n )\n ) {\n return updateGlobalSearchFetchingStatus(global, { messages: false });\n }\n\n const prevFoundIds = foundIdsForType || [];\n const newFoundIds = newFoundMessages.map((message) => getComplexKey(message));\n const foundIds = Array.prototype.concat(prevFoundIds, newFoundIds);\n const foundOrPrevFoundIds = areSortedArraysEqual(prevFoundIds, foundIds) ? prevFoundIds : foundIds;\n\n global = updateGlobalSearchFetchingStatus(global, { messages: false });\n\n return updateGlobalSearch(global, {\n resultsByType: {\n ...(global.globalSearch || {}).resultsByType,\n [type]: {\n totalCount,\n nextOffsetId: nextRate,\n foundIds: foundOrPrevFoundIds,\n },\n },\n });\n}\n\nexport function updateGlobalSearchFetchingStatus(\n global: GlobalState, newState: { chats?: boolean; messages?: boolean },\n) {\n return updateGlobalSearch(global, {\n fetchingStatus: {\n ...global.globalSearch.fetchingStatus,\n ...newState,\n },\n });\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiMessageSearchType } from '../../api/types';\n\nimport { areSortedArraysEqual, unique } from '../../util/iteratees';\nimport { SharedMediaType } from '../../types';\nimport { buildChatThreadKey } from '../helpers';\n\ninterface TextSearchParams {\n isActive: boolean;\n query?: string;\n results?: {\n totalCount?: number;\n nextOffsetId?: number;\n foundIds?: number[];\n };\n}\n\ninterface MediaSearchParams {\n currentType?: SharedMediaType;\n resultsByType?: Partial<Record<SharedMediaType, {\n totalCount?: number;\n nextOffsetId: number;\n foundIds: number[];\n }>>;\n}\n\nfunction replaceLocalTextSearch(\n global: GlobalState,\n chatThreadKey: string,\n searchParams: TextSearchParams,\n): GlobalState {\n return {\n ...global,\n localTextSearch: {\n byChatThreadKey: {\n ...global.localTextSearch.byChatThreadKey,\n [chatThreadKey]: searchParams,\n },\n },\n };\n}\n\nexport function updateLocalTextSearch(\n global: GlobalState,\n chatId: number,\n threadId: number,\n isActive: boolean,\n query?: string,\n): GlobalState {\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n\n return replaceLocalTextSearch(global, chatThreadKey, {\n ...global.localTextSearch.byChatThreadKey[chatThreadKey],\n isActive,\n query,\n });\n}\n\nexport function replaceLocalTextSearchResults(\n global: GlobalState,\n chatId: number,\n threadId: number,\n foundIds?: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n\n return replaceLocalTextSearch(global, chatThreadKey, {\n ...global.localTextSearch.byChatThreadKey[chatThreadKey],\n results: {\n foundIds,\n totalCount,\n nextOffsetId,\n },\n });\n}\n\nexport function updateLocalTextSearchResults(\n global: GlobalState,\n chatId: number,\n threadId: number,\n newFoundIds: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n const { results } = global.localTextSearch.byChatThreadKey[chatThreadKey] || {};\n const prevFoundIds = (results && results.foundIds) || [];\n const foundIds = orderFoundIds(unique(Array.prototype.concat(prevFoundIds, newFoundIds)));\n const foundOrPrevFoundIds = areSortedArraysEqual(prevFoundIds, foundIds) ? prevFoundIds : foundIds;\n\n return replaceLocalTextSearchResults(global, chatId, threadId, foundOrPrevFoundIds, totalCount, nextOffsetId);\n}\n\nfunction replaceLocalMediaSearch(\n global: GlobalState,\n chatId: number,\n searchParams: MediaSearchParams,\n): GlobalState {\n return {\n ...global,\n localMediaSearch: {\n byChatId: {\n ...global.localMediaSearch.byChatId,\n [chatId]: searchParams,\n },\n },\n };\n}\n\nexport function updateLocalMediaSearchType(\n global: GlobalState,\n chatId: number,\n currentType: SharedMediaType | undefined,\n): GlobalState {\n return replaceLocalMediaSearch(global, chatId, {\n ...global.localMediaSearch.byChatId[chatId],\n currentType,\n });\n}\n\nexport function replaceLocalMediaSearchResults(\n global: GlobalState,\n chatId: number,\n type: ApiMessageSearchType,\n foundIds?: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n return replaceLocalMediaSearch(global, chatId, {\n ...global.localMediaSearch.byChatId[chatId],\n resultsByType: {\n ...(global.localMediaSearch.byChatId[chatId] || {}).resultsByType,\n [type]: {\n foundIds,\n totalCount,\n nextOffsetId,\n },\n },\n });\n}\n\nexport function updateLocalMediaSearchResults(\n global: GlobalState,\n chatId: number,\n type: SharedMediaType,\n newFoundIds: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n const { resultsByType } = global.localMediaSearch.byChatId[chatId] || {};\n const prevFoundIds = resultsByType && resultsByType[type] ? resultsByType[type]!.foundIds : [];\n const foundIds = orderFoundIds(unique(Array.prototype.concat(prevFoundIds, newFoundIds)));\n const foundOrPrevFoundIds = areSortedArraysEqual(prevFoundIds, foundIds) ? prevFoundIds : foundIds;\n\n return replaceLocalMediaSearchResults(global, chatId, type, foundOrPrevFoundIds, totalCount, nextOffsetId);\n}\n\nfunction orderFoundIds(listedIds: number[]) {\n return listedIds.sort((a, b) => a - b);\n}\n","import { GlobalState } from '../../global/types';\nimport { ManagementProgress } from '../../types';\n\ninterface ManagementState {\n isActive: boolean;\n isUsernameAvailable?: boolean;\n error?: string;\n}\n\nexport function updateManagementProgress(global: GlobalState, progress: ManagementProgress): GlobalState {\n return {\n ...global,\n management: {\n ...global.management,\n progress,\n },\n };\n}\n\nexport function updateManagement(global: GlobalState, chatId: number, update: Partial<ManagementState>): GlobalState {\n return {\n ...global,\n management: {\n ...global.management,\n byChatId: {\n ...global.management.byChatId,\n [chatId]: {\n ...(global.management.byChatId[chatId] || {}),\n ...update,\n },\n },\n },\n };\n}\n","import { GlobalState } from '../../global/types';\nimport {\n ISettings, IThemeSettings, ThemeKey, NotifyException,\n} from '../../types';\nimport { ApiNotifyException } from '../../api/types';\nimport { updateUserBlockedState } from './users';\n\nexport function replaceSettings(global: GlobalState, newSettings?: Partial<ISettings>): GlobalState {\n return {\n ...global,\n settings: {\n ...global.settings,\n byKey: {\n ...global.settings.byKey,\n ...newSettings,\n },\n },\n };\n}\n\nexport function replaceThemeSettings(\n global: GlobalState, theme: ThemeKey, newSettings?: Partial<IThemeSettings>,\n): GlobalState {\n return {\n ...global,\n settings: {\n ...global.settings,\n themes: {\n ...global.settings.themes,\n [theme]: {\n ...(global.settings.themes[theme] || {}),\n ...newSettings,\n },\n },\n },\n };\n}\n\nexport function addNotifyExceptions(\n global: GlobalState, notifyExceptions: ApiNotifyException[],\n): GlobalState {\n notifyExceptions.forEach((notifyException) => {\n const { chatId, ...exceptionData } = notifyException;\n global = addNotifyException(global, chatId, exceptionData);\n });\n\n return global;\n}\n\nexport function addNotifyException(\n global: GlobalState, id: number, notifyException: NotifyException,\n): GlobalState {\n return {\n ...global,\n settings: {\n ...global.settings,\n notifyExceptions: {\n ...global.settings.notifyExceptions,\n [id]: notifyException,\n },\n },\n };\n}\n\nexport function updateNotifySettings(\n global: GlobalState, peerType: 'contact' | 'group' | 'broadcast', isSilent?: boolean, shouldShowPreviews?: boolean,\n) {\n switch (peerType) {\n case 'contact':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasPrivateChatsNotifications: !isSilent }),\n ...(typeof shouldShowPreviews !== 'undefined' && { hasPrivateChatsMessagePreview: shouldShowPreviews }),\n });\n case 'group':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasGroupNotifications: !isSilent }),\n ...(typeof shouldShowPreviews !== 'undefined' && { hasGroupMessagePreview: shouldShowPreviews }),\n });\n case 'broadcast':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasBroadcastNotifications: !isSilent }),\n ...(typeof shouldShowPreviews !== 'undefined' && { hasBroadcastMessagePreview: shouldShowPreviews }),\n });\n\n default:\n return undefined;\n }\n}\n\nexport function addBlockedContact(global: GlobalState, contactId: number): GlobalState {\n global = updateUserBlockedState(global, contactId, true);\n\n return {\n ...global,\n blocked: {\n ...global.blocked,\n ids: [contactId, ...global.blocked.ids],\n totalCount: global.blocked.totalCount + 1,\n },\n };\n}\n\nexport function removeBlockedContact(global: GlobalState, contactId: number): GlobalState {\n global = updateUserBlockedState(global, contactId, false);\n\n return {\n ...global,\n blocked: {\n ...global.blocked,\n ids: global.blocked.ids.filter((id) => id !== contactId),\n totalCount: global.blocked.totalCount - 1,\n },\n };\n}\n","import { GlobalState } from '../../global/types';\n\nexport function updateTwoFaSettings(\n global: GlobalState,\n update: GlobalState['twoFaSettings'],\n): GlobalState {\n return {\n ...global,\n twoFaSettings: {\n ...global.twoFaSettings,\n ...update,\n },\n };\n}\n","import { GlobalState } from '../../global/types';\nimport { ShippingOption, PaymentStep } from '../../types';\nimport { ApiMessage, ApiPaymentForm, ApiReceipt } from '../../api/types';\n\nexport function updateShippingOptions(\n global: GlobalState,\n shippingOptions: ShippingOption[],\n): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n shippingOptions,\n },\n };\n}\n\nexport function setRequestInfoId(global: GlobalState, id: string): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n formId: id,\n },\n };\n}\n\nexport function setPaymentStep(global: GlobalState, step: PaymentStep): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n step,\n },\n };\n}\n\nexport function setInvoiceMessageInfo(global: GlobalState, message: ApiMessage): GlobalState {\n if (!message.content || !message.content.invoice) {\n return global;\n }\n const {\n title,\n text,\n description,\n photoUrl,\n } = message.content.invoice;\n return {\n ...global,\n payment: {\n ...global.payment,\n invoiceContent: {\n title,\n text,\n description,\n photoUrl,\n },\n },\n };\n}\n\nexport function setStripeCardInfo(global: GlobalState, cardInfo: { type: string; id: string }): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n stripeCredentials: {\n ...cardInfo,\n },\n },\n };\n}\n\nexport function setPaymentForm(global: GlobalState, form: ApiPaymentForm): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n ...form,\n },\n };\n}\n\nexport function setReceipt(\n global: GlobalState,\n receipt?: ApiReceipt,\n message?: ApiMessage,\n): GlobalState {\n if (!receipt || !message) {\n return {\n ...global,\n payment: {\n ...global.payment,\n receipt: undefined,\n },\n };\n }\n\n const { invoice: messageInvoice } = message.content;\n const { photoUrl, text, title } = (messageInvoice || {});\n\n return {\n ...global,\n payment: {\n ...global.payment,\n receipt: {\n ...receipt,\n photoUrl,\n text,\n title,\n },\n },\n };\n}\n\nexport function clearPayment(global: GlobalState): GlobalState {\n return {\n ...global,\n payment: {},\n };\n}\n\nexport function closeInvoice(global: GlobalState): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n isPaymentModalOpen: false,\n },\n };\n}\n","// eslint-disable-next-line no-restricted-globals\nconst cacheApi = self.caches;\n\nexport enum Type {\n Text,\n Blob,\n Json,\n}\n\nexport async function fetch(cacheName: string, key: string, type: Type) {\n if (!cacheApi) {\n return undefined;\n }\n\n try {\n // To avoid the error \"Request scheme 'webdocument' is unsupported\"\n const request = new Request(key.replace(/:/g, '_'));\n const cache = await cacheApi.open(cacheName);\n const response = await cache.match(request);\n if (!response) {\n return undefined;\n }\n\n switch (type) {\n case Type.Text:\n return await response.text();\n case Type.Blob: {\n const blob = await response.blob();\n\n // Safari does not return correct Content-Type header for webp images.\n if (key.substr(0, 7) === 'sticker') {\n return new Blob([blob], { type: 'image/webp' });\n }\n\n // iOS Safari fails to preserve `type` in cache\n if (!blob.type) {\n const contentType = response.headers.get('Content-Type');\n if (contentType) {\n return new Blob([blob], { type: contentType });\n }\n }\n\n return blob;\n }\n case Type.Json:\n return await response.json();\n default:\n return undefined;\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n\nexport async function save(cacheName: string, key: string, data: AnyLiteral | Blob | string) {\n if (!cacheApi) {\n return undefined;\n }\n\n try {\n const cacheData = typeof data === 'string' || data instanceof Blob ? data : JSON.stringify(data);\n // To avoid the error \"Request scheme 'webdocument' is unsupported\"\n const request = new Request(key.replace(/:/g, '_'));\n const response = new Response(cacheData);\n const cache = await cacheApi.open(cacheName);\n return await cache.put(request, response);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n\nexport async function clear(cacheName: string) {\n try {\n if (!cacheApi) {\n return undefined;\n }\n\n return await cacheApi.delete(cacheName);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n","import {\n ApiBotInlineMediaResult, ApiBotInlineResult, ApiBotInlineSwitchPm,\n ApiLanguage, ApiMessage, ApiShippingAddress, ApiStickerSet,\n} from '../api/types';\n\nexport enum LoadMoreDirection {\n Backwards,\n Forwards,\n Around,\n}\n\nexport enum FocusDirection {\n Up,\n Down,\n Static,\n}\n\nexport interface IAlbum {\n albumId: string;\n messages: ApiMessage[];\n mainMessage: ApiMessage;\n}\n\nexport type ThemeKey = 'light' | 'dark';\n\nexport interface IThemeSettings {\n background?: string;\n backgroundColor?: string;\n patternColor?: string;\n isBlurred?: boolean;\n}\n\nexport type NotifySettings = {\n hasPrivateChatsNotifications?: boolean;\n hasPrivateChatsMessagePreview?: boolean;\n hasGroupNotifications?: boolean;\n hasGroupMessagePreview?: boolean;\n hasBroadcastNotifications?: boolean;\n hasBroadcastMessagePreview?: boolean;\n hasContactJoinedNotifications?: boolean;\n};\n\nexport type LangCode = (\n 'en' | 'ar' | 'be' | 'ca' | 'nl' | 'fr' | 'de' | 'id' | 'it' | 'ko' | 'ms' | 'fa' | 'pl' | 'pt-br' | 'ru' | 'es'\n | 'tr' | 'uk' | 'uz'\n);\n\nexport interface ISettings extends NotifySettings, Record<string, any> {\n theme: ThemeKey;\n shouldUseSystemTheme: boolean;\n messageTextSize: number;\n animationLevel: 0 | 1 | 2;\n messageSendKeyCombo: 'enter' | 'ctrl-enter';\n shouldAutoDownloadMediaFromContacts: boolean;\n shouldAutoDownloadMediaInPrivateChats: boolean;\n shouldAutoDownloadMediaInGroups: boolean;\n shouldAutoDownloadMediaInChannels: boolean;\n shouldAutoPlayGifs: boolean;\n shouldAutoPlayVideos: boolean;\n shouldSuggestStickers: boolean;\n shouldLoopStickers: boolean;\n hasPassword?: boolean;\n languages?: ApiLanguage[];\n language: LangCode;\n isSensitiveEnabled?: boolean;\n canChangeSensitive?: boolean;\n}\n\nexport interface ApiPrivacySettings {\n visibility: PrivacyVisibility;\n allowUserIds: number[];\n allowChatIds: number[];\n blockUserIds: number[];\n blockChatIds: number[];\n}\n\nexport interface IInputPrivacyContact {\n id: number;\n accessHash?: string;\n}\n\nexport interface IInputPrivacyRules {\n visibility: PrivacyVisibility;\n allowedUsers?: IInputPrivacyContact[];\n allowedChats?: IInputPrivacyContact[];\n blockedUsers?: IInputPrivacyContact[];\n blockedChats?: IInputPrivacyContact[];\n}\n\nexport type IAnchorPosition = {\n x: number;\n y: number;\n};\n\nexport interface ShippingOption {\n id: string;\n title: string;\n amount: number;\n prices: Price[];\n}\n\nexport interface Price {\n label: string;\n amount: number;\n}\n\nexport interface Invoice {\n currency?: string;\n emailRequested?: boolean;\n emailToProvider?: boolean;\n flexible?: boolean;\n nameRequested?: boolean;\n phoneRequested?: boolean;\n phoneToProvider?: boolean;\n prices?: Price[];\n shippingAddressRequested?: boolean;\n test?: boolean;\n}\n\nexport interface Receipt {\n currency: string;\n prices: Price[];\n info?: {\n shippingAddress?: ApiShippingAddress;\n phone?: string;\n name?: string;\n };\n totalAmount: number;\n credentialsTitle: string;\n shippingPrices?: Price[];\n shippingMethod?: string;\n photoUrl?: string;\n text?: string;\n title?: string;\n}\n\nexport enum SettingsScreens {\n Main,\n EditProfile,\n Notifications,\n Language,\n General,\n GeneralChatBackground,\n GeneralChatBackgroundColor,\n Privacy,\n PrivacyPhoneNumber,\n PrivacyLastSeen,\n PrivacyProfilePhoto,\n PrivacyForwarding,\n PrivacyGroupChats,\n PrivacyPhoneNumberAllowedContacts,\n PrivacyPhoneNumberDeniedContacts,\n PrivacyLastSeenAllowedContacts,\n PrivacyLastSeenDeniedContacts,\n PrivacyProfilePhotoAllowedContacts,\n PrivacyProfilePhotoDeniedContacts,\n PrivacyForwardingAllowedContacts,\n PrivacyForwardingDeniedContacts,\n PrivacyGroupChatsAllowedContacts,\n PrivacyGroupChatsDeniedContacts,\n PrivacyActiveSessions,\n PrivacyBlockedUsers,\n Folders,\n FoldersCreateFolder,\n FoldersEditFolder,\n FoldersIncludedChats,\n FoldersExcludedChats,\n TwoFaDisabled,\n TwoFaNewPassword,\n TwoFaNewPasswordConfirm,\n TwoFaNewPasswordHint,\n TwoFaNewPasswordEmail,\n TwoFaNewPasswordEmailCode,\n TwoFaEnabled,\n TwoFaChangePasswordCurrent,\n TwoFaChangePasswordNew,\n TwoFaChangePasswordConfirm,\n TwoFaChangePasswordHint,\n TwoFaTurnOff,\n TwoFaRecoveryEmailCurrentPassword,\n TwoFaRecoveryEmail,\n TwoFaRecoveryEmailCode,\n TwoFaCongratulations,\n}\n\nexport type StickerSetOrRecent = Pick<ApiStickerSet, (\n 'id' | 'title' | 'count' | 'stickers' | 'hasThumbnail' | 'isAnimated'\n)>;\n\nexport enum LeftColumnContent {\n ChatList,\n GlobalSearch,\n Settings,\n Contacts,\n Archived,\n NewChannelStep1,\n NewChannelStep2,\n NewGroupStep1,\n NewGroupStep2,\n}\n\nexport enum GlobalSearchContent {\n ChatList,\n Media,\n Links,\n Files,\n Music,\n Voice,\n}\n\nexport enum RightColumnContent {\n ChatInfo,\n UserInfo,\n Search,\n Management,\n StickerSearch,\n GifSearch,\n PollResults,\n AddingMembers,\n}\n\nexport enum MediaViewerOrigin {\n Inline,\n ScheduledInline,\n SharedMedia,\n ProfileAvatar,\n MiddleHeaderAvatar,\n Album,\n ScheduledAlbum,\n SearchResult,\n}\n\nexport enum ChatCreationProgress {\n Idle,\n InProgress,\n Complete,\n Error,\n}\n\nexport enum ProfileEditProgress {\n Idle,\n InProgress,\n Complete,\n Error,\n}\n\nexport enum ManagementProgress {\n Idle,\n InProgress,\n Complete,\n Error,\n}\n\nexport enum NewChatMembersProgress {\n Closed,\n InProgress,\n Loading,\n}\n\nexport type ProfileTabType = 'members' | 'media' | 'documents' | 'links' | 'audio';\nexport type SharedMediaType = 'media' | 'documents' | 'links' | 'audio';\nexport type ApiPrivacyKey = 'phoneNumber' | 'lastSeen' | 'profilePhoto' | 'forwards' | 'chatInvite';\nexport type PrivacyVisibility = 'everybody' | 'contacts' | 'nonContacts' | 'nobody';\n\nexport enum ProfileState {\n Profile,\n SharedMedia,\n MemberList,\n}\n\nexport enum PaymentStep {\n ShippingInfo,\n Shipping,\n PaymentInfo,\n Checkout\n}\n\nexport const UPLOADING_WALLPAPER_SLUG = 'UPLOADING_WALLPAPER_SLUG';\n\nexport enum ManagementScreens {\n Initial,\n ChatPrivacyType,\n Discussion,\n ChannelSubscribers,\n GroupType,\n GroupPermissions,\n GroupRemovedUsers,\n GroupUserPermissionsCreate,\n GroupUserPermissions,\n ChatAdministrators,\n GroupRecentActions,\n ChatAdminRights,\n GroupMembers,\n}\n\nexport type ManagementType = 'user' | 'group' | 'channel';\n\nexport type NotifyException = {\n isMuted: boolean;\n isSilent?: boolean;\n shouldShowPreviews?: boolean;\n};\n\nexport type EmojiKeywords = {\n isLoading?: boolean;\n version: number;\n keywords: Record<string, string[]>;\n};\n\nexport type InlineBotSettings = {\n id: number;\n help?: string;\n query?: string;\n offset?: string;\n canLoadMore?: boolean;\n results?: (ApiBotInlineResult | ApiBotInlineMediaResult)[];\n isGallery?: boolean;\n switchPm?: ApiBotInlineSwitchPm;\n};\n","import { ApiLangPack, ApiLangString } from '../api/types';\n\nimport {\n DEFAULT_LANG_CODE, DEFAULT_LANG_PACK, LANG_CACHE_NAME, LANG_PACKS,\n} from '../config';\nimport * as cacheApi from './cacheApi';\nimport { callApi } from '../api/gramjs';\nimport { createCallbackManager } from './callbacks';\nimport { formatInteger } from './textFormat';\nimport { getGlobal } from '../lib/teact/teactn';\n\ninterface LangFn {\n (key: string, value?: any, format?: 'i'): any;\n\n isRtl?: boolean;\n code?: string;\n}\n\nconst SUBSTITUTION_REGEX = /%\\d?\\$?[sdf@]/g;\nconst PLURAL_OPTIONS = ['value', 'zeroValue', 'oneValue', 'twoValue', 'fewValue', 'manyValue', 'otherValue'] as const;\nconst PLURAL_RULES = {\n /* eslint-disable max-len */\n en: (n: number) => (n !== 1 ? 6 : 2),\n ar: (n: number) => (n === 0 ? 1 : n === 1 ? 2 : n === 2 ? 3 : n % 100 >= 3 && n % 100 <= 10 ? 4 : n % 100 >= 11 ? 5 : 6),\n ca: (n: number) => (n !== 1 ? 6 : 2),\n de: (n: number) => (n !== 1 ? 6 : 2),\n es: (n: number) => (n !== 1 ? 6 : 2),\n fa: (n: number) => (n > 1 ? 6 : 2),\n fr: (n: number) => (n > 1 ? 6 : 2),\n id: () => 0,\n it: (n: number) => (n !== 1 ? 6 : 2),\n ko: () => 0,\n ms: () => 0,\n nl: (n: number) => (n !== 1 ? 6 : 2),\n pl: (n: number) => (n === 1 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n pt_BR: (n: number) => (n > 1 ? 6 : 2),\n ru: (n: number) => (n % 10 === 1 && n % 100 !== 11 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n tr: (n: number) => (n > 1 ? 6 : 2),\n uk: (n: number) => (n % 10 === 1 && n % 100 !== 11 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n uz: (n: number) => (n > 1 ? 6 : 2),\n /* eslint-enable max-len */\n};\n\nconst cache = new Map<string, string>();\n\nlet langPack: ApiLangPack | undefined;\nlet fallbackLangPack: ApiLangPack | undefined;\n\nconst {\n addCallback,\n removeCallback,\n runCallbacks,\n} = createCallbackManager();\n\nexport { addCallback, removeCallback };\n\nlet currentLangCode: string | undefined;\n\nexport const getTranslation: LangFn = (key: string, value?: any, format?: 'i') => {\n if (value !== undefined) {\n const cacheValue = Array.isArray(value) ? JSON.stringify(value) : value;\n const cached = cache.get(`${key}_${cacheValue}_${format}`);\n if (cached) {\n return cached;\n }\n }\n\n if (!langPack && !fallbackLangPack) {\n return key;\n }\n\n const langString = (langPack && langPack[key]) || (fallbackLangPack && fallbackLangPack[key]);\n if (!langString) {\n if (!fallbackLangPack) {\n void importFallbackLangPack();\n }\n\n return key;\n }\n\n return processTranslation(langString, key, value, format);\n};\n\nexport async function getTranslationForLangString(langCode: string, key: string) {\n let translateString = await cacheApi.fetch(\n LANG_CACHE_NAME,\n `${DEFAULT_LANG_PACK}_${langCode}_${key}`,\n cacheApi.Type.Json,\n );\n\n if (!translateString) {\n translateString = await fetchRemoteString(DEFAULT_LANG_PACK, langCode, key);\n }\n\n return processTranslation(translateString, key);\n}\n\nexport async function setLanguage(langCode: string, callback?: NoneToVoidFunction, withFallback = false) {\n if (langPack && langCode === currentLangCode) {\n if (callback) {\n callback();\n }\n\n return;\n }\n\n let newLangPack = await cacheApi.fetch(LANG_CACHE_NAME, langCode, cacheApi.Type.Json);\n if (!newLangPack) {\n if (withFallback) {\n await importFallbackLangPack();\n }\n\n newLangPack = await fetchRemote(langCode);\n if (!newLangPack) {\n return;\n }\n }\n\n cache.clear();\n\n currentLangCode = langCode;\n langPack = newLangPack;\n document.documentElement.lang = langCode;\n\n const { languages } = getGlobal().settings.byKey;\n const langInfo = languages ? languages.find((l) => l.langCode === langCode) : undefined;\n getTranslation.isRtl = Boolean(langInfo && langInfo.rtl);\n getTranslation.code = langCode;\n\n if (callback) {\n callback();\n }\n\n runCallbacks();\n}\n\nasync function importFallbackLangPack() {\n if (fallbackLangPack) {\n return;\n }\n\n fallbackLangPack = (await import('./fallbackLangPack')).default;\n runCallbacks();\n}\n\nasync function fetchRemote(langCode: string): Promise<ApiLangPack | undefined> {\n const remote = await callApi('fetchLangPack', { sourceLangPacks: LANG_PACKS, langCode });\n if (remote) {\n await cacheApi.save(LANG_CACHE_NAME, langCode, remote.langPack);\n return remote.langPack;\n }\n\n return undefined;\n}\n\nasync function fetchRemoteString(\n remoteLangPack: typeof LANG_PACKS[number], langCode: string, key: string,\n): Promise<string | undefined> {\n const remote = await callApi('fetchLangStrings', {\n langPack: remoteLangPack,\n langCode,\n keys: [key],\n });\n\n if (remote && remote.length) {\n await cacheApi.save(LANG_CACHE_NAME, `${remoteLangPack}_${langCode}_${key}`, remote[0]);\n\n return remote[0];\n }\n\n return undefined;\n}\n\nfunction getPluralOption(amount: number) {\n const langCode = currentLangCode || DEFAULT_LANG_CODE;\n const optionIndex = PLURAL_RULES[langCode as keyof typeof PLURAL_RULES]\n ? PLURAL_RULES[langCode as keyof typeof PLURAL_RULES](amount)\n : 0;\n\n return PLURAL_OPTIONS[optionIndex];\n}\n\nfunction processTemplate(template: string, value: any) {\n value = Array.isArray(value) ? value : [value];\n const translationSlices = template.split(SUBSTITUTION_REGEX);\n const initialValue = translationSlices.shift();\n\n return translationSlices.reduce((result, str, index) => {\n return `${result}${String(value[index] || '')}${str}`;\n }, initialValue || '');\n}\n\nfunction processTranslation(langString: ApiLangString | undefined, key: string, value?: any, format?: 'i') {\n const template = langString ? langString[typeof value === 'number' ? getPluralOption(value) : 'value'] : undefined;\n if (!template || !template.trim()) {\n const parts = key.split('.');\n\n return parts[parts.length - 1];\n }\n\n if (value !== undefined) {\n const formattedValue = format === 'i' ? formatInteger(value) : value;\n const result = processTemplate(template, formattedValue);\n const cacheValue = Array.isArray(value) ? JSON.stringify(value) : value;\n cache.set(`${key}_${cacheValue}_${format}`, result);\n return result;\n }\n\n return template;\n}\n","export function createCallbackManager() {\n const callbacks: AnyToVoidFunction[] = [];\n\n function addCallback(cb: AnyToVoidFunction) {\n callbacks.push(cb);\n\n return () => {\n removeCallback(cb);\n };\n }\n\n function removeCallback(cb: AnyToVoidFunction) {\n const index = callbacks.indexOf(cb);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n }\n\n function runCallbacks(...args: any[]) {\n callbacks.forEach((callback) => {\n callback(...args);\n });\n }\n\n return {\n runCallbacks,\n addCallback,\n removeCallback,\n };\n}\n","import { DEBUG } from '../config';\n\nexport enum Bundles {\n Auth,\n Main,\n Extra\n}\n\ninterface ImportedBundles {\n [Bundles.Auth]: typeof import('../bundles/auth');\n [Bundles.Main]: typeof import('../bundles/main');\n [Bundles.Extra]: typeof import('../bundles/extra');\n}\n\ntype BundlePromises = {\n [K in keyof ImportedBundles]: Promise<ImportedBundles[K]>\n};\n\nexport type BundleModules<B extends keyof ImportedBundles> = keyof ImportedBundles[B];\n\nconst LOAD_PROMISES: Partial<BundlePromises> = {};\nconst MEMORY_CACHE: Partial<ImportedBundles> = {};\n\nexport async function loadModule<B extends Bundles, M extends BundleModules<B>>(bundleName: B, moduleName: M) {\n if (!LOAD_PROMISES[bundleName]) {\n switch (bundleName) {\n case Bundles.Auth:\n LOAD_PROMISES[Bundles.Auth] = import('../bundles/auth');\n break;\n case Bundles.Main:\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START LOAD MAIN BUNDLE');\n }\n\n LOAD_PROMISES[Bundles.Main] = import('../bundles/main');\n break;\n case Bundles.Extra:\n LOAD_PROMISES[Bundles.Extra] = import('../bundles/extra');\n break;\n }\n\n (LOAD_PROMISES[bundleName] as Promise<ImportedBundles[B]>).then(handleBundleLoad);\n }\n\n const bundle = (await LOAD_PROMISES[bundleName]) as unknown as ImportedBundles[B];\n\n if (!MEMORY_CACHE[bundleName]) {\n MEMORY_CACHE[bundleName] = bundle;\n }\n\n return getModuleFromMemory(bundleName, moduleName);\n}\n\nexport function getModuleFromMemory<B extends Bundles, M extends BundleModules<B>>(bundleName: B, moduleName: M) {\n const bundle = MEMORY_CACHE[bundleName] as ImportedBundles[B];\n\n if (!bundle) {\n return undefined;\n }\n\n return bundle[moduleName];\n}\n\nconst listeners: NoneToVoidFunction[] = [];\n\nexport function addLoadListener(listener: NoneToVoidFunction) {\n if (!listeners.includes(listener)) {\n listeners.push(listener);\n }\n}\n\nfunction handleBundleLoad() {\n listeners.forEach((listener) => {\n listener();\n });\n}\n","import { ApiMediaFormat } from '../api/types';\n\nimport * as langProvider from '../util/langProvider';\nimport useForceUpdate from './useForceUpdate';\nimport useOnChange from './useOnChange';\n\nexport type LangFn = typeof langProvider.getTranslation;\n\nexport default <T extends ApiMediaFormat = ApiMediaFormat.BlobUrl>(): LangFn => {\n const forceUpdate = useForceUpdate();\n\n useOnChange(() => {\n return langProvider.addCallback(forceUpdate);\n }, [forceUpdate]);\n\n return langProvider.getTranslation;\n};\n","import { pause } from './schedulers';\n\n// Polyfill for Safari: `File` is not available in web worker\nif (typeof File === 'undefined') {\n // eslint-disable-next-line no-global-assign, no-restricted-globals, func-names\n self.File = class extends Blob {\n name: string;\n\n constructor(fileBits: BlobPart[], fileName: string, options?: FilePropertyBag) {\n if (options) {\n const { type, ...rest } = options;\n super(fileBits, { type });\n Object.assign(this, rest);\n } else {\n super(fileBits);\n }\n\n this.name = fileName;\n }\n } as typeof File;\n}\n\nexport function dataUriToBlob(dataUri: string) {\n const arr = dataUri.split(',');\n const mime = arr[0].match(/:(.*?);/)![1];\n const bstr = atob(arr[1]);\n let n = bstr.length;\n const u8arr = new Uint8Array(n);\n\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n\n return new Blob([u8arr], { type: mime });\n}\n\nexport function blobToDataUri(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = (e: ProgressEvent<FileReader>) => {\n const { result } = e.target || {};\n if (typeof result === 'string') {\n resolve(result);\n }\n\n reject(new Error('Failed to read blob'));\n };\n\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n}\n\nexport function blobToFile(blob: Blob, fileName: string) {\n return new File([blob], fileName, {\n lastModified: Date.now(),\n type: blob.type,\n });\n}\n\nexport function preloadImage(url: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = url;\n });\n}\n\nexport function preloadVideo(url: string): Promise<HTMLVideoElement> {\n return new Promise((resolve, reject) => {\n const video = document.createElement('video');\n video.volume = 0;\n video.onloadedmetadata = () => resolve(video);\n video.onerror = reject;\n video.src = url;\n });\n}\n\nexport async function createPosterForVideo(url: string): Promise<string | undefined> {\n const video = await preloadVideo(url);\n\n return Promise.race([\n pause(2000) as Promise<undefined>,\n new Promise<string>((resolve, reject) => {\n video.onseeked = () => {\n if (!video.videoWidth || !video.videoHeight) {\n resolve(undefined);\n }\n\n const canvas = document.createElement('canvas');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(video, 0, 0);\n resolve(canvas.toDataURL('image/jpeg'));\n };\n video.onerror = reject;\n video.currentTime = Math.min(video.duration, 1);\n }),\n ]);\n}\n\nexport async function fetchBlob(blobUrl: string) {\n const response = await fetch(blobUrl);\n return response.blob();\n}\n\nexport async function fetchFile(blobUrl: string, fileName: string) {\n const blob = await fetchBlob(blobUrl);\n return blobToFile(blob, fileName);\n}\n\nexport function imgToCanvas(img: HTMLImageElement) {\n const canvas = document.createElement('canvas');\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(img, 0, 0);\n\n return canvas;\n}\n","function promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n const dbp = promisifyRequest(request);\n return (txMode, callback) => dbp.then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(customStore, callback) {\n return customStore('readonly', (store) => {\n // This would be store.getAllKeys(), but it isn't supported by Edge or Safari.\n // And openKeyCursor isn't supported by Safari.\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n const items = [];\n return eachCursor(customStore, (cursor) => items.push(cursor.key)).then(() => items);\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n const items = [];\n return eachCursor(customStore, (cursor) => items.push(cursor.value)).then(() => items);\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n const items = [];\n return eachCursor(customStore, (cursor) => items.push([cursor.key, cursor.value])).then(() => items);\n}\n\nexport { clear, createStore, del, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","import * as idb from 'idb-keyval';\n\nimport { ApiSessionData } from '../api/types';\n\nimport { DEBUG, LEGACY_SESSION_KEY, SESSION_USER_KEY } from '../config';\nimport * as cacheApi from './cacheApi';\n\nconst DC_IDS = [1, 2, 3, 4, 5];\n\nexport function hasStoredSession(withLegacy = false) {\n if (withLegacy && localStorage.getItem(LEGACY_SESSION_KEY)) {\n return true;\n }\n\n const userAuthJson = localStorage.getItem(SESSION_USER_KEY);\n if (!userAuthJson) return false;\n\n try {\n const userAuth = JSON.parse(userAuthJson);\n return Boolean(userAuth && userAuth.id && userAuth.dcID);\n } catch (err) {\n // Do nothing.\n return false;\n }\n}\n\nexport function storeSession(sessionData: ApiSessionData, currentUserId?: number) {\n const { mainDcId, keys, hashes } = sessionData;\n\n localStorage.setItem(SESSION_USER_KEY, JSON.stringify({ dcID: mainDcId, id: currentUserId }));\n localStorage.setItem('dc', String(mainDcId));\n Object.keys(keys).map(Number).forEach((dcId) => {\n localStorage.setItem(`dc${dcId}_auth_key`, JSON.stringify(keys[dcId]));\n });\n Object.keys(hashes).map(Number).forEach((dcId) => {\n localStorage.setItem(`dc${dcId}_hash`, JSON.stringify(hashes[dcId]));\n });\n}\n\nexport function clearStoredSession() {\n [\n SESSION_USER_KEY,\n 'dc',\n ...DC_IDS.map((dcId) => `dc${dcId}_auth_key`),\n ...DC_IDS.map((dcId) => `dc${dcId}_hash`),\n ].forEach((key) => {\n localStorage.removeItem(key);\n });\n}\n\nexport function loadStoredSession(): ApiSessionData | undefined {\n if (!hasStoredSession()) {\n return undefined;\n }\n\n const userAuth = JSON.parse(localStorage.getItem(SESSION_USER_KEY)!);\n const mainDcId = Number(userAuth.dcID);\n const keys: Record<number, string> = {};\n const hashes: Record<number, string> = {};\n\n DC_IDS.forEach((dcId) => {\n try {\n const key = localStorage.getItem(`dc${dcId}_auth_key`);\n if (key) {\n keys[dcId] = JSON.parse(key);\n }\n\n const hash = localStorage.getItem(`dc${dcId}_hash`);\n if (hash) {\n hashes[dcId] = JSON.parse(hash);\n }\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('Failed to load stored session', err);\n }\n // Do nothing.\n }\n });\n\n if (!Object.keys(keys).length) return undefined;\n\n return {\n mainDcId,\n keys,\n hashes,\n };\n}\n\nexport async function importLegacySession() {\n const sessionId = localStorage.getItem(LEGACY_SESSION_KEY);\n if (!sessionId) return;\n\n const sessionJson = await idb.get(`GramJs:${sessionId}`);\n try {\n const sessionData = JSON.parse(sessionJson) as ApiSessionData;\n storeSession(sessionData);\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('Failed to load legacy session', err);\n }\n // Do nothing.\n }\n}\n\n// Remove previously created IndexedDB and cache API sessions\nexport async function clearLegacySessions() {\n localStorage.removeItem(LEGACY_SESSION_KEY);\n\n const idbKeys = await idb.keys();\n\n await Promise.all<Promise<any>>([\n cacheApi.clear('GramJs'),\n ...idbKeys\n .filter((k) => typeof k === 'string' && k.startsWith('GramJs:GramJs-session-'))\n .map((k) => idb.del(k)),\n ]);\n}\n\nexport function importTestSession() {\n const sessionJson = process.env.TEST_SESSION!;\n try {\n const sessionData = JSON.parse(sessionJson) as ApiSessionData & { userId: number };\n storeSession(sessionData, sessionData.userId);\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('Failed to load test session', err);\n }\n // Do nothing.\n }\n}\n","// Copyright Twitter Inc. Licensed under MIT\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\n// Version 2c193ce 28.05.2021\n\nconst vs16RegExp = /\\uFE0F/g;\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\n\nexport function removeVS16s(rawEmoji) {\n return rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji;\n}\n\n// This file is generated by source/emoji/scripts/generate.sh\n// eslint-disable-next-line max-len\nexport default /(?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc8f\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc91\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d\\udc8f\\udc91])|(?:\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1)(?:\\ud83c[\\udffb-\\udfff])?\\u200d(?:\\u2695\\ufe0f|\\u2696\\ufe0f|\\u2708\\ufe0f|\\ud83c[\\udf3e\\udf73\\udf7c\\udf84\\udf93\\udfa4\\udfa8\\udfeb\\udfed]|\\ud83d[\\udcbb\\udcbc\\udd27\\udd2c\\ude80\\ude92]|\\ud83e[\\uddaf-\\uddb3\\uddbc\\uddbd])|(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75]|\\u26f9)((?:\\ud83c[\\udffb-\\udfff]|\\ufe0f)\\u200d[\\u2640\\u2642]\\ufe0f)|(?:\\ud83c[\\udfc3\\udfc4\\udfca]|\\ud83d[\\udc6e\\udc70\\udc71\\udc73\\udc77\\udc81\\udc82\\udc86\\udc87\\ude45-\\ude47\\ude4b\\ude4d\\ude4e\\udea3\\udeb4-\\udeb6]|\\ud83e[\\udd26\\udd35\\udd37-\\udd39\\udd3d\\udd3e\\uddb8\\uddb9\\uddcd-\\uddcf\\uddd4\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f|(?:\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83c\\udff3\\ufe0f\\u200d\\u26a7\\ufe0f|\\ud83c\\udff3\\ufe0f\\u200d\\ud83c\\udf08|\\ud83d\\ude36\\u200d\\ud83c\\udf2b\\ufe0f|\\u2764\\ufe0f\\u200d\\ud83d\\udd25|\\u2764\\ufe0f\\u200d\\ud83e\\ude79|\\ud83c\\udff4\\u200d\\u2620\\ufe0f|\\ud83d\\udc15\\u200d\\ud83e\\uddba|\\ud83d\\udc3b\\u200d\\u2744\\ufe0f|\\ud83d\\udc41\\u200d\\ud83d\\udde8|\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc6f\\u200d\\u2640\\ufe0f|\\ud83d\\udc6f\\u200d\\u2642\\ufe0f|\\ud83d\\ude2e\\u200d\\ud83d\\udca8|\\ud83d\\ude35\\u200d\\ud83d\\udcab|\\ud83e\\udd3c\\u200d\\u2640\\ufe0f|\\ud83e\\udd3c\\u200d\\u2642\\ufe0f|\\ud83e\\uddde\\u200d\\u2640\\ufe0f|\\ud83e\\uddde\\u200d\\u2642\\ufe0f|\\ud83e\\udddf\\u200d\\u2640\\ufe0f|\\ud83e\\udddf\\u200d\\u2642\\ufe0f|\\ud83d\\udc08\\u200d\\u2b1b)|[#*0-9]\\ufe0f?\\u20e3|(?:[©®\\u2122\\u265f]\\ufe0f)|(?:\\ud83c[\\udc04\\udd70\\udd71\\udd7e\\udd7f\\ude02\\ude1a\\ude2f\\ude37\\udf21\\udf24-\\udf2c\\udf36\\udf7d\\udf96\\udf97\\udf99-\\udf9b\\udf9e\\udf9f\\udfcd\\udfce\\udfd4-\\udfdf\\udff3\\udff5\\udff7]|\\ud83d[\\udc3f\\udc41\\udcfd\\udd49\\udd4a\\udd6f\\udd70\\udd73\\udd76-\\udd79\\udd87\\udd8a-\\udd8d\\udda5\\udda8\\uddb1\\uddb2\\uddbc\\uddc2-\\uddc4\\uddd1-\\uddd3\\udddc-\\uddde\\udde1\\udde3\\udde8\\uddef\\uddf3\\uddfa\\udecb\\udecd-\\udecf\\udee0-\\udee5\\udee9\\udef0\\udef3]|[\\u203c\\u2049\\u2139\\u2194-\\u2199\\u21a9\\u21aa\\u231a\\u231b\\u2328\\u23cf\\u23ed-\\u23ef\\u23f1\\u23f2\\u23f8-\\u23fa\\u24c2\\u25aa\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u2600-\\u2604\\u260e\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262a\\u262e\\u262f\\u2638-\\u263a\\u2640\\u2642\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267b\\u267f\\u2692-\\u2697\\u2699\\u269b\\u269c\\u26a0\\u26a1\\u26a7\\u26aa\\u26ab\\u26b0\\u26b1\\u26bd\\u26be\\u26c4\\u26c5\\u26c8\\u26cf\\u26d1\\u26d3\\u26d4\\u26e9\\u26ea\\u26f0-\\u26f5\\u26f8\\u26fa\\u26fd\\u2702\\u2708\\u2709\\u270f\\u2712\\u2714\\u2716\\u271d\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u2764\\u27a1\\u2934\\u2935\\u2b05-\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u3030\\u303d\\u3297\\u3299])(?:\\ufe0f|(?!\\ufe0e))|(?:(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75\\udd90]|[\\u261d\\u26f7\\u26f9\\u270c\\u270d])(?:\\ufe0f|(?!\\ufe0e))|(?:\\ud83c[\\udf85\\udfc2-\\udfc4\\udfc7\\udfca]|\\ud83d[\\udc42\\udc43\\udc46-\\udc50\\udc66-\\udc69\\udc6e\\udc70-\\udc78\\udc7c\\udc81-\\udc83\\udc85-\\udc87\\udcaa\\udd7a\\udd95\\udd96\\ude45-\\ude47\\ude4b-\\ude4f\\udea3\\udeb4-\\udeb6\\udec0\\udecc]|\\ud83e[\\udd0c\\udd0f\\udd18-\\udd1c\\udd1e\\udd1f\\udd26\\udd30-\\udd39\\udd3d\\udd3e\\udd77\\uddb5\\uddb6\\uddb8\\uddb9\\uddbb\\uddcd-\\uddcf\\uddd1-\\udddd]|[\\u270a\\u270b]))(?:\\ud83c[\\udffb-\\udfff])?|(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f|\\ud83c\\udde6\\ud83c[\\udde8-\\uddec\\uddee\\uddf1\\uddf2\\uddf4\\uddf6-\\uddfa\\uddfc\\uddfd\\uddff]|\\ud83c\\udde7\\ud83c[\\udde6\\udde7\\udde9-\\uddef\\uddf1-\\uddf4\\uddf6-\\uddf9\\uddfb\\uddfc\\uddfe\\uddff]|\\ud83c\\udde8\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\uddee\\uddf0-\\uddf5\\uddf7\\uddfa-\\uddff]|\\ud83c\\udde9\\ud83c[\\uddea\\uddec\\uddef\\uddf0\\uddf2\\uddf4\\uddff]|\\ud83c\\uddea\\ud83c[\\udde6\\udde8\\uddea\\uddec\\udded\\uddf7-\\uddfa]|\\ud83c\\uddeb\\ud83c[\\uddee-\\uddf0\\uddf2\\uddf4\\uddf7]|\\ud83c\\uddec\\ud83c[\\udde6\\udde7\\udde9-\\uddee\\uddf1-\\uddf3\\uddf5-\\uddfa\\uddfc\\uddfe]|\\ud83c\\udded\\ud83c[\\uddf0\\uddf2\\uddf3\\uddf7\\uddf9\\uddfa]|\\ud83c\\uddee\\ud83c[\\udde8-\\uddea\\uddf1-\\uddf4\\uddf6-\\uddf9]|\\ud83c\\uddef\\ud83c[\\uddea\\uddf2\\uddf4\\uddf5]|\\ud83c\\uddf0\\ud83c[\\uddea\\uddec-\\uddee\\uddf2\\uddf3\\uddf5\\uddf7\\uddfc\\uddfe\\uddff]|\\ud83c\\uddf1\\ud83c[\\udde6-\\udde8\\uddee\\uddf0\\uddf7-\\uddfb\\uddfe]|\\ud83c\\uddf2\\ud83c[\\udde6\\udde8-\\udded\\uddf0-\\uddff]|\\ud83c\\uddf3\\ud83c[\\udde6\\udde8\\uddea-\\uddec\\uddee\\uddf1\\uddf4\\uddf5\\uddf7\\uddfa\\uddff]|\\ud83c\\uddf4\\ud83c\\uddf2|\\ud83c\\uddf5\\ud83c[\\udde6\\uddea-\\udded\\uddf0-\\uddf3\\uddf7-\\uddf9\\uddfc\\uddfe]|\\ud83c\\uddf6\\ud83c\\udde6|\\ud83c\\uddf7\\ud83c[\\uddea\\uddf4\\uddf8\\uddfa\\uddfc]|\\ud83c\\uddf8\\ud83c[\\udde6-\\uddea\\uddec-\\uddf4\\uddf7-\\uddf9\\uddfb\\uddfd-\\uddff]|\\ud83c\\uddf9\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\udded\\uddef-\\uddf4\\uddf7\\uddf9\\uddfb\\uddfc\\uddff]|\\ud83c\\uddfa\\ud83c[\\udde6\\uddec\\uddf2\\uddf3\\uddf8\\uddfe\\uddff]|\\ud83c\\uddfb\\ud83c[\\udde6\\udde8\\uddea\\uddec\\uddee\\uddf3\\uddfa]|\\ud83c\\uddfc\\ud83c[\\uddeb\\uddf8]|\\ud83c\\uddfd\\ud83c\\uddf0|\\ud83c\\uddfe\\ud83c[\\uddea\\uddf9]|\\ud83c\\uddff\\ud83c[\\udde6\\uddf2\\uddfc]|\\ud83c[\\udccf\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01\\ude32-\\ude36\\ude38-\\ude3a\\ude50\\ude51\\udf00-\\udf20\\udf2d-\\udf35\\udf37-\\udf7c\\udf7e-\\udf84\\udf86-\\udf93\\udfa0-\\udfc1\\udfc5\\udfc6\\udfc8\\udfc9\\udfcf-\\udfd3\\udfe0-\\udff0\\udff4\\udff8-\\udfff]|\\ud83d[\\udc00-\\udc3e\\udc40\\udc44\\udc45\\udc51-\\udc65\\udc6a\\udc6f\\udc79-\\udc7b\\udc7d-\\udc80\\udc84\\udc88-\\udc8e\\udc90\\udc92-\\udca9\\udcab-\\udcfc\\udcff-\\udd3d\\udd4b-\\udd4e\\udd50-\\udd67\\udda4\\uddfb-\\ude44\\ude48-\\ude4a\\ude80-\\udea2\\udea4-\\udeb3\\udeb7-\\udebf\\udec1-\\udec5\\uded0-\\uded2\\uded5-\\uded7\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd1d\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78\\udd7a-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcb\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7a\\ude80-\\ude86\\ude90-\\udea8\\udeb0-\\udeb6\\udec0-\\udec2\\uded0-\\uded6]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f/g;\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport Spinner from './Spinner';\n\nimport './Loading.scss';\n\ntype OwnProps = {\n color?: 'blue' | 'white' | 'black';\n};\n\nconst Loading: FC<OwnProps> = ({ color = 'blue' }) => {\n return (\n <div className=\"Loading\">\n <Spinner color={color} withBackground={color === 'white'} />\n </div>\n );\n};\n\nexport default memo(Loading);\n","import { MouseEvent as ReactMouseEvent, RefObject } from 'react';\n\nimport React, {\n FC, useRef, useCallback, useState,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Spinner from './Spinner';\nimport RippleEffect from './RippleEffect';\n\nimport './Button.scss';\n\nexport type OwnProps = {\n ref?: RefObject<HTMLButtonElement | HTMLAnchorElement>;\n type?: 'button' | 'submit' | 'reset';\n children: any;\n size?: 'default' | 'smaller' | 'tiny';\n color?: 'primary' | 'secondary' | 'gray' | 'danger' | 'translucent' | 'translucent-white' | 'dark';\n className?: string;\n round?: boolean;\n pill?: boolean;\n fluid?: boolean;\n isText?: boolean;\n isLoading?: boolean;\n ariaLabel?: string;\n href?: string;\n download?: string;\n disabled?: boolean;\n ripple?: boolean;\n faded?: boolean;\n tabIndex?: number;\n isRtl?: boolean;\n onClick?: (e: ReactMouseEvent<HTMLButtonElement, MouseEvent>) => void;\n onContextMenu?: (e: ReactMouseEvent<HTMLButtonElement, MouseEvent>) => void;\n onMouseDown?: (e: ReactMouseEvent<HTMLButtonElement>) => void;\n onMouseEnter?: NoneToVoidFunction;\n onMouseLeave?: NoneToVoidFunction;\n onFocus?: NoneToVoidFunction;\n};\n\n// Longest animation duration;\nconst CLICKED_TIMEOUT = 400;\n\nconst Button: FC<OwnProps> = ({\n ref,\n type = 'button',\n onClick,\n onContextMenu,\n onMouseDown,\n onMouseEnter,\n onMouseLeave,\n onFocus,\n children,\n size = 'default',\n color = 'primary',\n className,\n round,\n pill,\n fluid,\n isText,\n isLoading,\n ariaLabel,\n href,\n download,\n disabled,\n ripple,\n faded,\n tabIndex,\n isRtl,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let elementRef = useRef<HTMLButtonElement | HTMLAnchorElement>(null);\n if (ref) {\n elementRef = ref;\n }\n\n const [isClicked, setIsClicked] = useState(false);\n\n const fullClassName = buildClassName(\n 'Button',\n className,\n size,\n color,\n round && 'round',\n pill && 'pill',\n fluid && 'fluid',\n disabled && 'disabled',\n isText && 'text',\n isLoading && 'loading',\n ripple && 'has-ripple',\n faded && 'faded',\n isClicked && 'clicked',\n );\n\n const handleClick = useCallback((e: ReactMouseEvent<HTMLButtonElement, MouseEvent>) => {\n if (!disabled && onClick) {\n onClick(e);\n }\n\n setIsClicked(true);\n setTimeout(() => {\n setIsClicked(false);\n }, CLICKED_TIMEOUT);\n }, [disabled, onClick]);\n\n const handleMouseDown = useCallback((e: ReactMouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n if (!disabled && onMouseDown) {\n onMouseDown(e);\n }\n }, [onMouseDown, disabled]);\n\n if (href) {\n return (\n <a\n ref={elementRef as RefObject<HTMLAnchorElement>}\n className={fullClassName}\n href={href}\n title={ariaLabel}\n download={download}\n tabIndex={tabIndex}\n dir={isRtl ? 'rtl' : undefined}\n >\n {children}\n {!disabled && ripple && (\n <RippleEffect />\n )}\n </a>\n );\n }\n\n return (\n // eslint-disable-next-line react/button-has-type\n <button\n ref={elementRef as RefObject<HTMLButtonElement>}\n type={type}\n className={fullClassName}\n onClick={handleClick}\n onContextMenu={onContextMenu}\n onMouseDown={handleMouseDown}\n onMouseEnter={onMouseEnter && !disabled ? onMouseEnter : undefined}\n onMouseLeave={onMouseLeave && !disabled ? onMouseLeave : undefined}\n onFocus={onFocus && !disabled ? onFocus : undefined}\n aria-label={ariaLabel}\n title={ariaLabel}\n tabIndex={tabIndex}\n dir={isRtl ? 'rtl' : undefined}\n >\n {isLoading ? (\n <div>\n <span dir={isRtl ? 'auto' : undefined}>Please wait..</span>\n <Spinner color={isText ? 'blue' : 'white'} />\n </div>\n ) : children}\n {!disabled && ripple && (\n <RippleEffect />\n )}\n </button>\n );\n};\n\nexport default Button;\n","import React from '../../../lib/teact/teact';\nimport EMOJI_REGEX, { removeVS16s } from '../../../lib/twemojiRegex';\n\nimport { RE_LINK_TEMPLATE, RE_MENTION_TEMPLATE } from '../../../config';\nimport { IS_EMOJI_SUPPORTED } from '../../../util/environment';\nimport { nativeToUnfified } from '../../../util/emoji';\nimport buildClassName from '../../../util/buildClassName';\n\nimport MentionLink from '../../middle/message/MentionLink';\nimport SafeLink from '../SafeLink';\n\ntype TextPart = string | Element;\n\nconst RE_LETTER_OR_DIGIT = /^[\\d\\wа-яё]$/i;\nconst SIMPLE_MARKDOWN_REGEX = /(\\*\\*|__).+?\\1/g;\n\nexport default function renderText(\n part: TextPart,\n filters: Array<(\n 'escape_html' | 'hq_emoji' | 'emoji' | 'emoji_html' | 'br' | 'br_html' | 'highlight' | 'links' |\n 'simple_markdown' | 'simple_markdown_html'\n )> = ['emoji'],\n params?: { highlight: string | undefined },\n): TextPart[] {\n if (typeof part !== 'string') {\n return [part];\n }\n\n return filters.reduce((text, filter) => {\n switch (filter) {\n case 'escape_html':\n return escapeHtml(text);\n\n case 'hq_emoji':\n EMOJI_REGEX.lastIndex = 0;\n return replaceEmojis(text, 'big', 'jsx');\n\n case 'emoji':\n EMOJI_REGEX.lastIndex = 0;\n return replaceEmojis(text, 'small', 'jsx');\n\n case 'emoji_html':\n EMOJI_REGEX.lastIndex = 0;\n return replaceEmojis(text, 'small', 'html');\n\n case 'br':\n return addLineBreaks(text, 'jsx');\n\n case 'br_html':\n return addLineBreaks(text, 'html');\n\n case 'highlight':\n return addHighlight(text, params!.highlight);\n\n case 'links':\n return addLinks(text);\n\n case 'simple_markdown':\n return replaceSimpleMarkdown(text, 'jsx');\n\n case 'simple_markdown_html':\n return replaceSimpleMarkdown(text, 'html');\n }\n\n return text;\n }, [part] as TextPart[]);\n}\n\nfunction escapeHtml(textParts: TextPart[]): TextPart[] {\n const divEl = document.createElement('div');\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n divEl.innerText = part;\n\n return [...result, divEl.innerHTML];\n }, [] as TextPart[]);\n}\n\nfunction replaceEmojis(textParts: TextPart[], size: 'big' | 'small', type: 'jsx' | 'html'): TextPart[] {\n if (IS_EMOJI_SUPPORTED) {\n return textParts;\n }\n\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n const parts = part.split(EMOJI_REGEX);\n const emojis = part.match(EMOJI_REGEX) || [];\n result.push(parts[0]);\n\n return emojis.reduce((emojiResult: TextPart[], emoji, i) => {\n const code = nativeToUnfified(removeVS16s(emoji));\n const className = buildClassName(\n 'emoji',\n size === 'small' && 'emoji-small',\n );\n if (type === 'jsx') {\n emojiResult.push(\n <img\n className={className}\n src={`./img-apple-${size === 'big' ? '160' : '64'}/${code}.png`}\n alt={emoji}\n />,\n );\n }\n if (type === 'html') {\n emojiResult.push(\n // For preventing extra spaces in html\n // eslint-disable-next-line max-len\n `<img draggable=\"false\" class=\"${className}\" src=\"./img-apple-${size === 'big' ? '160' : '64'}/${code}.png\" alt=\"${emoji}\" />`,\n );\n }\n\n const index = i * 2 + 2;\n if (parts[index]) {\n emojiResult.push(parts[index]);\n }\n\n return emojiResult;\n }, result);\n }, [] as TextPart[]);\n}\n\nfunction addLineBreaks(textParts: TextPart[], type: 'jsx' | 'html'): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n return [...result, ...part\n .split(/\\r\\n|\\r|\\n/g)\n .reduce((parts: TextPart[], line: string, i, source) => {\n // This adds non-breaking space if line was indented with spaces, to preserve the indentation\n const trimmedLine = line.trimLeft();\n const indentLength = line.length - trimmedLine.length;\n parts.push(String.fromCharCode(160).repeat(indentLength) + trimmedLine);\n\n if (i !== source.length - 1) {\n parts.push(\n type === 'jsx' ? <br /> : '<br />',\n );\n }\n\n return parts;\n }, [])];\n }, [] as TextPart[]);\n}\n\nfunction addHighlight(textParts: TextPart[], highlight: string | undefined): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string' || !highlight) {\n return [...result, part];\n }\n\n const lowerCaseText = part.toLowerCase();\n const queryPosition = lowerCaseText.indexOf(highlight.toLowerCase());\n const nextSymbol = lowerCaseText[queryPosition + highlight.length];\n if (queryPosition < 0 || (nextSymbol && nextSymbol.match(RE_LETTER_OR_DIGIT))) {\n return [...result, part];\n }\n\n const newParts: TextPart[] = [];\n newParts.push(part.substring(0, queryPosition));\n newParts.push(\n <span className=\"matching-text-highlight\">\n {part.substring(queryPosition, queryPosition + highlight.length)}\n </span>,\n );\n newParts.push(part.substring(queryPosition + highlight.length));\n\n return [...result, ...newParts];\n }, [] as TextPart[]);\n}\n\nconst RE_LINK = new RegExp(`${RE_LINK_TEMPLATE}|${RE_MENTION_TEMPLATE}`, 'ig');\n\nfunction addLinks(textParts: TextPart[]): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n const links = part.match(RE_LINK);\n if (!links || !links.length) {\n return [...result, part];\n }\n\n const content: TextPart[] = [];\n\n let nextLink = links.shift();\n let lastIndex = 0;\n while (nextLink) {\n const index = part.indexOf(nextLink, lastIndex);\n content.push(part.substring(lastIndex, index));\n if (nextLink.startsWith('@')) {\n content.push(\n <MentionLink username={nextLink}>\n {nextLink}\n </MentionLink>,\n );\n } else {\n if (nextLink.endsWith('?')) {\n nextLink = nextLink.slice(0, nextLink.length - 1);\n }\n\n content.push(\n <SafeLink text={nextLink} url={nextLink} />,\n );\n }\n lastIndex = index + nextLink.length;\n nextLink = links.shift();\n }\n content.push(part.substring(lastIndex));\n\n return [...result, ...content];\n }, [] as TextPart[]);\n}\n\nfunction replaceSimpleMarkdown(textParts: TextPart[], type: 'jsx' | 'html'): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n const parts = part.split(SIMPLE_MARKDOWN_REGEX);\n const entities = part.match(SIMPLE_MARKDOWN_REGEX) || [];\n result.push(parts[0]);\n\n return entities.reduce((entityResult: TextPart[], entity, i) => {\n if (type === 'jsx') {\n entityResult.push(\n entity.startsWith('**')\n ? <b>{entity.replace(/\\*\\*/g, '')}</b>\n : <i>{entity.replace(/__/g, '')}</i>,\n );\n } else {\n entityResult.push(\n entity.startsWith('**')\n ? `<b>${entity.replace(/\\*\\*/g, '')}</b>`\n : `<i>${entity.replace(/__/g, '')}</i>`,\n );\n }\n\n const index = i * 2 + 2;\n if (parts[index]) {\n entityResult.push(parts[index]);\n }\n\n return entityResult;\n }, result);\n }, [] as TextPart[]);\n}\n","// This data was received from Telegram Desktop (Telegram/Resources/numbers.txt)\nconst DATA = `AF🇦🇫93Afghanistan333\nAO🇦🇴244Angola333\nAL🇦🇱355Albania234\nAD🇦🇩376Andorra222\nAE🇦🇪971United Arab Emirates234\nAI🇦🇮1264Anguilla34\nAR🇦🇷54Argentina\nAM🇦🇲374Armenia233\nAG🇦🇬1268Antigua and Barbuda34\nAU🇦🇺61Australia333\nAS🇦🇸1684American Samoa34\nAT🇦🇹43Austria\nAW🇦🇼297Aruba34\nAZ🇦🇿994Azerbaijan2322\nBI🇧🇮257Burundi224\nBE🇧🇪32Belgium3222\nBJ🇧🇯229Benin233\nBF🇧🇫226Burkina Faso2222\nBD🇧🇩880Bangladesh\nBG🇧🇬359Bulgaria\nBH🇧🇭973Bahrain44\nBS🇧🇸1242Bahamas34\nBA🇧🇦387Bosnia and Herzegovina\nBY🇧🇾375Belarus2322\nBZ🇧🇿501Belize\nBO🇧🇴591Bolivia134\nBR🇧🇷55Brazil254\nBB🇧🇧1246Barbados34\nBM🇧🇲1441Bermuda34\nBN🇧🇳673Brunei34\nBQ🇧🇶599Bonaire, Sint Eustatius and Saba\nBT🇧🇹975Bhutan\nBW🇧🇼267Botswana233\nCF🇨🇫236Central African Republic2222\nCA🇨🇦1Canada334\nCH🇨🇭41Switzerland234\nCK🇨🇰682Cook Islands\nCL🇨🇱56Chile144\nCN🇨🇳86China344\nCI🇨🇮225Côte d\\`Ivoire233\nCM🇨🇲237Cameroon44\nCD🇨🇩243DR Congo234\nCG🇨🇬242Republic of the Congo234\nCO🇨🇴57Colombia334\nKM🇰🇲269Comoros34\nCV🇨🇻238Cape Verde34\nCR🇨🇷506Costa Rica\nCU🇨🇺53Cuba44\nCY🇨🇾357Cyprus44\nCW🇨🇼599Curaçao\nCZ🇨🇿420Czech Republic\nDE🇩🇪49Germany38\nDJ🇩🇯253Djibouti2222\nDM🇩🇲1767Dominica34\nDK🇩🇰45Denmark44\nDO🇩🇴1Dominican Republic334\nDZ🇩🇿213Algeria3222\nEC🇪🇨593Ecuador\nEG🇪🇬20Egypt234\nER🇪🇷291Eritrea133\nES🇪🇸34Spain333\nEE🇪🇪372Estonia\nET🇪🇹251Ethiopia234\nFI🇫🇮358Finland\nFJ🇫🇯679Fiji\nFK🇫🇰500Falkland Islands\nFM🇫🇲691Micronesia\nFO🇫🇴298Faroe Islands33\nFR🇫🇷33France12222\nGA🇬🇦241Gabon1222\nGB🇬🇧44United Kingdom46\nGE🇬🇪995Georgia\nGF🇬🇫594French Guiana\nGH🇬🇭233Ghana\nGI🇬🇮350Gibraltar44\nGL🇬🇱299Greenland33\nGN🇬🇳224Guinea333\nGM🇬🇲220Gambia34\nGP🇬🇵590Guadeloupe\nGU🇬🇺1671Guam34\nGW🇬🇼245Guinea-Bissau34\nGQ🇬🇶240Equatorial Guinea333\nGR🇬🇷30Greece244\nGD🇬🇩1473Grenada34\nGT🇬🇹502Guatemala134\nGY🇬🇾592Guyana\nHK🇭🇰852Hong Kong\nHN🇭🇳504Honduras44\nHR🇭🇷385Croatia\nHT🇭🇹509Haiti\nHU🇭🇺36Hungary234\nID🇮🇩62Indonesia\nIN🇮🇳91India55\nIO🇩🇬246Diego Garcia34\nIE🇮🇪353Ireland234\nIR🇮🇷98Iran334\nIQ🇮🇶964Iraq334\nIS🇮🇸354Iceland34\nIL🇮🇱972Israel234\nIT🇮🇹39Italy334\nJM🇯🇲1876Jamaica34\nJO🇯🇴962Jordan144\nJP🇯🇵81Japan244\nKZ🇰🇿7Kazakhstan3322\nKE🇰🇪254Kenya333\nKG🇰🇬996Kyrgyzstan\nKH🇰🇭855Cambodia\nKI🇰🇮686Kiribati\nKN🇰🇳1869Saint Kitts and Nevis34\nKR🇰🇷82South Korea\nKW🇰🇼965Kuwait44\nKY🇰🇾1345Cayman Islands34\nLA🇱🇦856Laos\nLB🇱🇧961Lebanon\nLR🇱🇷231Liberia\nLY🇱🇾218Libya234\nLC🇱🇨1758Saint Lucia34\nLI🇱🇮423Liechtenstein\nLK🇱🇰94Sri Lanka234\nLS🇱🇸266Lesotho233\nLT🇱🇹370Lithuania35\nLU🇱🇺352Luxembourg\nLV🇱🇻371Latvia35\nMA🇲🇦212Morocco234\nMC🇲🇨377Monaco44\nMD🇲🇩373Moldova233\nMG🇲🇬261Madagascar2232\nMP🇲🇵1670Northern Mariana Islands34\nMO🇲🇴853Macau\nMS🇲🇸1664Montserrat34\nMV🇲🇻960Maldives\nMX🇲🇽52Mexico\nMH🇲🇭692Marshall Islands\nMK🇲🇰389Macedonia\nML🇲🇱223Mali44\nMT🇲🇹356Malta2222\nMM🇲🇲95Myanmar\nME🇲🇪382Montenegro\nMN🇲🇳976Mongolia\nMZ🇲🇿258Mozambique234\nMQ🇲🇶596Martinique\nMR🇲🇷222Mauritania44\nMU🇲🇺230Mauritius\nMW🇲🇼265Malawi\nMY🇲🇾60Malaysia\nNA🇳🇦264Namibia234\nNC🇳🇨687New Caledonia6\nNE🇳🇪227Niger2222\nNF🇳🇫672Norfolk Island\nNG🇳🇬234Nigeria\nNI🇳🇮505Nicaragua44\nNL🇳🇱31Netherlands12222\nNO🇳🇴47Norway44\nNP🇳🇵977Nepal\nNU🇳🇺683Niue\nNR🇳🇷674Nauru\nNZ🇳🇿64New Zealand\nOM🇴🇲968Oman44\nPK🇵🇰92Pakistan334\nPA🇵🇦507Panama44\nPE🇵🇪51Peru333\nPF🇵🇫689French Polynesia\nPH🇵🇭63Philippines334\nPM🇵🇲508Saint Pierre and Miquelon\nPR🇵🇷1Puerto Rico334\nPS🇵🇸970Palestine324\nPW🇵🇼680Palau\nPG🇵🇬675Papua New Guinea\nPL🇵🇱48Poland333\nKP🇰🇵850North Korea\nPT🇵🇹351Portugal144\nPY🇵🇾595Paraguay333\nQA🇶🇦974Qatar\nRE🇷🇪262Réunion333\nRO🇷🇴40Romania333\nRU🇷🇺7Russia3322\nRW🇷🇼250Rwanda333\nSA🇸🇦966Saudi Arabia\nSD🇸🇩249Sudan234\nSN🇸🇳221Senegal234\nSG🇸🇬65Singapore44\nSH🇸🇭290Saint Helena23\nSH🇸🇭247Saint Helena4\nSB🇸🇧677Solomon Islands\nSL🇸🇱232Sierra Leone233\nSV🇸🇻503El Salvador44\nSM🇸🇲378San Marino334\nSO🇸🇴252Somalia233\nRS🇷🇸381Serbia234\nSS🇸🇸211South Sudan234\nST🇸🇹239São Tomé and Príncipe25\nSR🇸🇷597Suriname34\nSK🇸🇰421Slovakia\nSI🇸🇮386Slovenia\nSE🇸🇪46Sweden234\nSZ🇸🇿268Swaziland44\nSC🇸🇨248Seychelles1222\nSX🇸🇽1721Sint Maarten34\nSY🇸🇾963Syria\nTC🇹🇨1649Turks and Caicos Islands34\nTD🇹🇩235Chad2222\nTG🇹🇬228Togo233\nTH🇹🇭66Thailand144\nTJ🇹🇯992Tajikistan\nTK🇹🇰690Tokelau\nTM🇹🇲993Turkmenistan26\nTL🇹🇱670Timor-Leste\nTO🇹🇴676Tonga\nTT🇹🇹1868Trinidad and Tobago34\nTN🇹🇳216Tunisia233\nTR🇹🇷90Turkey334\nTV🇹🇻688Tuvalu\nTW🇹🇼886Taiwan\nTZ🇹🇿255Tanzania234\nUG🇺🇬256Uganda234\nUA🇺🇦380Ukraine2322\nUY🇺🇾598Uruguay44\nUS🇺🇸1United States334\nUZ🇺🇿998Uzbekistan27\nVA🇻🇦3Vatican City\nVC🇻🇨1784Saint Vincent and the Grenadines34\nVE🇻🇪58Venezuela334\nVG🇻🇬1284British Virgin Islands34\nVI🇻🇮1340US Virgin Islands34\nVN🇻🇳84Vietnam\nVU🇻🇺678Vanuatu\nWF🇼🇫681Wallis and Futuna\nWS🇼🇸685Samoa\nXK🇽🇰383Kosovo44\nYE🇾🇪967Yemen333\nZA🇿🇦27South Africa234\nZM🇿🇲260Zambia234\nZW🇿🇼263Zimbabwe234`;\n\nconst formatsCache: Record<string, RegExp> = {};\nexport const defaultPhoneNumberFormat = /(\\d{1,3})(\\d{1,3})?(\\d{1,3})?(\\d{1,3})?(\\d{1,3})?/;\n\nconst parsed = DATA\n .split('\\n')\n .map((str) => {\n const id = str.substr(0, 2);\n const flag = str.substr(2, 4);\n const code = `+${str.match(/\\d+/)![0]}`;\n const name = str.split(/\\d+/)[1];\n const format = str.match(/\\d+$/);\n const phoneFormat = getPhoneNumberFormat(format);\n\n return {\n id, flag, code, name, phoneFormat,\n };\n });\n\nfunction getPhoneNumberFormat(format: RegExpMatchArray | null) {\n if (!format) {\n return defaultPhoneNumberFormat;\n }\n\n const formatValue = format[0] as string;\n let phoneNumberFormat;\n\n if (!formatsCache[formatValue]) {\n const phoneNumberGroups = formatValue.split('').map(Number);\n phoneNumberFormat = phoneNumberGroups.reduce((result, count, i) => {\n return `${result}(\\\\d{1,${count}})${i > 0 ? '?' : ''}`;\n }, '');\n formatsCache[formatValue] = new RegExp(`${phoneNumberFormat}${'()?'.repeat(5 - phoneNumberGroups.length)}`);\n }\n\n return formatsCache[formatValue];\n}\n\nexport default parsed;\n","import countryList, { defaultPhoneNumberFormat } from './countries';\n\nexport function getCountryById(id: string) {\n return countryList.find((c) => c.id === id) as Country;\n}\n\n// Empty groups are used to preserve 5 callback arguments for `replace` method\nfunction getPhoneNumberFormat(country?: Country) {\n return country ? country.phoneFormat : defaultPhoneNumberFormat;\n}\n\nexport function getCountryFromPhoneNumber(input: string) {\n let phoneNumber = input.replace(/[^\\d+]+/g, '');\n if (!phoneNumber.startsWith('+')) {\n phoneNumber = `+${phoneNumber}`;\n }\n\n const possibleCountries = countryList\n .filter((country: Country) => phoneNumber.startsWith(country.code))\n .sort((a, b) => a.code.length - b.code.length);\n\n return possibleCountries[possibleCountries.length - 1];\n}\n\nexport function formatPhoneNumber(input: string, country?: Country) {\n let phoneNumber = input.replace(/[^\\d]+/g, '');\n if (country) {\n phoneNumber = phoneNumber.substr(country.code.length - 1);\n } else if (input.startsWith('+')) {\n return input;\n }\n\n phoneNumber = phoneNumber.replace(getPhoneNumberFormat(country), (_, p1, p2, p3, p4, p5) => {\n const separator = country && country.id === 'GB' ? ' ' : '-';\n\n let output = '';\n if (p1) output = `${p1}`;\n if (p2) output += ` ${p2}`;\n if (p3) output += `${separator}${p3}`;\n if (p4) output += `${separator}${p4}`;\n if (p5) output += `${separator}${p5}`;\n return output;\n });\n\n return phoneNumber;\n}\n\nexport function formatPhoneNumberWithCode(phoneNumber: string) {\n const numberWithPlus = phoneNumber.startsWith('+') ? phoneNumber : `+${phoneNumber}`;\n const country = getCountryFromPhoneNumber(numberWithPlus);\n if (!country) {\n return numberWithPlus;\n }\n return `${country.code} ${formatPhoneNumber(numberWithPlus, country)}`;\n}\n\nexport { countryList };\n","import { useEffect } from '../lib/teact/teact';\n\nimport {\n BundleModules, Bundles, getModuleFromMemory, loadModule, addLoadListener,\n} from '../util/moduleLoader';\n\nimport useForceUpdate from './useForceUpdate';\n\nexport default <B extends Bundles, M extends BundleModules<B>>(\n bundleName: B, moduleName: M, noLoad = false, autoUpdate = false,\n) => {\n const module = getModuleFromMemory(bundleName, moduleName);\n const forceUpdate = useForceUpdate();\n\n if (autoUpdate) {\n // Use effect and cleanup for listener removal\n addLoadListener(forceUpdate);\n }\n\n useEffect(() => {\n if (!noLoad && !module) {\n loadModule(bundleName, moduleName).then(forceUpdate);\n }\n }, [bundleName, forceUpdate, module, moduleName, noLoad]);\n\n return module;\n};\n","import { useCallback, useState } from '../lib/teact/teact';\n\nexport default (initial = false): [boolean, AnyToVoidFunction, AnyToVoidFunction] => {\n const [value, setValue] = useState(initial);\n\n const setTrue = useCallback(() => {\n setValue(true);\n }, []);\n\n const setFalse = useCallback(() => {\n setValue(false);\n }, []);\n\n return [value, setTrue, setFalse];\n};\n","import React, { FC } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Spinner.scss';\n\nconst Spinner: FC<{\n color?: 'blue' | 'white' | 'black' | 'green' | 'gray';\n withBackground?: boolean;\n}> = ({\n color = 'blue',\n withBackground,\n}) => {\n return (\n <div className={buildClassName('Spinner', color, withBackground && 'with-background')}>\n <div />\n </div>\n );\n};\n\nexport default Spinner;\n","import { DEBUG_ALERT_MSG } from '../config';\nimport { throttle } from './schedulers';\n\nwindow.addEventListener('error', handleErrorEvent);\nwindow.addEventListener('unhandledrejection', handleErrorEvent);\n\n// eslint-disable-next-line prefer-destructuring\nconst APP_ENV = process.env.APP_ENV;\n\nfunction handleErrorEvent(e: ErrorEvent | PromiseRejectionEvent) {\n e.preventDefault();\n\n handleError(e instanceof ErrorEvent ? e.error : e.reason);\n}\n\nconst throttledAlert = throttle(window.alert, 1000);\n\nexport function handleError(err: Error) {\n // eslint-disable-next-line no-console\n console.error(err);\n\n if (APP_ENV === 'development' || APP_ENV === 'staging') {\n throttledAlert(`${DEBUG_ALERT_MSG}\\n\\n${(err && err.message) || err}\\n${err && err.stack}`);\n }\n}\n","export default function arePropsShallowEqual(currentProps: AnyLiteral, newProps: AnyLiteral) {\n if (currentProps === newProps) {\n return true;\n }\n\n const currentKeys = Object.keys(currentProps);\n const currentKeysLength = currentKeys.length;\n const newKeysLength = Object.keys(newProps).length;\n\n if (currentKeysLength !== newKeysLength) {\n return false;\n }\n\n if (currentKeysLength === 0) {\n return true;\n }\n\n for (let i = 0; i < currentKeysLength; i++) {\n const prop = currentKeys[i];\n if (currentProps[prop] !== newProps[prop]) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function getUnequalProps(currentProps: AnyLiteral, newProps: AnyLiteral) {\n const currentKeys = Object.keys(currentProps);\n const currentKeysLength = currentKeys.length;\n const newKeysLength = Object.keys(newProps).length;\n\n if (currentKeysLength !== newKeysLength) {\n return ['%LENGTH%'];\n }\n\n return currentKeys.filter((prop) => currentProps[prop] !== newProps[prop]);\n}\n","import { LangFn } from '../hooks/useLang';\n\nconst WEEKDAYS_FULL = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\nconst MONTHS_FULL = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December',\n];\n\nconst MONTHS_FULL_LOWERCASE = MONTHS_FULL.map((month) => month.toLowerCase());\nconst MIN_SEARCH_YEAR = 2015;\nconst MAX_DAY_IN_MONTH = 31;\nconst MAX_MONTH_IN_YEAR = 12;\nexport const MILISECONDS_IN_DAY = 24 * 60 * 60 * 1000;\n\nexport function getDayStart(datetime: number | Date) {\n const date = new Date(datetime);\n date.setHours(0, 0, 0, 0);\n return date;\n}\n\nexport function getDayStartAt(datetime: number | Date) {\n return getDayStart(datetime).getTime();\n}\n\nexport function toYearMonth(timestamp: number) {\n const date = new Date(timestamp * 1000);\n return `${date.getFullYear()}-${date.getMonth()}`;\n}\n\nfunction toIsoString(date: Date) {\n return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`;\n}\n\nexport function formatTime(datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n\n return `${hours}:${minutes}`;\n}\n\nexport function formatPastTimeShort(lang: LangFn, datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n const today = getDayStart(new Date());\n if (date >= today) {\n return formatTime(date);\n }\n\n const weekAgo = new Date(today);\n weekAgo.setDate(today.getDate() - 7);\n if (date >= weekAgo) {\n return lang(`Weekday.Short${WEEKDAYS_FULL[date.getDay()]}`);\n }\n\n const withYear = date.getFullYear() !== today.getFullYear();\n const format = (\n lang(withYear ? 'formatDateScheduleYear' : 'formatDateSchedule')\n || (withYear ? 'd MMM yyyy' : 'd MMM')\n );\n\n return formatDate(lang, date, format);\n}\n\nexport function formatFullDate(lang: LangFn, datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n const format = lang('formatterYearMax') || 'dd.MM.yyyy';\n\n return formatDate(lang, date, format);\n}\n\nexport function formatMonthAndYear(lang: LangFn, date: Date, isShort = false) {\n const format = lang(isShort ? 'formatterMonthYear2' : 'formatterMonthYear') || 'MMM yyyy';\n\n return formatDate(lang, date, format);\n}\n\nexport function formatHumanDate(lang: LangFn, datetime: number | Date, isShort = false, noWeekdays = false) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n const today = getDayStart(new Date());\n\n if (!noWeekdays) {\n if (toIsoString(date) === toIsoString(today)) {\n return (isShort ? lowerFirst : upperFirst)(lang('Weekday.Today'));\n }\n\n const yesterday = new Date(today);\n yesterday.setDate(today.getDate() - 1);\n if (toIsoString(date) === toIsoString(yesterday)) {\n return (isShort ? lowerFirst : upperFirst)(lang('Weekday.Yesterday'));\n }\n\n const weekAgo = new Date(today);\n const weekAhead = new Date(today);\n weekAgo.setDate(today.getDate() - 7);\n weekAhead.setDate(today.getDate() + 7);\n if (date >= weekAgo && date <= weekAhead) {\n const weekDay = WEEKDAYS_FULL[date.getDay()];\n return isShort\n ? lowerFirst(lang(`Weekday.Short${weekDay}`))\n : upperFirst(lang(`Weekday.${weekDay}`));\n }\n }\n\n const withYear = date.getFullYear() !== today.getFullYear();\n const formatKey = isShort\n ? (withYear ? 'formatDateScheduleYear' : 'formatDateSchedule')\n : (withYear ? 'chatFullDate' : 'chatDate');\n const format = lang(formatKey) || 'd MMMM yyyy';\n\n return (isShort ? lowerFirst : upperFirst)(formatDate(lang, date, format));\n}\n\nfunction formatDate(lang: LangFn, date: Date, format: string) {\n const day = date.getDate();\n const monthIndex = date.getMonth();\n\n return format\n .replace('LLLL', lang(MONTHS_FULL[monthIndex]))\n .replace('MMMM', lang(`Month.Gen${MONTHS_FULL[monthIndex]}`))\n .replace('MMM', lang(`Month.Short${MONTHS_FULL[monthIndex]}`))\n .replace('MM', String(monthIndex + 1).padStart(2, '0'))\n .replace('dd', String(day).padStart(2, '0'))\n .replace('d', String(day))\n .replace('yyyy', String(date.getFullYear()));\n}\n\nexport function formatMediaDateTime(lang: LangFn, datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n return `${formatHumanDate(lang, date, true)}, ${formatTime(date)}`;\n}\n\nexport function formatMediaDuration(duration: number) {\n const hours = Math.floor(duration / 3600);\n const minutes = Math.floor((duration % 3600) / 60);\n const seconds = Math.floor(duration % 3600 % 60);\n\n let string = '';\n if (hours > 0) {\n string += `${String(hours).padStart(2, '0')}:`;\n string += `${String(minutes).padStart(2, '0')}:`;\n } else {\n string += `${String(minutes)}:`;\n }\n string += String(seconds).padStart(2, '0');\n\n return string;\n}\n\nexport function formatVoiceRecordDuration(durationInMs: number) {\n const parts = [];\n\n let milliseconds = durationInMs % 1000;\n durationInMs -= milliseconds;\n milliseconds = Math.floor(milliseconds / 10);\n\n durationInMs = Math.floor(durationInMs / 1000);\n const seconds = durationInMs % 60;\n durationInMs -= seconds;\n\n durationInMs = Math.floor(durationInMs / 60);\n const minutes = durationInMs % 60;\n durationInMs -= minutes;\n\n durationInMs = Math.floor(durationInMs / 60);\n const hours = durationInMs % 60;\n\n if (hours > 0) {\n parts.push(String(hours).padStart(2, '0'));\n }\n parts.push(String(minutes).padStart(hours > 0 ? 2 : 1, '0'));\n parts.push(String(seconds).padStart(2, '0'));\n\n return `${parts.join(':')},${String(milliseconds).padStart(2, '0')}`;\n}\n\nexport function formatDateToString(date: Date, locale = 'en-US') {\n return date.toLocaleString(\n locale,\n {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n },\n );\n}\n\nfunction isValidDate(day: number, month: number, year = 2021): boolean {\n if (month > (MAX_MONTH_IN_YEAR - 1) || day > MAX_DAY_IN_MONTH) {\n return false;\n }\n const date = new Date(year, month, day);\n return !Number.isNaN(date.getTime()) && date.getDate() === day;\n}\n\nexport function parseDateString(query = ''): string | undefined {\n const matchStringDate = query.match(/\\d{1,2}\\s[a-zA-Z]{3,}/);\n const matchEuropeStringDate = query.match(/[a-zA-Z]{3,}\\s\\d{1,2}/);\n const matchNumberDate = query.match(/\\d{1,2}[./-]\\d{1,2}([./-]\\d{2,4})?/);\n if (!matchStringDate && !matchNumberDate && !matchEuropeStringDate) {\n return undefined;\n }\n\n if (matchNumberDate) {\n const [date, month, year] = query.split(/[./-]/).map(Number);\n return !(year && year < MIN_SEARCH_YEAR) && isValidDate(date, month - 1, year || undefined)\n ? `${year ? `${year}-` : ''}${String(month).padStart(2, '0')}-${String(date).padStart(2, '0')}`\n : undefined;\n }\n\n const dateParts = query.split(' ');\n const date = matchStringDate ? dateParts[0] : dateParts[1];\n const month = (matchStringDate ? dateParts[1] : dateParts[0]).toLowerCase();\n const monthIndex = MONTHS_FULL_LOWERCASE.findIndex((item) => item.startsWith(month));\n\n return monthIndex !== -1 && isValidDate(Number(date), monthIndex)\n ? `${String(monthIndex + 1).padStart(2, '0')}-${String(date).padStart(2, '0')}`\n : undefined;\n}\n\nexport function timestampPlusDay(timestamp: number) {\n return timestamp + MILISECONDS_IN_DAY / 1000;\n}\n\nfunction lowerFirst(str: string) {\n return `${str[0].toLowerCase()}${str.slice(1)}`;\n}\n\nfunction upperFirst(str: string) {\n return `${str[0].toUpperCase()}${str.slice(1)}`;\n}\n","import { useRef } from '../lib/teact/teact';\n\nfunction usePrevious<T extends any>(next: T): T | undefined;\nfunction usePrevious<T extends any>(next: T, shouldSkipUndefined: true): Exclude<T, undefined> | undefined;\nfunction usePrevious<T extends any>(next: T, shouldSkipUndefined?: boolean): Exclude<T, undefined> | undefined;\nfunction usePrevious<T extends any>(next: T, shouldSkipUndefined?: boolean) {\n const ref = useRef<T>();\n const { current } = ref;\n if (!shouldSkipUndefined || next !== undefined) {\n ref.current = next;\n }\n\n return current;\n}\n\nexport default usePrevious;\n","import { useCallback, useState } from '../lib/teact/teact';\n\nexport default () => {\n const [, setTrigger] = useState<boolean>(false);\n\n return useCallback(() => {\n setTrigger((trigger) => !trigger);\n }, []);\n};\n","import React, { FC, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Link.scss';\n\ntype OwnProps = {\n children: any;\n className?: string;\n isRtl?: boolean;\n onClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void;\n};\n\nconst Link: FC<OwnProps> = ({\n children, className, isRtl, onClick,\n}) => {\n const handleClick = useCallback((e: React.MouseEvent<HTMLAnchorElement>) => {\n e.preventDefault();\n onClick!(e);\n }, [onClick]);\n\n return (\n <a\n href=\"#\"\n className={buildClassName('Link', className)}\n dir={isRtl ? 'rtl' : 'auto'}\n onClick={onClick ? handleClick : undefined}\n >\n {children}\n </a>\n );\n};\n\nexport default Link;\n","export default (store: AnyLiteral) => {\n let id;\n\n do {\n id = String(Math.random()).replace('0.', 'id');\n } while (store.hasOwnProperty(id));\n\n return id;\n};\n","import { callApi } from '../api/gramjs';\nimport { ApiChat, ApiMessage, ApiUser } from '../api/types';\nimport { renderActionMessageText } from '../components/common/helpers/renderActionMessageText';\nimport { DEBUG } from '../config';\nimport { getDispatch, getGlobal, setGlobal } from '../lib/teact/teactn';\nimport {\n getChatTitle,\n getMessageAction,\n getMessageSenderName,\n getMessageSummaryText,\n getPrivateChatUserId,\n isActionMessage,\n isChatChannel,\n selectIsChatMuted,\n} from '../modules/helpers';\nimport { getTranslation } from './langProvider';\nimport { addNotifyExceptions, replaceSettings } from '../modules/reducers';\nimport {\n selectChatMessage, selectNotifyExceptions, selectNotifySettings, selectUser,\n} from '../modules/selectors';\nimport { IS_SERVICE_WORKER_SUPPORTED } from './environment';\n\nfunction getDeviceToken(subscription: PushSubscription) {\n const data = subscription.toJSON();\n return JSON.stringify({\n endpoint: data.endpoint,\n keys: data.keys,\n });\n}\n\nfunction checkIfPushSupported() {\n if (!IS_SERVICE_WORKER_SUPPORTED) return false;\n if (!('showNotification' in ServiceWorkerRegistration.prototype)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] Push notifications aren\\'t supported.');\n }\n return false;\n }\n\n // Check the current Notification permission.\n // If its denied, it's a permanent block until the\n // user changes the permission\n if (Notification.permission === 'denied') {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] The user has blocked push notifications.');\n }\n return false;\n }\n\n // Check if push messaging is supported\n if (!('PushManager' in window)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] Push messaging isn\\'t supported.');\n }\n return false;\n }\n return true;\n}\n\nfunction checkIfNotificationsSupported() {\n // Let's check if the browser supports notifications\n if (!('Notification' in window)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] This browser does not support desktop notification');\n }\n return false;\n }\n\n if (Notification.permission === 'denied' as NotificationPermission) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] The user has blocked push notifications.');\n }\n return false;\n }\n return true;\n}\n\nconst expirationTime = 12 * 60 * 60 * 1000; // 12 hours\n\nfunction checkIfShouldResubscribe(subscription: PushSubscription | null) {\n const global = getGlobal();\n if (!global.push || !subscription) return true;\n if (getDeviceToken(subscription) !== global.push.deviceToken) return true;\n return Date.now() - global.push.subscribedAt > expirationTime;\n}\n\nasync function requestPermission() {\n if (!('Notification' in window)) return;\n if (!['granted', 'denied'].includes(Notification.permission)) {\n await Notification.requestPermission();\n }\n}\n\nasync function unsubscribeFromPush(subscription: PushSubscription | null) {\n const global = getGlobal();\n const dispatch = getDispatch();\n if (subscription) {\n try {\n const deviceToken = getDeviceToken(subscription);\n await callApi('unregisterDevice', deviceToken);\n await subscription.unsubscribe();\n dispatch.deleteDeviceToken();\n return;\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] Unable to unsubscribe from push.', error);\n }\n }\n }\n if (global.push) {\n await callApi('unregisterDevice', global.push.deviceToken);\n dispatch.deleteDeviceToken();\n }\n}\n\nexport async function unsubscribe() {\n if (!checkIfPushSupported()) return;\n const serviceWorkerRegistration = await navigator.serviceWorker.ready;\n const subscription = await serviceWorkerRegistration.pushManager.getSubscription();\n await unsubscribeFromPush(subscription);\n}\n\n// Indicates if notification settings are loaded from the api\nlet areSettingsLoaded = false;\n\n// Load notification settings from the api\nasync function loadNotificationSettings() {\n if (areSettingsLoaded) return;\n const [resultSettings, resultExceptions] = await Promise.all([\n callApi('fetchNotificationSettings', {\n serverTimeOffset: getGlobal().serverTimeOffset,\n }),\n callApi('fetchNotificationExceptions', {\n serverTimeOffset: getGlobal().serverTimeOffset,\n }),\n ]);\n if (!resultSettings) return;\n\n let global = replaceSettings(getGlobal(), resultSettings);\n if (resultExceptions) {\n global = addNotifyExceptions(global, resultExceptions);\n }\n setGlobal(global);\n areSettingsLoaded = true;\n}\n\nexport async function subscribe() {\n if (!checkIfPushSupported()) {\n // Ask for notification permissions only if service worker notifications are not supported\n // As pushManager.subscribe automatically triggers permission popup\n await requestPermission();\n return;\n }\n const serviceWorkerRegistration = await navigator.serviceWorker.ready;\n let subscription = await serviceWorkerRegistration.pushManager.getSubscription();\n if (!checkIfShouldResubscribe(subscription)) return;\n await unsubscribeFromPush(subscription);\n try {\n subscription = await serviceWorkerRegistration.pushManager.subscribe({\n userVisibleOnly: true,\n });\n const deviceToken = getDeviceToken(subscription);\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] Received push subscription: ', deviceToken);\n }\n await callApi('registerDevice', deviceToken);\n getDispatch()\n .setDeviceToken(deviceToken);\n } catch (error) {\n if (Notification.permission === 'denied' as NotificationPermission) {\n // The user denied the notification permission which\n // means we failed to subscribe and the user will need\n // to manually change the notification permission to\n // subscribe to push messages\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] The user has blocked push notifications.');\n }\n } else if (DEBUG) {\n // A problem occurred with the subscription, this can\n // often be down to an issue or lack of the gcm_sender_id\n // and / or gcm_user_visible_only\n // eslint-disable-next-line no-console\n console.log('[PUSH] Unable to subscribe to push.', error);\n\n // Request permissions and fall back to local notifications\n // if pushManager.subscribe was aborted due to invalid VAPID key.\n if (error.code === DOMException.ABORT_ERR) {\n await requestPermission();\n }\n }\n }\n}\n\nfunction checkIfShouldNotify(chat: ApiChat, isActive: boolean) {\n if (!areSettingsLoaded) return false;\n const global = getGlobal();\n if (selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global)) || chat.isNotJoined\n || !chat.isListed) {\n return false;\n }\n // Dont show notification for active chat if client has focus\n return !(isActive && document.hasFocus());\n}\n\nfunction getNotificationContent(chat: ApiChat, message: ApiMessage) {\n const global = getGlobal();\n const {\n senderId,\n replyToMessageId,\n } = message;\n const messageSender = senderId ? selectUser(global, senderId) : undefined;\n const messageAction = getMessageAction(message as ApiMessage);\n const actionTargetMessage = messageAction && replyToMessageId\n ? selectChatMessage(global, chat.id, replyToMessageId)\n : undefined;\n const {\n targetUserIds: actionTargetUserIds,\n targetChatId: actionTargetChatId,\n } = messageAction || {};\n\n const actionTargetUsers = actionTargetUserIds\n ? actionTargetUserIds.map((userId) => selectUser(global, userId)).filter<ApiUser>(Boolean as any)\n : undefined;\n const privateChatUserId = getPrivateChatUserId(chat);\n const privateChatUser = privateChatUserId ? selectUser(global, privateChatUserId) : undefined;\n let body: string;\n if (isActionMessage(message)) {\n const actionOrigin = chat && (isChatChannel(chat) || message.senderId === message.chatId)\n ? chat\n : messageSender;\n body = renderActionMessageText(\n getTranslation,\n message,\n actionOrigin,\n actionTargetUsers,\n actionTargetMessage,\n actionTargetChatId,\n { asPlain: true },\n ) as string;\n } else {\n const senderName = getMessageSenderName(getTranslation, chat.id, messageSender);\n const summary = getMessageSummaryText(getTranslation, message);\n\n body = senderName ? `${senderName}: ${summary}` : summary;\n }\n\n return {\n title: getChatTitle(getTranslation, chat, privateChatUser),\n body,\n };\n}\n\nexport async function showNewMessageNotification({\n chat,\n message,\n isActiveChat,\n}: { chat: ApiChat; message: Partial<ApiMessage>; isActiveChat: boolean}) {\n if (!checkIfNotificationsSupported()) return;\n if (!message.id) return;\n\n await loadNotificationSettings();\n if (!checkIfShouldNotify(chat, isActiveChat)) return;\n\n const {\n title,\n body,\n } = getNotificationContent(chat, message as ApiMessage);\n\n if (checkIfPushSupported()) {\n if (navigator.serviceWorker.controller) {\n // notify service worker about new message notification\n navigator.serviceWorker.controller.postMessage({\n type: 'newMessageNotification',\n payload: {\n title,\n body,\n chatId: chat.id,\n messageId: message.id,\n },\n });\n }\n } else {\n const dispatch = getDispatch();\n const options: NotificationOptions = {\n body,\n icon: 'icon-192x192.png',\n badge: 'icon-192x192.png',\n tag: message.id.toString(),\n };\n\n if ('vibrate' in navigator) {\n options.vibrate = [200, 100, 200];\n }\n\n const notification = new Notification(title, options);\n\n notification.onclick = () => {\n notification.close();\n dispatch.focusMessage({\n chatId: chat.id,\n messageId: message.id,\n });\n if (window.focus) {\n window.focus();\n }\n };\n }\n}\n\n// Notify service worker that client is fully loaded\nexport function notifyClientReady() {\n if (!navigator.serviceWorker.controller) return;\n navigator.serviceWorker.controller.postMessage({\n type: 'clientReady',\n });\n}\n","import { ApiChat, ApiUser } from '../../api/types';\n\nimport { SERVICE_NOTIFICATIONS_USER_ID } from '../../config';\nimport { formatFullDate, formatTime } from '../../util/dateFormat';\nimport { orderBy } from '../../util/iteratees';\nimport { LangFn } from '../../hooks/useLang';\n\nconst USER_COLOR_KEYS = [1, 8, 5, 2, 7, 4, 6];\n\nexport function getUserFirstOrLastName(user?: ApiUser) {\n if (!user) {\n return undefined;\n }\n\n switch (user.type) {\n case 'userTypeBot':\n case 'userTypeRegular': {\n return user.firstName || user.lastName;\n }\n\n case 'userTypeDeleted':\n case 'userTypeUnknown': {\n return 'Deleted';\n }\n\n default:\n return undefined;\n }\n}\n\nexport function getUserFullName(user?: ApiUser) {\n if (!user) {\n return undefined;\n }\n\n if (isDeletedUser(user)) {\n return 'Deleted account';\n }\n\n switch (user.type) {\n case 'userTypeBot':\n case 'userTypeRegular': {\n if (user.firstName && user.lastName) {\n return `${user.firstName} ${user.lastName}`;\n }\n\n if (user.firstName) {\n return user.firstName;\n }\n\n if (user.lastName) {\n return user.lastName;\n }\n\n break;\n }\n\n case 'userTypeDeleted':\n case 'userTypeUnknown': {\n return 'Deleted account';\n }\n }\n\n return undefined;\n}\n\nexport function getUserStatus(lang: LangFn, user: ApiUser, serverTimeOffset: number) {\n if (user.id === SERVICE_NOTIFICATIONS_USER_ID) {\n return lang('ServiceNotifications').toLowerCase();\n }\n\n if (user.type && user.type === 'userTypeBot') {\n return lang('Bot');\n }\n\n if (!user.status) {\n return '';\n }\n\n switch (user.status.type) {\n case 'userStatusEmpty': {\n return lang('ALongTimeAgo');\n }\n\n case 'userStatusLastMonth': {\n return lang('WithinAMonth');\n }\n\n case 'userStatusLastWeek': {\n return lang('WithinAWeek');\n }\n\n case 'userStatusOffline': {\n const { wasOnline } = user.status;\n\n if (!wasOnline) return lang('LastSeen.Offline');\n\n const now = new Date(new Date().getTime() + serverTimeOffset * 1000);\n const wasOnlineDate = new Date(wasOnline * 1000);\n\n if (wasOnlineDate >= now) {\n return lang('LastSeen.JustNow');\n }\n\n const diff = new Date(now.getTime() - wasOnlineDate.getTime());\n\n // within a minute\n if (diff.getTime() / 1000 < 60) {\n return lang('LastSeen.JustNow');\n }\n\n // within an hour\n if (diff.getTime() / 1000 < 60 * 60) {\n const minutes = Math.floor(diff.getTime() / 1000 / 60);\n return lang('LastSeen.MinutesAgo', minutes);\n }\n\n // today\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const serverToday = new Date(today.getTime() + serverTimeOffset * 1000);\n if (wasOnlineDate > serverToday) {\n // up to 6 hours ago\n if (diff.getTime() / 1000 < 6 * 60 * 60) {\n const hours = Math.floor(diff.getTime() / 1000 / 60 / 60);\n return lang('LastSeen.HoursAgo', hours);\n }\n\n // other\n return lang('LastSeen.TodayAt', formatTime(wasOnlineDate));\n }\n\n // yesterday\n const yesterday = new Date();\n yesterday.setDate(now.getDate() - 1);\n yesterday.setHours(0, 0, 0, 0);\n const serverYesterday = new Date(yesterday.getTime() + serverTimeOffset * 1000);\n if (wasOnlineDate > serverYesterday) {\n return lang('LastSeen.YesterdayAt', formatTime(wasOnlineDate));\n }\n\n return lang('LastSeen.AtDate', formatFullDate(lang, wasOnlineDate));\n }\n\n case 'userStatusOnline': {\n return lang('Online');\n }\n\n case 'userStatusRecently': {\n return lang('Lately');\n }\n\n default:\n return undefined;\n }\n}\n\nexport function isUserOnline(user: ApiUser) {\n const { id, status, type } = user;\n\n if (!status) {\n return false;\n }\n\n if (id === SERVICE_NOTIFICATIONS_USER_ID) {\n return false;\n }\n\n return status.type === 'userStatusOnline' && type !== 'userTypeBot';\n}\n\nexport function isDeletedUser(user: ApiUser) {\n if (!user.status || user.type === 'userTypeBot' || user.id === SERVICE_NOTIFICATIONS_USER_ID) {\n return false;\n }\n\n return user.type === 'userTypeDeleted'\n || user.type === 'userTypeUnknown';\n}\n\nexport function isUserBot(user: ApiUser) {\n return user.type === 'userTypeBot';\n}\n\nexport function sortUserIds(\n userIds: number[],\n usersById: Record<number, ApiUser>,\n priorityIds?: number[],\n serverTimeOffset = 0,\n) {\n return orderBy(userIds, (id) => {\n const now = Date.now() / 1000 + serverTimeOffset;\n\n if (priorityIds && priorityIds.includes(id)) {\n // Assuming that online status expiration date can't be as far as two days from now,\n // this should place prioritized on top of the list.\n // Then we subtract index of `id` in `priorityIds` to preserve selected order\n return now + (48 * 60 * 60) - (priorityIds.length - priorityIds.indexOf(id));\n }\n\n const user = usersById[id];\n if (!user || !user.status) {\n return 0;\n }\n\n if (user.status.type === 'userStatusOnline') {\n return user.status.expires;\n } else if (user.status.type === 'userStatusOffline' && user.status.wasOnline) {\n return user.status.wasOnline;\n }\n\n switch (user.status.type) {\n case 'userStatusRecently':\n return now - 60 * 60 * 24;\n case 'userStatusLastWeek':\n return now - 60 * 60 * 24 * 7;\n case 'userStatusLastMonth':\n return now - 60 * 60 * 24 * 7 * 30;\n default:\n return 0;\n }\n }, 'desc');\n}\n\n// eslint-disable-next-line max-len\n// https://github.com/telegramdesktop/tdesktop/blob/371510cfe23b0bd226de8c076bc49248fbe40c26/Telegram/SourceFiles/data/data_peer.cpp#L53\nexport function getUserColorKey(peer: ApiUser | ApiChat | undefined) {\n const index = peer ? Math.abs(peer.id) % 7 : 0;\n\n return USER_COLOR_KEYS[index];\n}\n","import {\n ApiChat,\n ApiUser,\n ApiChatBannedRights,\n ApiChatAdminRights,\n ApiChatFolder,\n MAIN_THREAD_ID,\n} from '../../api/types';\n\nimport { NotifyException, NotifySettings } from '../../types';\nimport { LangFn } from '../../hooks/useLang';\n\nimport { ARCHIVED_FOLDER_ID } from '../../config';\nimport { orderBy } from '../../util/iteratees';\nimport { getUserFirstOrLastName } from './users';\nimport { formatDateToString, formatTime } from '../../util/dateFormat';\n\nconst FOREVER_BANNED_DATE = Date.now() / 1000 + 31622400; // 366 days\n\nconst VERIFIED_PRIORITY_BASE = 3e9;\nconst PINNED_PRIORITY_BASE = 3e8;\n\nexport function isChatPrivate(chatId: number) {\n return chatId > 0;\n}\n\nexport function isChatGroup(chat: ApiChat) {\n return isChatBasicGroup(chat) || isChatSuperGroup(chat);\n}\n\nexport function isChatBasicGroup(chat: ApiChat) {\n return chat.type === 'chatTypeBasicGroup';\n}\n\nexport function isChatSuperGroup(chat: ApiChat) {\n return chat.type === 'chatTypeSuperGroup';\n}\n\nexport function isChatChannel(chat: ApiChat) {\n return chat.type === 'chatTypeChannel';\n}\n\nexport function isCommonBoxChat(chat: ApiChat) {\n return chat.type === 'chatTypePrivate' || chat.type === 'chatTypeBasicGroup';\n}\n\nexport function getChatTypeString(chat: ApiChat) {\n switch (chat.type) {\n case 'chatTypePrivate':\n return 'PrivateChat';\n case 'chatTypeBasicGroup':\n case 'chatTypeSuperGroup':\n return 'AccDescrGroup';\n case 'chatTypeChannel':\n return 'AccDescrChannel';\n default:\n return 'Chat';\n }\n}\n\nexport function getPrivateChatUserId(chat: ApiChat) {\n if (chat.type !== 'chatTypePrivate' && chat.type !== 'chatTypeSecret') {\n return undefined;\n }\n return chat.id;\n}\n\n// TODO Get rid of `user`\nexport function getChatTitle(lang: LangFn, chat: ApiChat, user?: ApiUser, isSelf = false) {\n if (isSelf || (user && chat.id === user.id && user.isSelf)) {\n return lang('SavedMessages');\n }\n return chat.title || lang('HiddenName');\n}\n\nexport function getChatDescription(chat: ApiChat) {\n if (!chat.fullInfo) {\n return undefined;\n }\n return chat.fullInfo.about;\n}\n\nexport function getChatLink(chat: ApiChat) {\n const { username } = chat;\n if (username) {\n return `https://t.me/${username}`;\n }\n\n const { inviteLink } = chat.fullInfo || {};\n\n return inviteLink;\n}\n\nexport function getChatAvatarHash(\n owner: ApiChat | ApiUser,\n size: 'normal' | 'big' = 'normal',\n) {\n if (!owner.avatarHash) {\n return undefined;\n }\n\n switch (size) {\n case 'big':\n return `profile${owner.id}?${owner.avatarHash}`;\n default:\n return `avatar${owner.id}?${owner.avatarHash}`;\n }\n}\n\nexport function isChatSummaryOnly(chat: ApiChat) {\n return !chat.lastMessage;\n}\n\nexport function isChatAdmin(chat: ApiChat) {\n return Boolean(chat.adminRights);\n}\n\nexport function getHasAdminRight(chat: ApiChat, key: keyof ApiChatAdminRights) {\n return chat.adminRights ? chat.adminRights[key] : false;\n}\n\nexport function isUserRightBanned(chat: ApiChat, key: keyof ApiChatBannedRights) {\n return Boolean(\n (chat.currentUserBannedRights && chat.currentUserBannedRights[key])\n || (chat.defaultBannedRights && chat.defaultBannedRights[key]),\n );\n}\n\nexport function getCanPostInChat(chat: ApiChat, threadId: number) {\n if (threadId !== MAIN_THREAD_ID) {\n return true;\n }\n\n if (chat.isRestricted || chat.migratedTo || chat.isNotJoined) {\n return false;\n }\n\n if (chat.isCreator) {\n return true;\n }\n\n if (isChatPrivate(chat.id)) {\n return true;\n }\n\n if (isChatChannel(chat)) {\n return getHasAdminRight(chat, 'postMessages');\n }\n\n return isChatAdmin(chat) || !isUserRightBanned(chat, 'sendMessages');\n}\n\nexport interface IAllowedAttachmentOptions {\n canAttachMedia: boolean;\n canAttachPolls: boolean;\n canSendStickers: boolean;\n canSendGifs: boolean;\n canAttachEmbedLinks: boolean;\n}\n\nexport function getAllowedAttachmentOptions(chat?: ApiChat, isChatWithBot = false): IAllowedAttachmentOptions {\n if (!chat) {\n return {\n canAttachMedia: false,\n canAttachPolls: false,\n canSendStickers: false,\n canSendGifs: false,\n canAttachEmbedLinks: false,\n };\n }\n\n const isAdmin = isChatAdmin(chat);\n\n return {\n canAttachMedia: isAdmin || !isUserRightBanned(chat, 'sendMedia'),\n canAttachPolls: (isAdmin || !isUserRightBanned(chat, 'sendPolls')) && (!isChatPrivate(chat.id) || isChatWithBot),\n canSendStickers: isAdmin || !isUserRightBanned(chat, 'sendStickers'),\n canSendGifs: isAdmin || !isUserRightBanned(chat, 'sendGifs'),\n canAttachEmbedLinks: isAdmin || !isUserRightBanned(chat, 'embedLinks'),\n };\n}\n\nexport function getMessageSendingRestrictionReason(\n lang: LangFn, currentUserBannedRights?: ApiChatBannedRights, defaultBannedRights?: ApiChatBannedRights,\n) {\n if (currentUserBannedRights && currentUserBannedRights.sendMessages) {\n const { untilDate } = currentUserBannedRights;\n return untilDate && untilDate < FOREVER_BANNED_DATE\n ? lang(\n 'Channel.Persmission.Denied.SendMessages.Until',\n lang(\n 'formatDateAtTime',\n [formatDateToString(new Date(untilDate * 1000), lang.code), formatTime(untilDate * 1000)],\n ),\n )\n : lang('Channel.Persmission.Denied.SendMessages.Forever');\n }\n\n if (defaultBannedRights && defaultBannedRights.sendMessages) {\n return lang('Channel.Persmission.Denied.SendMessages.DefaultRestrictedText');\n }\n\n return undefined;\n}\n\nexport function getChatSlowModeOptions(chat?: ApiChat) {\n if (!chat || !chat.fullInfo) {\n return undefined;\n }\n\n return chat.fullInfo.slowMode;\n}\n\n\nexport function getChatOrder(chat: ApiChat) {\n return Math.max(\n chat.joinDate || 0,\n chat.draftDate || 0,\n chat.lastMessage ? chat.lastMessage.date : 0,\n );\n}\n\nexport function isChatArchived(chat: ApiChat) {\n return chat.folderId === ARCHIVED_FOLDER_ID;\n}\n\nexport function selectIsChatMuted(\n chat: ApiChat, notifySettings: NotifySettings, notifyExceptions?: Record<number, NotifyException>,\n) {\n return !(notifyExceptions && notifyExceptions[chat.id] && !notifyExceptions[chat.id].isMuted) && (\n chat.isMuted\n || (isChatPrivate(chat.id) && !notifySettings.hasPrivateChatsNotifications)\n || (isChatChannel(chat) && !notifySettings.hasBroadcastNotifications)\n || (isChatGroup(chat) && !notifySettings.hasGroupNotifications)\n );\n}\n\nexport function getCanDeleteChat(chat: ApiChat) {\n return isChatBasicGroup(chat) || ((isChatSuperGroup(chat) || isChatChannel(chat)) && chat.isCreator);\n}\n\nexport function prepareFolderListIds(\n chatsById: Record<number, ApiChat>,\n usersById: Record<number, ApiUser>,\n folder: ApiChatFolder,\n notifySettings: NotifySettings,\n notifyExceptions?: Record<number, NotifyException>,\n chatIdsCache?: number[],\n) {\n const excludedChatIds = folder.excludedChatIds ? new Set(folder.excludedChatIds) : undefined;\n const includedChatIds = folder.excludedChatIds ? new Set(folder.includedChatIds) : undefined;\n const pinnedChatIds = folder.excludedChatIds ? new Set(folder.pinnedChatIds) : undefined;\n const listIds = (chatIdsCache || Object.keys(chatsById).map(Number))\n .filter((id) => {\n return filterChatFolder(\n chatsById[id],\n folder,\n usersById,\n notifySettings,\n notifyExceptions,\n excludedChatIds,\n includedChatIds,\n pinnedChatIds,\n );\n });\n\n return [listIds, folder.pinnedChatIds] as const;\n}\n\nfunction filterChatFolder(\n chat: ApiChat,\n folder: ApiChatFolder,\n usersById: Record<number, ApiUser>,\n notifySettings: NotifySettings,\n notifyExceptions?: Record<number, NotifyException>,\n excludedChatIds?: Set<number>,\n includedChatIds?: Set<number>,\n pinnedChatIds?: Set<number>,\n) {\n if (!chat.isListed) {\n return false;\n }\n\n if (excludedChatIds && excludedChatIds.has(chat.id)) {\n return false;\n }\n\n if (includedChatIds && includedChatIds.has(chat.id)) {\n return true;\n }\n\n if (pinnedChatIds && pinnedChatIds.has(chat.id)) {\n return true;\n }\n\n if (isChatArchived(chat) && folder.excludeArchived) {\n return false;\n }\n\n if (folder.excludeMuted && !chat.unreadMentionsCount && selectIsChatMuted(chat, notifySettings, notifyExceptions)) {\n return false;\n }\n\n if (!chat.unreadCount && !chat.unreadMentionsCount && !chat.hasUnreadMark && folder.excludeRead) {\n return false;\n }\n\n if (isChatPrivate(chat.id)) {\n const privateChatUser = usersById[chat.id];\n\n const isChatWithBot = privateChatUser && privateChatUser.type === 'userTypeBot';\n if (isChatWithBot) {\n if (folder.bots) {\n return true;\n }\n } else {\n if (folder.contacts && privateChatUser && privateChatUser.isContact) {\n return true;\n }\n\n if (folder.nonContacts && privateChatUser && !privateChatUser.isContact) {\n return true;\n }\n }\n } else if (isChatGroup(chat)) {\n return !!folder.groups;\n } else if (isChatChannel(chat)) {\n return !!folder.channels;\n }\n\n return false;\n}\n\nexport function prepareChatList(\n chatsById: Record<number, ApiChat>,\n listIds: number[],\n orderedPinnedIds?: number[],\n folderType: 'all' | 'archived' | 'folder' = 'all',\n) {\n function chatFilter(chat?: ApiChat) {\n if (!chat || !chat.lastMessage || chat.migratedTo) {\n return false;\n }\n\n switch (folderType) {\n case 'all':\n if (isChatArchived(chat)) {\n return false;\n }\n break;\n case 'archived':\n if (!isChatArchived(chat)) {\n return false;\n }\n break;\n }\n\n return !chat.isRestricted && !chat.isNotJoined;\n }\n\n const listedChats = listIds\n .map((id) => chatsById[id])\n .filter(chatFilter);\n\n const listIdsSet = new Set(listIds);\n const pinnedChats = orderedPinnedIds\n ? (\n orderedPinnedIds\n .map((id) => chatsById[id])\n .filter(chatFilter)\n .filter((chat) => listIdsSet.has(chat.id))\n )\n : [];\n\n const otherChats = orderBy(\n orderedPinnedIds\n ? listedChats.filter((chat) => !orderedPinnedIds.includes(chat.id))\n : listedChats,\n getChatOrder,\n 'desc',\n );\n\n return {\n pinnedChats,\n otherChats,\n };\n}\n\nexport function getFolderUnreadDialogs(\n chatsById: Record<number, ApiChat>,\n usersById: Record<number, ApiUser>,\n folder: ApiChatFolder,\n chatIdsCache: number[],\n notifySettings: NotifySettings,\n notifyExceptions?: Record<number, NotifyException>,\n) {\n const [listIds] = prepareFolderListIds(chatsById, usersById, folder, notifySettings, notifyExceptions, chatIdsCache);\n\n const listedChats = listIds\n .map((id) => chatsById[id])\n .filter((chat) => (chat && chat.lastMessage && !chat.isRestricted && !chat.isNotJoined));\n\n const unreadDialogsCount = listedChats\n .reduce((total, chat) => (chat.unreadCount || chat.hasUnreadMark ? total + 1 : total), 0);\n\n const hasActiveDialogs = listedChats.some((chat) => (\n chat.unreadMentionsCount\n || (!selectIsChatMuted(chat, notifySettings, notifyExceptions) && (chat.unreadCount || chat.hasUnreadMark))\n ));\n\n return {\n unreadDialogsCount,\n hasActiveDialogs,\n };\n}\n\nexport function getFolderDescriptionText(\n lang: LangFn,\n chatsById: Record<number, ApiChat>,\n usersById: Record<number, ApiUser>,\n folder: ApiChatFolder,\n chatIdsCache: number[],\n notifySettings: NotifySettings,\n notifyExceptions?: Record<number, NotifyException>,\n) {\n const {\n id, title, emoticon, description, pinnedChatIds,\n excludedChatIds, includedChatIds,\n excludeArchived, excludeMuted, excludeRead,\n ...filters\n } = folder;\n\n // If folder has multiple additive filters or uses include/exclude lists,\n // we display folder chats count\n if (\n Object.values(filters).filter(Boolean).length > 1\n || (excludedChatIds && excludedChatIds.length)\n || (includedChatIds && includedChatIds.length)\n ) {\n const length = getFolderChatsCount(chatsById, usersById, folder, chatIdsCache, notifySettings, notifyExceptions);\n return lang('Chats', length);\n }\n\n // Otherwise, we return a short description of a single filter\n if (filters.bots) {\n return lang('FilterBots');\n } else if (filters.groups) {\n return lang('FilterGroups');\n } else if (filters.channels) {\n return lang('FilterChannels');\n } else if (filters.contacts) {\n return lang('FilterContacts');\n } else if (filters.nonContacts) {\n return lang('FilterNonContacts');\n } else {\n return undefined;\n }\n}\n\nfunction getFolderChatsCount(\n chatsById: Record<number, ApiChat>,\n usersById: Record<number, ApiUser>,\n folder: ApiChatFolder,\n chatIdsCache: number[],\n notifySettings: NotifySettings,\n notifyExceptions?: Record<number, NotifyException>,\n) {\n const [listIds, pinnedIds] = prepareFolderListIds(\n chatsById, usersById, folder, notifySettings, notifyExceptions, chatIdsCache,\n );\n const { pinnedChats, otherChats } = prepareChatList(chatsById, listIds, pinnedIds, 'folder');\n return pinnedChats.length + otherChats.length;\n}\n\nexport function isChat(chatOrUser?: ApiUser | ApiChat): chatOrUser is ApiChat {\n if (!chatOrUser) {\n return false;\n }\n\n return chatOrUser.id < 0;\n}\n\nexport function getMessageSenderName(lang: LangFn, chatId: number, sender?: ApiUser) {\n if (!sender || isChatPrivate(chatId)) {\n return undefined;\n }\n\n if (sender.isSelf) {\n return lang('FromYou');\n }\n\n return getUserFirstOrLastName(sender);\n}\n\nexport function sortChatIds(\n chatIds: number[],\n chatsById: Record<number, ApiChat>,\n shouldPrioritizeVerified = false,\n priorityIds?: number[],\n) {\n return orderBy(chatIds, (id) => {\n const chat = chatsById[id];\n if (!chat) {\n return 0;\n }\n\n let priority = 0;\n\n if (chat.lastMessage) {\n priority += chat.lastMessage.date;\n }\n\n if (shouldPrioritizeVerified && chat.isVerified) {\n priority += VERIFIED_PRIORITY_BASE; // ~100 years in seconds\n }\n\n if (priorityIds && priorityIds.includes(id)) {\n priority = Date.now() + PINNED_PRIORITY_BASE + (priorityIds.length - priorityIds.indexOf(id));\n }\n\n return priority;\n }, 'desc');\n}\n","import { DEBUG } from '../../config';\n\ntype Handler = (e: Event) => void;\n\nconst NON_BUBBLEABLE_EVENTS = new Set(['scroll', 'mouseenter', 'mouseleave']);\n\nconst delegationRegistry: Record<string, Map<HTMLElement, Handler>> = {};\nconst delegatedEventsByElement = new Map<HTMLElement, Set<string>>();\nconst documentEventCounters: Record<string, number> = {};\n\nexport function addEventListener(element: HTMLElement, propName: string, handler: Handler, asCapture = false) {\n const eventName = resolveEventName(propName, element);\n if (canUseEventDelegation(eventName, element, asCapture)) {\n addDelegatedListener(eventName, element, handler);\n } else {\n element.addEventListener(eventName, handler, asCapture);\n }\n}\n\nexport function removeEventListener(element: HTMLElement, propName: string, handler: Handler, asCapture = false) {\n const eventName = resolveEventName(propName, element);\n if (canUseEventDelegation(eventName, element, asCapture)) {\n removeDelegatedListener(eventName, element);\n } else {\n element.removeEventListener(eventName, handler, asCapture);\n }\n}\n\nfunction resolveEventName(propName: string, element: HTMLElement) {\n const eventName = propName\n .replace(/^on/, '')\n .replace(/Capture$/, '').toLowerCase();\n\n if (eventName === 'change' && element.tagName !== 'SELECT') {\n // React behavior repeated here.\n // https://stackoverflow.com/questions/38256332/in-react-whats-the-difference-between-onchange-and-oninput\n return 'input';\n }\n\n if (eventName === 'doubleclick') {\n return 'dblclick';\n }\n\n // Replace focus/blur by their \"bubbleable\" versions\n if (eventName === 'focus') {\n return 'focusin';\n }\n\n if (eventName === 'blur') {\n return 'focusout';\n }\n\n return eventName;\n}\n\nfunction canUseEventDelegation(realEventName: string, element: HTMLElement, asCapture: boolean) {\n return (\n !asCapture\n && !NON_BUBBLEABLE_EVENTS.has(realEventName)\n && element.tagName !== 'VIDEO'\n && element.tagName !== 'IFRAME'\n );\n}\n\nfunction addDelegatedListener(eventName: string, element: HTMLElement, handler: Handler) {\n if (!documentEventCounters[eventName]) {\n documentEventCounters[eventName] = 0;\n document.addEventListener(eventName, handleEvent);\n }\n\n resolveDelegationRegistryForName(eventName).set(element, handler);\n resolveDelegatedEventsForElement(element).add(eventName);\n documentEventCounters[eventName]++;\n}\n\nfunction removeDelegatedListener(eventName: string, element: HTMLElement) {\n documentEventCounters[eventName]--;\n if (!documentEventCounters[eventName]) {\n // Synchronous deletion on 0 will cause perf degradation in the case of 1 element\n // which is not a real case, so it's ok to do it this way\n document.removeEventListener(eventName, handleEvent);\n }\n\n delegationRegistry[eventName].delete(element);\n delegatedEventsByElement.get(element)!.delete(eventName);\n}\n\nexport function removeAllDelegatedListeners(element: HTMLElement) {\n const eventNames = delegatedEventsByElement.get(element);\n if (!eventNames) {\n return;\n }\n\n eventNames.forEach((eventName) => removeDelegatedListener(eventName, element));\n delegatedEventsByElement.delete(element);\n}\n\nfunction handleEvent(realEvent: Event) {\n const events = delegationRegistry[realEvent.type];\n\n if (events) {\n let furtherCallsPrevented = false;\n let current: HTMLElement = realEvent.target as HTMLElement;\n\n const stopPropagation = () => {\n furtherCallsPrevented = true;\n };\n\n const preventDefault = () => {\n realEvent.preventDefault();\n };\n\n // Proxy is a simplest way to provide an access to the event property\n const event = new Proxy(realEvent, {\n get(target, p) {\n if (p === 'currentTarget') {\n return current;\n }\n if (p === 'stopPropagation' || p === 'stopImmediatePropagation') {\n return stopPropagation;\n }\n if (p === 'preventDefault') {\n // \"this\" is changed to proxy and one can't call methods via it\n return preventDefault;\n }\n return Reflect.get(target, p);\n },\n });\n\n // This can also be limited by teact root\n while (current && current !== document.body) {\n const handler = events.get(current);\n if (handler) {\n handler(event);\n if (furtherCallsPrevented) {\n return;\n }\n }\n\n current = current.parentNode as HTMLElement;\n }\n }\n}\n\nfunction resolveDelegationRegistryForName(eventName: string) {\n if (!delegationRegistry[eventName]) {\n delegationRegistry[eventName] = new Map();\n }\n\n return delegationRegistry[eventName];\n}\n\nfunction resolveDelegatedEventsForElement(element: HTMLElement) {\n const existing = delegatedEventsByElement.get(element);\n if (existing) {\n return existing;\n }\n\n const newSet = new Set<string>();\n delegatedEventsByElement.set(element, newSet);\n\n return newSet;\n}\n\nif (DEBUG) {\n document.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('DELEGATED EVENTS', { delegationRegistry, delegatedEventsByElement, documentEventCounters });\n });\n}\n","import { useEffect, useRef } from '../lib/teact/teact';\n\nimport { IS_IOS } from '../util/environment';\nimport usePrevious from './usePrevious';\nimport { getDispatch } from '../lib/teact/teactn';\n\n// Carefully selected by swiping and observing visual changes\n// TODO: may be different on other devices such as iPad, maybe take dpi into account?\nconst SAFARI_EDGE_BACK_GESTURE_LIMIT = 300;\nconst SAFARI_EDGE_BACK_GESTURE_DURATION = 350;\n\ntype HistoryState = {\n currentIndex: number;\n nextStateIndexToReplace: number;\n isHistoryAltered: boolean;\n isDisabled: boolean;\n isEdge: boolean;\n currentIndexes: number[];\n};\n\nconst historyState: HistoryState = {\n currentIndex: 0,\n nextStateIndexToReplace: -1,\n isHistoryAltered: false,\n isDisabled: false,\n isEdge: false,\n currentIndexes: [],\n};\n\nexport const disableHistoryBack = () => {\n historyState.isDisabled = true;\n};\n\nconst handleTouchStart = (event: TouchEvent) => {\n const x = event.touches[0].pageX;\n\n if (x <= SAFARI_EDGE_BACK_GESTURE_LIMIT || x >= window.innerWidth - SAFARI_EDGE_BACK_GESTURE_LIMIT) {\n historyState.isEdge = true;\n }\n};\n\nconst handleTouchEnd = () => {\n if (historyState.isEdge) {\n setTimeout(() => {\n historyState.isEdge = false;\n }, SAFARI_EDGE_BACK_GESTURE_DURATION);\n }\n};\n\nif (IS_IOS) {\n window.addEventListener('touchstart', handleTouchStart);\n window.addEventListener('touchend', handleTouchEnd);\n window.addEventListener('popstate', handleTouchEnd);\n}\n\nwindow.history.replaceState({ index: historyState.currentIndex }, '');\n\nexport default function useHistoryBack(\n isActive: boolean | undefined,\n onBack: ((noDisableAnimation: boolean) => void) | undefined,\n onForward?: (state: any) => void,\n currentState?: any,\n shouldReplaceNext = false,\n) {\n const indexRef = useRef(-1);\n const isForward = useRef(false);\n const prevIsActive = usePrevious(isActive);\n const isClosed = useRef(true);\n\n useEffect(() => {\n const handlePopState = (event: PopStateEvent) => {\n if (historyState.isHistoryAltered) {\n setTimeout(() => {\n historyState.isHistoryAltered = false;\n }, 0);\n return;\n }\n const { index: i } = event.state;\n const index = i || 0;\n\n const prev = historyState.currentIndexes[historyState.currentIndexes.indexOf(indexRef.current) - 1];\n\n if (historyState.isDisabled) return;\n\n if (!isClosed.current && (index === 0 || index === prev)) {\n historyState.currentIndexes.splice(historyState.currentIndexes.indexOf(indexRef.current), 1);\n\n if (onBack) {\n if (historyState.isEdge) {\n getDispatch().disableHistoryAnimations();\n }\n onBack(!historyState.isEdge);\n isClosed.current = true;\n }\n } else if (index === indexRef.current && isClosed.current && onForward) {\n isForward.current = true;\n if (historyState.isEdge) {\n getDispatch().disableHistoryAnimations();\n }\n onForward(event.state.state);\n }\n };\n\n if (!historyState.isDisabled && prevIsActive !== isActive) {\n if (isActive) {\n isClosed.current = false;\n\n if (isForward.current) {\n isForward.current = false;\n historyState.currentIndexes.push(indexRef.current);\n } else {\n setTimeout(() => {\n const index = ++historyState.currentIndex;\n\n historyState.currentIndexes.push(index);\n\n window.history[\n (historyState.currentIndexes.includes(historyState.nextStateIndexToReplace - 1)\n && window.history.state.index !== 0\n && historyState.nextStateIndexToReplace === index\n && !shouldReplaceNext)\n ? 'replaceState'\n : 'pushState'\n ]({\n index,\n state: currentState,\n }, '');\n\n indexRef.current = index;\n\n if (shouldReplaceNext) {\n historyState.nextStateIndexToReplace = historyState.currentIndex + 1;\n }\n }, 0);\n }\n } else if (!isClosed.current) {\n if (indexRef.current === historyState.currentIndex || !shouldReplaceNext) {\n historyState.isHistoryAltered = true;\n window.history.back();\n\n setTimeout(() => {\n historyState.nextStateIndexToReplace = -1;\n }, 400);\n }\n historyState.currentIndexes.splice(historyState.currentIndexes.indexOf(indexRef.current), 1);\n\n isClosed.current = true;\n }\n }\n\n window.addEventListener('popstate', handlePopState);\n return () => window.removeEventListener('popstate', handlePopState);\n }, [currentState, isActive, onBack, onForward, prevIsActive, shouldReplaceNext]);\n}\n","import { useRef, useState } from '../lib/teact/teact';\nimport buildClassName from '../util/buildClassName';\n\nconst CLOSE_DURATION = 350;\n\nexport default (\n isOpen = false,\n onCloseTransitionEnd?: () => void,\n noOpenTransition = false,\n className: string | false = 'fast',\n noCloseTransition = false,\n) => {\n const [isClosed, setIsClosed] = useState(!isOpen);\n const closeTimeoutRef = useRef<number>();\n // СSS class should be added in a separate tick to turn on CSS transition.\n const [hasOpenClassName, setHasOpenClassName] = useState(isOpen && noOpenTransition);\n\n\n if (isOpen) {\n setIsClosed(false);\n setHasOpenClassName(true);\n\n if (closeTimeoutRef.current) {\n window.clearTimeout(closeTimeoutRef.current);\n closeTimeoutRef.current = undefined;\n }\n } else {\n setHasOpenClassName(false);\n\n if (!isClosed && !closeTimeoutRef.current) {\n closeTimeoutRef.current = window.setTimeout(() => {\n setIsClosed(true);\n\n if (onCloseTransitionEnd) {\n onCloseTransitionEnd();\n }\n\n closeTimeoutRef.current = undefined;\n }, noCloseTransition ? 0 : CLOSE_DURATION);\n }\n }\n\n // `noCloseTransition`, when set to true, should remove the open class immediately\n const shouldHaveOpenClassName = hasOpenClassName && !(noCloseTransition && !isOpen);\n const isClosing = Boolean(closeTimeoutRef.current);\n const shouldRender = isOpen || isClosing;\n const transitionClassNames = buildClassName(\n className && 'opacity-transition',\n className,\n shouldHaveOpenClassName && 'open',\n shouldRender && 'shown',\n isClosing && 'closing',\n );\n\n return {\n shouldRender,\n transitionClassNames,\n };\n};\n","const DEFAULT_MAX_TEXT_LENGTH = 30;\n\nexport default function trimText(text: string | undefined, length = DEFAULT_MAX_TEXT_LENGTH) {\n if (!text || text.length <= length) {\n return text;\n }\n\n return `${text.substr(0, length)}...`;\n}\n","import React, { FC, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport './MenuItem.scss';\n\ntype OnClickHandler = (e: React.SyntheticEvent<HTMLDivElement | HTMLAnchorElement>) => void;\n\ntype OwnProps = {\n icon?: string;\n className?: string;\n children: any;\n onClick?: OnClickHandler;\n href?: string;\n download?: string;\n disabled?: boolean;\n destructive?: boolean;\n ariaLabel?: string;\n};\n\nconst MenuItem: FC<OwnProps> = (props) => {\n const {\n icon,\n className,\n children,\n onClick,\n href,\n download,\n disabled,\n destructive,\n ariaLabel,\n } = props;\n\n const lang = useLang();\n const handleClick = useCallback((e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled || !onClick) {\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n\n onClick(e);\n }, [disabled, onClick]);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.keyCode !== 13 && e.keyCode !== 32) {\n return;\n }\n\n if (disabled || !onClick) {\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n\n onClick(e);\n }, [disabled, onClick]);\n\n const fullClassName = buildClassName(\n 'MenuItem',\n className,\n disabled && 'disabled',\n destructive && 'destructive',\n );\n\n const content = (\n <>\n {icon && (\n <i className={`icon-${icon}`} data-char={icon.startsWith('char-') ? icon.replace('char-', '') : undefined} />\n )}\n {children}\n </>\n );\n\n if (href) {\n return (\n <a\n tabIndex={0}\n className={fullClassName}\n href={href}\n download={download}\n aria-label={ariaLabel}\n title={ariaLabel}\n target={href.startsWith(window.location.origin) ? '_self' : '_blank'}\n rel=\"noopener noreferrer\"\n dir={lang.isRtl ? 'rtl' : undefined}\n onClick={onClick}\n >\n {content}\n </a>\n );\n }\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n className={fullClassName}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n aria-label={ariaLabel}\n title={ariaLabel}\n dir={lang.isRtl ? 'rtl' : undefined}\n >\n {content}\n </div>\n );\n};\n\nexport default MenuItem;\n","import React, {\n FC, useCallback, useMemo, useState, memo,\n} from '../../lib/teact/teact';\nimport { debounce } from '../../util/schedulers';\n\nimport './RippleEffect.scss';\n\ninterface Ripple {\n x: number;\n y: number;\n size: number;\n}\n\nconst ANIMATION_DURATION_MS = 700;\n\nconst RippleEffect: FC = () => {\n const [ripples, setRipples] = useState<Ripple[]>([]);\n\n const cleanUpDebounced = useMemo(() => {\n return debounce(() => {\n setRipples([]);\n }, ANIMATION_DURATION_MS, false);\n }, []);\n\n const handleMouseDown = useCallback((e: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n if (e.button !== 0) {\n return;\n }\n\n const container = e.currentTarget as HTMLDivElement;\n const position = container.getBoundingClientRect() as DOMRect;\n\n const rippleSize = container.offsetWidth / 2;\n\n setRipples([\n ...ripples,\n {\n x: e.clientX - position.x - (rippleSize / 2),\n y: e.clientY - position.y - (rippleSize / 2),\n size: rippleSize,\n },\n ]);\n\n requestAnimationFrame(() => {\n cleanUpDebounced();\n });\n }, [ripples, cleanUpDebounced]);\n\n return (\n <div className=\"ripple-container\" onMouseDown={handleMouseDown}>\n {ripples.map(({ x, y, size }: Ripple) => (\n <span\n // @ts-ignore\n style={`left: ${x}px; top: ${y}px; width: ${size}px; height: ${size}px;`}\n />\n ))}\n </div>\n );\n};\n\nexport default memo(RippleEffect);\n","import { ISettings } from '../types';\n\nimport { animateSingle } from './animation';\n\nimport themeColors from '../styles/themes.json';\n\ntype RGBAColor = {\n r: number;\n g: number;\n b: number;\n a?: number;\n};\n\nlet isInitialized = false;\n\nconst HEX_COLOR_REGEX = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})?$/i;\nconst DURATION_MS = 200;\nconst ENABLE_ANIMATION_DELAY_MS = 500;\n\nconst lerp = (start: number, end: number, interpolationRatio: number) => {\n return (1 - interpolationRatio) * start + interpolationRatio * end;\n};\n\nconst colors = (Object.keys(themeColors) as Array<keyof typeof themeColors>).map((property) => ({\n property,\n colors: [hexToRgb(themeColors[property][0]), hexToRgb(themeColors[property][1])],\n}));\n\nexport default (theme: ISettings['theme'], withAnimation: boolean) => {\n const isDarkTheme = theme === 'dark';\n const shouldAnimate = isInitialized && withAnimation;\n const startIndex = isDarkTheme ? 0 : 1;\n const endIndex = isDarkTheme ? 1 : 0;\n const startAt = Date.now();\n const themeColorTag = document.querySelector('meta[name=\"theme-color\"]');\n\n document.documentElement.classList.remove(`theme-${isDarkTheme ? 'light' : 'dark'}`);\n if (isInitialized) {\n document.documentElement.classList.add('no-animations');\n }\n document.documentElement.classList.add(`theme-${theme}`);\n if (themeColorTag) {\n themeColorTag.setAttribute('content', isDarkTheme ? '#212121' : '#fff');\n }\n\n setTimeout(() => {\n document.documentElement.classList.remove('no-animations');\n }, ENABLE_ANIMATION_DELAY_MS);\n\n isInitialized = true;\n\n if (shouldAnimate) {\n animateSingle(() => {\n const t = Math.min((Date.now() - startAt) / DURATION_MS, 1);\n\n applyColorAnimationStep(startIndex, endIndex, transition(t));\n\n return t < 1;\n });\n } else {\n applyColorAnimationStep(startIndex, endIndex);\n }\n};\n\nfunction transition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n\nfunction hexToRgb(hex: string): RGBAColor {\n const result = HEX_COLOR_REGEX.exec(hex)!;\n\n return {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16),\n a: result[4] !== undefined ? parseInt(result[4], 16) : undefined,\n };\n}\n\nfunction applyColorAnimationStep(startIndex: number, endIndex: number, interpolationRatio: number = 1) {\n colors.forEach(({ property, colors: propertyColors }) => {\n const r = Math.round(lerp(propertyColors[startIndex].r, propertyColors[endIndex].r, interpolationRatio));\n const g = Math.round(lerp(propertyColors[startIndex].g, propertyColors[endIndex].g, interpolationRatio));\n const b = Math.round(lerp(propertyColors[startIndex].b, propertyColors[endIndex].b, interpolationRatio));\n const a = propertyColors[startIndex].a !== undefined\n ? Math.round(lerp(propertyColors[startIndex].a!, propertyColors[endIndex].a!, interpolationRatio))\n : undefined;\n\n document.documentElement.style.setProperty(property, a !== undefined\n ? `rgba(${r},${g},${b},${a / 255})`\n : `rgb(${r},${g},${b})`);\n });\n}\n","import WebpWorker from 'worker-loader!../lib/webp/webp_wasm.worker';\nimport { isWebpSupported } from './environment';\nimport { dataUriToBlob, blobToDataUri } from './files';\nimport { pause } from './schedulers';\n\ntype TEncodedImage = {\n result: Uint8ClampedArray;\n width: number;\n height: number;\n};\n\nconst WORKER_INITIALIZATION_TIMEOUT = 2000;\n\nlet canvas: HTMLCanvasElement;\nlet worker: IWebpWorker;\n\nexport const EMPTY_IMAGE_DATA_URI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk'\n + 'YAAAAAYAAjCB0C8AAAAASUVORK5CYII=';\n\nexport async function webpToPng(url: string, blob: Blob): Promise<Blob | undefined> {\n initWebpWorker();\n\n while (!worker.wasmReady) {\n await pause(WORKER_INITIALIZATION_TIMEOUT);\n }\n\n const { result, width, height } = await getDecodePromise(url, blob);\n if (!width || !height) {\n return undefined;\n }\n\n return createPng({ result, width, height });\n}\n\nexport async function webpToPngBase64(key: string, url: string): Promise<string> {\n if (isWebpSupported() || url.substr(0, 15) !== 'data:image/webp') {\n return url;\n }\n\n initWebpWorker();\n\n const pngBlob = await webpToPng(key, dataUriToBlob(url));\n\n if (!pngBlob) {\n throw new Error(`Can't convert webp to png. Url: ${url}`);\n }\n\n return blobToDataUri(pngBlob);\n}\n\nfunction initWebpWorker() {\n if (!worker) {\n worker = new WebpWorker() as IWebpWorker;\n worker.wasmReady = false;\n worker.onmessage = handleLibWebpMessage;\n }\n}\n\nfunction createPng({ result, width, height }: TEncodedImage): Promise<Blob | undefined> {\n if (!canvas) {\n canvas = document.createElement('canvas');\n }\n\n return new Promise((resolve) => {\n const img = new ImageData(result, width, height);\n\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d')!;\n ctx.putImageData(img, 0, 0);\n\n canvas.toBlob((blob) => {\n resolve(blob ?? undefined);\n }, 'image/png', 1);\n });\n}\n\nfunction handleLibWebpMessage(e: MessageEvent) {\n const { id } = e.data;\n switch (e.data.type) {\n case 'initialized': {\n worker.wasmReady = true;\n break;\n }\n\n case 'result': {\n if (worker.requests.has(id)) {\n const resolve = worker.requests.get(id)!;\n\n worker.requests.delete(id);\n resolve(e.data!);\n }\n break;\n }\n }\n}\n\nfunction getDecodePromise(url: string, blob: Blob): Promise<TEncodedImage> {\n return new Promise((resolve) => {\n worker.requests = worker.requests || new Map();\n worker.requests.set(url, resolve);\n worker.postMessage({ id: url, blob });\n });\n}\n","import { ChangeEvent, FormEvent, RefObject } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\ntype OwnProps = {\n ref?: RefObject<HTMLInputElement>;\n id?: string;\n className?: string;\n value?: string;\n label?: string;\n error?: string;\n success?: string;\n disabled?: boolean;\n readOnly?: boolean;\n placeholder?: string;\n autoComplete?: string;\n maxLength?: number;\n inputMode?: 'text' | 'none' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search';\n onChange?: (e: ChangeEvent<HTMLInputElement>) => void;\n onInput?: (e: FormEvent<HTMLInputElement>) => void;\n onKeyPress?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n onKeyDown?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;\n onPaste?: (e: React.ClipboardEvent<HTMLInputElement>) => void;\n};\n\nconst InputText: FC<OwnProps> = ({\n ref,\n id,\n className,\n value,\n label,\n error,\n success,\n disabled,\n readOnly,\n placeholder,\n autoComplete,\n inputMode,\n maxLength,\n onChange,\n onInput,\n onKeyPress,\n onKeyDown,\n onBlur,\n onPaste,\n}) => {\n const lang = useLang();\n const labelText = error || success || label;\n const fullClassName = buildClassName(\n 'input-group',\n value && 'touched',\n error ? 'error' : success && 'success',\n disabled && 'disabled',\n readOnly && 'disabled',\n labelText && 'with-label',\n className,\n );\n\n return (\n <div className={fullClassName} dir={lang.isRtl ? 'rtl' : undefined}>\n <input\n ref={ref}\n className=\"form-control\"\n type=\"text\"\n id={id}\n dir=\"auto\"\n value={value || ''}\n placeholder={placeholder}\n maxLength={maxLength}\n autoComplete={autoComplete}\n inputMode={inputMode}\n disabled={disabled}\n readOnly={readOnly}\n onChange={onChange}\n onInput={onInput}\n onKeyPress={onKeyPress}\n onKeyDown={onKeyDown}\n onBlur={onBlur}\n onPaste={onPaste}\n />\n {labelText && (\n <label htmlFor={id}>{labelText}</label>\n )}\n </div>\n );\n};\n\nexport default memo(InputText);\n","import { ChangeEvent } from 'react';\nimport React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from './Spinner';\n\nimport './Checkbox.scss';\n\ntype OwnProps = {\n id?: string;\n name?: string;\n value?: string;\n label: string;\n subLabel?: string;\n checked: boolean;\n disabled?: boolean;\n round?: boolean;\n blocking?: boolean;\n isLoading?: boolean;\n withCheckedCallback?: boolean;\n onChange?: (e: ChangeEvent<HTMLInputElement>) => void;\n onCheck?: (isChecked: boolean) => void;\n};\n\nconst Checkbox: FC<OwnProps> = ({\n id,\n name,\n value,\n label,\n subLabel,\n checked,\n disabled,\n round,\n blocking,\n isLoading,\n onChange,\n onCheck,\n}) => {\n const lang = useLang();\n const handleChange = useCallback((event: ChangeEvent<HTMLInputElement>) => {\n if (onChange) {\n onChange(event);\n }\n\n if (onCheck) {\n onCheck(event.currentTarget.checked);\n }\n }, [onChange, onCheck]);\n\n const className = buildClassName(\n 'Checkbox',\n disabled && 'disabled',\n round && 'round',\n isLoading && 'loading',\n blocking && 'blocking',\n );\n\n return (\n <label className={className} dir={lang.isRtl ? 'rtl' : undefined}>\n <input\n type=\"checkbox\"\n id={id}\n name={name}\n value={value}\n checked={checked}\n disabled={disabled}\n onChange={handleChange}\n />\n <div className=\"Checkbox-main\">\n <span className=\"label\" dir=\"auto\">{label}</span>\n {subLabel && <span className=\"subLabel\" dir=\"auto\">{subLabel}</span>}\n </div>\n {isLoading && <Spinner />}\n </label>\n );\n};\n\nexport default memo(Checkbox);\n","import captureKeyboardListener from './captureKeyboardListeners';\n\ntype IHandlerFunction = () => void;\n\nexport default function captureEscKeyListener(handler: IHandlerFunction) {\n return captureKeyboardListener({ onEsc: handler });\n}\n","export function formatInteger(value: number) {\n return String(value).replace(/\\d(?=(\\d{3})+$)/g, '$& ');\n}\n\nfunction formatFixedNumber(number: number) {\n const fixed = String(number.toFixed(1));\n if (fixed.substr(-2) === '.0') {\n return Math.round(number);\n }\n\n return number.toFixed(1).replace('.', ',');\n}\n\nexport function formatIntegerCompact(views: number) {\n if (views < 1e3) {\n return views;\n }\n\n if (views < 1e6) {\n return `${formatFixedNumber(views / 1e3)}K`;\n }\n\n return `${formatFixedNumber(views / 1e6)}M`;\n}\n\nexport function getFirstLetters(phrase: string, count = 2) {\n return phrase\n .replace(/[.,!@#$%^&*()_+=\\-`~[\\]/\\\\{}:\"|<>?]+/gi, '')\n .trim()\n .split(/\\s+/)\n .slice(0, count)\n .map((word: string) => word.length && word.match(/./u)![0].toUpperCase())\n .join('');\n}\n","export const MEMO_EMPTY_ARRAY = [];\n","import { useEffect } from '../lib/teact/teact';\n\nconst ANIMATION_START_EVENT = 'tt-event-heavy-animation-start';\nconst ANIMATION_END_EVENT = 'tt-event-heavy-animation-end';\n\nlet timeout: number | undefined;\nlet isAnimating = false;\n\nexport const dispatchHeavyAnimationEvent = (duration?: number) => {\n if (!isAnimating) {\n isAnimating = true;\n document.dispatchEvent(new Event(ANIMATION_START_EVENT));\n }\n\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n if (duration) {\n timeout = window.setTimeout(() => {\n isAnimating = false;\n document.dispatchEvent(new Event(ANIMATION_END_EVENT));\n timeout = undefined;\n }, duration);\n }\n\n return () => {\n isAnimating = false;\n document.dispatchEvent(new Event(ANIMATION_END_EVENT));\n };\n};\n\nexport default (\n handleAnimationStart: AnyToVoidFunction,\n handleAnimationEnd: AnyToVoidFunction,\n) => {\n useEffect(() => {\n if (isAnimating) {\n handleAnimationStart();\n }\n\n document.addEventListener(ANIMATION_START_EVENT, handleAnimationStart);\n document.addEventListener(ANIMATION_END_EVENT, handleAnimationEnd);\n\n return () => {\n document.removeEventListener(ANIMATION_END_EVENT, handleAnimationEnd);\n document.removeEventListener(ANIMATION_START_EVENT, handleAnimationStart);\n };\n }, [handleAnimationEnd, handleAnimationStart]);\n};\n","import usePrevious from './usePrevious';\n\nexport default <T extends any[], PT = T>(cb: (args: PT) => void, dependencies: T) => {\n const prevDeps = usePrevious<T>(dependencies);\n if (!prevDeps || dependencies.some((d, i) => d !== prevDeps[i])) {\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n cb(prevDeps || []);\n }\n};\n","const RE_NOT_LETTER = /[^\\wа-яё]+/;\n\nexport default function searchWords(haystack: string, needle: string) {\n if (!haystack || !needle) {\n return false;\n }\n\n const haystackWords = haystack.toLowerCase().split(RE_NOT_LETTER);\n const needleWords = needle.toLowerCase().split(RE_NOT_LETTER);\n\n return needleWords.every((needleWord) => (\n haystackWords.some((haystackWord) => haystackWord.startsWith(needleWord))\n ));\n}\n","import { throttle } from './schedulers';\nimport {\n MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT,\n MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH,\n MOBILE_SCREEN_MAX_WIDTH,\n} from '../config';\nimport { IS_IOS, IS_SINGLE_COLUMN_LAYOUT } from './environment';\n\ntype IDimensions = {\n width: number;\n height: number;\n};\n\nconst IS_LANDSCAPE = IS_SINGLE_COLUMN_LAYOUT && isLandscape();\n\nconst initialHeight = window.innerHeight;\nlet windowSize = updateSizes();\nlet isRefreshDisabled = false;\n\nfunction disableRefresh() {\n isRefreshDisabled = true;\n}\n\nfunction enableRefresh() {\n isRefreshDisabled = false;\n}\n\nconst handleResize = throttle(() => {\n windowSize = updateSizes();\n\n if (!isRefreshDisabled && (\n isMobileScreen() !== IS_SINGLE_COLUMN_LAYOUT\n || (IS_SINGLE_COLUMN_LAYOUT && IS_LANDSCAPE !== isLandscape())\n )) {\n window.location.reload();\n }\n}, 250, true);\n\nwindow.addEventListener('resize', handleResize);\nwindow.addEventListener('orientationchange', handleResize);\n\nexport function updateSizes(): IDimensions {\n const vh = window.innerHeight * 0.01;\n\n document.documentElement.style.setProperty('--vh', `${vh}px`);\n\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n}\n\nfunction isMobileScreen() {\n return windowSize.width <= MOBILE_SCREEN_MAX_WIDTH || (\n windowSize.width <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH && windowSize.height <= MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT\n );\n}\n\nfunction isLandscape() {\n if (IS_IOS) {\n return window.matchMedia('(orientation: landscape)').matches;\n }\n\n // eslint-disable-next-line max-len\n // Source: https://web.archive.org/web/20160509220835/http://blog.abouthalf.com/development/orientation-media-query-challenges-in-android-browsers/\n // Feature is marked as deprecated now, but it is still supported\n // https://developer.mozilla.org/en-US/docs/Web/CSS/@media/device-aspect-ratio#browser_compatibility\n return window.matchMedia('screen and (min-device-aspect-ratio: 1/1) and (orientation: landscape)').matches;\n}\n\nexport default {\n get: () => windowSize,\n getIsKeyboardVisible: () => initialHeight > windowSize.height,\n disableRefresh,\n enableRefresh,\n};\n","import { RefObject } from 'react';\nimport React, { FC, useEffect, useRef } from '../../lib/teact/teact';\n\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useKeyboardListNavigation from '../../hooks/useKeyboardListNavigation';\nimport useVirtualBackdrop from '../../hooks/useVirtualBackdrop';\nimport useEffectWithPrevDeps from '../../hooks/useEffectWithPrevDeps';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport './Menu.scss';\n\ntype OwnProps = {\n ref?: RefObject<HTMLDivElement>;\n containerRef?: RefObject<HTMLElement>;\n isOpen: boolean;\n className?: string;\n style?: string;\n positionX?: 'left' | 'right';\n positionY?: 'top' | 'bottom';\n autoClose?: boolean;\n shouldSkipTransition?: boolean;\n footer?: string;\n noCloseOnBackdrop?: boolean;\n onKeyDown?: (e: React.KeyboardEvent<any>) => void;\n onCloseAnimationEnd?: () => void;\n onClose?: () => void;\n onMouseEnter?: (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;\n onMouseLeave?: (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;\n children: any;\n};\n\nconst ANIMATION_DURATION = 200;\n\nconst Menu: FC<OwnProps> = ({\n ref,\n containerRef,\n isOpen,\n className,\n style,\n children,\n positionX = 'left',\n positionY = 'top',\n autoClose = false,\n footer,\n noCloseOnBackdrop = false,\n onCloseAnimationEnd,\n onClose,\n onMouseEnter,\n onMouseLeave,\n shouldSkipTransition,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let menuRef = useRef<HTMLDivElement>(null);\n if (ref) {\n menuRef = ref;\n }\n const backdropContainerRef = containerRef || menuRef;\n\n const {\n transitionClassNames,\n } = useShowTransition(\n isOpen,\n onCloseAnimationEnd,\n shouldSkipTransition,\n undefined,\n shouldSkipTransition,\n );\n\n useEffect(\n () => (isOpen && onClose ? captureEscKeyListener(onClose) : undefined),\n [isOpen, onClose],\n );\n\n useHistoryBack(isOpen, onClose, undefined, undefined, autoClose);\n\n useEffectWithPrevDeps(([prevIsOpen]) => {\n if (prevIsOpen !== undefined) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }\n }, [isOpen]);\n\n const handleKeyDown = useKeyboardListNavigation(menuRef, isOpen, autoClose ? onClose : undefined, undefined, true);\n\n useVirtualBackdrop(\n isOpen,\n backdropContainerRef,\n noCloseOnBackdrop ? undefined : onClose,\n );\n\n const bubbleClassName = buildClassName(\n 'bubble menu-container custom-scroll',\n positionY,\n positionX,\n footer && 'with-footer',\n transitionClassNames,\n );\n\n return (\n <div\n className={buildClassName('Menu no-selection', className)}\n onKeyDown={isOpen ? handleKeyDown : undefined}\n onMouseEnter={onMouseEnter}\n onMouseLeave={isOpen ? onMouseLeave : undefined}\n // @ts-ignore teact feature\n style={style}\n >\n {isOpen && (\n // This only prevents click events triggering on underlying elements\n <div className=\"backdrop\" />\n )}\n <div\n ref={menuRef}\n className={bubbleClassName}\n // @ts-ignore teact feature\n style={`transform-origin: ${positionY} ${positionX}`}\n onClick={autoClose ? onClose : undefined}\n >\n {children}\n {footer && <div className=\"footer\">{footer}</div>}\n </div>\n </div>\n );\n};\n\nexport default Menu;\n","type HandlerName = 'onEnter' | 'onBackspace' | 'onDelete' | 'onEsc' | 'onUp' | 'onDown' | 'onLeft' | 'onRight'\n| 'onTab';\ntype Handler = (e: KeyboardEvent) => void;\ntype CaptureOptions = Partial<Record<HandlerName, Handler>>;\n\nconst keyToHandlerName: Record<string, HandlerName> = {\n Enter: 'onEnter',\n Backspace: 'onBackspace',\n Delete: 'onDelete',\n Esc: 'onEsc',\n Escape: 'onEsc',\n ArrowUp: 'onUp',\n ArrowDown: 'onDown',\n ArrowLeft: 'onLeft',\n ArrowRight: 'onRight',\n Tab: 'onTab',\n};\n\nconst handlers: Record<HandlerName, Handler[]> = {\n onEnter: [],\n onDelete: [],\n onBackspace: [],\n onEsc: [],\n onUp: [],\n onDown: [],\n onLeft: [],\n onRight: [],\n onTab: [],\n};\n\nexport default function captureKeyboardListeners(options: CaptureOptions) {\n if (!hasActiveHandlers()) {\n document.addEventListener('keydown', handleKeyDown, true);\n }\n\n (Object.keys(options) as Array<HandlerName>).forEach((handlerName) => {\n const handler = options[handlerName];\n if (!handler) {\n return;\n }\n\n const currentEventHandlers = handlers[handlerName];\n if (currentEventHandlers) {\n currentEventHandlers.push(handler);\n }\n });\n\n return () => {\n releaseKeyboardListener(options);\n };\n}\n\nfunction hasActiveHandlers() {\n return Object.values(handlers).some((keyHandlers) => Boolean(keyHandlers.length));\n}\n\nfunction handleKeyDown(e: KeyboardEvent) {\n const handlerName = keyToHandlerName[e.key];\n if (!handlerName) {\n return;\n }\n\n const { length } = handlers[handlerName];\n if (!length) {\n return;\n }\n e.stopPropagation();\n\n const handler = handlers[handlerName][length - 1];\n handler!(e);\n}\n\nfunction releaseKeyboardListener(options: CaptureOptions) {\n (Object.keys(options) as Array<HandlerName>).forEach((handlerName) => {\n const handler = options[handlerName];\n const currentEventHandlers = handlers[handlerName];\n if (currentEventHandlers) {\n const index = currentEventHandlers.findIndex((cb) => cb === handler);\n if (index !== -1) {\n currentEventHandlers.splice(index, 1);\n }\n }\n });\n\n if (!hasActiveHandlers()) {\n document.removeEventListener('keydown', handleKeyDown, false);\n }\n}\n","import DecoderWorker from 'worker-loader!opus-recorder/dist/decoderWorker.min';\nimport WavWorker from 'worker-loader!opus-recorder/dist/waveWorker.min';\n\nconst SAMPLE_RATE = 48000;\nconst BIT_DEPTH = 16;\n\nexport async function oggToWav(opusData: Blob): Promise<Blob> {\n const arrayBuffer = await new Response(opusData).arrayBuffer();\n\n return new Promise((resolve) => {\n const typedArray = new Uint8Array(arrayBuffer);\n\n let decoderWorker: DecoderWorker | undefined = new DecoderWorker();\n let wavWorker: WavWorker | undefined = new WavWorker();\n\n decoderWorker.onmessage = (e) => {\n // eslint-disable-next-line no-null/no-null\n if (e.data === null) {\n // `null` means decoder is finished\n wavWorker!.postMessage({ command: 'done' });\n } else {\n // `e.data` contains decoded buffers as float32 values\n wavWorker!.postMessage(\n {\n command: 'encode',\n buffers: e.data,\n },\n e.data.map(({ buffer }: Float32Array) => buffer),\n );\n }\n };\n\n wavWorker.onmessage = (e) => {\n if (e.data.message === 'page') {\n resolve(new Blob([e.data.page], { type: 'audio/wav' }));\n\n decoderWorker!.terminate();\n decoderWorker = undefined;\n wavWorker!.terminate();\n wavWorker = undefined;\n }\n };\n\n wavWorker.postMessage({\n command: 'init',\n wavBitDepth: BIT_DEPTH,\n wavSampleRate: SAMPLE_RATE,\n });\n\n decoderWorker.postMessage({\n command: 'init',\n decoderSampleRate: SAMPLE_RATE,\n outputBufferSampleRate: SAMPLE_RATE,\n });\n\n decoderWorker.postMessage({\n command: 'decode',\n pages: typedArray,\n }, [typedArray.buffer]);\n });\n}\n","import {\n ApiMediaFormat,\n ApiMediaFormatToPrepared,\n ApiOnProgress,\n ApiParsedMedia,\n ApiPreparedMedia,\n} from '../api/types';\n\nimport {\n DEBUG, MEDIA_CACHE_DISABLED, MEDIA_CACHE_NAME, MEDIA_CACHE_NAME_AVATARS,\n} from '../config';\nimport { callApi, cancelApiProgress } from '../api/gramjs';\nimport * as cacheApi from './cacheApi';\nimport { fetchBlob } from './files';\nimport { IS_OPUS_SUPPORTED, IS_PROGRESSIVE_SUPPORTED, isWebpSupported } from './environment';\nimport { oggToWav } from './oggToWav';\nimport { webpToPng } from './webpToPng';\n\nconst asCacheApiType = {\n [ApiMediaFormat.DataUri]: cacheApi.Type.Text,\n [ApiMediaFormat.BlobUrl]: cacheApi.Type.Blob,\n [ApiMediaFormat.Lottie]: cacheApi.Type.Json,\n [ApiMediaFormat.Progressive]: undefined,\n [ApiMediaFormat.Stream]: undefined,\n};\n\nconst PROGRESSIVE_URL_PREFIX = './progressive/';\n\nconst memoryCache = new Map<string, ApiPreparedMedia>();\nconst fetchPromises = new Map<string, Promise<ApiPreparedMedia | undefined>>();\n\nexport function fetch<T extends ApiMediaFormat>(\n url: string, mediaFormat: T, onProgress?: ApiOnProgress,\n): Promise<ApiMediaFormatToPrepared<T>> {\n if (mediaFormat === ApiMediaFormat.Progressive) {\n return (\n IS_PROGRESSIVE_SUPPORTED\n ? getProgressive(url)\n : fetch(url, ApiMediaFormat.BlobUrl, onProgress)\n ) as Promise<ApiMediaFormatToPrepared<T>>;\n }\n\n if (!fetchPromises.has(url)) {\n const promise = fetchFromCacheOrRemote(url, mediaFormat, onProgress)\n .catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn(err);\n }\n\n return undefined;\n })\n .finally(() => {\n fetchPromises.delete(url);\n });\n\n fetchPromises.set(url, promise);\n }\n\n return fetchPromises.get(url) as Promise<ApiMediaFormatToPrepared<T>>;\n}\n\nexport function getFromMemory<T extends ApiMediaFormat>(url: string) {\n return memoryCache.get(url) as ApiMediaFormatToPrepared<T>;\n}\n\nexport function cancelProgress(progressCallback: ApiOnProgress) {\n cancelApiProgress(progressCallback);\n}\n\nfunction getProgressive(url: string) {\n const progressiveUrl = `${PROGRESSIVE_URL_PREFIX}${url}`;\n\n memoryCache.set(url, progressiveUrl);\n\n return Promise.resolve(progressiveUrl);\n}\n\nasync function fetchFromCacheOrRemote(url: string, mediaFormat: ApiMediaFormat, onProgress?: ApiOnProgress) {\n if (!MEDIA_CACHE_DISABLED) {\n const cacheName = url.startsWith('avatar') ? MEDIA_CACHE_NAME_AVATARS : MEDIA_CACHE_NAME;\n const cached = await cacheApi.fetch(cacheName, url, asCacheApiType[mediaFormat]!);\n if (cached) {\n let media = cached;\n\n if (cached.type === 'audio/ogg' && !IS_OPUS_SUPPORTED) {\n media = await oggToWav(media);\n }\n\n if (cached.type === 'image/webp' && !isWebpSupported() && media) {\n const mediaPng = await webpToPng(url, media);\n if (mediaPng) {\n media = mediaPng;\n }\n }\n\n const prepared = prepareMedia(media);\n\n memoryCache.set(url, prepared);\n\n return prepared;\n }\n }\n\n if (mediaFormat === ApiMediaFormat.Stream) {\n const mediaSource = new MediaSource();\n const streamUrl = URL.createObjectURL(mediaSource);\n let isOpen = false;\n\n mediaSource.addEventListener('sourceopen', () => {\n if (isOpen) {\n return;\n }\n isOpen = true;\n\n const sourceBuffer = mediaSource.addSourceBuffer('audio/mpeg');\n\n void callApi('downloadMedia', { url, mediaFormat }, (progress: number, arrayBuffer: ArrayBuffer) => {\n if (onProgress) {\n onProgress(progress);\n }\n\n if (progress === 1) {\n mediaSource.endOfStream();\n }\n\n if (!arrayBuffer) {\n return;\n }\n\n sourceBuffer.appendBuffer(arrayBuffer!);\n });\n });\n\n memoryCache.set(url, streamUrl);\n return streamUrl;\n }\n\n const remote = await callApi('downloadMedia', { url, mediaFormat }, onProgress);\n if (!remote) {\n throw new Error('Failed to fetch media');\n }\n\n let { prepared, mimeType } = remote;\n\n if (mimeType === 'audio/ogg' && !IS_OPUS_SUPPORTED) {\n const blob = await fetchBlob(prepared as string);\n URL.revokeObjectURL(prepared as string);\n const media = await oggToWav(blob);\n prepared = prepareMedia(media);\n mimeType = blob.type;\n }\n\n if (mimeType === 'image/webp' && !isWebpSupported()) {\n const blob = await fetchBlob(prepared as string);\n URL.revokeObjectURL(prepared as string);\n const media = await webpToPng(url, blob);\n if (media) {\n prepared = prepareMedia(media);\n }\n }\n\n memoryCache.set(url, prepared);\n\n return prepared;\n}\n\nfunction prepareMedia(mediaData: ApiParsedMedia): ApiPreparedMedia {\n if (mediaData instanceof Blob) {\n return URL.createObjectURL(mediaData);\n }\n\n return mediaData;\n}\n\nif (IS_PROGRESSIVE_SUPPORTED) {\n navigator.serviceWorker.addEventListener('message', async (e) => {\n const { type, messageId, params } = e.data as {\n type: string;\n messageId: string;\n params: { url: string; start: number; end: number };\n };\n\n if (type !== 'requestPart') {\n return;\n }\n\n const result = await callApi('downloadMedia', { mediaFormat: ApiMediaFormat.Progressive, ...params });\n if (!result) {\n return;\n }\n\n const { arrayBuffer, mimeType, fullSize } = result;\n\n navigator.serviceWorker.controller!.postMessage({\n type: 'partResponse',\n messageId,\n result: {\n arrayBuffer,\n mimeType,\n fullSize,\n },\n }, [arrayBuffer!]);\n });\n}\n","import { useEffect } from '../lib/teact/teact';\nimport usePrevious from './usePrevious';\n\nexport default <T extends any[], PT = T>(cb: (args: PT) => void, dependencies: T) => {\n const prevDeps = usePrevious<T>(dependencies);\n return useEffect(() => {\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n return cb(prevDeps || []);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n};\n","/* eslint-disable no-nested-ternary */\n/* eslint-disable no-bitwise */\n\nconst utf16 = {\n // The utf16-class is necessary to convert from javascripts internal character representation to unicode and back.\n decode: (input) => {\n const output = [];\n let i = 0;\n const len = input.length;\n let value;\n let extra;\n\n while (i < len) {\n value = input.charCodeAt(i++);\n if ((value & 0xf800) === 0xd800) {\n extra = input.charCodeAt(i++);\n if ((value & 0xfc00) !== 0xd800 || (extra & 0xfc00) !== 0xdc00) {\n throw new RangeError('UTF-16(decode): Illegal UTF-16 sequence');\n }\n value = ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000;\n }\n output.push(value);\n }\n return output;\n },\n encode: (input) => {\n const output = [];\n let i = 0;\n const len = input.length;\n let value;\n\n while (i < len) {\n value = input[i++];\n if ((value & 0xf800) === 0xd800) {\n throw new RangeError('UTF-16(encode): Illegal UTF-16 value');\n }\n if (value > 0xffff) {\n value -= 0x10000;\n output.push(String.fromCharCode(((value >>> 10) & 0x3ff) | 0xd800));\n value = 0xdc00 | (value & 0x3ff);\n }\n output.push(String.fromCharCode(value));\n }\n return output.join('');\n },\n};\n\n// Default parameters\nconst initial_n = 0x80;\nconst initial_bias = 72;\nconst delimiter = '\\x2D';\nconst base = 36;\nconst damp = 700;\nconst tmin = 1;\nconst tmax = 26;\nconst skew = 38;\nconst maxint = 0x7fffffff;\n\n// decode_digit(cp) returns the numeric value of a basic code\n// point (for use in representing integers) in the range 0 to\n// base-1, or base if cp is does not represent a value.\n\nfunction decode_digit(cp) {\n return cp - 48 < 10 ? cp - 22 : cp - 65 < 26 ? cp - 65 : cp - 97 < 26 ? cp - 97 : base;\n}\n\n// ** Bias adaptation function **\nfunction adapt(delta, numpoints, firsttime) {\n let k;\n delta = firsttime ? Math.floor(delta / damp) : delta >> 1;\n delta += Math.floor(delta / numpoints);\n\n for (k = 0; delta > ((base - tmin) * tmax) >> 1; k += base) {\n delta = Math.floor(delta / (base - tmin));\n }\n return Math.floor(k + ((base - tmin + 1) * delta) / (delta + skew));\n}\n\n// Main decode\nfunction decode(input, preserveCase) {\n // Dont use utf16\n const output = [];\n const case_flags = [];\n const input_length = input.length;\n\n let n; let out; let i; let bias; let basic; let j; let ic; let oldi; let w; let k; let digit; let t; let len;\n\n // Initialize the state:\n\n n = initial_n;\n i = 0;\n bias = initial_bias;\n\n // Handle the basic code points: Let basic be the number of input code\n // points before the last delimiter, or 0 if there is none, then\n // copy the first basic code points to the output.\n\n basic = input.lastIndexOf(delimiter);\n if (basic < 0) basic = 0;\n\n for (j = 0; j < basic; ++j) {\n if (preserveCase) case_flags[output.length] = input.charCodeAt(j) - 65 < 26;\n if (input.charCodeAt(j) >= 0x80) {\n throw new RangeError('Illegal input >= 0x80');\n }\n output.push(input.charCodeAt(j));\n }\n\n // Main decoding loop: Start just after the last delimiter if any\n // basic code points were copied; start at the beginning otherwise.\n\n for (ic = basic > 0 ? basic + 1 : 0; ic < input_length;) {\n // ic is the index of the next character to be consumed,\n\n // Decode a generalized variable-length integer into delta,\n // which gets added to i. The overflow checking is easier\n // if we increase i as we go, then subtract off its starting\n // value at the end to obtain delta.\n for (oldi = i, w = 1, k = base; ; k += base) {\n if (ic >= input_length) {\n throw RangeError('punycode_bad_input(1)');\n }\n digit = decode_digit(input.charCodeAt(ic++));\n\n if (digit >= base) {\n throw RangeError('punycode_bad_input(2)');\n }\n if (digit > Math.floor((maxint - i) / w)) {\n throw RangeError('punycode_overflow(1)');\n }\n i += digit * w;\n t = k <= bias ? tmin : k >= bias + tmax ? tmax : k - bias;\n if (digit < t) {\n break;\n }\n if (w > Math.floor(maxint / (base - t))) {\n throw RangeError('punycode_overflow(2)');\n }\n w *= base - t;\n }\n\n out = output.length + 1;\n bias = adapt(i - oldi, out, oldi === 0);\n\n // i was supposed to wrap around from out to 0,\n // incrementing n each time, so we'll fix that now:\n if (Math.floor(i / out) > maxint - n) {\n throw RangeError('punycode_overflow(3)');\n }\n n += Math.floor(i / out);\n i %= out;\n\n // Insert n at position i of the output:\n // Case of last character determines uppercase flag:\n if (preserveCase) {\n case_flags.splice(i, 0, input.charCodeAt(ic - 1) - 65 < 26);\n }\n\n output.splice(i, 0, n);\n i++;\n }\n if (preserveCase) {\n for (i = 0, len = output.length; i < len; i++) {\n if (case_flags[i]) {\n output[i] = String.fromCharCode(output[i])\n .toUpperCase()\n .charCodeAt(0);\n }\n }\n }\n return utf16.encode(output);\n}\n\nfunction toUnicode(domain) {\n const domain_array = domain.split('.');\n const out = [];\n for (let i = 0; i < domain_array.length; ++i) {\n const s = domain_array[i];\n out.push(s.match(/^xn--/) ? decode(s.slice(4)) : s);\n }\n return out.join('.');\n}\n\nexport default toUnicode;\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\nimport { getDispatch } from '../../lib/teact/teactn';\nimport convertPunycode from '../../lib/punycode';\n\nimport { DEBUG, RE_TME_INVITE_LINK, RE_TME_LINK } from '../../config';\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n url?: string;\n text: string;\n className?: string;\n children?: any;\n isRtl?: boolean;\n};\n\nconst SafeLink: FC<OwnProps> = ({\n url,\n text,\n className,\n children,\n isRtl,\n}) => {\n const { toggleSafeLinkModal, openTelegramLink } = getDispatch();\n\n const content = children || text;\n const isNotSafe = url !== content;\n\n const handleClick = useCallback((e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {\n if (\n e.ctrlKey || e.altKey || e.shiftKey || e.metaKey\n || !url || (!url.match(RE_TME_LINK) && !url.match(RE_TME_INVITE_LINK))\n ) {\n if (isNotSafe) {\n toggleSafeLinkModal({ url });\n\n e.preventDefault();\n return false;\n }\n\n return true;\n }\n\n e.preventDefault();\n openTelegramLink({ url });\n\n return false;\n }, [isNotSafe, openTelegramLink, toggleSafeLinkModal, url]);\n\n if (!url) {\n return undefined;\n }\n\n const classNames = buildClassName(\n className || 'text-entity-link',\n text.length > 50 && 'long-word-break-all',\n );\n\n return (\n <a\n href={ensureProtocol(url)}\n title={getDomain(url)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={classNames}\n onClick={handleClick}\n dir={isRtl ? 'rtl' : 'auto'}\n >\n {content}\n </a>\n );\n};\n\nfunction ensureProtocol(url?: string) {\n if (!url) {\n return undefined;\n }\n\n return url.includes('://') ? url : `https://${url}`;\n}\n\nfunction getDomain(url?: string) {\n if (!url) {\n return undefined;\n }\n\n const href = ensureProtocol(url);\n if (!href) {\n return undefined;\n }\n\n try {\n let decodedHref = decodeURI(href);\n\n const match = decodedHref.match(/^https?:\\/\\/([^/:?#]+)(?:[/:?#]|$)/i);\n if (!match) {\n return undefined;\n }\n const domain = match[1];\n decodedHref = decodedHref.replace(domain, convertPunycode(domain));\n\n return decodedHref;\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('SafeLink.getDecodedUrl error ', url, error);\n }\n }\n\n return undefined;\n}\n\nexport default memo(SafeLink);\n","import { ApiDocument } from '../../../api/types';\n\nconst ONE_GIGABYTE = 1024 * 1024 * 1024;\nconst ONE_MEGABYTE = 1024 * 1024;\n\nexport function getFileSizeString(bytes: number) {\n if (bytes > (ONE_GIGABYTE / 2)) {\n return `${(bytes / ONE_GIGABYTE).toFixed(1)} GB`;\n }\n if (bytes > (ONE_MEGABYTE / 2)) {\n return `${(bytes / ONE_MEGABYTE).toFixed(1)} MB`;\n }\n return `${(bytes / (1024)).toFixed(1)} KB`;\n}\n\nexport function getDocumentExtension(document: ApiDocument) {\n const { fileName, mimeType } = document;\n\n return getFileExtension(fileName, mimeType);\n}\n\nexport function getFileExtension(fileName: string, mimeType: string) {\n if (fileName && fileName.indexOf('.') !== -1) {\n return fileName.split('.').pop();\n } else {\n return mimeType.split('/').pop();\n }\n}\n\nexport function getColorFromExtension(extension: string) {\n switch (extension) {\n case 'apk':\n case 'xls':\n case 'xlsx':\n return 'green';\n case 'zip':\n case 'rar':\n case '7z':\n case 'tar':\n case 'gz':\n case 'ppt':\n case 'pptx':\n return 'orange';\n case 'pdf':\n case 'xps':\n return 'red';\n default:\n return 'default';\n }\n}\n\nexport function getDocumentHasPreview(document: ApiDocument) {\n return Boolean(document.previewBlobUrl || document.thumbnail);\n}\n","import { ApiError, ApiInviteInfo } from '../../api/types';\n\nconst STRIPE_ERRORS: Record<string, Record<string, string>> = {\n missing_payment_information: {\n field: 'cardNumber',\n fieldError: 'Incorrect card number',\n },\n invalid_number: {\n field: 'cardNumber',\n fieldError: 'Incorrect card number',\n },\n number: {\n field: 'cardNumber',\n fieldError: 'Incorrect card number',\n },\n exp_year: {\n field: 'expiry',\n fieldError: 'Incorrect year',\n },\n exp_month: {\n field: 'expiry',\n fieldError: 'Incorrect month',\n },\n invalid_expiry_year: {\n field: 'expiry',\n fieldError: 'Incorrect year',\n },\n invalid_expiry_month: {\n field: 'expiry',\n fieldError: 'Incorrect month',\n },\n cvc: {\n field: 'cvv',\n fieldError: 'Incorrect CVV',\n },\n invalid_cvc: {\n field: 'cvv',\n fieldError: 'Incorrect CVV',\n },\n};\n\nexport function getStripeError(error: {\n code: string;\n message: string;\n param?: string;\n}) {\n const { message, code, param } = error;\n const { field, fieldError, description } = param ? STRIPE_ERRORS[param] : STRIPE_ERRORS[code];\n return {\n field,\n fieldError,\n description: description || message,\n };\n}\n\nconst SHIPPING_ERRORS: Record<string, Record<string, string>> = {\n ADDRESS_STREET_LINE1_INVALID: {\n field: 'streetLine1',\n fieldError: 'Incorrect street address',\n },\n ADDRESS_STREET_LINE2_INVALID: {\n field: 'streetLine2',\n fieldError: 'Incorrect street address',\n },\n ADDRESS_CITY_INVALID: {\n field: 'city',\n fieldError: 'Incorrect city',\n },\n ADDRESS_COUNTRY_INVALID: {\n field: 'countryIso2',\n fieldError: 'Incorrect country',\n },\n ADDRESS_POSTCODE_INVALID: {\n field: 'postCode',\n fieldError: 'Incorrect post code',\n },\n ADDRESS_STATE_INVALID: {\n field: 'state',\n fieldError: 'Incorrect state',\n },\n REQ_INFO_NAME_INVALID: {\n field: 'fullName',\n fieldError: 'Incorrect name',\n },\n REQ_INFO_PHONE_INVALID: {\n field: 'phone',\n fieldError: 'Incorrect phone',\n },\n REQ_INFO_EMAIL_INVALID: {\n field: 'email',\n fieldError: 'Incorrect email',\n },\n};\n\n\nexport function getShippingErrors(dialogs: (ApiError | ApiInviteInfo)[]) {\n return Object.values(dialogs).reduce((acc, cur) => {\n if (!('hasErrorKey' in cur) || !cur.hasErrorKey) return acc;\n const error = SHIPPING_ERRORS[cur.message];\n if (error) {\n acc = {\n ...acc,\n [error.field]: error.fieldError,\n };\n }\n return acc;\n }, {});\n}\n","import { fastRaf } from './schedulers';\n\ninterface AnimationInstance {\n isCancelled: boolean;\n}\n\nlet currentInstance: AnimationInstance | undefined;\n\nexport function animateSingle(tick: Function, instance?: AnimationInstance) {\n if (!instance) {\n if (currentInstance && !currentInstance.isCancelled) {\n currentInstance.isCancelled = true;\n }\n\n instance = { isCancelled: false };\n currentInstance = instance;\n }\n\n fastRaf(() => {\n if (!instance!.isCancelled && tick()) {\n animateSingle(tick, instance);\n }\n });\n}\n\nexport function animate(tick: Function) {\n fastRaf(() => {\n if (tick()) {\n animate(tick);\n }\n });\n}\n","import React, { FC, useState, useRef } from '../../lib/teact/teact';\n\nimport Menu from './Menu';\n\nimport './DropdownMenu.scss';\n\ntype OwnProps = {\n className?: string;\n trigger: FC<{ onTrigger: () => void; isOpen?: boolean }>;\n positionX?: 'left' | 'right';\n positionY?: 'top' | 'bottom';\n footer?: string;\n forceOpen?: boolean;\n onOpen?: NoneToVoidFunction;\n onClose?: NoneToVoidFunction;\n children: any;\n};\n\nconst DropdownMenu: FC<OwnProps> = ({\n trigger,\n className,\n children,\n positionX = 'left',\n positionY = 'top',\n footer,\n forceOpen,\n onOpen,\n onClose,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const menuRef = useRef<HTMLDivElement>(null);\n // eslint-disable-next-line no-null/no-null\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [isOpen, setIsOpen] = useState(false);\n\n const toggleIsOpen = () => {\n setIsOpen(!isOpen);\n if (isOpen) {\n if (onClose) onClose();\n } else if (onOpen) onOpen();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<any>) => {\n const menu = menuRef.current;\n\n if (!isOpen || e.keyCode !== 40 || !menu) {\n return;\n }\n\n const focusedElement = document.activeElement;\n const elementChildren = Array.from(menu.children);\n\n if (!focusedElement || elementChildren.indexOf(focusedElement) === -1) {\n (elementChildren[0] as HTMLElement).focus();\n }\n };\n\n const handleClose = () => {\n setIsOpen(false);\n if (onClose) onClose();\n };\n\n return (\n <div\n ref={dropdownRef}\n className={`DropdownMenu ${className || ''}`}\n onKeyDown={handleKeyDown}\n >\n {trigger({ onTrigger: toggleIsOpen, isOpen })}\n\n <Menu\n ref={menuRef}\n containerRef={dropdownRef}\n isOpen={isOpen || !!forceOpen}\n className={className || ''}\n positionX={positionX}\n positionY={positionY}\n footer={footer}\n autoClose\n onClose={handleClose}\n shouldSkipTransition={forceOpen}\n >\n {children}\n </Menu>\n </div>\n );\n};\n\nexport default DropdownMenu;\n","import { RefObject } from 'react';\nimport { useState, useCallback, useEffect } from '../lib/teact/teact';\n\nexport default (\n elementRef: RefObject<HTMLElement>,\n isOpen: boolean,\n onSelectWithEnter?: (index: number) => void,\n itemSelector?: string,\n noCaptureFocus?: boolean,\n) => {\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n useEffect(() => {\n setFocusedIndex(-1);\n\n const element = elementRef.current;\n if (isOpen && element && !noCaptureFocus) {\n element.tabIndex = -1;\n element.focus();\n }\n }, [elementRef, isOpen, noCaptureFocus]);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent<any>) => {\n const element = elementRef.current;\n\n if (!element) {\n return;\n }\n\n if (e.keyCode === 13 && onSelectWithEnter) {\n onSelectWithEnter(focusedIndex);\n return;\n }\n\n if (e.keyCode !== 38 && e.keyCode !== 40) {\n return;\n }\n\n const focusedElement = document.activeElement;\n const elementChildren = Array.from(itemSelector ? element.querySelectorAll(itemSelector) : element.children);\n\n let newIndex = (focusedElement && elementChildren.indexOf(focusedElement)) || focusedIndex;\n\n if (e.keyCode === 38 && newIndex > 0) {\n newIndex--;\n } else if (e.keyCode === 40 && newIndex < elementChildren.length - 1) {\n newIndex++;\n } else if (elementChildren.length === 1) {\n newIndex = 0;\n } else {\n return;\n }\n\n const item = elementChildren[newIndex] as HTMLElement;\n if (item) {\n setFocusedIndex(newIndex);\n item.focus();\n }\n }, [elementRef, onSelectWithEnter, itemSelector, focusedIndex]);\n\n return handleKeyDown;\n};\n","// @ts-ignore\nimport twemojiRegex from '../../../lib/twemojiRegex';\n\nconst DETECT_UP_TO = 3;\nconst MAX_LENGTH = DETECT_UP_TO * 8; // Maximum 8 per one emoji.\nconst RE_EMOJI_ONLY = new RegExp(`^(?:${twemojiRegex.source})+$`, '');\n\nexport default (text: string): number | false => {\n if (text.length > MAX_LENGTH) {\n return false;\n }\n\n const isEmojiOnly = Boolean(text.match(RE_EMOJI_ONLY));\n if (!isEmojiOnly) {\n return false;\n }\n\n let emojiCount = 0;\n while (twemojiRegex.exec(text)) {\n emojiCount++;\n\n if (emojiCount > DETECT_UP_TO) {\n twemojiRegex.lastIndex = 0;\n return false;\n }\n }\n\n return emojiCount;\n};\n","// Due to the fact that emoji from Apple do not contain some characters, it is necessary to remove them from emoji-data\n// https://github.com/iamcal/emoji-data/issues/136\nconst EXCLUDE_EMOJIS = ['female_sign', 'male_sign', 'medical_symbol'];\n\nexport type EmojiRawData = typeof import('emoji-data-ios/emoji-data.json');\nexport type EmojiModule = { default: EmojiRawData };\n\nexport type EmojiData = {\n categories: Array<EmojiCategory>;\n emojis: Record<string, Emoji>;\n};\n\nfunction unifiedToNative(unified: string) {\n const unicodes = unified.split('-');\n const codePoints = unicodes.map((i) => parseInt(i, 16));\n\n return String.fromCodePoint(...codePoints);\n}\n\nexport function nativeToUnfified(emoji: string) {\n let code;\n\n if (emoji.length === 1) {\n code = emoji.charCodeAt(0).toString(16).padStart(4, '0');\n } else {\n const pairs = [];\n for (let i = 0; i < emoji.length; i++) {\n if (emoji.charCodeAt(i) >= 0xd800 && emoji.charCodeAt(i) <= 0xdbff) {\n if (emoji.charCodeAt(i + 1) >= 0xdc00 && emoji.charCodeAt(i + 1) <= 0xdfff) {\n pairs.push(\n (emoji.charCodeAt(i) - 0xd800) * 0x400\n + (emoji.charCodeAt(i + 1) - 0xdc00) + 0x10000,\n );\n }\n } else if (emoji.charCodeAt(i) < 0xd800 || emoji.charCodeAt(i) > 0xdfff) {\n pairs.push(emoji.charCodeAt(i));\n }\n }\n\n code = pairs.map((x) => x.toString(16).padStart(4, '0')).join('-');\n }\n\n return code;\n}\n\nexport function uncompressEmoji(data: EmojiRawData): EmojiData {\n const emojiData: EmojiData = { categories: [], emojis: {} };\n\n for (let i = 0; i < data.length; i += 2) {\n const category = {\n id: data[i][0],\n name: data[i][1],\n emojis: [],\n } as EmojiCategory;\n\n for (let j = 0; j < data[i + 1].length; j++) {\n const emojiRaw = data[i + 1][j];\n if (!EXCLUDE_EMOJIS.includes(emojiRaw[1][0])) {\n category.emojis.push(emojiRaw[1][0]);\n emojiData.emojis[emojiRaw[1][0]] = {\n id: emojiRaw[1][0],\n names: emojiRaw[1] as string[],\n native: unifiedToNative(emojiRaw[0] as string),\n image: (emojiRaw[0] as string).toLowerCase(),\n };\n }\n }\n\n emojiData.categories.push(category);\n }\n\n return emojiData;\n}\n","import {\n hasElementChanged,\n isComponentElement,\n isEmptyElement,\n isRealElement,\n isTextElement,\n mountComponent,\n renderComponent,\n unmountTree,\n getTarget,\n setTarget,\n VirtualElement,\n VirtualElementComponent,\n VirtualRealElement,\n} from './teact';\nimport generateIdFor from '../../util/generateIdFor';\nimport { DEBUG } from '../../config';\nimport { addEventListener, removeEventListener } from './dom-events';\n\ntype VirtualDomHead = {\n children: [VirtualElement] | [];\n};\n\nconst FILTERED_ATTRIBUTES = new Set(['key', 'ref', 'teactFastList', 'teactOrderKey']);\nconst HTML_ATTRIBUTES = new Set(['dir']);\nconst MAPPED_ATTRIBUTES: { [k: string]: string } = {\n autoPlay: 'autoplay',\n autoComplete: 'autocomplete',\n};\nconst INDEX_KEY_PREFIX = '__indexKey#';\n\nconst headsByElement: Record<string, VirtualDomHead> = {};\nlet DEBUG_virtualTreeSize = 1;\n\nfunction render($element?: VirtualElement, parentEl?: HTMLElement | null) {\n if (!parentEl) {\n return undefined;\n }\n\n let headId = parentEl.getAttribute('data-teact-head-id');\n if (!headId) {\n headId = generateIdFor(headsByElement);\n headsByElement[headId] = { children: [] };\n parentEl.setAttribute('data-teact-head-id', headId);\n }\n\n const $head = headsByElement[headId];\n $head.children = [renderWithVirtual(parentEl, $head.children[0], $element, $head, 0) as VirtualElement];\n\n if (process.env.APP_ENV === 'perf') {\n DEBUG_virtualTreeSize = 0;\n DEBUG_addToVirtualTreeSize($head);\n\n return DEBUG_virtualTreeSize;\n }\n\n return undefined;\n}\n\nfunction renderWithVirtual(\n parentEl: HTMLElement,\n $current: VirtualElement | undefined,\n $new: VirtualElement | undefined,\n $parent: VirtualRealElement | VirtualDomHead,\n index: number,\n {\n skipComponentUpdate = false,\n forceIndex = false,\n fragment,\n moveDirection,\n }: {\n skipComponentUpdate?: boolean;\n forceIndex?: boolean;\n fragment?: DocumentFragment;\n moveDirection?: 'up' | 'down';\n } = {},\n) {\n if (\n !skipComponentUpdate\n && $current && $new\n && isComponentElement($current) && isComponentElement($new)\n && !hasElementChanged($current, $new)\n ) {\n $new = updateComponent($current, $new);\n }\n\n // Parent element may have changed, so we need to update the listener closure.\n if (!skipComponentUpdate && $new && isComponentElement($new) && $new.componentInstance.isMounted) {\n setupComponentUpdateListener($new, $parent, index, parentEl);\n }\n\n if ($current === $new) {\n return $new;\n }\n\n if (!$current && $new) {\n if (isComponentElement($new)) {\n $new = initComponent($new, $parent, index, parentEl);\n }\n\n const node = createNode($new);\n setTarget($new, node);\n\n if (forceIndex && parentEl.childNodes[index]) {\n parentEl.insertBefore(node, parentEl.childNodes[index]);\n } else {\n (fragment || parentEl).appendChild(node);\n }\n } else if ($current && !$new) {\n parentEl.removeChild(getTarget($current)!);\n unmountTree($current);\n } else if ($current && $new) {\n if (hasElementChanged($current, $new)) {\n if (isComponentElement($new)) {\n $new = initComponent($new, $parent, index, parentEl);\n }\n\n const node = createNode($new);\n setTarget($new, node);\n parentEl.replaceChild(node, getTarget($current)!);\n unmountTree($current);\n } else {\n const areComponents = isComponentElement($current) && isComponentElement($new);\n\n if (!areComponents) {\n setTarget($new, getTarget($current)!);\n }\n\n if (isRealElement($current) && isRealElement($new)) {\n if (moveDirection) {\n const node = getTarget($current)!;\n const nextSibling = parentEl.childNodes[moveDirection === 'up' ? index : index + 1];\n\n if (nextSibling) {\n parentEl.insertBefore(node, nextSibling);\n } else {\n (fragment || parentEl).appendChild(node);\n }\n }\n\n if (!areComponents) {\n updateAttributes($current, $new, getTarget($current) as HTMLElement);\n }\n\n $new.children = renderChildren(\n $current,\n $new,\n areComponents ? parentEl : getTarget($current) as HTMLElement,\n );\n }\n }\n }\n\n return $new;\n}\n\nfunction initComponent(\n $element: VirtualElementComponent, $parent: VirtualRealElement | VirtualDomHead, index: number, parentEl: HTMLElement,\n) {\n if (!isComponentElement($element)) {\n return $element;\n }\n\n const { componentInstance } = $element;\n\n if (!componentInstance.isMounted) {\n $element = mountComponent(componentInstance);\n setupComponentUpdateListener($element, $parent, index, parentEl);\n\n const $firstChild = $element.children[0];\n if (isComponentElement($firstChild)) {\n $element.children = [initComponent($firstChild, $element, 0, parentEl)];\n }\n\n componentInstance.isMounted = true;\n }\n\n return $element;\n}\n\nfunction updateComponent($current: VirtualElementComponent, $new: VirtualElementComponent) {\n $current.componentInstance.props = $new.componentInstance.props;\n\n return renderComponent($current.componentInstance);\n}\n\nfunction setupComponentUpdateListener(\n $element: VirtualElementComponent, $parent: VirtualRealElement | VirtualDomHead, index: number, parentEl: HTMLElement,\n) {\n const { componentInstance } = $element;\n\n componentInstance.onUpdate = () => {\n $parent.children[index] = renderWithVirtual(\n parentEl,\n $parent.children[index],\n componentInstance.$element,\n $parent,\n index,\n { skipComponentUpdate: true },\n ) as VirtualElementComponent;\n };\n}\n\nfunction createNode($element: VirtualElement): Node {\n if (isEmptyElement($element)) {\n return document.createTextNode('');\n }\n\n if (isTextElement($element)) {\n return document.createTextNode($element.value);\n }\n\n if (isComponentElement($element)) {\n return createNode($element.children[0] as VirtualElement);\n }\n\n const { tag, props, children = [] } = $element;\n const element = document.createElement(tag);\n\n if (typeof props.ref === 'object') {\n props.ref.current = element;\n }\n\n Object.keys(props).forEach((key) => {\n addAttribute(element, key, props[key]);\n });\n\n $element.children = children.map(($child, i) => (\n renderWithVirtual(element, undefined, $child, $element, i) as VirtualElement\n ));\n\n return element;\n}\n\nfunction renderChildren(\n $current: VirtualRealElement, $new: VirtualRealElement, currentEl: HTMLElement,\n) {\n if ($new.props.teactFastList) {\n return renderFastListChildren($current, $new, currentEl);\n }\n\n const maxLength = Math.max($current.children.length, $new.children.length);\n const newChildren = [];\n const fragment = $new.children.length > $current.children.length + 1 ? document.createDocumentFragment() : undefined;\n\n for (let i = 0; i < maxLength; i++) {\n const $newChild = renderWithVirtual(\n currentEl,\n $current.children[i],\n $new.children[i],\n $new,\n i,\n i >= $current.children.length ? { fragment } : undefined,\n );\n\n if ($newChild) {\n newChildren.push($newChild);\n }\n }\n\n if (fragment) {\n currentEl.appendChild(fragment);\n }\n\n return newChildren;\n}\n\nfunction renderFastListChildren($current: VirtualRealElement, $new: VirtualRealElement, currentEl: HTMLElement) {\n const newKeys = new Set(\n $new.children.map(($newChild) => {\n const key = 'props' in $newChild && $newChild.props.key;\n\n if (DEBUG && isRealElement($newChild) && !key) {\n // eslint-disable-next-line no-console\n console.warn('Missing `key` in `teactFastList`');\n }\n\n return key;\n }),\n );\n\n let currentRemainingIndex = 0;\n const remainingByKey = $current.children\n .reduce((acc, $currentChild, i) => {\n let key = 'props' in $currentChild ? $currentChild.props.key : undefined;\n\n // First we handle removed children\n if (key && !newKeys.has(key)) {\n renderWithVirtual(currentEl, $currentChild, undefined, $new, -1);\n\n return acc;\n } else if (!key) {\n const $newChild = $new.children[i];\n const newChildKey = ($newChild && 'props' in $newChild) ? $newChild.props.key : undefined;\n // If a non-key element remains at the same index we preserve it with a virtual `key`\n if ($newChild && !newChildKey) {\n key = `${INDEX_KEY_PREFIX}${i}`;\n } else {\n renderWithVirtual(currentEl, $currentChild, undefined, $new, -1);\n\n return acc;\n }\n }\n\n // Then we build up info about remaining children\n acc[key] = {\n $element: $currentChild,\n index: currentRemainingIndex++,\n order: 'props' in $currentChild ? $currentChild.props.teactOrderKey : undefined,\n };\n return acc;\n }, {} as Record<string, { $element: VirtualElement; index: number; order?: number }>);\n\n let newChildren: VirtualElement[] = [];\n\n let fragmentQueue: VirtualElement[] | undefined;\n let fragmentIndex: number | undefined;\n\n let currentPreservedIndex = 0;\n\n $new.children.forEach(($newChild, i) => {\n const key = 'props' in $newChild ? $newChild.props.key : `${INDEX_KEY_PREFIX}${i}`;\n const currentChildInfo = remainingByKey[key];\n\n if (!currentChildInfo) {\n // All new nodes are queued to be inserted with fragments if possible.\n if (!fragmentQueue) {\n fragmentQueue = [];\n fragmentIndex = i;\n }\n\n fragmentQueue.push($newChild);\n return;\n }\n\n if (fragmentQueue) {\n newChildren = newChildren.concat(flushFragmentQueue(fragmentQueue, fragmentIndex!, currentEl, $new));\n fragmentIndex = undefined;\n fragmentQueue = undefined;\n }\n\n // This is a \"magic\" `teactOrderKey` property that tells us the element is updated\n const order = 'props' in $newChild ? $newChild.props.teactOrderKey : undefined;\n const shouldMoveNode = currentChildInfo.index !== currentPreservedIndex && currentChildInfo.order !== order;\n const isMovingDown = shouldMoveNode && currentPreservedIndex > currentChildInfo.index;\n\n // When the node goes down, preserved indexing actually breaks, so the \"magic\" should help.\n if (!shouldMoveNode || isMovingDown) {\n currentPreservedIndex++;\n }\n\n newChildren.push(\n renderWithVirtual(currentEl, currentChildInfo.$element, $newChild, $new, i, {\n forceIndex: true,\n ...(shouldMoveNode && {\n moveDirection: isMovingDown ? 'down' : 'up',\n }),\n })!,\n );\n });\n\n if (fragmentQueue) {\n newChildren = newChildren.concat(flushFragmentQueue(fragmentQueue, fragmentIndex!, currentEl, $new));\n }\n\n return newChildren;\n}\n\nfunction flushFragmentQueue(\n fragmentQueue: VirtualElement[], fragmentIndex: number, parentEl: HTMLElement, $parent: VirtualRealElement,\n) {\n if (fragmentQueue.length === 1) {\n return [renderWithVirtual(parentEl, undefined, fragmentQueue[0], $parent, fragmentIndex, { forceIndex: true })!];\n } else if (fragmentQueue.length > 1) {\n const fragment = document.createDocumentFragment();\n const newChildren = fragmentQueue.map(($fragmentChild) => (\n renderWithVirtual(parentEl, undefined, $fragmentChild, $parent, fragmentIndex!, { fragment })!\n ));\n\n if (parentEl.childNodes[fragmentIndex]) {\n parentEl.insertBefore(fragment, parentEl.childNodes[fragmentIndex]);\n } else {\n parentEl.appendChild(fragment);\n }\n\n return newChildren;\n }\n\n throw new Error('Unexpected input');\n}\n\nfunction updateAttributes($current: VirtualRealElement, $new: VirtualRealElement, element: HTMLElement) {\n const currentKeys = Object.keys($current.props);\n const newKeys = Object.keys($new.props);\n\n currentKeys.forEach((key) => {\n if ($current.props[key] !== undefined && $new.props[key] === undefined) {\n removeAttribute(element, key, $current.props[key]);\n }\n });\n\n newKeys.forEach((key) => {\n if ($new.props[key] === undefined) {\n return;\n }\n\n if ($current.props[key] !== $new.props[key]) {\n if ($current.props[key] === undefined) {\n addAttribute(element, key, $new.props[key]);\n } else {\n updateAttribute(element, key, $current.props[key], $new.props[key]);\n }\n }\n });\n}\n\nfunction addAttribute(element: HTMLElement, key: string, value: any) {\n if (value === undefined) {\n return;\n }\n\n // An optimization attempt\n if (key === 'className') {\n element.className = value;\n // An optimization attempt\n } else if (key === 'value') {\n (element as HTMLInputElement).value = value;\n } else if (key === 'style') {\n element.style.cssText = value;\n } else if (key.startsWith('on')) {\n addEventListener(element, key, value, key.endsWith('Capture'));\n } else if (key.startsWith('data-') || HTML_ATTRIBUTES.has(key)) {\n element.setAttribute(key, value);\n } else if (!FILTERED_ATTRIBUTES.has(key)) {\n (element as any)[MAPPED_ATTRIBUTES[key] || key] = value;\n }\n}\n\nfunction removeAttribute(element: HTMLElement, key: string, value: any) {\n if (key === 'className') {\n element.className = '';\n } else if (key === 'value') {\n (element as HTMLInputElement).value = '';\n } else if (key === 'style') {\n element.style.cssText = '';\n } else if (key.startsWith('on')) {\n removeEventListener(element, key, value, key.endsWith('Capture'));\n } else if (key.startsWith('data-') || HTML_ATTRIBUTES.has(key)) {\n element.removeAttribute(key);\n } else if (!FILTERED_ATTRIBUTES.has(key)) {\n delete (element as any)[MAPPED_ATTRIBUTES[key] || key];\n }\n}\n\nfunction updateAttribute(element: HTMLElement, key: string, oldValue: any, newValue: any) {\n if (key === 'value') {\n // Removing and adding value causes a cursor jump\n (element as HTMLInputElement).value = newValue !== undefined ? newValue : '';\n } else {\n removeAttribute(element, key, oldValue);\n addAttribute(element, key, newValue);\n }\n}\n\nfunction DEBUG_addToVirtualTreeSize($current: VirtualRealElement | VirtualDomHead) {\n DEBUG_virtualTreeSize += $current.children.length;\n\n $current.children.forEach(($child) => {\n if (isRealElement($child)) {\n DEBUG_addToVirtualTreeSize($child);\n }\n });\n}\n\nexport default { render };\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, ApiUser } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\n\ntype OwnProps = {\n className?: string;\n sender?: ApiUser | ApiChat;\n children: any;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'openUserInfo'>;\n\nconst UserLink: FC<OwnProps & DispatchProps> = ({\n className, sender, openUserInfo, children,\n}) => {\n const handleClick = useCallback(() => {\n if (sender) {\n openUserInfo({ id: sender.id });\n }\n }, [sender, openUserInfo]);\n\n if (!sender) {\n return children;\n }\n\n return (\n <Link className={buildClassName('UserLink', className)} onClick={handleClick}>{children}</Link>\n );\n};\n\nexport default withGlobal<OwnProps>(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['openUserInfo']),\n)(UserLink);\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiMessage } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\n\ntype OwnProps = {\n className?: string;\n message?: ApiMessage;\n children: any;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'focusMessage'>;\n\nconst MessageLink: FC<OwnProps & DispatchProps> = ({\n className, message, children, focusMessage,\n}) => {\n const handleMessageClick = useCallback((): void => {\n if (message) {\n focusMessage({ chatId: message.chatId, messageId: message.id });\n }\n }, [focusMessage, message]);\n\n if (!message) {\n return children;\n }\n\n return (\n <Link className={buildClassName('MessageLink', className)} onClick={handleMessageClick}>{children}</Link>\n );\n};\n\nexport default withGlobal<OwnProps>(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['focusMessage']),\n)(MessageLink);\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\n\ntype OwnProps = {\n className?: string;\n chatId?: number;\n children: any;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'openChat'>;\n\nconst ChatLink: FC<OwnProps & DispatchProps> = ({\n className, chatId, openChat, children,\n}) => {\n const handleClick = useCallback(() => {\n if (chatId) {\n openChat({ id: chatId });\n }\n }, [chatId, openChat]);\n\n if (!chatId) {\n return children;\n }\n\n return (\n <Link className={buildClassName('ChatLink', className)} onClick={handleClick}>{children}</Link>\n );\n};\n\nexport default withGlobal<OwnProps>(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['openChat']),\n)(ChatLink);\n","import React from '../../../lib/teact/teact';\n\nimport { ApiChat, ApiMessage, ApiUser } from '../../../api/types';\nimport { LangFn } from '../../../hooks/useLang';\nimport {\n getChatTitle,\n getMessageContent,\n getMessageSummaryText,\n getUserFullName,\n isChat,\n} from '../../../modules/helpers';\nimport trimText from '../../../util/trimText';\nimport { TextPart } from './renderMessageText';\nimport renderText from './renderText';\n\nimport UserLink from '../UserLink';\nimport MessageLink from '../MessageLink';\nimport ChatLink from '../ChatLink';\n\ninterface ActionMessageTextOptions {\n maxTextLength?: number;\n asPlain?: boolean;\n isEmbedded?: boolean;\n}\n\nconst NBSP = '\\u00A0';\n\nexport function renderActionMessageText(\n lang: LangFn,\n message: ApiMessage,\n actionOrigin?: ApiUser | ApiChat,\n targetUsers?: ApiUser[],\n targetMessage?: ApiMessage,\n targetChatId?: number,\n options: ActionMessageTextOptions = {},\n) {\n if (!message.content.action) {\n return [];\n }\n const { text, translationValues } = message.content.action;\n const content: TextPart[] = [];\n const textOptions: ActionMessageTextOptions = { ...options, maxTextLength: 32 };\n const translationKey = text === 'Chat.Service.Group.UpdatedPinnedMessage1' && !targetMessage\n ? 'Message.PinnedGenericMessage'\n : text;\n\n let unprocessed: string;\n let processed = processPlaceholder(\n lang(translationKey, translationValues && translationValues.length ? translationValues : undefined),\n '%action_origin%',\n actionOrigin\n ? (!options.isEmbedded && renderOriginContent(lang, actionOrigin, options.asPlain)) || NBSP\n : 'User',\n );\n\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%target_user%',\n targetUsers\n ? targetUsers.map((user) => renderUserContent(user, options.asPlain)).filter<TextPart>(Boolean as any)\n : 'User',\n );\n\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%message%',\n targetMessage\n ? renderMessageContent(lang, targetMessage, textOptions)\n : 'a message',\n );\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%product%',\n targetMessage\n ? renderProductContent(targetMessage)\n : 'a product',\n );\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%target_chat%',\n targetChatId\n ? renderMigratedContent(targetChatId, options.asPlain)\n : 'another chat',\n );\n content.push(...processed);\n\n if (options.asPlain) {\n return content.join('').trim();\n }\n\n return content;\n}\n\nfunction renderProductContent(message: ApiMessage) {\n return message.content && message.content.invoice\n ? message.content.invoice.title\n : 'a product';\n}\n\nfunction renderMessageContent(lang: LangFn, message: ApiMessage, options: ActionMessageTextOptions = {}) {\n const text = getMessageSummaryText(lang, message);\n const {\n photo, video, document, sticker,\n } = getMessageContent(message);\n\n const { maxTextLength, isEmbedded, asPlain } = options;\n\n const showQuotes = isEmbedded && text && !photo && !video && !document && !sticker;\n let messageText = trimText(text as string, maxTextLength)!;\n\n if (isEmbedded) {\n if (photo) {\n messageText = 'a photo';\n } else if (video) {\n messageText = video.isGif ? 'a GIF' : 'a video';\n } else if (document) {\n messageText = 'a document';\n } else if (sticker) {\n messageText = text;\n }\n }\n\n if (asPlain) {\n return showQuotes ? `«${messageText}»` : messageText;\n }\n\n if (showQuotes) {\n return (\n <span>\n «\n <MessageLink className=\"action-link\" message={message}>{renderText(messageText)}</MessageLink>\n »\n </span>\n );\n }\n\n return (\n <MessageLink className=\"action-link\" message={message}>{renderText(messageText)}</MessageLink>\n );\n}\n\nfunction renderOriginContent(lang: LangFn, origin: ApiUser | ApiChat, asPlain?: boolean) {\n return isChat(origin)\n ? renderChatContent(lang, origin, asPlain)\n : renderUserContent(origin, asPlain);\n}\n\nfunction renderUserContent(sender: ApiUser, asPlain?: boolean): string | TextPart | undefined {\n const text = trimText(getUserFullName(sender));\n\n if (asPlain) {\n return text;\n }\n\n return <UserLink className=\"action-link\" sender={sender}>{sender && renderText(text!)}</UserLink>;\n}\n\nfunction renderChatContent(lang: LangFn, chat: ApiChat, asPlain?: boolean): string | TextPart | undefined {\n const text = trimText(getChatTitle(lang, chat));\n\n if (asPlain) {\n return text;\n }\n\n return <ChatLink className=\"action-link\" chatId={chat.id}>{chat && renderText(text!)}</ChatLink>;\n}\n\nfunction renderMigratedContent(chatId: number, asPlain?: boolean): string | TextPart | undefined {\n const text = 'another chat';\n\n if (asPlain) {\n return text;\n }\n\n return <ChatLink className=\"action-link\" chatId={chatId}>{text}</ChatLink>;\n}\n\nfunction processPlaceholder(text: string, placeholder: string, replaceValue?: TextPart | TextPart[]): TextPart[] {\n const placeholderPosition = text.indexOf(placeholder);\n if (placeholderPosition < 0 || !replaceValue) {\n return [text];\n }\n\n const content: TextPart[] = [];\n content.push(text.substring(0, placeholderPosition));\n if (Array.isArray(replaceValue)) {\n replaceValue.forEach((value, index) => {\n content.push(value);\n if (index + 1 < replaceValue.length) {\n content.push(', ');\n }\n });\n } else {\n content.push(replaceValue);\n }\n content.push(text.substring(placeholderPosition + placeholder.length));\n\n return content;\n}\n","export interface ApiDimensions {\n width: number;\n height: number;\n}\n\nexport interface ApiPhotoSize extends ApiDimensions {\n type: 's' | 'm' | 'x' | 'y' | 'z';\n}\n\nexport interface ApiThumbnail extends ApiDimensions {\n dataUri: string;\n}\n\nexport interface ApiPhoto {\n id: string;\n thumbnail?: ApiThumbnail;\n sizes: ApiPhotoSize[];\n blobUrl?: string;\n}\n\nexport interface ApiSticker {\n id: string;\n stickerSetId: string;\n stickerSetAccessHash?: string;\n emoji?: string;\n isAnimated: boolean;\n width?: number;\n height?: number;\n thumbnail?: ApiThumbnail;\n isPreloadedGlobally?: boolean;\n}\n\nexport interface ApiStickerSet {\n archived?: true;\n isAnimated?: true;\n installedDate?: number;\n id: string;\n accessHash: string;\n title: string;\n hasThumbnail?: boolean;\n count: number;\n hash: number;\n stickers?: ApiSticker[];\n packs?: Record<string, ApiSticker[]>;\n covers?: ApiSticker[];\n}\n\nexport interface ApiVideo {\n id: string;\n mimeType: string;\n duration: number;\n fileName: string;\n width?: number;\n height?: number;\n supportsStreaming?: boolean;\n isRound?: boolean;\n isGif?: boolean;\n thumbnail?: ApiThumbnail;\n blobUrl?: string;\n size: number;\n}\n\nexport interface ApiAudio {\n size: number;\n mimeType: string;\n fileName: string;\n duration: number;\n performer?: string;\n title?: string;\n}\n\nexport interface ApiVoice {\n duration: number;\n waveform?: number[];\n}\n\nexport interface ApiDocument {\n id?: string;\n fileName: string;\n size: number;\n timestamp?: number;\n mimeType: string;\n thumbnail?: ApiThumbnail;\n previewBlobUrl?: string;\n mediaType?: 'photo' | 'video';\n mediaSize?: ApiDimensions;\n}\n\nexport interface ApiContact {\n firstName: string;\n lastName: string;\n phoneNumber: string;\n userId: number;\n}\n\nexport interface ApiPollAnswer {\n text: string;\n option: string;\n}\n\nexport interface ApiPollResult {\n isChosen?: true;\n isCorrect?: true;\n option: string;\n votersCount: number;\n}\n\nexport interface ApiPoll {\n id: string;\n summary: {\n closed?: true;\n isPublic?: true;\n multipleChoice?: true;\n quiz?: true;\n question: string;\n answers: ApiPollAnswer[];\n closePeriod?: number;\n closeDate?: number;\n };\n results: {\n results?: ApiPollResult[];\n totalVoters?: number;\n recentVoterIds?: number[];\n solution?: string;\n solutionEntities?: ApiMessageEntity[];\n };\n}\n\nexport interface ApiInvoice {\n text: string;\n title: string;\n photoUrl?: string;\n description?: string;\n receiptMsgId?: number;\n}\n\nexport type ApiNewPoll = {\n summary: ApiPoll['summary'];\n quiz?: {\n correctAnswers: string[];\n solution?: string;\n solutionEntities?: ApiMessageEntity[];\n };\n};\n\nexport interface ApiAction {\n text: string;\n targetUserIds?: number[];\n targetChatId?: number;\n type: 'historyClear' | 'other';\n photo?: ApiPhoto;\n translationValues: string[];\n}\n\nexport interface ApiWebPage {\n id: number;\n url: string;\n displayUrl: string;\n type?: string;\n siteName?: string;\n title?: string;\n description?: string;\n photo?: ApiPhoto;\n duration?: number;\n document?: ApiDocument;\n video?: ApiVideo;\n}\n\nexport interface ApiMessageForwardInfo {\n isChannelPost: boolean;\n isLinkedChannelPost?: boolean;\n fromChatId?: number;\n senderUserId?: number;\n fromMessageId?: number;\n hiddenUserName?: string;\n adminTitle?: string;\n}\n\nexport interface ApiMessageEntity {\n type: string;\n offset: number;\n length: number;\n userId?: number;\n url?: string;\n}\n\nexport enum ApiMessageEntityTypes {\n Bold = 'MessageEntityBold',\n Blockquote = 'MessageEntityBlockquote',\n BotCommand = 'MessageEntityBotCommand',\n Cashtag = 'MessageEntityCashtag',\n Code = 'MessageEntityCode',\n Email = 'MessageEntityEmail',\n Hashtag = 'MessageEntityHashtag',\n Italic = 'MessageEntityItalic',\n MentionName = 'MessageEntityMentionName',\n Mention = 'MessageEntityMention',\n Phone = 'MessageEntityPhone',\n Pre = 'MessageEntityPre',\n Strike = 'MessageEntityStrike',\n TextUrl = 'MessageEntityTextUrl',\n Url = 'MessageEntityUrl',\n Underline = 'MessageEntityUnderline',\n Unknown = 'MessageEntityUnknown',\n}\n\nexport interface ApiFormattedText {\n text: string;\n entities?: ApiMessageEntity[];\n}\n\nexport interface ApiMessage {\n id: number;\n chatId: number;\n content: {\n text?: ApiFormattedText;\n photo?: ApiPhoto;\n video?: ApiVideo;\n document?: ApiDocument;\n sticker?: ApiSticker;\n contact?: ApiContact;\n poll?: ApiPoll;\n action?: ApiAction;\n webPage?: ApiWebPage;\n audio?: ApiAudio;\n voice?: ApiVoice;\n invoice?: ApiInvoice;\n };\n date: number;\n isOutgoing: boolean;\n senderId?: number;\n replyToMessageId?: number;\n replyToTopMessageId?: number;\n sendingState?: 'messageSendingStatePending' | 'messageSendingStateFailed';\n forwardInfo?: ApiMessageForwardInfo;\n isDeleting?: boolean;\n previousLocalId?: number;\n views?: number;\n isEdited?: boolean;\n isMediaUnread?: boolean;\n groupedId?: string;\n isInAlbum?: boolean;\n hasUnreadMention?: boolean;\n inlineButtons?: ApiKeyboardButtons;\n keyboardButtons?: ApiKeyboardButtons;\n viaBotId?: number;\n threadInfo?: ApiThreadInfo;\n adminTitle?: string;\n isScheduled?: boolean;\n shouldHideKeyboardButtons?: boolean;\n isFromScheduled?: boolean;\n}\n\nexport interface ApiThreadInfo {\n threadId: number;\n chatId: number;\n topMessageId?: number;\n originChannelId?: number;\n messagesCount: number;\n lastMessageId?: number;\n lastReadInboxMessageId?: number;\n recentReplierIds?: number[];\n}\n\nexport type ApiMessageOutgoingStatus = 'read' | 'succeeded' | 'pending' | 'failed';\n\nexport interface ApiKeyboardButton {\n type: 'command' | 'url' | 'callback' | 'requestPoll' | 'buy' | 'NOT_SUPPORTED';\n text: string;\n messageId: number;\n value?: string;\n}\n\nexport type ApiKeyboardButtons = ApiKeyboardButton[][];\n\nexport type ApiMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio' | 'profilePhoto';\nexport type ApiGlobalMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio' | 'voice';\n\nexport type ApiReportReason = 'spam' | 'violence' | 'pornography' | 'childAbuse'\n| 'copyright' | 'geoIrrelevant' | 'fake' | 'other';\n\nexport const MAIN_THREAD_ID = -1;\n\n// `Symbol` can not be transferred from worker\nexport const MESSAGE_DELETED = 'MESSAGE_DELETED';\n","// We cache avatars as Data URI for faster initial load\n// and messages media as Blob for smaller size.\n\nexport enum ApiMediaFormat {\n DataUri,\n BlobUrl,\n Lottie,\n Progressive,\n Stream,\n}\n\nexport type ApiParsedMedia = string | Blob | AnyLiteral | ArrayBuffer;\nexport type ApiPreparedMedia = string | AnyLiteral;\nexport type ApiMediaFormatToPrepared<T> = T extends ApiMediaFormat.Lottie ? AnyLiteral : string;\n","import React, { FC } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectUser } from '../../../modules/selectors';\n\ntype OwnProps = {\n userId?: number;\n username?: string;\n children: any;\n};\n\ntype StateProps = {\n userOrChat?: ApiUser | ApiChat;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'openChat' | 'openChatByUsername'>;\n\nconst MentionLink: FC<OwnProps & StateProps & DispatchProps> = ({\n username,\n userOrChat,\n children,\n openChat,\n openChatByUsername,\n}) => {\n const handleClick = () => {\n if (userOrChat) {\n openChat({ id: userOrChat.id });\n } else if (username) {\n openChatByUsername({ username: username.substring(1) });\n }\n };\n\n return (\n <a onClick={handleClick} className=\"text-entity-link\" dir=\"auto\">\n {children}\n </a>\n );\n};\n\nexport default withGlobal<OwnProps>(\n (global, { userId }): StateProps => {\n return {\n userOrChat: userId ? selectUser(global, userId) : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['openChat', 'openChatByUsername']),\n)(MentionLink);\n","import { DEBUG } from '../config';\n\nexport function updateAppBadge(unreadCount: number) {\n if (typeof window.navigator.setAppBadge !== 'function') {\n return;\n }\n\n window.navigator.setAppBadge(unreadCount).catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n });\n}\n","import { RefObject } from 'react';\nimport { useEffect } from '../lib/teact/teact';\n\nconst BACKDROP_CLASSNAME = 'backdrop';\n\n// This effect implements closing menus by clicking outside of them\n// without adding extra elements to the DOM\nexport default function useVirtualBackdrop(\n isOpen: boolean,\n menuRef: RefObject<HTMLElement>,\n onClose?: () => void | undefined,\n) {\n useEffect(() => {\n const handleEvent = (e: Event) => {\n const menu = menuRef.current;\n const target = e.target as HTMLElement | null;\n if (!menu || !target) {\n return;\n }\n\n if (\n !menu.contains(e.target as Node | null)\n || target.classList.contains(BACKDROP_CLASSNAME)\n ) {\n e.preventDefault();\n e.stopPropagation();\n if (onClose) {\n onClose();\n }\n }\n };\n\n if (isOpen && onClose) {\n document.addEventListener('mousedown', handleEvent);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleEvent);\n };\n }, [isOpen, menuRef, onClose]);\n}\n","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"1acd58cb47a2c30f9ff3.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"64f200b5f81026a4c348.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"5776a38b2938fc893ccb.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"a66075669d8d0ac2d740.worker.js\");\n};","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ANIMATION_LEVEL_MAX } from '../../../config';\nimport {\n IS_ANDROID, IS_IOS, IS_SAFARI, IS_TOUCH_ENV,\n} from '../../../util/environment';\nimport { setLanguage } from '../../../util/langProvider';\nimport switchTheme from '../../../util/switchTheme';\nimport { selectTheme } from '../../selectors';\n\nconst HISTORY_ANIMATION_DURATION = 450;\n\nsubscribeToSystemThemeChange();\n\naddReducer('init', (global) => {\n const { animationLevel, messageTextSize, language } = global.settings.byKey;\n const theme = selectTheme(global);\n\n setLanguage(language, undefined, true);\n\n document.documentElement.style.setProperty('--message-text-size', `${messageTextSize}px`);\n document.body.classList.add('initial');\n document.body.classList.add(`animation-level-${animationLevel}`);\n document.body.classList.add(IS_TOUCH_ENV ? 'is-touch-env' : 'is-pointer-env');\n switchTheme(theme, animationLevel === ANIMATION_LEVEL_MAX);\n\n if (IS_SAFARI) {\n document.body.classList.add('is-safari');\n }\n if (IS_IOS) {\n document.body.classList.add('is-ios');\n } else if (IS_ANDROID) {\n document.body.classList.add('is-android');\n }\n});\n\naddReducer('setIsUiReady', (global, actions, payload) => {\n const { uiReadyState } = payload!;\n\n if (uiReadyState === 2) {\n document.body.classList.remove('initial');\n }\n\n return {\n ...global,\n uiReadyState,\n };\n});\n\naddReducer('setAuthPhoneNumber', (global, actions, payload) => {\n const { phoneNumber } = payload!;\n\n return {\n ...global,\n authPhoneNumber: phoneNumber,\n };\n});\n\naddReducer('setAuthRememberMe', (global, actions, payload) => {\n return {\n ...global,\n authRememberMe: Boolean(payload),\n };\n});\n\naddReducer('clearAuthError', (global) => {\n return {\n ...global,\n authError: undefined,\n };\n});\n\naddReducer('disableHistoryAnimations', () => {\n setTimeout(() => {\n setGlobal({\n ...getGlobal(),\n shouldSkipHistoryAnimations: false,\n });\n document.body.classList.remove('no-animate');\n }, HISTORY_ANIMATION_DURATION);\n\n setGlobal({\n ...getGlobal(),\n shouldSkipHistoryAnimations: true,\n }, true);\n});\n\nfunction subscribeToSystemThemeChange() {\n function handleSystemThemeChange() {\n const currentThemeMatch = document.documentElement.className.match(/theme-(\\w+)/);\n const currentTheme = currentThemeMatch ? currentThemeMatch[1] : 'light';\n const global = getGlobal();\n const nextTheme = selectTheme(global);\n const { animationLevel } = global.settings.byKey;\n\n if (nextTheme !== currentTheme) {\n switchTheme(nextTheme, animationLevel === ANIMATION_LEVEL_MAX);\n // Force-update component containers\n setGlobal({ ...global });\n }\n }\n\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\n if (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', handleSystemThemeChange);\n } else if (typeof mql.addListener === 'function') {\n mql.addListener(handleSystemThemeChange);\n }\n}\n","import { addReducer } from '../../../lib/teact/teactn';\nimport { ISettings, IThemeSettings, ThemeKey } from '../../../types';\nimport { replaceSettings, replaceThemeSettings } from '../../reducers';\n\naddReducer('setSettingOption', (global, actions, payload?: Partial<ISettings>) => {\n return replaceSettings(global, payload);\n});\n\naddReducer('setThemeSettings', (global, actions, payload: { theme: ThemeKey } & Partial<IThemeSettings>) => {\n const { theme, ...settings } = payload;\n\n return replaceThemeSettings(global, theme, settings);\n});\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { initApi, callApi } from '../../../api/gramjs';\nimport { GlobalState } from '../../../global/types';\n\nimport {\n LANG_CACHE_NAME,\n CUSTOM_BG_CACHE_NAME,\n MEDIA_CACHE_NAME,\n MEDIA_CACHE_NAME_AVATARS,\n MEDIA_PROGRESSIVE_CACHE_NAME,\n IS_TEST,\n} from '../../../config';\nimport { PLATFORM_ENV } from '../../../util/environment';\nimport { unsubscribe } from '../../../util/notifications';\nimport * as cacheApi from '../../../util/cacheApi';\nimport { updateAppBadge } from '../../../util/appBadge';\nimport {\n storeSession,\n loadStoredSession,\n clearStoredSession,\n importLegacySession,\n clearLegacySessions,\n} from '../../../util/sessions';\n\naddReducer('initApi', (global: GlobalState, actions) => {\n (async () => {\n if (!IS_TEST) {\n await importLegacySession();\n void clearLegacySessions();\n }\n\n void initApi(actions.apiUpdate, {\n userAgent: navigator.userAgent,\n platform: PLATFORM_ENV,\n sessionData: loadStoredSession(),\n });\n })();\n});\n\naddReducer('setAuthPhoneNumber', (global, actions, payload) => {\n const { phoneNumber } = payload!;\n\n void callApi('provideAuthPhoneNumber', phoneNumber.replace(/[^\\d]/g, ''));\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('setAuthCode', (global, actions, payload) => {\n const { code } = payload!;\n\n void callApi('provideAuthCode', code);\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('setAuthPassword', (global, actions, payload) => {\n const { password } = payload!;\n\n void callApi('provideAuthPassword', password);\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('uploadProfilePhoto', (global, actions, payload) => {\n const { file } = payload!;\n\n void callApi('uploadProfilePhoto', file);\n});\n\naddReducer('signUp', (global, actions, payload) => {\n const { firstName, lastName } = payload!;\n\n void callApi('provideAuthRegistration', { firstName, lastName });\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('returnToAuthPhoneNumber', (global) => {\n void callApi('restartAuth');\n\n return {\n ...global,\n authError: undefined,\n };\n});\n\naddReducer('goToAuthQrCode', (global) => {\n void callApi('restartAuthWithQr');\n\n return {\n ...global,\n authIsLoadingQrCode: true,\n authError: undefined,\n };\n});\n\naddReducer('saveSession', (global, actions, payload) => {\n const { sessionData } = payload;\n\n if (sessionData) {\n storeSession(payload.sessionData, global.currentUserId);\n } else {\n clearStoredSession();\n }\n});\n\naddReducer('signOut', () => {\n (async () => {\n try {\n await unsubscribe();\n await callApi('destroy');\n } catch (err) {\n // Do nothing\n }\n\n getDispatch().reset();\n })();\n});\n\naddReducer('reset', () => {\n clearStoredSession();\n\n void cacheApi.clear(MEDIA_CACHE_NAME);\n void cacheApi.clear(MEDIA_CACHE_NAME_AVATARS);\n void cacheApi.clear(MEDIA_PROGRESSIVE_CACHE_NAME);\n void cacheApi.clear(CUSTOM_BG_CACHE_NAME);\n\n const langCachePrefix = LANG_CACHE_NAME.replace(/\\d+$/, '');\n const langCacheVersion = (LANG_CACHE_NAME.match(/\\d+$/) || [0])[0];\n for (let i = 0; i < langCacheVersion; i++) {\n void cacheApi.clear(`${langCachePrefix}${i === 0 ? '' : i}`);\n }\n\n void clearLegacySessions();\n\n updateAppBadge(0);\n\n getDispatch().init();\n});\n\naddReducer('disconnect', () => {\n (async () => {\n await callApi('disconnect');\n })();\n});\n\naddReducer('loadNearestCountry', (global) => {\n if (global.connectionState !== 'connectionStateReady') {\n return;\n }\n\n (async () => {\n const authNearestCountry = await callApi('fetchNearestCountry');\n\n setGlobal({\n ...getGlobal(),\n authNearestCountry,\n });\n })();\n});\n\naddReducer('setDeviceToken', (global, actions, deviceToken) => {\n setGlobal({\n ...global,\n push: {\n deviceToken,\n subscribedAt: Date.now(),\n },\n });\n});\n\naddReducer('deleteDeviceToken', (global) => {\n const newGlobal = { ...global };\n delete newGlobal.push;\n setGlobal(newGlobal);\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\nimport {\n ApiPrivacyKey, PrivacyVisibility, ProfileEditProgress, IInputPrivacyRules, IInputPrivacyContact,\n UPLOADING_WALLPAPER_SLUG, LangCode,\n} from '../../../types';\n\nimport { callApi } from '../../../api/gramjs';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { selectUser } from '../../selectors';\nimport {\n addUsers, addBlockedContact, updateChats, updateUser, removeBlockedContact, replaceSettings, updateNotifySettings,\n addNotifyExceptions,\n} from '../../reducers';\nimport { isChatPrivate } from '../../helpers';\n\naddReducer('updateProfile', (global, actions, payload) => {\n const {\n photo, firstName, lastName, bio: about, username,\n } = payload!;\n\n (async () => {\n const { currentUserId } = global;\n if (!currentUserId) {\n return;\n }\n\n setGlobal({\n ...getGlobal(),\n profileEdit: {\n progress: ProfileEditProgress.InProgress,\n },\n });\n\n if (photo) {\n await callApi('updateProfilePhoto', photo);\n }\n\n if (firstName || lastName || about) {\n const result = await callApi('updateProfile', { firstName, lastName, about });\n if (result) {\n global = getGlobal();\n const currentUser = currentUserId && selectUser(global, currentUserId);\n\n if (currentUser) {\n setGlobal(updateUser(\n global,\n currentUser.id,\n {\n firstName,\n lastName,\n fullInfo: {\n ...currentUser.fullInfo,\n bio: about,\n },\n },\n ));\n }\n }\n }\n\n if (username) {\n const result = await callApi('updateUsername', username);\n if (result && currentUserId) {\n setGlobal(updateUser(getGlobal(), currentUserId, { username }));\n }\n }\n\n setGlobal({\n ...getGlobal(),\n profileEdit: {\n progress: ProfileEditProgress.Complete,\n },\n });\n })();\n});\n\naddReducer('checkUsername', (global, actions, payload) => {\n const { username } = payload!;\n\n (async () => {\n // No need to check the username if profile update is already in progress\n if (global.profileEdit && global.profileEdit.progress === ProfileEditProgress.InProgress) {\n return;\n }\n\n setGlobal({\n ...global,\n profileEdit: {\n progress: global.profileEdit ? global.profileEdit.progress : ProfileEditProgress.Idle,\n isUsernameAvailable: undefined,\n },\n });\n\n const isUsernameAvailable = await callApi('checkUsername', username);\n\n global = getGlobal();\n setGlobal({\n ...global,\n profileEdit: {\n ...global.profileEdit!,\n isUsernameAvailable,\n },\n });\n })();\n});\n\naddReducer('loadWallpapers', () => {\n (async () => {\n const result = await callApi('fetchWallpapers', 0);\n if (!result) {\n return;\n }\n\n const global = getGlobal();\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: result.wallpapers,\n },\n });\n })();\n});\n\naddReducer('uploadWallpaper', (global, actions, payload) => {\n const file = payload;\n const previewBlobUrl = URL.createObjectURL(file);\n\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: [\n {\n slug: UPLOADING_WALLPAPER_SLUG,\n document: {\n fileName: '',\n size: file.size,\n mimeType: file.type,\n previewBlobUrl,\n },\n },\n ...(global.settings.loadedWallpapers || []),\n ],\n },\n });\n\n (async () => {\n const result = await callApi('uploadWallpaper', file);\n if (!result) {\n return;\n }\n\n const { wallpaper } = result;\n\n global = getGlobal();\n if (!global.settings.loadedWallpapers) {\n return;\n }\n\n const firstWallpaper = global.settings.loadedWallpapers[0];\n if (!firstWallpaper || firstWallpaper.slug !== UPLOADING_WALLPAPER_SLUG) {\n return;\n }\n\n const withLocalMedia = {\n ...wallpaper,\n document: {\n ...wallpaper.document,\n previewBlobUrl,\n },\n };\n\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: [\n withLocalMedia,\n ...global.settings.loadedWallpapers.slice(1),\n ],\n },\n });\n })();\n});\n\naddReducer('loadBlockedContacts', () => {\n (async () => {\n const result = await callApi('fetchBlockedContacts');\n\n if (!result) {\n return;\n }\n\n let newGlobal = getGlobal();\n\n if (result.users && result.users.length) {\n newGlobal = addUsers(newGlobal, buildCollectionByKey(result.users, 'id'));\n }\n if (result.chats && result.chats.length) {\n newGlobal = updateChats(newGlobal, buildCollectionByKey(result.chats, 'id'));\n }\n\n newGlobal = {\n ...newGlobal,\n blocked: {\n ...newGlobal.blocked,\n ids: [...(newGlobal.blocked.ids || []), ...result.blockedIds],\n totalCount: result.totalCount,\n },\n };\n\n setGlobal(newGlobal);\n })();\n});\n\naddReducer('blockContact', (global, actions, payload) => {\n const { contactId, accessHash } = payload!;\n\n (async () => {\n const result = await callApi('blockContact', contactId, accessHash);\n if (!result) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal(addBlockedContact(newGlobal, contactId));\n })();\n});\n\naddReducer('unblockContact', (global, actions, payload) => {\n const { contactId } = payload!;\n let accessHash: string | undefined;\n const isPrivate = isChatPrivate(contactId);\n\n if (isPrivate) {\n const user = selectUser(global, contactId);\n if (!user) {\n return;\n }\n\n accessHash = user.accessHash;\n }\n\n (async () => {\n const result = await callApi('unblockContact', contactId, accessHash);\n if (!result) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal(removeBlockedContact(newGlobal, contactId));\n })();\n});\n\naddReducer('loadAuthorizations', () => {\n (async () => {\n const result = await callApi('fetchAuthorizations');\n if (!result) {\n return;\n }\n\n setGlobal({\n ...getGlobal(),\n activeSessions: result,\n });\n })();\n});\n\naddReducer('terminateAuthorization', (global, actions, payload) => {\n const { hash } = payload!;\n\n (async () => {\n const result = await callApi('terminateAuthorization', hash);\n if (!result) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal({\n ...newGlobal,\n activeSessions: newGlobal.activeSessions.filter((session) => session.hash !== hash),\n });\n })();\n});\n\naddReducer('terminateAllAuthorizations', () => {\n (async () => {\n const result = await callApi('terminateAllAuthorizations');\n if (!result) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n activeSessions: global.activeSessions.filter((session) => session.isCurrent),\n });\n })();\n});\n\naddReducer('loadNotificationExceptions', (global) => {\n const { serverTimeOffset } = global;\n\n (async () => {\n const result = await callApi('fetchNotificationExceptions', { serverTimeOffset });\n if (!result) {\n return;\n }\n\n setGlobal(addNotifyExceptions(getGlobal(), result));\n })();\n});\n\naddReducer('loadNotificationSettings', (global) => {\n const { serverTimeOffset } = global;\n (async () => {\n const result = await callApi('fetchNotificationSettings', {\n serverTimeOffset,\n });\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), result));\n })();\n});\n\naddReducer('updateNotificationSettings', (global, actions, payload) => {\n const { peerType, isSilent, shouldShowPreviews } = payload!;\n\n (async () => {\n const result = await callApi('updateNotificationSettings', peerType, { isSilent, shouldShowPreviews });\n\n if (!result) {\n return;\n }\n\n setGlobal(updateNotifySettings(getGlobal(), peerType, isSilent, shouldShowPreviews));\n })();\n});\n\naddReducer('updateContactSignUpNotification', (global, actions, payload) => {\n const { isSilent } = payload!;\n\n (async () => {\n const result = await callApi('updateContactSignUpNotification', isSilent);\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), { hasContactJoinedNotifications: !isSilent }));\n })();\n});\n\naddReducer('loadLanguages', () => {\n (async () => {\n const result = await callApi('fetchLanguages');\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), { languages: result }));\n })();\n});\n\naddReducer('loadPrivacySettings', () => {\n (async () => {\n const [\n phoneNumberSettings, lastSeenSettings, profilePhotoSettings, forwardsSettings, chatInviteSettings,\n ] = await Promise.all([\n callApi('fetchPrivacySettings', 'phoneNumber'),\n callApi('fetchPrivacySettings', 'lastSeen'),\n callApi('fetchPrivacySettings', 'profilePhoto'),\n callApi('fetchPrivacySettings', 'forwards'),\n callApi('fetchPrivacySettings', 'chatInvite'),\n ]);\n\n if (\n !phoneNumberSettings || !lastSeenSettings || !profilePhotoSettings || !forwardsSettings || !chatInviteSettings\n ) {\n return;\n }\n\n const global = getGlobal();\n\n global.settings.privacy.phoneNumber = phoneNumberSettings;\n global.settings.privacy.lastSeen = lastSeenSettings;\n global.settings.privacy.profilePhoto = profilePhotoSettings;\n global.settings.privacy.forwards = forwardsSettings;\n global.settings.privacy.chatInvite = chatInviteSettings;\n\n setGlobal(global);\n })();\n});\n\naddReducer('setPrivacyVisibility', (global, actions, payload) => {\n const { privacyKey, visibility } = payload!;\n\n const {\n privacy: { [privacyKey as ApiPrivacyKey]: settings },\n } = global.settings;\n\n if (!settings) {\n return;\n }\n\n const rules = buildInputPrivacyRules(global, {\n visibility,\n allowedIds: [...settings.allowUserIds, ...settings.allowChatIds],\n deniedIds: [...settings.blockUserIds, ...settings.blockChatIds],\n });\n\n (async () => {\n const result = await callApi('setPrivacySettings', privacyKey, rules);\n\n if (result) {\n const newGlobal = getGlobal();\n\n newGlobal.settings.privacy[privacyKey as ApiPrivacyKey] = result;\n\n setGlobal(newGlobal);\n }\n })();\n});\n\naddReducer('setPrivacySettings', (global, actions, payload) => {\n const { privacyKey, isAllowList, contactsIds } = payload!;\n const {\n privacy: { [privacyKey as ApiPrivacyKey]: settings },\n } = global.settings;\n\n if (!settings) {\n return;\n }\n\n const rules = buildInputPrivacyRules(global, {\n visibility: settings.visibility,\n allowedIds: isAllowList ? contactsIds : [...settings.allowUserIds, ...settings.allowChatIds],\n deniedIds: !isAllowList ? contactsIds : [...settings.blockUserIds, ...settings.blockChatIds],\n });\n\n (async () => {\n const result = await callApi('setPrivacySettings', privacyKey, rules);\n\n if (result) {\n const newGlobal = getGlobal();\n\n newGlobal.settings.privacy[privacyKey as ApiPrivacyKey] = result;\n\n setGlobal(newGlobal);\n }\n })();\n});\n\nfunction buildInputPrivacyRules(global: GlobalState, {\n visibility,\n allowedIds,\n deniedIds,\n}: {\n visibility: PrivacyVisibility;\n allowedIds: number[];\n deniedIds: number[];\n}): IInputPrivacyRules {\n const {\n users: { byId: usersById },\n chats: { byId: chatsById },\n } = global;\n\n const rules: IInputPrivacyRules = {\n visibility,\n };\n let users: IInputPrivacyContact[];\n let chats: IInputPrivacyContact[];\n\n const collectUsers = (userId: number) => {\n if (!isChatPrivate(userId)) {\n return undefined;\n }\n const { id, accessHash } = usersById[userId] || {};\n if (!id) {\n return undefined;\n }\n\n return { id, accessHash };\n };\n\n const collectChats = (userId: number) => {\n if (isChatPrivate(userId)) {\n return undefined;\n }\n const chat = chatsById[userId];\n\n return chat ? { id: chat.id } : undefined;\n };\n\n if (visibility === 'contacts' || visibility === 'nobody') {\n users = allowedIds.map(collectUsers).filter(Boolean) as IInputPrivacyContact[];\n chats = allowedIds.map(collectChats).filter(Boolean) as IInputPrivacyContact[];\n\n if (users.length > 0) {\n rules.allowedUsers = users;\n }\n if (chats.length > 0) {\n rules.allowedChats = chats;\n }\n }\n\n if (visibility === 'everybody' || visibility === 'contacts') {\n users = deniedIds.map(collectUsers).filter(Boolean) as IInputPrivacyContact[];\n chats = deniedIds.map(collectChats).filter(Boolean) as IInputPrivacyContact[];\n\n if (users.length > 0) {\n rules.blockedUsers = users;\n }\n if (chats.length > 0) {\n rules.blockedChats = chats;\n }\n }\n\n return rules;\n}\n\naddReducer('updateIsOnline', (global, actions, payload) => {\n callApi('updateIsOnline', payload);\n});\n\naddReducer('loadContentSettings', () => {\n (async () => {\n const result = await callApi('fetchContentSettings');\n if (!result) return;\n\n setGlobal(replaceSettings(getGlobal(), result));\n })();\n});\n\naddReducer('updateContentSettings', (global, actions, payload) => {\n (async () => {\n setGlobal(replaceSettings(getGlobal(), { isSensitiveEnabled: payload }));\n\n const result = await callApi('updateContentSettings', payload);\n if (!result) {\n setGlobal(replaceSettings(getGlobal(), { isSensitiveEnabled: !payload }));\n }\n })();\n});\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport {\n ApiUpdate,\n ApiUpdateAuthorizationState,\n ApiUpdateAuthorizationError,\n ApiUpdateConnectionState,\n ApiUpdateSession,\n ApiUpdateCurrentUser, ApiUpdateServerTimeOffset,\n} from '../../../api/types';\nimport { DEBUG, SESSION_USER_KEY } from '../../../config';\nimport { subscribe } from '../../../util/notifications';\nimport { updateUser } from '../../reducers';\nimport { setLanguage } from '../../../util/langProvider';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n if (DEBUG) {\n if (update['@type'] !== 'updateUserStatus' && update['@type'] !== 'updateServerTimeOffset') {\n // eslint-disable-next-line no-console\n console.log('[GramJs] UPDATE', update['@type'], { update });\n }\n }\n\n switch (update['@type']) {\n case 'updateApiReady':\n onUpdateApiReady(global);\n break;\n\n case 'updateAuthorizationState':\n onUpdateAuthorizationState(update);\n break;\n\n case 'updateAuthorizationError':\n onUpdateAuthorizationError(update);\n break;\n\n case 'updateConnectionState':\n onUpdateConnectionState(update);\n break;\n\n case 'updateSession':\n onUpdateSession(update);\n break;\n\n case 'updateServerTimeOffset':\n onUpdateServerTimeOffset(update);\n break;\n\n case 'updateCurrentUser':\n onUpdateCurrentUser(update);\n break;\n\n case 'error':\n if (update.error.message === 'SESSION_REVOKED') {\n actions.signOut();\n }\n\n actions.showDialog({ data: { ...update.error, hasErrorKey: true } });\n\n break;\n }\n});\n\nfunction onUpdateApiReady(global: GlobalState) {\n subscribe();\n setLanguage(global.settings.byKey.language);\n}\n\nfunction onUpdateAuthorizationState(update: ApiUpdateAuthorizationState) {\n let global = getGlobal();\n\n const wasAuthReady = global.authState === 'authorizationStateReady';\n const authState = update.authorizationState;\n\n setGlobal({\n ...global,\n authState,\n authIsLoading: false,\n });\n\n global = getGlobal();\n\n switch (authState) {\n case 'authorizationStateLoggingOut':\n setGlobal({\n ...global,\n isLoggingOut: true,\n });\n break;\n case 'authorizationStateWaitCode':\n setGlobal({\n ...global,\n authIsCodeViaApp: update.isCodeViaApp,\n });\n break;\n case 'authorizationStateWaitPassword':\n setGlobal({\n ...global,\n authHint: update.hint,\n });\n break;\n case 'authorizationStateWaitQrCode':\n setGlobal({\n ...global,\n authIsLoadingQrCode: false,\n authQrCode: update.qrCode,\n });\n break;\n case 'authorizationStateReady': {\n if (wasAuthReady) {\n break;\n }\n\n setGlobal({\n ...global,\n isLoggingOut: false,\n lastSyncTime: Date.now(),\n });\n\n break;\n }\n }\n}\n\nfunction onUpdateAuthorizationError(update: ApiUpdateAuthorizationError) {\n setGlobal({\n ...getGlobal(),\n authError: update.message,\n });\n}\n\nfunction onUpdateConnectionState(update: ApiUpdateConnectionState) {\n const { connectionState } = update;\n const global = getGlobal();\n\n setGlobal({\n ...global,\n connectionState,\n });\n\n if (connectionState === 'connectionStateReady' && global.authState === 'authorizationStateReady') {\n getDispatch().sync();\n } else if (connectionState === 'connectionStateBroken') {\n getDispatch().signOut();\n }\n}\n\nfunction onUpdateSession(update: ApiUpdateSession) {\n const { sessionData } = update;\n const { authRememberMe, authState } = getGlobal();\n const isEmpty = !sessionData || !sessionData.mainDcId;\n\n if (!authRememberMe || authState !== 'authorizationStateReady' || isEmpty) {\n return;\n }\n\n getDispatch().saveSession({ sessionData });\n}\n\nfunction onUpdateServerTimeOffset(update: ApiUpdateServerTimeOffset) {\n const global = getGlobal();\n\n if (global.serverTimeOffset === update.serverTimeOffset) {\n return;\n }\n\n setGlobal({\n ...global,\n serverTimeOffset: update.serverTimeOffset,\n });\n}\n\nfunction onUpdateCurrentUser(update: ApiUpdateCurrentUser) {\n const { currentUser } = update;\n\n setGlobal({\n ...updateUser(getGlobal(), currentUser.id, currentUser),\n currentUserId: currentUser.id,\n });\n\n updateSessionUserId(currentUser.id);\n}\n\nfunction updateSessionUserId(currentUserId: number) {\n const sessionUserAuth = localStorage.getItem(SESSION_USER_KEY);\n if (!sessionUserAuth) return;\n\n const userAuth = JSON.parse(sessionUserAuth);\n userAuth.id = currentUserId;\n\n localStorage.setItem(SESSION_USER_KEY, JSON.stringify(userAuth));\n}\n","export var ServiceWorkerNoSupportError = (function() {\n\n\tfunction ServiceWorkerNoSupportError() {\n\t\tvar err = Error.call(this, 'ServiceWorker is not supported.');\n\t\tObject.setPrototypeOf(err, ServiceWorkerNoSupportError.prototype);\n\t\treturn err;\n\t}\n\n\tServiceWorkerNoSupportError.prototype = Object.create(Error.prototype);\n\n\treturn ServiceWorkerNoSupportError;\n})();\n\nexport var scriptUrl = __webpack_public_path__ + \"serviceWorker.js\";\n\nexport default function registerServiceWorkerIfSupported(mapScriptUrlOrOptions, maybeOptions) {\n\n\tvar targetScriptUrl = scriptUrl;\n\tvar options = maybeOptions;\n\n\tif (typeof mapScriptUrlOrOptions === 'function') {\n\t\ttargetScriptUrl = mapScriptUrlOrOptions(targetScriptUrl);\n\t} else {\n\t\toptions = mapScriptUrlOrOptions;\n\t}\n\n\tif ('serviceWorker' in navigator) {\n\t\treturn navigator.serviceWorker.register(targetScriptUrl, options);\n\t}\n\n\treturn Promise.reject(new ServiceWorkerNoSupportError());\n}\n","import { scriptUrl } from 'service-worker-loader!../serviceWorker';\n\nimport { DEBUG } from '../config';\nimport { getDispatch } from '../lib/teact/teactn';\nimport { IS_ANDROID, IS_IOS, IS_SERVICE_WORKER_SUPPORTED } from './environment';\nimport { notifyClientReady } from './notifications';\n\ntype WorkerAction = {\n type: string;\n payload: Record<string, any>;\n};\n\nfunction handleWorkerMessage(e: MessageEvent) {\n const action: WorkerAction = e.data;\n if (!action.type) return;\n const dispatch = getDispatch();\n switch (action.type) {\n case 'focusMessage':\n dispatch.focusMessage(action.payload);\n break;\n }\n}\n\nfunction subscribeToWorker() {\n navigator.serviceWorker.removeEventListener('message', handleWorkerMessage);\n navigator.serviceWorker.addEventListener('message', handleWorkerMessage);\n // Notify web worker that client is ready to receive messages\n notifyClientReady();\n}\n\nif (IS_SERVICE_WORKER_SUPPORTED) {\n window.addEventListener('load', async () => {\n try {\n await navigator.serviceWorker.register(scriptUrl);\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] ServiceWorker registered');\n }\n\n await navigator.serviceWorker.ready;\n\n if (navigator.serviceWorker.controller) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] ServiceWorker ready');\n }\n subscribeToWorker();\n } else {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('[SW] ServiceWorker not available');\n }\n\n if (!IS_IOS && !IS_ANDROID) {\n getDispatch().showDialog({ data: { message: 'SERVICE_WORKER_DISABLED', hasErrorKey: true } });\n }\n }\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('[SW] ServiceWorker registration failed: ', err);\n }\n }\n });\n window.addEventListener('focus', async () => {\n await navigator.serviceWorker.ready;\n subscribeToWorker();\n });\n}\n","import { GlobalState } from './types';\nimport { NewChatMembersProgress } from '../types';\n\nimport {\n ANIMATION_LEVEL_DEFAULT, DARK_THEME_PATTERN_COLOR, DEFAULT_MESSAGE_TEXT_SIZE_PX, DEFAULT_PATTERN_COLOR,\n} from '../config';\n\nexport const INITIAL_STATE: GlobalState = {\n isLeftColumnShown: true,\n isChatInfoShown: false,\n newChatMembersProgress: NewChatMembersProgress.Closed,\n uiReadyState: 0,\n serverTimeOffset: 0,\n\n authRememberMe: true,\n\n blocked: {\n ids: [],\n totalCount: 0,\n },\n\n users: {\n byId: {},\n },\n\n chats: {\n listIds: {},\n isFullyLoaded: {},\n orderedPinnedIds: {},\n totalCount: {},\n byId: {},\n },\n\n messages: {\n byChatId: {},\n },\n\n scheduledMessages: {\n byChatId: {},\n },\n\n chatFolders: {\n byId: {},\n activeChatFolder: 0,\n },\n\n fileUploads: {\n byMessageLocalId: {},\n },\n\n recentEmojis: ['grinning', 'kissing_heart', 'christmas_tree', 'brain', 'trophy'],\n\n stickers: {\n setsById: {},\n added: {},\n recent: {\n stickers: [],\n },\n favorite: {\n stickers: [],\n },\n featured: {\n setIds: [],\n },\n search: {},\n forEmoji: {},\n },\n\n emojiKeywords: {},\n\n gifs: {\n saved: {},\n search: {},\n },\n\n inlineBots: {\n isLoading: false,\n byUsername: {},\n },\n\n globalSearch: {},\n\n userSearch: {},\n\n localTextSearch: {\n byChatThreadKey: {},\n },\n\n localMediaSearch: {\n byChatId: {},\n },\n\n management: {\n byChatId: {},\n },\n\n topPeers: {},\n\n topInlineBots: {},\n\n mediaViewer: {},\n\n audioPlayer: {},\n\n forwardMessages: {},\n\n pollResults: {},\n\n payment: {},\n\n notifications: [],\n\n dialogs: [],\n\n activeSessions: [],\n\n settings: {\n byKey: {\n theme: 'light',\n shouldUseSystemTheme: true,\n messageTextSize: DEFAULT_MESSAGE_TEXT_SIZE_PX,\n animationLevel: ANIMATION_LEVEL_DEFAULT,\n messageSendKeyCombo: 'enter',\n shouldAutoDownloadMediaFromContacts: true,\n shouldAutoDownloadMediaInPrivateChats: true,\n shouldAutoDownloadMediaInGroups: true,\n shouldAutoDownloadMediaInChannels: true,\n shouldAutoPlayGifs: true,\n shouldAutoPlayVideos: true,\n shouldSuggestStickers: true,\n shouldLoopStickers: true,\n language: 'en',\n },\n themes: {\n light: {\n isBlurred: true,\n patternColor: DEFAULT_PATTERN_COLOR,\n },\n dark: {\n isBlurred: true,\n patternColor: DARK_THEME_PATTERN_COLOR,\n },\n },\n privacy: {},\n notifyExceptions: {},\n },\n\n twoFaSettings: {},\n\n shouldShowContextMenuHint: true,\n};\n","import {\n addCallback, addReducer, getGlobal, removeCallback,\n} from '../lib/teact/teactn';\n\nimport { GlobalState } from './types';\nimport { MAIN_THREAD_ID } from '../api/types';\n\nimport { onBeforeUnload, onIdle, throttle } from '../util/schedulers';\nimport {\n DEBUG,\n GLOBAL_STATE_CACHE_DISABLED,\n GLOBAL_STATE_CACHE_KEY,\n GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n GLOBAL_STATE_CACHE_USER_LIST_LIMIT,\n} from '../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../util/environment';\nimport { pick } from '../util/iteratees';\nimport { INITIAL_STATE } from './initial';\nimport { selectCurrentMessageList } from '../modules/selectors';\nimport { hasStoredSession } from '../util/sessions';\n\nconst UPDATE_THROTTLE = 5000;\n\nconst updateCacheThrottled = throttle(() => onIdle(updateCache), UPDATE_THROTTLE, false);\n\nlet isCaching = false;\nlet unsubscribeFromBeforeUnload: NoneToVoidFunction | undefined;\n\nexport function initCache() {\n if (GLOBAL_STATE_CACHE_DISABLED) {\n return;\n }\n\n addReducer('saveSession', () => {\n if (isCaching) {\n return;\n }\n\n setupCaching();\n });\n\n addReducer('reset', () => {\n localStorage.removeItem(GLOBAL_STATE_CACHE_KEY);\n\n if (!isCaching) {\n return;\n }\n\n clearCaching();\n });\n}\n\nexport function loadCache(initialState: GlobalState) {\n if (GLOBAL_STATE_CACHE_DISABLED) {\n return undefined;\n }\n\n if (hasStoredSession(true)) {\n setupCaching();\n\n return readCache(initialState);\n } else {\n clearCaching();\n\n return undefined;\n }\n}\n\nfunction setupCaching() {\n isCaching = true;\n unsubscribeFromBeforeUnload = onBeforeUnload(updateCache, true);\n window.addEventListener('blur', updateCache);\n addCallback(updateCacheThrottled);\n}\n\nfunction clearCaching() {\n isCaching = false;\n removeCallback(updateCacheThrottled);\n window.removeEventListener('blur', updateCache);\n if (unsubscribeFromBeforeUnload) {\n unsubscribeFromBeforeUnload();\n }\n}\n\nfunction readCache(initialState: GlobalState) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.time('global-state-cache-read');\n }\n\n const json = localStorage.getItem(GLOBAL_STATE_CACHE_KEY);\n const cached = json ? JSON.parse(json) as GlobalState : undefined;\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.timeEnd('global-state-cache-read');\n }\n\n if (cached) {\n // Pre-fill defaults in nested objects which may be missing in older cache\n cached.settings.byKey = {\n ...initialState.settings.byKey,\n ...cached.settings.byKey,\n };\n cached.settings.themes = {\n ...initialState.settings.themes,\n ...cached.settings.themes,\n };\n cached.chatFolders = {\n ...initialState.chatFolders,\n ...cached.chatFolders,\n };\n }\n\n return {\n ...initialState,\n ...cached,\n };\n}\n\nfunction updateCache() {\n if (!isCaching) {\n return;\n }\n\n const global = getGlobal();\n\n if (global.isLoggingOut) {\n return;\n }\n\n const reducedGlobal: GlobalState = {\n ...INITIAL_STATE,\n ...pick(global, [\n 'authState',\n 'authPhoneNumber',\n 'authRememberMe',\n 'authNearestCountry',\n 'currentUserId',\n 'contactList',\n 'topPeers',\n 'topInlineBots',\n 'recentEmojis',\n 'push',\n 'shouldShowContextMenuHint',\n ]),\n isChatInfoShown: reduceShowChatInfo(global),\n users: reduceUsers(global),\n chats: reduceChats(global),\n messages: reduceMessages(global),\n globalSearch: {\n recentlyFoundChatIds: global.globalSearch.recentlyFoundChatIds,\n },\n settings: reduceSettings(global),\n chatFolders: reduceChatFolders(global),\n };\n\n const json = JSON.stringify(reducedGlobal);\n localStorage.setItem(GLOBAL_STATE_CACHE_KEY, json);\n}\n\nfunction reduceShowChatInfo(global: GlobalState): boolean {\n return window.innerWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n ? global.isChatInfoShown\n : false;\n}\n\nfunction reduceUsers(global: GlobalState): GlobalState['users'] {\n const { users: { byId, selectedId } } = global;\n const idsToSave = [\n ...(global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT).filter((cid) => cid > 0),\n ...Object.keys(byId),\n ].slice(0, GLOBAL_STATE_CACHE_USER_LIST_LIMIT);\n\n return {\n byId: pick(byId, idsToSave as number[]),\n selectedId: window.innerWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN ? selectedId : undefined,\n };\n}\n\nfunction reduceChats(global: GlobalState): GlobalState['chats'] {\n const chatIdsToSave = [\n ...(global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT),\n ];\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n\n return {\n ...global.chats,\n byId: pick(global.chats.byId, currentChatId ? [...chatIdsToSave, currentChatId] : chatIdsToSave),\n listIds: {\n active: chatIdsToSave,\n },\n isFullyLoaded: {},\n orderedPinnedIds: {\n active: global.chats.orderedPinnedIds.active,\n },\n };\n}\n\nfunction reduceMessages(global: GlobalState): GlobalState['messages'] {\n const byChatId: GlobalState['messages']['byChatId'] = {};\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n\n const chatIdsToSave = [\n ...(global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT),\n ...(currentChatId ? [currentChatId] : []),\n ];\n chatIdsToSave.forEach((chatId) => {\n const current = global.messages.byChatId[chatId];\n if (!current) {\n return;\n }\n\n const mainThread = current.threadsById[MAIN_THREAD_ID];\n if (!mainThread || !mainThread.viewportIds) {\n return;\n }\n\n byChatId[chatId] = {\n byId: pick(current.byId, mainThread.viewportIds),\n threadsById: {\n [MAIN_THREAD_ID]: mainThread,\n },\n };\n });\n\n const currentMessageList = selectCurrentMessageList(global);\n\n return {\n byChatId,\n messageLists: !currentMessageList || IS_SINGLE_COLUMN_LAYOUT ? undefined : [{\n ...currentMessageList,\n threadId: MAIN_THREAD_ID,\n type: 'thread',\n }],\n };\n}\n\nfunction reduceSettings(global: GlobalState): GlobalState['settings'] {\n const { byKey, themes } = global.settings;\n\n return {\n byKey,\n themes,\n privacy: {},\n notifyExceptions: {},\n };\n}\n\nfunction reduceChatFolders(global: GlobalState): GlobalState['chatFolders'] {\n return {\n ...global.chatFolders,\n activeChatFolder: 0,\n };\n}\n","import { addReducer } from '../lib/teact/teactn';\n\nimport { INITIAL_STATE } from './initial';\nimport { initCache, loadCache } from './cache';\nimport { cloneDeep } from '../util/iteratees';\n\ninitCache();\n\naddReducer('init', () => {\n const initial = cloneDeep(INITIAL_STATE);\n return loadCache(initial) || initial;\n});\n","const STORAGE_KEY = 'tt-active-tab';\nconst INTERVAL = 2000;\n\nconst tabKey = String(Date.now() + Math.random());\n\nlocalStorage.setItem(STORAGE_KEY, tabKey);\n\nlet callback: NoneToVoidFunction;\n\nconst interval = window.setInterval(() => {\n if (callback && localStorage.getItem(STORAGE_KEY) !== tabKey) {\n callback();\n clearInterval(interval);\n }\n}, INTERVAL);\n\nexport function addActiveTabChangeListener(_callback: NoneToVoidFunction) {\n callback = _callback;\n}\n","const SITE_FONTS = ['400 1em Roboto', '500 1em Roboto'];\n\nexport default function preloadFonts() {\n if ('fonts' in document) {\n return Promise.all(SITE_FONTS.map((font) => document.fonts.load(font)));\n }\n\n return undefined;\n}\n","export default __webpack_public_path__ + \"telegram-logo.df3a91becaa9678c529b4c4cadd45204.svg\";","export default __webpack_public_path__ + \"monkey.a3d5fcdc50b18dc55695f7dd4101a8c9.svg\";","import React, { FC, useEffect } from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMediaFormat } from '../../api/types';\nimport { GlobalActions, GlobalState } from '../../global/types';\n\nimport { getChatAvatarHash } from '../../modules/helpers/chats'; // Direct import for better module splitting\nimport useFlag from '../../hooks/useFlag';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport { pause } from '../../util/schedulers';\nimport { preloadImage } from '../../util/files';\nimport preloadFonts from '../../util/fonts';\nimport * as mediaLoader from '../../util/mediaLoader';\nimport { Bundles, loadModule } from '../../util/moduleLoader';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\nimport './UiLoader.scss';\n\n// @ts-ignore\nimport telegramLogoPath from '../../assets/telegram-logo.svg';\n// @ts-ignore\nimport monkeyPath from '../../assets/monkey.svg';\nimport { selectIsRightColumnShown, selectTheme } from '../../modules/selectors';\n\ntype OwnProps = {\n page: 'main' | 'authCode' | 'authPassword' | 'authPhoneNumber' | 'authQrCode';\n children: any;\n};\n\ntype StateProps = Pick<GlobalState, 'uiReadyState' | 'shouldSkipHistoryAnimations'> & {\n hasCustomBackground?: boolean;\n hasCustomBackgroundColor: boolean;\n isRightColumnShown?: boolean;\n};\n\ntype DispatchProps = Pick<GlobalActions, 'setIsUiReady'>;\n\nconst MAX_PRELOAD_DELAY = 700;\nconst SECOND_STATE_DELAY = 1000;\nconst AVATARS_TO_PRELOAD = 10;\n\nfunction preloadAvatars() {\n const { listIds, byId } = getGlobal().chats;\n if (!listIds.active) {\n return undefined;\n }\n\n return Promise.all(listIds.active.slice(0, AVATARS_TO_PRELOAD).map((chatId) => {\n const chat = byId[chatId];\n if (!chat) {\n return undefined;\n }\n\n const avatarHash = getChatAvatarHash(chat);\n if (!avatarHash) {\n return undefined;\n }\n\n return mediaLoader.fetch(avatarHash, ApiMediaFormat.DataUri);\n }));\n}\n\nconst preloadTasks = {\n main: () => Promise.all([\n loadModule(Bundles.Main, 'Main')\n .then(preloadFonts),\n preloadAvatars(),\n ]),\n authPhoneNumber: () => Promise.all([\n preloadFonts(),\n preloadImage(telegramLogoPath),\n ]),\n authCode: () => preloadImage(monkeyPath),\n authPassword: () => preloadImage(monkeyPath),\n authQrCode: preloadFonts,\n};\n\nconst UiLoader: FC<OwnProps & StateProps & DispatchProps> = ({\n page,\n children,\n hasCustomBackground,\n hasCustomBackgroundColor,\n isRightColumnShown,\n shouldSkipHistoryAnimations,\n setIsUiReady,\n}) => {\n const [isReady, markReady] = useFlag();\n const {\n shouldRender: shouldRenderMask, transitionClassNames,\n } = useShowTransition(!isReady, undefined, true);\n\n useEffect(() => {\n let timeout: number | undefined;\n\n const safePreload = async () => {\n try {\n await preloadTasks[page]();\n } catch (err) {\n // Do nothing\n }\n };\n\n Promise.race([\n pause(MAX_PRELOAD_DELAY),\n safePreload(),\n ]).then(() => {\n markReady();\n setIsUiReady({ uiReadyState: 1 });\n\n timeout = window.setTimeout(() => {\n setIsUiReady({ uiReadyState: 2 });\n }, SECOND_STATE_DELAY);\n });\n\n return () => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n setIsUiReady({ uiReadyState: 0 });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <div id=\"UiLoader\">\n {children}\n {shouldRenderMask && !shouldSkipHistoryAnimations && (\n <div className={buildClassName('mask', transitionClassNames)}>\n {page === 'main' ? (\n <>\n <div className=\"left\" />\n <div\n className={buildClassName(\n 'middle',\n hasCustomBackground && 'custom-bg-image',\n hasCustomBackgroundColor && 'custom-bg-color',\n isRightColumnShown && 'with-right-column',\n )}\n />\n {isRightColumnShown && <div className=\"right\" />}\n </>\n ) : (\n <div className=\"blank\" />\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport default withGlobal<OwnProps>(\n (global): StateProps => {\n const theme = selectTheme(global);\n const { background, backgroundColor } = global.settings.themes[theme] || {};\n\n return {\n shouldSkipHistoryAnimations: global.shouldSkipHistoryAnimations,\n uiReadyState: global.uiReadyState,\n hasCustomBackground: Boolean(background),\n hasCustomBackgroundColor: Boolean(backgroundColor),\n isRightColumnShown: selectIsRightColumnShown(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setIsUiReady']),\n)(UiLoader);\n","import * as langProvider from '../util/langProvider';\nimport { useState } from '../lib/teact/teact';\n\nexport default (langCode: string | undefined, key: string): string | undefined => {\n const [translation, setTranslation] = useState<string>();\n\n if (langCode) {\n langProvider\n .getTranslationForLangString(langCode, key)\n .then(setTranslation);\n }\n\n return translation;\n};\n","export function getSuggestedLanguage() {\n let suggestedLanguage = navigator.language;\n\n if (suggestedLanguage && suggestedLanguage !== 'pt-br') {\n suggestedLanguage = suggestedLanguage.substr(0, 2);\n }\n\n return suggestedLanguage;\n}\n","import React, {\n FC, useState, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport { countryList } from '../../util/phoneNumber';\nimport searchWords from '../../util/searchWords';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport DropdownMenu from '../ui/DropdownMenu';\nimport MenuItem from '../ui/MenuItem';\nimport Spinner from '../ui/Spinner';\n\nimport './CountryCodeInput.scss';\n\ntype OwnProps = {\n id: string;\n value?: Country;\n isLoading?: boolean;\n onChange: (value: Country) => void;\n};\n\nconst MENU_HIDING_DURATION = 200 + ANIMATION_END_DELAY;\nconst SELECT_TIMEOUT = 50;\n\nconst CountryCodeInput: FC<OwnProps> = ({\n id,\n value,\n isLoading,\n onChange,\n}) => {\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef<HTMLInputElement>(null);\n\n const [filter, setFilter] = useState<string | undefined>();\n const [filteredList, setFilteredList] = useState(countryList);\n\n function updateFilter(filterValue?: string) {\n setFilter(filterValue);\n setFilteredList(getFilteredList(filterValue));\n }\n\n const handleChange = useCallback((e: React.SyntheticEvent<HTMLElement>) => {\n const { countryId } = (e.currentTarget.firstElementChild as HTMLDivElement).dataset;\n const country = countryList.find((c) => c.id === countryId);\n\n if (country) {\n onChange(country);\n }\n\n setTimeout(() => updateFilter(undefined), MENU_HIDING_DURATION);\n }, [onChange]);\n\n const handleInput = useCallback((e: React.FormEvent<HTMLInputElement>) => {\n updateFilter(e.currentTarget.value);\n }, []);\n\n const handleInputKeyDown = useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.keyCode !== 8) {\n return;\n }\n\n const target = e.currentTarget;\n if (value && filter === undefined) {\n target.value = '';\n }\n\n updateFilter(target.value);\n }, [filter, value]);\n\n const CodeInput: FC<{ onTrigger: () => void; isOpen?: boolean }> = ({ onTrigger, isOpen }) => {\n const handleTrigger = () => {\n if (isOpen) {\n return;\n }\n\n setTimeout(() => {\n inputRef.current!.select();\n }, SELECT_TIMEOUT);\n\n onTrigger();\n\n const formEl = document.getElementById('auth-phone-number-form')!;\n formEl.scrollTo({ top: formEl.scrollHeight, behavior: 'smooth' });\n };\n\n const inputValue = filter !== undefined\n ? filter\n : (value && value.name) || '';\n\n return (\n <div className={buildClassName('input-group', value && 'touched')}>\n <input\n ref={inputRef}\n className={buildClassName('form-control', isOpen && 'focus')}\n type=\"text\"\n id={id}\n value={inputValue}\n autoComplete=\"off\"\n onClick={handleTrigger}\n onFocus={handleTrigger}\n onInput={handleInput}\n onKeyDown={handleInputKeyDown}\n />\n <label>{lang('Login.SelectCountry.Title')}</label>\n {isLoading ? (\n <Spinner color=\"black\" />\n ) : (\n <i onClick={handleTrigger} className={buildClassName('css-icon-down', isOpen && 'open')} />\n )}\n </div>\n );\n };\n\n return (\n <DropdownMenu\n className=\"CountryCodeInput\"\n trigger={CodeInput}\n >\n {filteredList.map((country: Country) => (\n <MenuItem\n key={country.id}\n className={value && country.id === value.id ? 'selected' : ''}\n onClick={handleChange}\n >\n <span data-country-id={country.id} />\n <span className=\"country-flag\">{renderText(country.flag, ['hq_emoji'])}</span>\n <span className=\"country-name\">{country.name}</span>\n <span className=\"country-code\">{country.code}</span>\n </MenuItem>\n ))}\n {!filteredList.length && (\n <MenuItem\n key=\"no-results\"\n className=\"no-results\"\n disabled\n >\n <span>{lang('lng_country_none')}</span>\n </MenuItem>\n )}\n </DropdownMenu>\n );\n};\n\nfunction getFilteredList(filter = ''): Country[] {\n return filter.length\n ? countryList.filter((country) => searchWords(country.name, filter))\n : countryList;\n}\n\nexport default memo(CountryCodeInput);\n","import { ChangeEvent } from 'react';\n\n// @ts-ignore\nimport monkeyPath from '../../assets/monkey.svg';\n\nimport React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { LangCode } from '../../types';\n\nimport { IS_SAFARI, IS_TOUCH_ENV } from '../../util/environment';\nimport { preloadImage } from '../../util/files';\nimport preloadFonts from '../../util/fonts';\nimport { pick } from '../../util/iteratees';\nimport { formatPhoneNumber, getCountryById, getCountryFromPhoneNumber } from '../../util/phoneNumber';\nimport { setLanguage } from '../../util/langProvider';\nimport useLang from '../../hooks/useLang';\nimport useFlag from '../../hooks/useFlag';\nimport useLangString from '../../hooks/useLangString';\nimport { getSuggestedLanguage } from './helpers/getSuggestedLanguage';\n\nimport Button from '../ui/Button';\nimport Checkbox from '../ui/Checkbox';\nimport InputText from '../ui/InputText';\nimport Loading from '../ui/Loading';\nimport CountryCodeInput from './CountryCodeInput';\n\ntype StateProps = Pick<GlobalState, (\n 'connectionState' | 'authState' |\n 'authPhoneNumber' | 'authIsLoading' | 'authIsLoadingQrCode' | 'authError' | 'authRememberMe' | 'authNearestCountry'\n)> & {\n language?: LangCode;\n};\ntype DispatchProps = Pick<GlobalActions, (\n 'setAuthPhoneNumber' | 'setAuthRememberMe' | 'loadNearestCountry' | 'clearAuthError' | 'goToAuthQrCode' |\n 'setSettingOption'\n)>;\n\nconst MIN_NUMBER_LENGTH = 7;\n\nlet isPreloadInitiated = false;\n\nconst AuthPhoneNumber: FC<StateProps & DispatchProps> = ({\n connectionState,\n authState,\n authPhoneNumber,\n authIsLoading,\n authIsLoadingQrCode,\n authError,\n authRememberMe,\n authNearestCountry,\n language,\n setAuthPhoneNumber,\n setAuthRememberMe,\n loadNearestCountry,\n clearAuthError,\n goToAuthQrCode,\n setSettingOption,\n}) => {\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef<HTMLInputElement>(null);\n const suggestedLanguage = getSuggestedLanguage();\n\n const continueText = useLangString(suggestedLanguage, 'ContinueOnThisLanguage');\n const [country, setCountry] = useState<Country | undefined>();\n const [phoneNumber, setPhoneNumber] = useState<string | undefined>();\n const [isTouched, setIsTouched] = useState(false);\n const [lastSelection, setLastSelection] = useState<[number, number] | undefined>();\n const [isLoading, markIsLoading, unmarkIsLoading] = useFlag();\n\n const fullNumber = country ? `${country.code} ${phoneNumber || ''}` : phoneNumber;\n const canSubmit = fullNumber && fullNumber.replace(/[^\\d]+/g, '').length >= MIN_NUMBER_LENGTH;\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n inputRef.current!.focus();\n }\n }, [country]);\n\n useEffect(() => {\n if (connectionState === 'connectionStateReady' && !authNearestCountry) {\n loadNearestCountry();\n }\n }, [connectionState, authNearestCountry, loadNearestCountry]);\n\n useEffect(() => {\n if (authNearestCountry && !country && !isTouched) {\n setCountry(getCountryById(authNearestCountry));\n }\n }, [country, authNearestCountry, isTouched]);\n\n const parseFullNumber = useCallback((newFullNumber: string) => {\n if (!newFullNumber.length) {\n setPhoneNumber('');\n }\n\n const suggestedCountry = getCountryFromPhoneNumber(newFullNumber);\n\n // Any phone numbers should be allowed, in some cases ignoring formatting\n const selectedCountry = !country\n || (suggestedCountry && suggestedCountry.id !== country.id)\n || (!suggestedCountry && newFullNumber.length)\n ? suggestedCountry\n : country;\n\n if (!country || !selectedCountry || (selectedCountry && selectedCountry.code !== country.code)) {\n setCountry(selectedCountry);\n }\n\n setPhoneNumber(formatPhoneNumber(newFullNumber, selectedCountry));\n }, [country]);\n\n const handleLangChange = useCallback(() => {\n markIsLoading();\n\n setLanguage(suggestedLanguage!, () => {\n unmarkIsLoading();\n\n setSettingOption({ language: suggestedLanguage });\n });\n }, [markIsLoading, setSettingOption, suggestedLanguage, unmarkIsLoading]);\n\n useEffect(() => {\n if (phoneNumber === undefined && authPhoneNumber) {\n parseFullNumber(authPhoneNumber);\n }\n }, [authPhoneNumber, phoneNumber, parseFullNumber]);\n\n useLayoutEffect(() => {\n if (inputRef.current && lastSelection) {\n inputRef.current.setSelectionRange(...lastSelection);\n }\n }, [lastSelection]);\n\n const isJustPastedRef = useRef(false);\n const handlePaste = useCallback(() => {\n isJustPastedRef.current = true;\n requestAnimationFrame(() => {\n isJustPastedRef.current = false;\n });\n }, []);\n\n const handlePhoneNumberChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n if (authError) {\n clearAuthError();\n }\n\n // This is for further screens. We delay it until user input to speed up the initial loading.\n if (!isPreloadInitiated) {\n isPreloadInitiated = true;\n preloadFonts();\n preloadImage(monkeyPath);\n }\n\n const { value, selectionStart, selectionEnd } = e.target;\n setLastSelection(\n selectionStart && selectionEnd && selectionEnd < value.length\n ? [selectionStart, selectionEnd]\n : undefined,\n );\n\n setIsTouched(true);\n\n const shouldFixSafariAutoComplete = (\n IS_SAFARI && country && fullNumber !== undefined\n && value.length - fullNumber.length > 1 && !isJustPastedRef.current\n );\n parseFullNumber(shouldFixSafariAutoComplete ? `${country!.code} ${value}` : value);\n }, [authError, clearAuthError, country, fullNumber, parseFullNumber]);\n\n const handleKeepSessionChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setAuthRememberMe(e.target.checked);\n }, [setAuthRememberMe]);\n\n function handleSubmit(event: React.FormEvent<HTMLFormElement>) {\n event.preventDefault();\n\n if (authIsLoading) {\n return;\n }\n\n if (canSubmit) {\n setAuthPhoneNumber({ phoneNumber: fullNumber });\n }\n }\n\n const isAuthReady = authState === 'authorizationStateWaitPhoneNumber';\n\n return (\n <div id=\"auth-phone-number-form\" className=\"custom-scroll\">\n <div className=\"auth-form\">\n <div id=\"logo\" />\n <h2>Telegram</h2>\n <p className=\"note\">{lang('StartText')}</p>\n <form action=\"\" onSubmit={handleSubmit}>\n <CountryCodeInput\n id=\"sign-in-phone-code\"\n value={country}\n isLoading={!authNearestCountry && !country}\n onChange={setCountry}\n />\n <InputText\n ref={inputRef}\n id=\"sign-in-phone-number\"\n label={lang('Login.PhonePlaceholder')}\n value={fullNumber}\n error={authError && lang(authError)}\n inputMode=\"tel\"\n onChange={handlePhoneNumberChange}\n onPaste={IS_SAFARI ? handlePaste : undefined}\n />\n <Checkbox\n id=\"sign-in-keep-session\"\n label=\"Keep me signed in\"\n checked={Boolean(authRememberMe)}\n onChange={handleKeepSessionChange}\n />\n {canSubmit && (\n isAuthReady ? (\n <Button type=\"submit\" ripple isLoading={authIsLoading}>{lang('Login.Next')}</Button>\n ) : (\n <Loading />\n )\n )}\n {isAuthReady && (\n <Button isText ripple isLoading={authIsLoadingQrCode} onClick={goToAuthQrCode}>\n {lang('Login.QR.Login')}\n </Button>\n )}\n {suggestedLanguage && suggestedLanguage !== language && continueText && (\n <Button isText isLoading={isLoading} onClick={handleLangChange}>{continueText}</Button>\n )}\n </form>\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n settings: { byKey: { language } },\n } = global;\n\n return {\n ...pick(global, [\n 'connectionState',\n 'authState',\n 'authPhoneNumber',\n 'authIsLoading',\n 'authIsLoadingQrCode',\n 'authError',\n 'authRememberMe',\n 'authNearestCountry',\n ]),\n language,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setAuthPhoneNumber',\n 'setAuthRememberMe',\n 'clearAuthError',\n 'loadNearestCountry',\n 'goToAuthQrCode',\n 'setSettingOption',\n ]),\n)(AuthPhoneNumber));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthCodeAsync: FC = () => {\n const AuthCode = useModuleLoader(Bundles.Auth, 'AuthCode');\n\n return AuthCode ? <AuthCode /> : <Loading />;\n};\n\nexport default memo(AuthCodeAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthPasswordAsync: FC = () => {\n const AuthPassword = useModuleLoader(Bundles.Auth, 'AuthPassword');\n\n return AuthPassword ? <AuthPassword /> : <Loading />;\n};\n\nexport default memo(AuthPasswordAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthRegisterAsync: FC = () => {\n const AuthRegister = useModuleLoader(Bundles.Auth, 'AuthRegister');\n\n return AuthRegister ? <AuthRegister /> : <Loading />;\n};\n\nexport default memo(AuthRegisterAsync);\n","/*\n jquery-qrcode v0.14.0 - https://larsjung.de/jquery-qrcode/ */\n'use strict';let G=null;class H{}H.render=function(w,B){G(w,B)};self.QrCreator=H;\n(function(w){function B(t,c,a,e){var b={},h=w(a,c);h.u(t);h.J();e=e||0;var r=h.h(),d=h.h()+2*e;b.text=t;b.level=c;b.version=a;b.O=d;b.a=function(b,a){b-=e;a-=e;return 0>b||b>=r||0>a||a>=r?!1:h.a(b,a)};return b}function C(t,c,a,e,b,h,r,d,g,x){function u(b,a,f,c,d,r,g){b?(t.lineTo(a+r,f+g),t.arcTo(a,f,c,d,h)):t.lineTo(a,f)}r?t.moveTo(c+h,a):t.moveTo(c,a);u(d,e,a,e,b,-h,0);u(g,e,b,c,b,0,-h);u(x,c,b,c,a,h,0);u(r,c,a,e,a,0,h)}function z(t,c,a,e,b,h,r,d,g,x){function u(b,a,c,d){t.moveTo(b+c,a);t.lineTo(b,\na);t.lineTo(b,a+d);t.arcTo(b,a,b+c,a,h)}r&&u(c,a,h,h);d&&u(e,a,-h,h);g&&u(e,b,-h,-h);x&&u(c,b,h,-h)}function A(t,c){var a=c.fill;if(\"string\"===typeof a)t.fillStyle=a;else{var e=a.type,b=a.colorStops;a=a.position.map((b)=>Math.round(b*c.size));if(\"linear-gradient\"===e)var h=t.createLinearGradient.apply(t,a);else if(\"radial-gradient\"===e)h=t.createRadialGradient.apply(t,a);else throw Error(\"Unsupported fill\");b.forEach(([b,a])=>{h.addColorStop(b,a)});t.fillStyle=h}}function y(t,c){a:{var a=c.text,e=\nc.v,b=c.N,h=c.K,r=c.P;b=Math.max(1,b||1);for(h=Math.min(40,h||40);b<=h;b+=1)try{var d=B(a,e,b,r);break a}catch(J){}d=void 0}if(!d)return null;a=t.getContext(\"2d\");c.background&&(a.fillStyle=c.background,a.fillRect(c.left,c.top,c.size,c.size));e=d.O;h=c.size/e;a.beginPath();for(r=0;r<e;r+=1)for(b=0;b<e;b+=1){var g=a,x=c.left+b*h,u=c.top+r*h,p=r,q=b,f=d.a,k=x+h,m=u+h,D=p-1,E=p+1,n=q-1,l=q+1,y=Math.floor(Math.min(.5,Math.max(0,c.R))*h),v=f(p,q),I=f(D,n),w=f(D,q);D=f(D,l);var F=f(p,l);l=f(E,l);q=f(E,\nq);E=f(E,n);p=f(p,n);x=Math.round(x);u=Math.round(u);k=Math.round(k);m=Math.round(m);v?C(g,x,u,k,m,y,!w&&!p,!w&&!F,!q&&!F,!q&&!p):z(g,x,u,k,m,y,w&&p&&I,w&&F&&D,q&&F&&l,q&&p&&E)}A(a,c);a.fill();return t}var v={minVersion:1,maxVersion:40,ecLevel:\"L\",left:0,top:0,size:200,fill:\"#000\",background:null,text:\"no text\",radius:.5,quiet:0};G=function(t,c){var a={};Object.assign(a,v,t);a.N=a.minVersion;a.K=a.maxVersion;a.v=a.ecLevel;a.left=a.left;a.top=a.top;a.size=a.size;a.fill=a.fill;a.background=a.background;\na.text=a.text;a.R=a.radius;a.P=a.quiet;if(c instanceof HTMLCanvasElement){if(c.width!==a.size||c.height!==a.size)c.width=a.size,c.height=a.size;c.getContext(\"2d\").clearRect(0,0,c.width,c.height);y(c,a)}else t=document.createElement(\"canvas\"),t.width=a.size,t.height=a.size,a=y(t,a),c.appendChild(a)}})(function(){function w(c){var a=C.s(c);return{S:function(){return 4},b:function(){return a.length},write:function(c){for(var b=0;b<a.length;b+=1)c.put(a[b],8)}}}function B(){var c=[],a=0,e={B:function(){return c},\nc:function(b){return 1==(c[Math.floor(b/8)]>>>7-b%8&1)},put:function(b,h){for(var a=0;a<h;a+=1)e.m(1==(b>>>h-a-1&1))},f:function(){return a},m:function(b){var h=Math.floor(a/8);c.length<=h&&c.push(0);b&&(c[h]|=128>>>a%8);a+=1}};return e}function C(c,a){function e(b,h){for(var a=-1;7>=a;a+=1)if(!(-1>=b+a||d<=b+a))for(var c=-1;7>=c;c+=1)-1>=h+c||d<=h+c||(r[b+a][h+c]=0<=a&&6>=a&&(0==c||6==c)||0<=c&&6>=c&&(0==a||6==a)||2<=a&&4>=a&&2<=c&&4>=c?!0:!1)}function b(b,a){for(var f=d=4*c+17,k=Array(f),m=0;m<\nf;m+=1){k[m]=Array(f);for(var p=0;p<f;p+=1)k[m][p]=null}r=k;e(0,0);e(d-7,0);e(0,d-7);f=y.G(c);for(k=0;k<f.length;k+=1)for(m=0;m<f.length;m+=1){p=f[k];var q=f[m];if(null==r[p][q])for(var n=-2;2>=n;n+=1)for(var l=-2;2>=l;l+=1)r[p+n][q+l]=-2==n||2==n||-2==l||2==l||0==n&&0==l}for(f=8;f<d-8;f+=1)null==r[f][6]&&(r[f][6]=0==f%2);for(f=8;f<d-8;f+=1)null==r[6][f]&&(r[6][f]=0==f%2);f=y.w(h<<3|a);for(k=0;15>k;k+=1)m=!b&&1==(f>>k&1),r[6>k?k:8>k?k+1:d-15+k][8]=m,r[8][8>k?d-k-1:9>k?15-k:14-k]=m;r[d-8][8]=!b;if(7<=\nc){f=y.A(c);for(k=0;18>k;k+=1)m=!b&&1==(f>>k&1),r[Math.floor(k/3)][k%3+d-8-3]=m;for(k=0;18>k;k+=1)m=!b&&1==(f>>k&1),r[k%3+d-8-3][Math.floor(k/3)]=m}if(null==g){b=t.I(c,h);f=B();for(k=0;k<x.length;k+=1)m=x[k],f.put(4,4),f.put(m.b(),y.f(4,c)),m.write(f);for(k=m=0;k<b.length;k+=1)m+=b[k].j;if(f.f()>8*m)throw Error(\"code length overflow. (\"+f.f()+\">\"+8*m+\")\");for(f.f()+4<=8*m&&f.put(0,4);0!=f.f()%8;)f.m(!1);for(;!(f.f()>=8*m);){f.put(236,8);if(f.f()>=8*m)break;f.put(17,8)}var u=0;m=k=0;p=Array(b.length);\nq=Array(b.length);for(n=0;n<b.length;n+=1){var v=b[n].j,w=b[n].o-v;k=Math.max(k,v);m=Math.max(m,w);p[n]=Array(v);for(l=0;l<p[n].length;l+=1)p[n][l]=255&f.B()[l+u];u+=v;l=y.C(w);v=z(p[n],l.b()-1).l(l);q[n]=Array(l.b()-1);for(l=0;l<q[n].length;l+=1)w=l+v.b()-q[n].length,q[n][l]=0<=w?v.c(w):0}for(l=f=0;l<b.length;l+=1)f+=b[l].o;f=Array(f);for(l=u=0;l<k;l+=1)for(n=0;n<b.length;n+=1)l<p[n].length&&(f[u]=p[n][l],u+=1);for(l=0;l<m;l+=1)for(n=0;n<b.length;n+=1)l<q[n].length&&(f[u]=q[n][l],u+=1);g=f}b=g;f=\n-1;k=d-1;m=7;p=0;a=y.F(a);for(q=d-1;0<q;q-=2)for(6==q&&--q;;){for(n=0;2>n;n+=1)null==r[k][q-n]&&(l=!1,p<b.length&&(l=1==(b[p]>>>m&1)),a(k,q-n)&&(l=!l),r[k][q-n]=l,--m,-1==m&&(p+=1,m=7));k+=f;if(0>k||d<=k){k-=f;f=-f;break}}}var h=A[a],r=null,d=0,g=null,x=[],u={u:function(b){b=w(b);x.push(b);g=null},a:function(b,a){if(0>b||d<=b||0>a||d<=a)throw Error(b+\",\"+a);return r[b][a]},h:function(){return d},J:function(){for(var a=0,h=0,c=0;8>c;c+=1){b(!0,c);var d=y.D(u);if(0==c||a>d)a=d,h=c}b(!1,h)}};return u}\nfunction z(c,a){if(\"undefined\"==typeof c.length)throw Error(c.length+\"/\"+a);var e=function(){for(var b=0;b<c.length&&0==c[b];)b+=1;for(var r=Array(c.length-b+a),d=0;d<c.length-b;d+=1)r[d]=c[d+b];return r}(),b={c:function(b){return e[b]},b:function(){return e.length},multiply:function(a){for(var h=Array(b.b()+a.b()-1),c=0;c<b.b();c+=1)for(var g=0;g<a.b();g+=1)h[c+g]^=v.i(v.g(b.c(c))+v.g(a.c(g)));return z(h,0)},l:function(a){if(0>b.b()-a.b())return b;for(var c=v.g(b.c(0))-v.g(a.c(0)),h=Array(b.b()),\ng=0;g<b.b();g+=1)h[g]=b.c(g);for(g=0;g<a.b();g+=1)h[g]^=v.i(v.g(a.c(g))+c);return z(h,0).l(a)}};return b}C.s=function(c){for(var a=[],e=0;e<c.length;e++){var b=c.charCodeAt(e);128>b?a.push(b):2048>b?a.push(192|b>>6,128|b&63):55296>b||57344<=b?a.push(224|b>>12,128|b>>6&63,128|b&63):(e++,b=65536+((b&1023)<<10|c.charCodeAt(e)&1023),a.push(240|b>>18,128|b>>12&63,128|b>>6&63,128|b&63))}return a};var A={L:1,M:0,Q:3,H:2},y=function(){function c(b){for(var a=0;0!=b;)a+=1,b>>>=1;return a}var a=[[],[6,18],\n[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],\n[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],e={w:function(b){for(var a=b<<10;0<=c(a)-c(1335);)a^=1335<<c(a)-c(1335);return(b<<10|a)^21522},A:function(b){for(var a=b<<12;0<=c(a)-c(7973);)a^=7973<<c(a)-c(7973);return b<<12|a},G:function(b){return a[b-1]},F:function(b){switch(b){case 0:return function(b,a){return 0==(b+a)%2};case 1:return function(b){return 0==b%2};case 2:return function(b,a){return 0==a%3};case 3:return function(b,a){return 0==\n(b+a)%3};case 4:return function(b,a){return 0==(Math.floor(b/2)+Math.floor(a/3))%2};case 5:return function(b,a){return 0==b*a%2+b*a%3};case 6:return function(b,a){return 0==(b*a%2+b*a%3)%2};case 7:return function(b,a){return 0==(b*a%3+(b+a)%2)%2};default:throw Error(\"bad maskPattern:\"+b);}},C:function(b){for(var a=z([1],0),c=0;c<b;c+=1)a=a.multiply(z([1,v.i(c)],0));return a},f:function(b,a){if(4!=b||1>a||40<a)throw Error(\"mode: \"+b+\"; type: \"+a);return 10>a?8:16},D:function(b){for(var a=b.h(),c=0,\nd=0;d<a;d+=1)for(var g=0;g<a;g+=1){for(var e=0,t=b.a(d,g),p=-1;1>=p;p+=1)if(!(0>d+p||a<=d+p))for(var q=-1;1>=q;q+=1)0>g+q||a<=g+q||(0!=p||0!=q)&&t==b.a(d+p,g+q)&&(e+=1);5<e&&(c+=3+e-5)}for(d=0;d<a-1;d+=1)for(g=0;g<a-1;g+=1)if(e=0,b.a(d,g)&&(e+=1),b.a(d+1,g)&&(e+=1),b.a(d,g+1)&&(e+=1),b.a(d+1,g+1)&&(e+=1),0==e||4==e)c+=3;for(d=0;d<a;d+=1)for(g=0;g<a-6;g+=1)b.a(d,g)&&!b.a(d,g+1)&&b.a(d,g+2)&&b.a(d,g+3)&&b.a(d,g+4)&&!b.a(d,g+5)&&b.a(d,g+6)&&(c+=40);for(g=0;g<a;g+=1)for(d=0;d<a-6;d+=1)b.a(d,g)&&!b.a(d+\n1,g)&&b.a(d+2,g)&&b.a(d+3,g)&&b.a(d+4,g)&&!b.a(d+5,g)&&b.a(d+6,g)&&(c+=40);for(g=e=0;g<a;g+=1)for(d=0;d<a;d+=1)b.a(d,g)&&(e+=1);return c+=Math.abs(100*e/a/a-50)/5*10}};return e}(),v=function(){for(var c=Array(256),a=Array(256),e=0;8>e;e+=1)c[e]=1<<e;for(e=8;256>e;e+=1)c[e]=c[e-4]^c[e-5]^c[e-6]^c[e-8];for(e=0;255>e;e+=1)a[c[e]]=e;return{g:function(b){if(1>b)throw Error(\"glog(\"+b+\")\");return a[b]},i:function(b){for(;0>b;)b+=255;for(;256<=b;)b-=255;return c[b]}}}(),t=function(){function c(b,c){switch(c){case A.L:return a[4*\n(b-1)];case A.M:return a[4*(b-1)+1];case A.Q:return a[4*(b-1)+2];case A.H:return a[4*(b-1)+3]}}var a=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,\n2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,\n45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,\n151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],\n[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],\n[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],e={I:function(b,a){var e=c(b,a);if(\"undefined\"==\ntypeof e)throw Error(\"bad rs block @ typeNumber:\"+b+\"/errorCorrectLevel:\"+a);b=e.length/3;a=[];for(var d=0;d<b;d+=1)for(var g=e[3*d],h=e[3*d+1],t=e[3*d+2],p=0;p<g;p+=1){var q=t,f={};f.o=h;f.j=q;a.push(f)}return a}};return e}();return C}());\nexport default QrCreator;\n//# sourceMappingURL=qr-creator.min.js.map\n","import QrCreator from 'qr-creator';\nimport React, {\n FC, useEffect, useRef, memo, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState, GlobalActions } from '../../global/types';\nimport { LangCode } from '../../types';\n\nimport { pick } from '../../util/iteratees';\nimport { setLanguage } from '../../util/langProvider';\nimport renderText from '../common/helpers/renderText';\nimport useLangString from '../../hooks/useLangString';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\nimport { getSuggestedLanguage } from './helpers/getSuggestedLanguage';\n\nimport Loading from '../ui/Loading';\nimport Button from '../ui/Button';\n\ntype StateProps = Pick<GlobalState, 'connectionState' | 'authState' | 'authQrCode'> & {\n language?: LangCode;\n};\ntype DispatchProps = Pick<GlobalActions, (\n 'returnToAuthPhoneNumber' | 'setSettingOption'\n)>;\n\nconst DATA_PREFIX = 'tg://login?token=';\n\nconst AuthCode: FC<StateProps & DispatchProps> = ({\n connectionState,\n authState,\n authQrCode,\n language,\n returnToAuthPhoneNumber,\n setSettingOption,\n}) => {\n const suggestedLanguage = getSuggestedLanguage();\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const qrCodeRef = useRef<HTMLDivElement>(null);\n const continueText = useLangString(suggestedLanguage, 'ContinueOnThisLanguage');\n const [isLoading, markIsLoading, unmarkIsLoading] = useFlag();\n\n useEffect(() => {\n if (!authQrCode || connectionState !== 'connectionStateReady') {\n return;\n }\n\n const container = qrCodeRef.current!;\n\n container.innerHTML = '';\n container.classList.remove('pre-animate');\n\n QrCreator.render({\n text: `${DATA_PREFIX}${authQrCode.token}`,\n radius: 0.5,\n ecLevel: 'M',\n fill: '#4E96D4',\n size: 280,\n }, container);\n }, [connectionState, authQrCode]);\n\n const handleLangChange = useCallback(() => {\n markIsLoading();\n\n setLanguage(suggestedLanguage!, () => {\n unmarkIsLoading();\n\n setSettingOption({ language: suggestedLanguage });\n });\n }, [markIsLoading, setSettingOption, suggestedLanguage, unmarkIsLoading]);\n\n const isAuthReady = authState === 'authorizationStateWaitQrCode';\n\n return (\n <div id=\"auth-qr-form\" className=\"custom-scroll\">\n <div className=\"auth-form qr\">\n {authQrCode ? (\n <div key=\"qr-container\" className=\"qr-container pre-animate\" ref={qrCodeRef} />\n ) : (\n <div key=\"qr-loading\" className=\"qr-loading\"><Loading /></div>\n )}\n <h3>{lang('Login.QR.Title')}</h3>\n <ol>\n <li><span>{lang('Login.QR.Help1')}</span></li>\n <li><span>{renderText(lang('Login.QR.Help2'), ['simple_markdown'])}</span></li>\n <li><span>{lang('Login.QR.Help3')}</span></li>\n </ol>\n {isAuthReady && (\n <Button isText onClick={returnToAuthPhoneNumber}>{lang('Login.QR.Cancel')}</Button>\n )}\n {suggestedLanguage && suggestedLanguage !== language && continueText && (\n <Button isText isLoading={isLoading} onClick={handleLangChange}>{continueText}</Button>\n )}\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n connectionState, authState, authQrCode, settings: { byKey: { language } },\n } = global;\n\n return {\n connectionState,\n authState,\n authQrCode,\n language,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'returnToAuthPhoneNumber', 'setSettingOption',\n ]),\n)(AuthCode));\n","import React, { FC, useEffect, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../global/types';\n\nimport '../../modules/actions/initial';\nimport { pick } from '../../util/iteratees';\nimport { PLATFORM_ENV } from '../../util/environment';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport UiLoader from '../common/UiLoader';\nimport AuthPhoneNumber from './AuthPhoneNumber';\nimport AuthCode from './AuthCode.async';\nimport AuthPassword from './AuthPassword.async';\nimport AuthRegister from './AuthRegister.async';\nimport AuthQrCode from './AuthQrCode';\n\nimport './Auth.scss';\n\ntype StateProps = Pick<GlobalState, 'authState'>;\ntype DispatchProps = Pick<GlobalActions, 'reset' | 'initApi' | 'returnToAuthPhoneNumber' | 'goToAuthQrCode'>;\n\nconst Auth: FC<StateProps & DispatchProps> = ({\n authState, reset, initApi, returnToAuthPhoneNumber, goToAuthQrCode,\n}) => {\n useEffect(() => {\n reset();\n initApi();\n }, [reset, initApi]);\n\n const isMobile = PLATFORM_ENV === 'iOS' || PLATFORM_ENV === 'Android';\n\n const handleChangeAuthorizationMethod = () => {\n if (!isMobile) {\n goToAuthQrCode();\n } else {\n returnToAuthPhoneNumber();\n }\n };\n\n useHistoryBack(\n (!isMobile && authState === 'authorizationStateWaitPhoneNumber')\n || (isMobile && authState === 'authorizationStateWaitQrCode'), handleChangeAuthorizationMethod,\n );\n\n switch (authState) {\n case 'authorizationStateWaitCode':\n return <UiLoader page=\"authCode\" key=\"authCode\"><AuthCode /></UiLoader>;\n case 'authorizationStateWaitPassword':\n return <UiLoader page=\"authPassword\" key=\"authPassword\"><AuthPassword /></UiLoader>;\n case 'authorizationStateWaitRegistration':\n return <AuthRegister />;\n case 'authorizationStateWaitPhoneNumber':\n return <UiLoader page=\"authPhoneNumber\" key=\"authPhoneNumber\"><AuthPhoneNumber /></UiLoader>;\n case 'authorizationStateWaitQrCode':\n return <UiLoader page=\"authQrCode\" key=\"authQrCode\"><AuthQrCode /></UiLoader>;\n default:\n return isMobile\n ? <UiLoader page=\"authPhoneNumber\" key=\"authPhoneNumber\"><AuthPhoneNumber /></UiLoader>\n : <UiLoader page=\"authQrCode\" key=\"authQrCode\"><AuthQrCode /></UiLoader>;\n }\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authState']),\n (global, actions): DispatchProps => pick(actions, ['reset', 'initApi', 'returnToAuthPhoneNumber', 'goToAuthQrCode']),\n)(Auth));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst MainAsync: FC = () => {\n const Main = useModuleLoader(Bundles.Main, 'Main');\n\n return Main ? <Main /> : undefined;\n};\n\nexport default memo(MainAsync);\n","export default __webpack_public_path__ + \"app-inactive.bc7953c2dfebcabce2c43ca7dc778a89.png\";","import React, { FC } from '../../lib/teact/teact';\n\nimport Button from '../ui/Button';\n\nimport appInactivePath from '../../assets/app-inactive.png';\nimport './AppInactive.scss';\n\nconst AppInactive: FC = () => {\n const handleReload = () => {\n window.location.reload();\n };\n\n return (\n <div id=\"AppInactive\">\n <div className=\"content\">\n <img src={appInactivePath} alt=\"\" />\n <h3 className=\"title\">Such error, many tabs</h3>\n <div className=\"description\">\n Telegram supports only one active tab with the app.\n <br />\n Please reload this page to continue using this tab or close it.\n </div>\n <div className=\"actions\">\n <Button isText ripple onClick={handleReload}>Reload app</Button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default AppInactive;\n","import { FC, useEffect } from './lib/teact/teact';\nimport React, { withGlobal } from './lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from './global/types';\n\nimport { INACTIVE_MARKER, PAGE_TITLE } from './config';\nimport { pick } from './util/iteratees';\nimport { updateSizes } from './util/windowSize';\nimport { addActiveTabChangeListener } from './util/activeTabMonitor';\nimport useFlag from './hooks/useFlag';\n\nimport Auth from './components/auth/Auth';\nimport UiLoader from './components/common/UiLoader';\nimport Main from './components/main/Main.async';\nimport AppInactive from './components/main/AppInactive';\nimport { hasStoredSession } from './util/sessions';\n// import Test from './components/test/TestNoRedundancy';\n\ntype StateProps = Pick<GlobalState, 'authState'>;\ntype DispatchProps = Pick<GlobalActions, 'disconnect'>;\n\nconst App: FC<StateProps & DispatchProps> = ({ authState, disconnect }) => {\n const [isInactive, markInactive] = useFlag(false);\n\n useEffect(() => {\n updateSizes();\n addActiveTabChangeListener(() => {\n disconnect();\n document.title = `${PAGE_TITLE}${INACTIVE_MARKER}`;\n\n markInactive();\n });\n }, [disconnect, markInactive]);\n\n // return <Test />;\n\n if (isInactive) {\n return <AppInactive />;\n }\n\n if (authState) {\n switch (authState) {\n case 'authorizationStateWaitPhoneNumber':\n case 'authorizationStateWaitCode':\n case 'authorizationStateWaitPassword':\n case 'authorizationStateWaitRegistration':\n case 'authorizationStateWaitQrCode':\n return <Auth />;\n case 'authorizationStateClosed':\n case 'authorizationStateClosing':\n case 'authorizationStateLoggingOut':\n case 'authorizationStateReady':\n return renderMain();\n }\n }\n\n return hasStoredSession(true) ? renderMain() : <Auth />;\n};\n\nfunction renderMain() {\n return (\n <UiLoader page=\"main\" key=\"main\">\n <Main />\n </UiLoader>\n );\n}\n\nexport default withGlobal(\n (global): StateProps => pick(global, ['authState']),\n (setGlobal, actions): DispatchProps => pick(actions, ['disconnect']),\n)(App);\n","import './util/handleError';\nimport './util/setupServiceWorker';\n\nimport React, { getDispatch, getGlobal } from './lib/teact/teactn';\nimport TeactDOM from './lib/teact/teact-dom';\n\nimport './global';\n\nimport { DEBUG } from './config';\n\nimport App from './App';\n\nimport './styles/index.scss';\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> INIT');\n}\n\ngetDispatch().init();\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START INITIAL RENDER');\n}\n\nTeactDOM.render(\n <App />,\n document.getElementById('root'),\n);\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH INITIAL RENDER');\n}\n\ndocument.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('GLOBAL STATE', getGlobal());\n});\n"],"sourceRoot":""} |