{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/lib/teact/teact.ts","webpack:///./src/config.ts","webpack:///./src/lib/teact/teactn.tsx","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/types/index.ts","webpack:///./src/modules/selectors/users.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/util/environment.ts","webpack:///./src/util/buildClassName.ts","webpack:///./src/util/schedulers.ts","webpack:///./src/api/gramjs/worker/provider.ts","webpack:///./src/assets/lang/en-extra.json","webpack:///./src/assets/lang/es-extra.json","webpack:///./src/assets/lang/it-extra.json","webpack:///./src/assets/lang/pl-extra.json","webpack:///./src/assets/lang/ru-extra.json","webpack:///./src/util/langProvider.ts","webpack:///./src/util/callbacks.ts","webpack:///./src/util/moduleLoader.ts","webpack:///./src/util/cacheApi.ts","webpack:///./src/util/files.ts","webpack:///./src/lib/twemojiRegex.js","webpack:///./src/components/ui/Loading.tsx","webpack:///./src/hooks/useModuleLoader.ts","webpack:///./src/types/index.ts","webpack:///./src/util/countries.ts","webpack:///./src/util/phoneNumber.ts","webpack:///./src/components/ui/Spinner.tsx","webpack:///./src/util/handleError.ts","webpack:///./src/util/generateIdFor.ts","webpack:///./src/modules/helpers/users.ts","webpack:///./src/modules/helpers/chats.ts","webpack:///./src/util/arePropsShallowEqual.ts","webpack:///./src/lib/teact/dom-events.ts","webpack:///./src/hooks/useShowTransition.ts","webpack:///./src/util/dateFormat.ts","webpack:///./src/hooks/useForceUpdate.ts","webpack:///./src/util/pushNotifications.ts","webpack:///./src/components/ui/Button.tsx","webpack:///./src/components/ui/MenuItem.tsx","webpack:///./src/components/ui/RippleEffect.tsx","webpack:///./src/util/webpToPng.ts","webpack:///./src/components/common/helpers/renderText.tsx","webpack:///./src/hooks/useFlag.ts","webpack:///./src/hooks/usePrevious.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/components/ui/InputText.tsx","webpack:///./src/components/ui/Checkbox.tsx","webpack:///./src/lib/lovely-chart/constants.js","webpack:///./src/util/captureEscKeyListener.ts","webpack:///./src/hooks/useHeavyAnimationCheck.ts","webpack:///./src/util/memo.ts","webpack:///./src/util/textFormat.ts","webpack:///./src/util/searchWords.ts","webpack:///./src/components/ui/Menu.tsx","webpack:///./src/hooks/useKeyboardListNavigation.ts","webpack:///./src/util/oggToWav.ts","webpack:///./src/util/mediaLoader.ts","webpack:///./src/util/windowSize.ts","webpack:///./src/util/captureKeyboardListeners.ts","webpack:///./src/lib/punycode.js","webpack:///./src/components/common/SafeLink.tsx","webpack:///./src/hooks/useEffectWithPrevDeps.ts","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/lib/teact/teact-dom.ts","webpack:///./src/components/common/helpers/parseEmojiOnlyString.ts","webpack:///./src/api/types/messages.ts","webpack:///./src/api/types/media.ts","webpack:///./src/util/switchTheme.ts","webpack:///./src/util/emoji.ts","webpack:///./src/components/middle/message/MentionLink.tsx","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/api/initial.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/fonts.ts","webpack:///./src/assets/telegram-logo.svg","webpack:///./src/assets/monkey.svg","webpack:///./src/components/common/UiLoader.tsx","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:///./src/components/auth/AuthQrCode.async.tsx","webpack:///./src/components/auth/Auth.tsx","webpack:///./src/components/main/Main.async.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","1","__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","getTarget","setTarget","useState","initial","newValue","scheduleNextState","throttleWithPrimaryRaf","applyNextState","throttleWithRaf","currentElement","forceUpdateComponent","useLayoutEffectBase","schedulerFn","exec","some","dependency","useEffect","fastRaf","useLayoutEffect","onTickEnd","useMemo","resolver","useCallback","newCallback","useRef","memo","areEqual","arePropsShallowEqual","propsRef","renderedRef","addEventListener","orderBy","values","APP_INFO","process","IS_TEST","DEBUG_ALERT_MSG","GRAMJS_SESSION_ID_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","Set","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","TOP_CHAT_MESSAGES_PRELOAD_LIMIT","ALL_CHATS_PRELOAD_DISABLED","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","STICKER_SIZE_INLINE_DESKTOP_FACTOR","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","MEMOJI_STICKER_ID","MENU_TRANSITION_DURATION","SLIDE_TRANSITION_DURATION","LAYERS_TRANSITION_DURATION","CONTENT_TYPES_FOR_QUICK_UPLOAD","RE_LINK_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","LANG_PACKS","TIPS_USERNAME","FEEDBACK_URL","DARK_THEME_BG_COLOR","DARK_THEME_PATTERN_COLOR","DEFAULT_PATTERN_COLOR","React","currentGlobal","reducers","callbacks","container","containers","mapStateToProps","mapReducersToProps","ownProps","mappedProps","newMappedProps","setGlobal","actions","Number","isNaN","DEBUG_componentName","keys","getUnequalProps","join","areMappedPropsChanged","DEBUG_updates","updateTime","Map","runCallbacksThrottled","cb","newGlobal","getGlobal","getDispatch","addReducer","reducer","payload","onDispatch","addCallback","removeCallback","index","indexOf","splice","withGlobal","id","generateIdFor","useForceUpdate","delete","set","currentProps","newProps","currentKeys","filter","prop","buildCollectionByKey","collection","reduce","byKey","member","mapValues","callback","newByKey","pick","result","pickTruthy","omit","stringKeys","has","orderKey","sort","a","b","Array","isArray","mode1","mode2","orderKey1","orderKey2","aValue1","bValue1","aValue2","bValue2","aValue","bValue","array","concat","unique","from","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","noEmoji","text","photo","video","audio","voice","sticker","contact","poll","invoice","content","groupedId","isGif","emoji","caption","title","performer","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","getMessageContent","hasMessageMedia","getMessagePhoto","getMessageVideo","getMessageDocument","getMessageSticker","getMessageContact","getMessagePoll","getMessageAction","getMessageAudio","getMessageVoice","getMessageInvoice","getMessageWebPage","getMessageWebPagePhoto","getMessageMediaThumbDataUri","thumbnail","media","getMessageMediaThumbnail","dataUri","getMessageMediaHash","webPagePhoto","base","hasMessageLocalBlobUrl","canMessagePlayVideoInline","getVideoOrAudioBaseHash","getDocumentHasPreview","IS_PROGRESSIVE_SUPPORTED","IS_SAFARI","size","mimeType","getMessageMediaFormat","isAnimated","ApiMediaFormat","Lottie","Progressive","IS_OPUS_SUPPORTED","BlobUrl","getMessageMediaFilename","date","blobUrl","previewBlobUrl","getChatMediaMessageIds","messages","listedIds","reverseOrder","ids","getMessageContentIds","reverse","getPhotoFullDimensions","sizes","getPhotoInlineDimensions","getVideoDimensions","width","height","getMediaTransferState","progress","isDownloadNeeded","isUploading","isTransferring","transferProgress","messageIds","contentType","validator","matchLinkInMessageText","getMediaDuration","duration","buildChatThreadKey","threadId","selectUser","global","userId","users","byId","selectChat","chats","selectChatUser","chat","getPrivateChatUserId","selectIsChatWithSelf","currentUserId","selectIsChatWithBot","user","isUserBot","selectSupportChat","isSupport","selectChatOnlineCount","isChatPrivate","isChatChannel","isChatSuperGroup","onlineCount","fullInfo","members","memberId","isUserOnline","selectChatBot","selectIsChatBotNotStarted","bot","lastMessage","messageInfo","byChatId","threadsById","MAIN_THREAD_ID","selectAreActiveChatsLoaded","listIds","active","selectIsChatListed","targetList","includes","list","selectChatListType","folderId","selectChatFolder","chatFolders","selectIsChatPinned","archived","orderedPinnedIds","chatFoldersById","pinnedChatIds","selectChatByUsername","username","usernameLowered","toLowerCase","selectCountNotMutedUnread","activeChatIds","unreadCount","isMuted","selectCurrentStickerSearch","stickers","search","selectCurrentGifSearch","gifs","selectStickerSet","setsById","selectStickersForEmoji","stickerSets","stickersForEmoji","packs","selectAnimatedEmoji","animatedEmojis","replace","selectCurrentMessageList","messageLists","selectCurrentChat","selectChatMessages","selectScheduledMessages","scheduledMessages","selectThreadParam","thread","selectListedIds","selectOutlyingIds","selectCurrentMessageIds","messageListType","selectViewportIds","selectPinnedIds","selectScheduledIds","selectScrollOffset","selectReplyingToId","selectEditingId","selectEditingScheduledId","selectDraft","selectNoWebPage","selectThreadInfo","selectFirstMessageId","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","isRestricted","isPrivate","isChatWithSelf","isBasicGroup","isChatBasicGroup","isSuperGroup","isChannel","isServiceNotification","isOwn","isAction","isMessageEditable","Date","viaBotId","canReply","getCanPostInChat","hasPinPermission","isCreator","isUserRightBanned","getHasAdminRight","canPin","canUnpin","pinnedMessageIds","canDelete","canDeleteForAll","canEdit","canForward","hasSticker","hasFavoriteSticker","favorite","selectIsStickerFavorite","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","noOptions","ability","selectCanDeleteSelectedMessages","selectedMessageIds","selectedMessages","messageActions","selectUploadProgress","fileTransfer","fileUploads","byMessageLocalId","selectRealLastReadId","lastReadInboxMessageId","min","selectFirstUnreadId","outlyingIds","lastReadId","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","settings","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","isStatisticsShown","isPollResults","pollResults","selectIsPollResultsOpen","isSearch","IS_MOBILE_SCREEN","isManagement","currentManagement","selectCurrentManagement","isStickerSearch","query","isGifSearch","currentChatId","areActiveChatsLoaded","isUserInfo","isChatInfo","RightColumnContent","PollResults","Search","Management","Statistics","StickerSearch","GifSearch","UserInfo","ChatInfo","selectIsRightColumnShown","selectCurrentGlobalSearchQuery","globalSearch","selectPaymentMessageId","payment","selectPaymentRequestId","formId","selectProviderPublishableKey","nativeParams","publishableKey","selectStripeCredentials","stripeCredentials","PLATFORM_ENV","userAgent","platform","navigator","os","test","getPlatform","IS_MAC_OS","IS_IOS","IS_ANDROID","IS_TOUCH_ENV","matchMedia","matches","innerWidth","IS_VOICE_RECORDING_SUPPORTED","mediaDevices","AudioContext","webkitAudioContext","IS_EMOJI_SUPPORTED","documentElement","style","IS_SERVICE_WORKER_SUPPORTED","Audio","canPlayType","DPR","devicePixelRatio","MASK_IMAGE_ENABLED","isWebpSupportedCache","isWebpSupported","webp","Image","handleLoadOrError","hasWebp","parts","debounce","fn","ms","shouldRunFirst","shouldRunLast","waitingTimeout","args","self","throttle","interval","isPending","_args","setInterval","clearInterval","throttleWith","fastPrimaryRaf","throttleWithTickEnd","waiting","onIdle","requestIdleCallback","pause","rafPromise","requestAnimationFrame","fastRafCallbacks","isPrimary","unshift","currentCallbacks","worker","requestStates","requestStatesByCallback","initApi","sessionId","Worker","update","requestState","response","callbackArgs","subscribeToWorker","makeRequest","callApi","fnName","cancelApiProgress","progressCallback","isCanceled","postMessage","assign","pop","catch","finally","EXTRA_PACK_PATHS","en","enExtraJson","es","esExtraJson","it","itExtraJson","pl","plExtraJson","ru","ruExtraJson","PLURAL_OPTIONS","PLURAL_RULES","ar","ca","de","fa","fr","ko","nl","pt_BR","tr","uk","uz","cache","langPack","runCallbacks","createCallbackManager","currentLangCode","async","setLanguage","langCode","lang","newLangPack","cached","cacheApi","Json","remote","sourceLangPacks","fetchFromCacheOrRemote","fetch","pairs","json","extraLangPack","clear","getTranslation","format","langString","template","amount","optionIndex","getPluralOption","trim","processTemplate","formatInteger","Bundles","LOAD_PROMISES","MEMORY_CACHE","loadModule","bundleName","moduleName","Auth","Main","Extra","handleBundleLoad","bundle","getModuleFromMemory","listeners","addLoadListener","listener","caches","Type","cacheName","Request","open","Blob","blob","substr","headers","save","cacheData","JSON","stringify","Response","put","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","canvas","videoWidth","videoHeight","getContext","drawImage","toDataURL","currentTime","fetchBlob","imgToCanvas","vs16RegExp","zeroWidthJoiner","fromCharCode","removeVS16s","rawEmoji","color","className","withBackground","noLoad","autoUpdate","LoadMoreDirection","FocusDirection","SettingsScreens","LeftColumnContent","GlobalSearchContent","MediaViewerOrigin","ChatCreationProgress","ProfileEditProgress","ManagementProgress","ProfileState","PaymentStep","UPLOADING_WALLPAPER_SLUG","ManagementScreens","formatsCache","defaultPhoneNumberFormat","parsed","str","flag","phoneFormat","formatValue","phoneNumberFormat","phoneNumberGroups","count","repeat","getPhoneNumberFormat","getCountryById","countryList","getCountryFromPhoneNumber","input","phoneNumber","startsWith","possibleCountries","country","formatPhoneNumber","_","p1","p2","p3","p4","p5","separator","output","formatPhoneNumberWithCode","numberWithPlus","Spinner","buildClassName","handleErrorEvent","startedAt","isReloading","preventDefault","ErrorEvent","reason","alert","localStorage","getItem","removeItem","location","reload","APP_ENV","store","random","USER_COLOR_KEYS","getUserFirstOrLastName","firstName","lastName","isDeletedUser","getUserStatus","status","wasOnline","wasOnlineDate","diff","getTime","floor","today","setHours","formatTime","yesterday","setDate","getDate","formatFullDate","getSortedUserIds","usersById","priorityIds","expires","getUserColorKey","peer","abs","getChatTypeString","isSelf","getChatDescription","about","getChatLink","inviteLink","getChatAvatarHash","owner","avatarHash","isChatSummaryOnly","isChatAdmin","adminRights","currentUserBannedRights","defaultBannedRights","migratedTo","isNotJoined","getAllowedAttachmentOptions","isChatWithBot","canAttachMedia","canAttachPolls","canSendStickers","canSendGifs","canAttachEmbedLinks","isAdmin","getMessageSendingRestrictionReason","sendMessages","getChatSlowModeOptions","slowMode","getChatOrder","max","joinDate","isChatArchived","getCanDeleteChat","prepareFolderListIds","chatsById","folder","chatIdsCache","excludedChatIds","includedChatIds","excludeArchived","excludeMuted","unreadMentionsCount","hasUnreadMark","excludeRead","privateChatUser","bots","contacts","isContact","nonContacts","groups","channels","filterChatFolder","prepareChatList","folderType","chatFilter","listedChats","listIdsSet","pinnedChats","otherChats","getFolderUnreadDialogs","unreadDialogsCount","total","hasActiveDialogs","getFolderDescriptionText","emoticon","description","filters","pinnedIds","getFolderChatsCount","isChat","chatOrUser","getMessageSenderName","NON_BUBBLEABLE_EVENTS","delegationRegistry","delegatedEventsByElement","documentEventCounters","element","propName","handler","eventName","resolveEventName","canUseEventDelegation","handleEvent","resolveDelegationRegistryForName","existing","newSet","resolveDelegatedEventsForElement","add","addDelegatedListener","removeEventListener","removeDelegatedListener","tagName","realEventName","eventNames","realEvent","events","furtherCallsPrevented","stopPropagation","Proxy","Reflect","body","isOpen","onCloseTransitionEnd","noOpenTransition","noCloseTransition","isClosed","setIsClosed","closeTimeoutRef","hasAsyncOpenClassName","setHasAsyncOpenClassName","hasOpenClassName","isClosing","shouldRender","transitionClassNames","WEEKDAYS_FULL","MONTHS_FULL","MONTHS_FULL_LOWERCASE","month","getDayStart","datetime","getDayStartAt","toYearMonth","timestamp","getFullYear","getMonth","toIsoString","getHours","padStart","getMinutes","formatPastTimeShort","weekAgo","getDay","withYear","formatDate","formatMonthAndYear","isShort","formatHumanDate","noWeekdays","lowerFirst","upperFirst","weekAhead","weekDay","formatKey","day","monthIndex","formatMediaDateTime","formatMediaDuration","hours","minutes","seconds","string","formatVoiceRecordDuration","durationInMs","milliseconds","formatDateToString","toLocaleString","year","isValidDate","MAX_MONTH_IN_YEAR","parseDateString","matchStringDate","matchEuropeStringDate","matchNumberDate","dateParts","findIndex","timestampPlusDay","MILISECONDS_IN_DAY","toUpperCase","setTrigger","trigger","getDeviceToken","subscription","toJSON","endpoint","isPushSupported","ServiceWorkerRegistration","Notification","permission","unsubscribeFromPush","serviceWorkerRegistration","serviceWorker","ready","pushManager","getSubscription","deviceToken","unsubscribe","subscribeToPush","subscribe","userVisibleOnly","Button","ref","onClick","onContextMenu","onMouseDown","onMouseEnter","onMouseLeave","onFocus","pill","fluid","isText","isLoading","ariaLabel","download","disabled","ripple","faded","tabIndex","elementRef","isClicked","setIsClicked","fullClassName","handleClick","handleMouseDown","aria-label","MenuItem","icon","destructive","handleKeyDown","keyCode","role","onKeyDown","RippleEffect","ripples","setRipples","cleanUpDebounced","button","currentTarget","position","getBoundingClientRect","rippleSize","offsetWidth","x","clientX","y","clientY","EMPTY_IMAGE_DATA_URI","webpToPng","initWebpWorker","wasmReady","requests","getDecodePromise","ImageData","putImageData","toBlob","createPng","webpToPngBase64","pngBlob","WebpWorker","onmessage","handleLibWebpMessage","RE_LETTER_OR_DIGIT","SIMPLE_MARKDOWN_REGEX","renderText","part","params","textParts","divEl","innerText","innerHTML","escapeHtml","EMOJI_REGEX","lastIndex","replaceEmojis","addLineBreaks","highlight","lowerCaseText","queryPosition","nextSymbol","newParts","links","RE_MENTION","nextLink","addLinks","replaceSimpleMarkdown","emojis","emojiResult","nativeToUnfified","alt","line","trimmedLine","trimLeft","indentLength","entityResult","setValue","usePrevious","next","shouldSkipUndefined","replaceChatListIds","newIds","updateChatListIds","idsUpdate","replaceChats","newById","updateChat","chatUpdate","shouldOmitMinInfo","isMin","updatedChat","updateChats","updatedById","addChats","addedById","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","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","exitMessageSelectMode","updateStickerSets","category","sets","resultIds","updatedSets","stickerSet","setIds","updateStickerSet","stickerSetId","currentStickerSet","updateGifSearch","isNew","results","nextOffset","currentResults","newResults","currentIds","gif","replaceAnimatedEmojis","updateStickersForEmoji","remoteStickers","allStickers","uniqueIds","forEmoji","rebuildStickersForEmoji","replaceUsers","updateUser","userUpdate","contactUserIds","updatedUser","updateUsers","addUsers","updateSelectedUserId","deleteUser","MEMO_EMPTY_ARRAY","getComplexKey","updateGlobalSearch","searchStatePartial","updateGlobalSearchContent","currentContent","updateGlobalSearchResults","newFoundMessages","nextRate","resultsByType","newFoundMessagesById","foundIdsForType","foundIds","updateGlobalSearchFetchingStatus","prevFoundIds","newFoundIds","foundOrPrevFoundIds","nextOffsetId","newState","fetchingStatus","replaceLocalTextSearch","searchParams","updateLocalTextSearch","replaceLocalTextSearchResults","updateLocalTextSearchResults","orderFoundIds","replaceLocalMediaSearch","updateLocalMediaSearchType","currentType","updateLocalMediaSearchResults","replaceLocalMediaSearchResults","updateManagementProgress","updateManagement","replaceSettings","newSettings","updateNotifySettings","peerType","isSilent","isShowPreviews","hasPrivateChatsNotifications","hasPrivateChatsMessagePreview","hasGroupNotifications","hasGroupMessagePreview","hasBroadcastNotifications","hasBroadcastMessagePreview","addBlockedContact","contactId","blocked","removeBlockedContact","updateTwoFaSettings","twoFaSettings","updateShippingOptions","shippingOptions","setRequestInfoId","setPaymentStep","step","setInvoiceMessageInfo","photoUrl","invoiceContent","setStripeCardInfo","cardInfo","setPaymentForm","form","setReceipt","receipt","messageInvoice","clearPayment","closeInvoice","isPaymentModalOpen","label","success","readOnly","placeholder","autoComplete","inputMode","maxLength","onChange","onInput","onKeyPress","onBlur","labelText","htmlFor","subLabel","checked","blocking","onCheck","handleChange","DEFAULT_RANGE","begin","end","TRANSITION_DEFAULT_DURATION","LONG_PRESS_TIMEOUT","GUTTER","PLOT_HEIGHT","PLOT_TOP_PADDING","PLOT_LINE_WIDTH","PLOT_PIE_RADIUS_FACTOR","PLOT_PIE_SHIFT","PLOT_BARS_WIDTH_SHIFT","BALLOON_OFFSET","AXES_FONT","AXES_MAX_COLUMN_WIDTH","AXES_MAX_ROW_HEIGHT","X_AXIS_HEIGHT","X_AXIS_SHIFT_START","Y_AXIS_ZERO_BASED_THRESHOLD","MINIMAP_HEIGHT","MINIMAP_MARGIN","MINIMAP_LINE_WIDTH","MINIMAP_EAR_WIDTH","MINIMAP_MAX_ANIMATED_DATASETS","ZOOM_TIMEOUT","ZOOM_RANGE_DELTA","ZOOM_RANGE_MIDDLE","MONTHS","WEEK_DAYS","WEEK_DAYS_SHORT","SPEED_TEST_INTERVAL","SPEED_TEST_FAST_FPS","SIMPLIFIER_MIN_POINTS","SIMPLIFIER_PLOT_FACTOR","SIMPLIFIER_MINIMAP_FACTOR","ANIMATE_PROPS","captureEscKeyListener","captureKeyboardListener","onEsc","isAnimating","dispatchHeavyAnimationEvent","dispatchEvent","Event","handleAnimationStart","handleAnimationEnd","formatFixedNumber","number","toFixed","formatIntegerCompact","views","getFirstLetters","phrase","word","RE_NOT_LETTER","searchWords","haystack","needle","haystackWords","needleWord","haystackWord","Menu","containerRef","positionX","positionY","autoClose","footer","noCloseOnBackdrop","onCloseAnimationEnd","onClose","menuRef","backdropContainerRef","useShowTransition","useEffectWithPrevDeps","prevIsOpen","onSelectWithEnter","focusedIndex","setFocusedIndex","focusedElement","activeElement","elementChildren","newIndex","focus","useKeyboardListNavigation","useVirtualBackdrop","bubbleClassName","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","getFromMemory","cancelProgress","mediaData","fullSize","controller","windowSize","updateSizes","vh","setProperty","handleResize","keyToHandlerName","Enter","Backspace","Delete","Esc","Escape","ArrowUp","ArrowDown","Tab","handlers","onEnter","onDelete","onBackspace","onUp","onDown","onTab","captureKeyboardListeners","hasActiveHandlers","handlerName","currentEventHandlers","releaseKeyboardListener","keyHandlers","utf16","len","RangeError","adapt","delta","numpoints","firsttime","k","decode","preserveCase","case_flags","input_length","out","bias","basic","j","ic","oldi","w","digit","lastIndexOf","cp","toUnicode","domain_array","getHref","getDecodedUrl","decodedHref","decodeURI","convertPunycode","openTelegramLink","ctrlKey","altKey","shiftKey","metaKey","classNames","prevDeps","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","getShippingError","errors","cur","currentInstance","animateSingle","tick","instance","isCancelled","animate","DropdownMenu","dropdownRef","setIsOpen","menu","onTrigger","FILTERED_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","RE_EMOJI_ONLY","twemojiRegex","DETECT_UP_TO","emojiCount","MESSAGE_DELETED","isInitialized","HEX_COLOR_REGEX","lerp","start","interpolationRatio","colors","themeColors","hexToRgb","hex","parseInt","g","applyColorAnimationStep","startIndex","endIndex","propertyColors","theme","withAnimation","isDarkTheme","shouldAnimate","startAt","themeColorTag","querySelector","classList","remove","transition","EXCLUDE_EMOJIS","unifiedToNative","unified","codePoints","fromCodePoint","toString","uncompressEmoji","emojiData","categories","emojiRaw","colons","native","image","openChat","openChatByUsername","contains","animationLevel","messageTextSize","language","switchTheme","uiReadyState","authPhoneNumber","authRememberMe","authError","apiUpdate","authIsSessionRemembered","authIsLoading","password","file","authIsLoadingQrCode","setItem","reset","init","connectionState","authNearestCountry","onUpdateApiReady","wasAuthReady","authState","authorizationState","isLoggingOut","authIsCodeViaApp","isCodeViaApp","authHint","hint","authQrCode","qrCode","lastSyncTime","saveSession","onUpdateAuthorizationState","onUpdateAuthorizationError","sync","signOut","onUpdateConnectionState","currentUser","onUpdateCurrentUser","showError","ServiceWorkerNoSupportError","setPrototypeOf","scriptUrl","register","INITIAL_STATE","isLeftColumnShown","recentEmojis","added","recent","featured","saved","topPeers","audioPlayer","notifications","activeSessions","isBackgroundBlurred","patternColor","messageSendKeyCombo","shouldSuggestStickers","privacy","updateCacheThrottled","isAllowed","reducedGlobal","reduceShowChatInfo","reduceUsers","reduceChats","reduceMessages","recentlyFoundChatIds","reduceSettings","loadCache","initialState","time","parse","timeEnd","readCache","idsToSave","cid","chatIdsToSave","mainThread","history","replaceState","SITE_FONTS","preloadFonts","font","fonts","load","preloadAvatars","mediaLoader","preloadTasks","main","telegramLogoPath","authCode","monkeyPath","authPassword","hasCustomBackground","customBackground","isCustomBackgroundColor","isRightColumnShown","setIsUiReady","isReady","markReady","useFlag","shouldRenderMask","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","gotToAuthQrCode","setCountry","setPhoneNumber","isTouched","setIsTouched","lastSelection","setLastSelection","fullNumber","canSubmit","parseFullNumber","newFullNumber","suggestedCountry","selectedCountry","setSelectionRange","handlePhoneNumberChange","selectionStart","selectionEnd","handleKeepSessionChange","isAuthReady","onSubmit","InputText","Checkbox","Loading","AuthCodeAsync","AuthCode","useModuleLoader","AuthPasswordAsync","AuthPassword","AuthRegisterAsync","AuthRegister","AuthQrCodeAsync","AuthQrCode","MainAsync","renderMain","TeactDOM"],"mappings":"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","file":"main.b24208fc76bcbd38f3e7.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\t1: 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\t1: 0\n \t};\n\n\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + chunkId + \".\" + {\"0\":\"cfd4c89106e5147f5997\",\"2\":\"f7d16accfb1c79ee906b\",\"3\":\"4bcadbdcb5986d5c9ba9\",\"4\":\"66638f18ab54b35d4ce9\",\"5\":\"42b78d9f9dc78dd3f534\",\"6\":\"2a86679c910dccf735ed\",\"7\":\"787d1bfb0f7aad083fca\",\"8\":\"be9a4dd2a4d166554abe\",\"9\":\"90b7985da07e3b6a4886\",\"10\":\"bd5435d947f7c8aea0ee\"}[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,\"2\":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\":\"cfd4c89106e5147f5997\",\"2\":\"f7d16accfb1c79ee906b\",\"3\":\"4bcadbdcb5986d5c9ba9\",\"4\":\"66638f18ab54b35d4ce9\",\"5\":\"42b78d9f9dc78dd3f534\",\"6\":\"2a86679c910dccf735ed\",\"7\":\"787d1bfb0f7aad083fca\",\"8\":\"be9a4dd2a4d166554abe\",\"9\":\"90b7985da07e3b6a4886\",\"10\":\"bd5435d947f7c8aea0ee\"}[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 = 90);\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 from '../../util/arePropsShallowEqual';\nimport { handleError } from '../../util/handleError';\nimport { removeAllDelegatedListeners } from './dom-events';\n\nexport type Props = AnyLiteral;\nexport type FC

= (props: P) => any;\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 = (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;\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 scheduleNextState?: () => void;\n forceUpdate?: () => void;\n onUpdate?: () => void;\n}\n\nexport type VirtualElement = VirtualElementEmpty | VirtualElementText | VirtualElementTag | VirtualElementComponent;\nexport type VirtualRealElement = VirtualElementTag | 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.\n/* eslint-disable no-null/no-null */\nfunction helpGc(componentInstance: ComponentInstance) {\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\n/* eslint-enable no-null/no-null */\n\nfunction applyNextState(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\nfunction forceUpdateComponent(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted || !componentInstance.onUpdate) {\n return;\n }\n\n const currentElement = componentInstance.$element;\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(initial?: T): [T, StateHookSetter] {\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.scheduleNextState || !componentInstance.forceUpdate) {\n componentInstance.scheduleNextState = throttleWithPrimaryRaf(() => applyNextState(componentInstance));\n componentInstance.forceUpdate = throttleWithRaf(() => forceUpdateComponent(componentInstance));\n }\n\n componentInstance.scheduleNextState();\n componentInstance.forceUpdate();\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(resolver: () => T, dependencies: any[]): 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 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(newCallback: F, dependencies: any[]): F {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => newCallback, dependencies);\n}\n\nexport function useRef(initial: T): { current: T };\nexport function useRef(): { current: T | undefined }; // TT way (empty is `undefined`)\nexport function useRef(initial: null): { current: T | null }; // React way (empty is `null`)\n// eslint-disable-next-line no-null/no-null\nexport function useRef(initial?: T | null) {\n return useMemo(() => ({\n current: initial,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }), []);\n}\n\nexport function memo(Component: T, areEqual = arePropsShallowEqual) {\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 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","export const APP_INFO = process.env.APP_INFO || 'Telegram T';\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 GRAMJS_SESSION_ID_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';\nexport const ASSET_CACHE_NAME = 'tt-assets';\n\nexport const API_UPDATE_THROTTLE = 300;\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\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 CHANNEL_MEMBERS_LIMIT = 30;\nexport const PINNED_MESSAGES_LIMIT = 50;\nexport const BLOCKED_LIST_LIMIT = 100;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 25;\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 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 MEMOJI_STICKER_ID = 'MEMOJI_STICKER';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\nexport const LAYERS_TRANSITION_DURATION = 450;\n\nexport const CONTENT_TYPES_FOR_QUICK_UPLOAD = 'image/png,image/gif,image/jpeg,video/mp4,video/avi,video/quicktime';\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,6})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\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_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios'];\nexport const TIPS_USERNAME = 'TelegramTips';\nexport const FEEDBACK_URL = 'https://bugs.telegram.org/?tag_ids=41&sort=time';\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","import React, {\n FC, 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 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 = ((global: GlobalState, ownProps: OwnProps) => AnyLiteral | null);\ntype MapActionsToProps = ((setGlobal: Function, actions: GlobalActions) => Partial | null);\n\nlet currentGlobal = {} as GlobalState;\n\nconst reducers: Record = {};\nconst callbacks: Function[] = [updateContainers];\nconst actions = {} as GlobalActions;\nconst containers = new Map;\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\nexport function setGlobal(newGlobal?: GlobalState) {\n if (typeof newGlobal === 'object' && newGlobal !== currentGlobal) {\n currentGlobal = newGlobal;\n runCallbacksThrottled();\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) {\n if (reducers[name]) {\n reducers[name].forEach((reducer) => {\n const newGlobal = reducer(currentGlobal, actions, payload);\n if (newGlobal) {\n setGlobal(newGlobal);\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) => {\n onDispatch(name, payload);\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(\n mapStateToProps: MapStateToProps = () => ({}),\n mapReducersToProps: MapActionsToProps = () => ({}),\n) {\n return (Component: FC) => {\n return function TeactNContainer(props: OwnProps) {\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 ;\n };\n };\n}\n\nfunction 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\nif (DEBUG) {\n (window as any).getGlobal = getGlobal;\n\n document.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('GLOBAL CONTAINERS', orderBy(Object.values(containers), 'DEBUG_updates', 'desc'));\n });\n}\n","type CollectionByKey = Record;\n\ntype OrderDirection = 'asc' | 'desc';\n\ninterface OrderCallback {\n (member: T): any;\n}\n\nexport function buildCollectionByKey(collection: T[], key: keyof T) {\n return collection.reduce((byKey: CollectionByKey, member: T) => {\n byKey[member[key]] = member;\n\n return byKey;\n }, {});\n}\n\nexport function mapValues(\n byKey: CollectionByKey,\n callback: (member: M, key: string, index: number, originalByKey: CollectionByKey) => R,\n): CollectionByKey {\n return Object.keys(byKey).reduce((newByKey: CollectionByKey, key, index) => {\n newByKey[key] = callback(byKey[key], key, index, byKey);\n return newByKey;\n }, {});\n}\n\nexport function pick(object: T, keys: K[]) {\n return keys.reduce((result, key) => {\n result[key] = object[key];\n return result;\n }, {} as Pick);\n}\n\nexport function pickTruthy(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);\n}\n\nexport function omit(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>;\n\n return pick(object, savedKeys);\n}\n\nexport function orderBy(\n collection: T[],\n orderKey: (keyof T) | OrderCallback | ((keyof T) | OrderCallback)[],\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(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(array: T[], set: Set): 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(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(array: Array, 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';\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');\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(message: ApiMessage, noEmoji = false) {\n const {\n text, photo, video, audio, voice, document, sticker, contact, poll, invoice,\n } = message.content;\n\n if (message.groupedId) {\n if (text) {\n return `${noEmoji ? '' : '🖼 '}${text.text}`;\n }\n\n return 'Album';\n }\n\n if (photo) {\n if (text) {\n return `${noEmoji ? '' : '🖼 '}${text.text}`;\n }\n\n return 'Photo';\n }\n\n if (video) {\n if (video.isGif) {\n if (text) {\n return `${noEmoji ? '' : 'GIF '}${text.text}`;\n }\n\n return 'GIF';\n } else {\n if (text) {\n return `${noEmoji ? '' : '📹 '}${text.text}`;\n }\n\n return 'Video';\n }\n }\n\n if (sticker) {\n return `Sticker ${sticker.emoji}`;\n }\n\n if (audio) {\n const caption = [audio.title, audio.performer].filter(Boolean).join(' — ') || (text && text.text);\n if (caption) {\n return `🎧 ${caption}`;\n }\n\n return 'Audio';\n }\n\n if (voice) {\n if (text) {\n return `${noEmoji ? '' : '🎤 '}${text.text}`;\n }\n\n return 'Voice Message';\n }\n\n if (document) {\n return `${noEmoji ? '' : '📎 '}${text ? text.text : document.fileName}`;\n }\n\n if (contact) {\n return 'Contact';\n }\n\n if (poll) {\n return `📊 ${poll.summary.question}`;\n }\n\n if (invoice) {\n return 'Invoice';\n }\n\n if (text) {\n return text.text;\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(sender: ApiUser | ApiChat) {\n return sender.id > 0 ? getUserFullName(sender as ApiUser) : getChatTitle(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","import {\n ApiAudio, ApiMediaFormat, ApiMessage, ApiMessageSearchType, ApiPhoto, ApiVideo,\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\nexport type IDimensions = {\n width: number;\n height: number;\n};\n\ntype Target = 'micro' | 'pictogram' | 'inline' | 'viewerPreview' | 'viewerFull' | 'download';\n\nconst MAX_INLINE_VIDEO_SIZE = 10 * 1024 ** 2; // 10 MB\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 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 getMessageMediaThumbnail(message: ApiMessage) {\n const media = getMessagePhoto(message)\n || getMessageVideo(message)\n || getMessageDocument(message)\n || getMessageSticker(message)\n || getMessageWebPagePhoto(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\n if (!(photo || video || sticker || webPagePhoto || audio || voice || document)) {\n return undefined;\n }\n\n const base = getMessageKey(message);\n\n if (photo || webPagePhoto) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n if (hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n return `${base}?size=x`;\n case 'viewerPreview':\n return `${base}?size=x`;\n case 'viewerFull':\n return `${base}?size=z`;\n }\n }\n\n if (video) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n if (hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n if (canMessagePlayVideoInline(video)) {\n return getVideoOrAudioBaseHash(video, base);\n }\n\n return `${base}?size=z`;\n case 'viewerPreview':\n return `${base}?size=m`;\n case 'viewerFull':\n return getVideoOrAudioBaseHash(video, base);\n case 'download':\n return `${base}?download`;\n }\n }\n\n if (document) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n case 'inline':\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 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;\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 if (sticker && target === 'inline' && sticker.isAnimated) {\n return ApiMediaFormat.Lottie;\n } else if (video && IS_PROGRESSIVE_SUPPORTED && (\n (target === 'viewerFull') || (target === 'inline' && canMessagePlayVideoInline(video))\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 getMessageMediaFilename(message: ApiMessage) {\n const { photo, video, webPage } = message.content;\n\n if (photo || (webPage && webPage.photo)) {\n return `photo${message.date}.jpeg`;\n }\n\n if (video) {\n return video.fileName;\n }\n\n return undefined;\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 canMessagePlayVideoInline(video: ApiVideo): boolean {\n return video.isGif || video.isRound || video.size <= MAX_INLINE_VIDEO_SIZE;\n}\n\nexport function getChatMediaMessageIds(\n messages: Record, listedIds: number[], reverseOrder = false,\n) {\n const ids = getMessageContentIds(messages, listedIds, 'media');\n\n return reverseOrder ? ids.reverse() : ids;\n}\n\nexport function getPhotoFullDimensions(photo: ApiPhoto): IDimensions | 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): IDimensions | 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): IDimensions | undefined {\n if (video.width && video.height) {\n return video as IDimensions;\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, messageIds: number[], contentType: ApiMessageSearchType,\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 default:\n return [] as Array;\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);\n}\n\nexport function getMediaDuration(message: ApiMessage) {\n const { audio, voice, video } = getMessageContent(message);\n const media = audio || voice || video;\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 { ApiDocument } from './messages';\n\nexport * from './users';\nexport * from './chats';\nexport * from './messages';\nexport * from './updates';\nexport * from './media';\nexport * from './payments';\nexport * from './settings';\n\nexport interface ApiOnProgress {\n (\n progress: number, // Float between 0 and 1.\n ...args: any[]\n ): void;\n\n isCanceled?: boolean;\n acceptsBuffer?: boolean;\n}\n\nexport interface ApiAttachment {\n blobUrl: string;\n filename: string;\n mimeType: string;\n size: number;\n quick?: {\n width: number;\n height: number;\n duration?: number;\n };\n voice?: {\n duration: number;\n waveform: number[];\n };\n previewBlobUrl?: string;\n}\n\nexport interface ApiWallpaper {\n slug: string;\n document: ApiDocument;\n}\n\nexport interface ApiSession {\n hash: string;\n isCurrent: boolean;\n isOfficialApp: boolean;\n isPasswordPending: boolean;\n deviceModel: string;\n platform: string;\n systemVersion: string;\n appName: string;\n appVersion: string;\n dateCreated: number;\n dateActive: number;\n ip: string;\n country: string;\n region: string;\n}\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\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 { ApiChat, MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalState } from '../../global/types';\n\nimport {\n getPrivateChatUserId, isChatChannel, isChatPrivate, isChatSuperGroup, isHistoryClearMessage, isUserBot, isUserOnline,\n} from '../helpers';\nimport { selectUser } from './users';\nimport { ALL_FOLDER_ID, ARCHIVED_FOLDER_ID } from '../../config';\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)) {\n return undefined;\n }\n\n if (isChatSuperGroup(chat)) {\n return chat.onlineCount;\n }\n\n if (!chat.fullInfo || !chat.fullInfo.members) {\n return undefined;\n }\n\n const memberIds = chat.fullInfo.members.map((m) => m.userId);\n return memberIds.reduce((onlineCount, memberId) => {\n if (global.users.byId[memberId] && isUserOnline(global.users.byId[memberId])) {\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 (chat && chat.unreadCount && !chat.isMuted) {\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 emoji = emoji.replace('\\ufe0f', '');\n\n return animatedEmojis.stickers.find((sticker) => sticker.emoji === emoji);\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} 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(\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 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(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 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 isMessageEditable = (\n (isChatWithSelf || Date.now() - 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 canDeleteForAll = canDelete && !isServiceNotification && (\n (isPrivate && !isChatWithSelf)\n || (isBasicGroup && (\n isOwn || getHasAdminRight(chat, 'deleteMessages')\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 canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n };\n}\n\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 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 threadInfo.lastMessageId\n ? Math.min(threadInfo.lastReadInboxMessageId, threadInfo.lastMessageId)\n : threadInfo.lastReadInboxMessageId;\n }\n}\n\nexport function selectFirstUnreadId(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 } 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\n if (outlyingIds) {\n const found = outlyingIds.find((id) => {\n return !lastReadId || (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 = listedIds.find((id) => {\n return !lastReadId || (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);\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 { RightColumnContent } from '../../types';\n\nimport { IS_MOBILE_SCREEN } 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 isStatisticsShown,\n } = global;\n\n const isPollResults = selectIsPollResultsOpen(global);\n const isSearch = Boolean(!IS_MOBILE_SCREEN && 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 ) : isStatisticsShown ? (\n RightColumnContent.Statistics\n ) : isStickerSearch ? (\n RightColumnContent.StickerSearch\n ) : isGifSearch ? (\n RightColumnContent.GifSearch\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","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","import {\n MOBILE_SCREEN_MAX_WIDTH,\n MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT,\n MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH,\n} from '../config';\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: 'Mac OS' | 'iOS' | 'Windows' | 'Android' | 'Linux' | undefined;\n\n if (macosPlatforms.indexOf(platform) !== -1) {\n os = 'Mac OS';\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 === 'Mac OS';\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);\n\nexport const IS_TOUCH_ENV = window.matchMedia('(pointer: coarse)').matches;\n// Keep in mind the landscape orientation\nexport const IS_MOBILE_SCREEN = window.innerWidth <= MOBILE_SCREEN_MAX_WIDTH || (\n window.innerWidth <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH && window.innerHeight <= MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT\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'));\n\nexport const DPR = window.devicePixelRatio || 1;\n\n// `mask-image` CSS property for custom background slows down the scroll performance significantly\nexport const MASK_IMAGE_ENABLED = IS_IOS;\n\nlet isWebpSupportedCache: boolean | undefined;\n\nexport function isWebpSupported() {\n return Boolean(isWebpSupportedCache);\n}\n\nfunction testWebp(): Promise {\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","type Parts = (string | false | undefined)[];\n\nexport default (...parts: Parts) => {\n return parts.filter(Boolean).join(' ');\n};\n","type Scheduler = typeof requestAnimationFrame | typeof onTickEnd | typeof runNow;\n\nexport function debounce(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n shouldRunLast = true,\n) {\n let waitingTimeout: number | undefined;\n\n return (...args: Parameters) => {\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(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n) {\n let interval: number | undefined;\n let isPending: boolean;\n let args: Parameters;\n\n return (..._args: Parameters) => {\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(fn: F) {\n return throttleWith(fastRaf, fn);\n}\n\nexport function throttleWithPrimaryRaf(fn: F) {\n return throttleWith(fastPrimaryRaf, fn);\n}\n\nexport function throttleWithTickEnd(fn: F) {\n return throttleWith(onTickEnd, fn);\n}\n\nexport function throttleWithNow(fn: F) {\n return throttleWith(runNow, fn);\n}\n\nexport function throttleWith(schedulerFn: Scheduler, fn: F) {\n let waiting = false;\n let args: Parameters;\n\n return (..._args: Parameters) => {\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 requestAnimationFrame(resolve);\n });\n}\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function fastRaf(callback: NoneToVoidFunction, isPrimary = false) {\n if (!fastRafCallbacks) {\n fastRafCallbacks = [callback];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n fastRafCallbacks = undefined;\n currentCallbacks.forEach((cb) => cb());\n });\n } else if (isPrimary) {\n fastRafCallbacks.unshift(callback);\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nexport function fastPrimaryRaf(callback: NoneToVoidFunction) {\n return fastRaf(callback, true);\n}\n","import Worker from 'worker-loader!./worker';\n\nimport { 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();\nconst requestStatesByCallback = new Map();\n\n// TODO Re-use `util/WorkerConnector.ts`\n\nexport function initApi(onUpdate: OnApiUpdate, sessionId = '') {\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: [sessionId],\n });\n}\n\nexport function callApi(fnName: T, ...args: MethodArgs) {\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;\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>> = 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","export default __webpack_public_path__ + \"en-extra.e73049da90714ecdae3233e8ffa74d39.json\";","export default __webpack_public_path__ + \"es-extra.b80575cdf988e1a7e3a915abe97f63b4.json\";","export default __webpack_public_path__ + \"it-extra.78e5568451a888818c7e2209e05a9602.json\";","export default __webpack_public_path__ + \"pl-extra.38fd67a6c26e58f5c912568332c7c074.json\";","export default __webpack_public_path__ + \"ru-extra.5761b75bfbe92bb46eb8bba9acbdbb4c.json\";","import { ApiLangPack } from '../api/types';\n\nimport { DEBUG, LANG_CACHE_NAME, LANG_PACKS } from '../config';\nimport * as cacheApi from './cacheApi';\nimport { callApi } from '../api/gramjs';\nimport { createCallbackManager } from './callbacks';\nimport { mapValues } from './iteratees';\n\nimport enExtraJson from '../assets/lang/en-extra.json';\nimport esExtraJson from '../assets/lang/es-extra.json';\nimport itExtraJson from '../assets/lang/it-extra.json';\nimport plExtraJson from '../assets/lang/pl-extra.json';\nimport ruExtraJson from '../assets/lang/ru-extra.json';\nimport { formatInteger } from './textFormat';\n\nconst EXTRA_PACK_PATHS: Record = {\n en: enExtraJson as unknown as string,\n es: esExtraJson as unknown as string,\n it: itExtraJson as unknown as string,\n pl: plExtraJson as unknown as string,\n ru: ruExtraJson as unknown as string,\n};\n\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();\n\nlet langPack: ApiLangPack;\n\nconst {\n addCallback,\n removeCallback,\n runCallbacks,\n} = createCallbackManager();\n\nexport { addCallback, removeCallback };\n\nlet currentLangCode: string | undefined;\n\nexport async function setLanguage(langCode: string, callback?: NoneToVoidFunction) {\n if (langPack && langCode === currentLangCode) {\n document.documentElement.lang = langCode;\n if (callback) {\n callback();\n }\n\n return;\n }\n\n const newLangPack = await fetchFromCacheOrRemote(langCode);\n if (!newLangPack) {\n return;\n }\n\n if (EXTRA_PACK_PATHS[langCode]) {\n try {\n const response = await fetch(EXTRA_PACK_PATHS[langCode]);\n const pairs = await response.json();\n const extraLangPack = mapValues(pairs, (value, key) => ({ key, value }));\n\n Object.assign(newLangPack, extraLangPack);\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }\n }\n\n cache.clear();\n\n currentLangCode = langCode;\n langPack = newLangPack;\n document.documentElement.lang = langCode;\n\n if (callback) {\n callback();\n }\n\n runCallbacks(langPack);\n}\n\nexport function getTranslation(key: string, value?: any, format?: 'i') {\n if (value !== undefined) {\n const cached = cache.get(`${key}_${value}_${format}`);\n if (cached) {\n return cached;\n }\n }\n\n if (!langPack) {\n return key;\n }\n\n const langString = langPack[key];\n if (!langString) {\n return key;\n }\n\n const template = langString[typeof value === 'number' ? getPluralOption(value) : 'value'];\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 cache.set(`${key}_${value}_${format}`, result);\n return result;\n }\n\n return template;\n}\n\nasync function fetchFromCacheOrRemote(langCode: string): Promise {\n const cached = await cacheApi.fetch(LANG_CACHE_NAME, langCode, cacheApi.Type.Json);\n if (cached) {\n return cached;\n }\n\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\nfunction getPluralOption(amount: number) {\n const optionIndex = currentLangCode && PLURAL_RULES[currentLangCode as keyof typeof PLURAL_RULES]\n ? PLURAL_RULES[currentLangCode as keyof typeof PLURAL_RULES](amount)\n : 0;\n\n return PLURAL_OPTIONS[optionIndex];\n}\n\nfunction processTemplate(template: string, value: any) {\n return template.replace(/%\\d?\\$?[sdf@]/, String(value));\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\n};\n\nexport type BundleModules = keyof ImportedBundles[B];\n\nconst LOAD_PROMISES: Partial = {};\nconst MEMORY_CACHE: Partial = {};\n\nexport async function loadModule>(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).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>(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","// 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 const request = new Request(key);\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 const request = new Request(key);\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 { 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 {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = (e: ProgressEvent) => {\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 {\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 {\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 {\n const video = await preloadVideo(url);\n\n return Promise.race([\n pause(2000) as Promise,\n new Promise((resolve, reject) => {\n video.onseeked = () => {\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","// Copyright Twitter Inc. Licensed under MIT\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\n// Version 09.05.2020\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 /(?:\\u2624|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\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\\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\\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\\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\\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\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d])|(?:\\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\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f|(?:\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\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\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\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\\u2764\\ufe0f\\u200d\\ud83d\\udc68|\\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\\u2764\\ufe0f\\u200d\\ud83d[\\udc68\\udc69]|\\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|\\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|\\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-\\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 = ({ color = 'blue' }) => {\n return (\n

\n \n
\n );\n};\n\nexport default memo(Loading);\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 >(\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 {\n ApiLanguage, ApiMessage, ApiStickerSet, ApiShippingAddress,\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 interface ISettings extends Record {\n messageTextSize: number;\n customBackground?: string;\n patternColor?: string;\n isBackgroundBlurred?: boolean;\n animationLevel: 0 | 1 | 2;\n messageSendKeyCombo: 'enter' | 'ctrl-enter';\n theme: 'light' | 'dark';\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 hasPrivateChatsNotifications?: boolean;\n hasPrivateChatsMessagePreview?: boolean;\n hasGroupNotifications?: boolean;\n hasGroupMessagePreview?: boolean;\n hasBroadcastNotifications?: boolean;\n hasBroadcastMessagePreview?: boolean;\n hasContactJoinedNotifications?: boolean;\n languages?: ApiLanguage[];\n language: 'en' | 'fr' | 'de' | 'it' | 'pt' | 'ru' | 'es' | 'uk';\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;\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 Statistics,\n StickerSearch,\n GifSearch,\n PollResults,\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 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","// 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 Caledonia\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 = {};\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 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
\n
\n
\n );\n};\n\nexport default Spinner;\n","import {\n DEBUG_ALERT_MSG, GLOBAL_STATE_CACHE_KEY, GRAMJS_SESSION_ID_KEY,\n} 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;\nconst STARTUP_TIMEOUT = 5000;\n\nconst startedAt = Date.now();\nlet isReloading = false;\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 (isReloading) {\n return;\n }\n\n // For startup errors, we just clean the cache or the session and refresh the page.\n if (Date.now() - startedAt <= STARTUP_TIMEOUT) {\n if (localStorage.getItem(GLOBAL_STATE_CACHE_KEY)) {\n localStorage.removeItem(GLOBAL_STATE_CACHE_KEY);\n } else if (localStorage.getItem(GRAMJS_SESSION_ID_KEY)) {\n localStorage.removeItem(GRAMJS_SESSION_ID_KEY);\n } else {\n return;\n }\n\n isReloading = true;\n window.location.reload();\n\n return;\n }\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 (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 { 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(user: ApiUser, lang: LangFn) {\n if (user.id === SERVICE_NOTIFICATIONS_USER_ID) {\n return lang('ServiceNotifications').toLowerCase();\n }\n\n if (user.type && user.type === 'userTypeBot') {\n return '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();\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 if (wasOnlineDate > today) {\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 today.setHours(0, 0, 0, 0);\n if (wasOnlineDate > yesterday) {\n return lang('LastSeen.YesterdayAt', formatTime(wasOnlineDate));\n }\n\n return lang('LastSeen.AtDate', formatFullDate(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 getSortedUserIds(\n userIds: number[],\n usersById: Record,\n priorityIds?: number[],\n) {\n return orderBy(userIds, (id) => {\n const now = Date.now() / 1000;\n\n if (priorityIds && priorityIds.includes(id)) {\n /*\n ** Assuming that online status expiration date can't be as far as two days from now,\n ** this should place priorityIds on top of the list.\n **\n ** We then subtract index of `id` in `priorityIds` to preserve selected order\n */\n return now + (48 * 60 * 60) - 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 { ARCHIVED_FOLDER_ID } from '../../config';\nimport { orderBy } from '../../util/iteratees';\nimport { getUserFirstOrLastName } from './users';\nimport { getTranslation } from '../../util/langProvider';\nimport { LangFn } from '../../hooks/useLang';\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\nexport function getChatTitle(chat: ApiChat, user?: ApiUser) {\n if (user && chat.id === user.id && user.isSelf) {\n return getTranslation('SavedMessages');\n }\n return chat.title || getTranslation('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 const { inviteLink } = chat.fullInfo || {};\n\n if (inviteLink && inviteLink.length) {\n return inviteLink;\n }\n\n return username ? `t.me/${username}` : '';\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(chat: ApiChat) {\n if (chat.currentUserBannedRights && chat.currentUserBannedRights.sendMessages) {\n return 'You are not allowed to send messages in this chat.';\n }\n if (chat.defaultBannedRights && chat.defaultBannedRights.sendMessages) {\n return 'Sending messages is not allowed in this chat.';\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\nexport function getChatOrder(chat: ApiChat) {\n return Math.max(chat.joinDate || 0, chat.lastMessage ? chat.lastMessage.date : 0);\n}\n\nexport function isChatArchived(chat: ApiChat) {\n return chat.folderId === ARCHIVED_FOLDER_ID;\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,\n usersById: Record,\n folder: ApiChatFolder,\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], folder, usersById, excludedChatIds, includedChatIds, pinnedChatIds,\n );\n });\n\n return [listIds, folder.pinnedChatIds] as const;\n}\n\nfunction filterChatFolder(\n chat: ApiChat,\n folder: ApiChatFolder,\n usersById: Record,\n excludedChatIds?: Set,\n includedChatIds?: Set,\n pinnedChatIds?: Set,\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 (chat.isMuted && folder.excludeMuted) {\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,\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,\n usersById: Record,\n folder: ApiChatFolder,\n chatIdsCache: number[],\n) {\n const [listIds] = prepareFolderListIds(chatsById, usersById, folder, 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 || (!chat.isMuted && (chat.unreadCount || chat.hasUnreadMark))\n ));\n\n return {\n unreadDialogsCount,\n hasActiveDialogs,\n };\n}\n\nexport function getFolderDescriptionText(\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n chatIdsCache: number[],\n lang: LangFn,\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);\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,\n usersById: Record,\n folder: ApiChatFolder,\n chatIdsCache: number[],\n) {\n const [listIds, pinnedIds] = prepareFolderListIds(chatsById, usersById, folder, chatIdsCache);\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(chatId: number, sender?: ApiUser) {\n if (!sender || isChatPrivate(chatId)) {\n return undefined;\n }\n\n if (sender.isSelf) {\n return 'You';\n }\n\n return getUserFirstOrLastName(sender);\n}\n","export default function arePropsShallowEqual(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 false;\n }\n\n return currentKeys.every((prop) => currentProps[prop] === newProps[prop]);\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> = {};\nconst delegatedEventsByElement = new Map>();\nconst documentEventCounters: Record = {};\n\nexport function addEventListener(element: HTMLElement, propName: string, handler: Handler) {\n const eventName = resolveEventName(propName, element);\n if (canUseEventDelegation(eventName, element)) {\n addDelegatedListener(eventName, element, handler);\n } else {\n element.addEventListener(eventName, handler);\n }\n}\n\nexport function removeEventListener(element: HTMLElement, propName: string, handler: Handler) {\n const eventName = resolveEventName(propName, element);\n if (canUseEventDelegation(eventName, element)) {\n removeDelegatedListener(eventName, element);\n } else {\n element.removeEventListener(eventName, handler);\n }\n}\n\nfunction resolveEventName(propName: string, element: HTMLElement) {\n const eventName = propName.replace(/^on/, '').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) {\n return (\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();\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 { 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();\n // СSS class should be added in a separate tick to turn on CSS transition.\n const [hasAsyncOpenClassName, setHasAsyncOpenClassName] = useState(false);\n\n if (isOpen) {\n setIsClosed(false);\n setHasAsyncOpenClassName(true);\n\n if (closeTimeoutRef.current) {\n window.clearTimeout(closeTimeoutRef.current);\n closeTimeoutRef.current = undefined;\n }\n } else {\n setHasAsyncOpenClassName(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 const hasOpenClassName = hasAsyncOpenClassName || (isOpen && noOpenTransition);\n const isClosing = Boolean(closeTimeoutRef.current);\n const shouldRender = isOpen || isClosing;\n const transitionClassNames = buildClassName(\n className && 'opacity-transition',\n className,\n hasOpenClassName && 'open',\n shouldRender && 'shown',\n isClosing && 'closing',\n );\n\n return {\n shouldRender,\n transitionClassNames,\n };\n};\n","import { MILISECONDS_IN_DAY } from '../lib/lovely-chart/constants';\nimport { getTranslation } from './langProvider';\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;\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(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 getTranslation(`Weekday.Short${WEEKDAYS_FULL[date.getDay()]}`);\n }\n\n const withYear = date.getFullYear() !== today.getFullYear();\n const format = (\n getTranslation(withYear ? 'formatDateScheduleYear' : 'formatDateSchedule')\n || (withYear ? 'd MMM yyyy' : 'd MMM')\n );\n\n return formatDate(date, format);\n}\n\nexport function formatFullDate(datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n const format = getTranslation('formatterYearMax') || 'dd.MM.yyyy';\n\n return formatDate(date, format);\n}\n\nexport function formatMonthAndYear(date: Date, isShort = false) {\n const format = getTranslation(isShort ? 'formatterMonthYear2' : 'formatterMonthYear') || 'MMM yyyy';\n\n return formatDate(date, format);\n}\n\nexport function formatHumanDate(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)(getTranslation('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)(getTranslation('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(getTranslation(`Weekday.Short${weekDay}`))\n : upperFirst(getTranslation(`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 = getTranslation(formatKey) || 'd MMMM yyyy';\n\n return (isShort ? lowerFirst : upperFirst)(formatDate(date, format));\n}\n\nfunction formatDate(date: Date, format: string) {\n const day = date.getDate();\n const monthIndex = date.getMonth();\n\n return format\n .replace('LLLL', getTranslation(MONTHS_FULL[monthIndex]))\n .replace('MMMM', getTranslation(`Month.Gen${MONTHS_FULL[monthIndex]}`))\n .replace('MMM', getTranslation(`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(datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n return `${formatHumanDate(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) {\n return date.toLocaleString(\n 'en-US',\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 { useCallback, useState } from '../lib/teact/teact';\n\nexport default () => {\n const [, setTrigger] = useState(false);\n\n return useCallback(() => {\n setTrigger((trigger) => !trigger);\n }, []);\n};\n","import { callApi } from '../api/gramjs';\nimport { DEBUG } from '../config';\nimport { IS_SERVICE_WORKER_SUPPORTED } from './environment';\n\nfunction getDeviceToken(subscription: PushSubscription) {\n const data = subscription.toJSON();\n return JSON.stringify({ endpoint: data.endpoint, keys: data.keys });\n}\n\nexport function isPushSupported() {\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.log('[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.log('[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.log('[PUSH] Push messaging isn\\'t supported.');\n }\n return false;\n }\n return true;\n}\n\nexport async function unsubscribeFromPush() {\n if (!isPushSupported) return;\n const serviceWorkerRegistration = await navigator.serviceWorker.ready;\n const subscription = await serviceWorkerRegistration.pushManager.getSubscription();\n if (subscription) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] Unsubscribing', subscription);\n }\n try {\n const deviceToken = getDeviceToken(subscription);\n await callApi('unregisterDevice', deviceToken);\n await subscription.unsubscribe();\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}\n\nexport async function subscribeToPush() {\n if (!isPushSupported()) return;\n await unsubscribeFromPush();\n const serviceWorkerRegistration = await navigator.serviceWorker.ready;\n try {\n const 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 } 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.log('[PUSH] Permission for Notifications was denied');\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 }\n}\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;\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 onClick?: (e: ReactMouseEvent) => void;\n onContextMenu?: (e: ReactMouseEvent) => void;\n onMouseDown?: (e: ReactMouseEvent) => void;\n onMouseEnter?: NoneToVoidFunction;\n onMouseLeave?: NoneToVoidFunction;\n onFocus?: NoneToVoidFunction;\n};\n\n// Longest animation duration;\nconst CLICKED_TIMEOUT = 400;\n\nconst Button: FC = ({\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}) => {\n // eslint-disable-next-line no-null/no-null\n let elementRef = useRef(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) => {\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) => {\n e.preventDefault();\n if (!disabled && onMouseDown) {\n onMouseDown(e);\n }\n }, [onMouseDown, disabled]);\n\n if (href) {\n return (\n }\n className={fullClassName}\n href={href}\n title={ariaLabel}\n download={download}\n tabIndex={tabIndex}\n >\n {children}\n {!disabled && ripple && (\n \n )}\n \n );\n }\n\n return (\n // eslint-disable-next-line react/button-has-type\n }\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 >\n {isLoading ? (\n
\n Please wait..\n \n
\n ) : children}\n {!disabled && ripple && (\n \n )}\n \n );\n};\n\nexport default Button;\n","import React, { FC, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './MenuItem.scss';\n\ntype OnClickHandler = (e: React.SyntheticEvent) => 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 = (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 handleClick = useCallback((e: React.MouseEvent) => {\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) => {\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 \n )}\n {children}\n \n );\n\n if (href) {\n return (\n \n {content}\n \n );\n }\n\n return (\n \n {content}\n
\n );\n};\n\nexport default MenuItem;\n","import React, {\n FC, useCallback, useMemo, useState,\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([]);\n\n const cleanUpDebounced = useMemo(() => {\n return debounce(() => {\n setRipples([]);\n }, ANIMATION_DURATION_MS, false);\n }, []);\n\n const handleMouseDown = useCallback((e: React.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
\n {ripples.map(({ x, y, size }: Ripple) => (\n \n ))}\n
\n );\n};\n\nexport default RippleEffect;\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 {\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 {\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 {\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 {\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 React from '../../../lib/teact/teact';\nimport EMOJI_REGEX, { removeVS16s } from '../../../lib/twemojiRegex';\n\nimport { RE_LINK_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 ,\n );\n }\n if (type === 'html') {\n emojiResult.push(\n // For preventing extra spaces in html\n // eslint-disable-next-line max-len\n `\"${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' ?
: '
',\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 \n {part.substring(queryPosition, queryPosition + highlight.length)}\n ,\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, 'ig');\nconst RE_MENTION = /@[\\w\\d_-]+/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) || []), ...(part.match(RE_MENTION) || [])];\n if (!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 \n {nextLink}\n ,\n );\n } else {\n content.push(\n ,\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 ? {entity.replace(/\\*\\*/g, '')}\n : {entity.replace(/__/g, '')},\n );\n } else {\n entityResult.push(\n entity.startsWith('**')\n ? `${entity.replace(/\\*\\*/g, '')}`\n : `${entity.replace(/__/g, '')}`,\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","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 { useRef } from '../lib/teact/teact';\n\nfunction usePrevious(next: T): T | undefined;\nfunction usePrevious(next: T, shouldSkipUndefined: true): Exclude | undefined;\nfunction usePrevious(next: T, shouldSkipUndefined?: boolean): Exclude | undefined;\nfunction usePrevious(next: T, shouldSkipUndefined?: boolean) {\n const ref = useRef();\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 { GlobalState } from '../../global/types';\nimport { ApiChat } 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): GlobalState {\n return {\n ...global,\n chats: {\n ...global.chats,\n byId: newById,\n },\n };\n}\n\nexport function updateChat(global: GlobalState, chatId: number, chatUpdate: Partial): GlobalState {\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 };\n\n if (!updatedChat.id || !updatedChat.type) {\n return global;\n }\n\n return replaceChats(global, {\n ...byId,\n [chatId]: updatedChat,\n });\n}\n\nexport function updateChats(global: GlobalState, updatedById: Record): GlobalState {\n Object.keys(updatedById).forEach((id) => {\n global = updateChat(global, Number(id), updatedById[Number(id)]);\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): GlobalState {\n const { byId } = global.chats;\n Object.keys(addedById).map(Number).forEach((id) => {\n if (!byId[id] || (byId[id].isMin && !addedById[id].isMin)) {\n global = updateChat(global, id, addedById[id]);\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).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;\n threadsById: Record;\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): GlobalState {\n return updateMessageStore(global, chatId, {\n byId: newById,\n });\n}\n\nfunction updateThread(\n global: GlobalState, chatId: number, threadId: number, threadUpdate: Partial,\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,\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(\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>);\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,\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,\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,\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 deletedForwardedPosts = Object.values(pickTruthy(byId, messageIds)).filter(\n ({ forwardInfo }) => forwardInfo && forwardInfo.isLinkedChannelPost,\n );\n const newById = omit(byId, messageIds);\n\n const threadIds = Object.keys(global.messages.byChatId[chatId].threadsById).map(Number);\n threadIds.forEach((threadId) => {\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\n messageIds.forEach((messageId) => {\n if (listedIds && listedIds.includes(messageId)) {\n listedIds = listedIds.filter((id) => id !== messageId);\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 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\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 | 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[],\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, 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; 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,\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): GlobalState {\n return {\n ...global,\n users: {\n ...global.users,\n byId: newById,\n },\n };\n}\nexport function updateUser(global: GlobalState, userId: number, userUpdate: Partial): GlobalState {\n const { byId } = global.users;\n const { hash, userIds: contactUserIds } = global.contactList || {};\n const user = byId[userId];\n const shouldOmitMinInfo = userUpdate.isMin && user && !user.isMin;\n const updatedUser = {\n ...user,\n ...(shouldOmitMinInfo ? omit(userUpdate, ['isMin', 'accessHash']) : userUpdate),\n };\n\n if (!updatedUser.id || !updatedUser.type) {\n return global;\n }\n\n if (updatedUser.isContact && (contactUserIds && !contactUserIds.includes(userId))) {\n global = {\n ...global,\n contactList: {\n hash: hash || 0,\n userIds: [userId, ...contactUserIds],\n },\n };\n }\n\n return replaceUsers(global, {\n ...byId,\n [userId]: updatedUser,\n });\n}\n\nexport function updateUsers(global: GlobalState, updatedById: Record): GlobalState {\n Object.keys(updatedById).map(Number).forEach((id) => {\n global = updateUser(global, id, updatedById[id]);\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): GlobalState {\n const { byId } = global.users;\n Object.keys(addedById).map(Number).forEach((id) => {\n if (!byId[id] || (byId[id].isMin && !addedById[id].isMin)) {\n global = updateUser(global, id, addedById[id]);\n }\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","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,\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);\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>;\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): 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 { ISettings } from '../../types';\n\nexport function replaceSettings(global: GlobalState, newSettings?: Partial): 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 updateNotifySettings(\n global: GlobalState, peerType: 'contact' | 'group' | 'broadcast', isSilent?: boolean, isShowPreviews?: boolean,\n) {\n switch (peerType) {\n case 'contact':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasPrivateChatsNotifications: !isSilent }),\n ...(typeof isShowPreviews !== 'undefined' && { hasPrivateChatsMessagePreview: isShowPreviews }),\n });\n case 'group':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasGroupNotifications: !isSilent }),\n ...(typeof isShowPreviews !== 'undefined' && { hasGroupMessagePreview: isShowPreviews }),\n });\n case 'broadcast':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasBroadcastNotifications: !isSilent }),\n ...(typeof isShowPreviews !== 'undefined' && { hasBroadcastMessagePreview: isShowPreviews }),\n });\n\n default:\n return undefined;\n }\n}\n\nexport function addBlockedContact(global: GlobalState, contactId: number): GlobalState {\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 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","import { ChangeEvent, FormEvent, RefObject } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n ref?: RefObject;\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) => void;\n onInput?: (e: FormEvent) => void;\n onKeyPress?: (e: React.KeyboardEvent) => void;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n onBlur?: (e: React.FocusEvent) => void;\n};\n\nconst InputText: FC = ({\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}) => {\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
\n \n {labelText && (\n \n )}\n
\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';\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) => void;\n onCheck?: (isChecked: boolean) => void;\n};\n\nconst Checkbox: FC = ({\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 handleChange = useCallback((event: ChangeEvent) => {\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 \n );\n};\n\nexport default memo(Checkbox);\n","export const DPR = window.devicePixelRatio || 1;\n\nexport const DEFAULT_RANGE = { begin: 0.8, end: 1 };\nexport const TRANSITION_DEFAULT_DURATION = 300;\nexport const LONG_PRESS_TIMEOUT = 500;\n\nexport const GUTTER = 10;\nexport const PLOT_HEIGHT = 320;\nexport const PLOT_TOP_PADDING = 15;\nexport const PLOT_LINE_WIDTH = 2;\nexport const PLOT_PIE_RADIUS_FACTOR = 0.9 / 2;\nexport const PLOT_PIE_SHIFT = 10;\nexport const PLOT_BARS_WIDTH_SHIFT = 0.5;\n\nexport const BALLOON_OFFSET = 20;\n\nexport const AXES_FONT = '300 10px Helvetica, Arial, sans-serif';\nexport const AXES_MAX_COLUMN_WIDTH = 45;\nexport const AXES_MAX_ROW_HEIGHT = 50;\nexport const X_AXIS_HEIGHT = 30;\nexport const X_AXIS_SHIFT_START = 1;\nexport const Y_AXIS_ZERO_BASED_THRESHOLD = 0.1;\n\nexport const MINIMAP_HEIGHT = 40;\nexport const MINIMAP_MARGIN = 10;\nexport const MINIMAP_LINE_WIDTH = 1;\nexport const MINIMAP_EAR_WIDTH = 8;\nexport const MINIMAP_MAX_ANIMATED_DATASETS = 4;\n\nexport const ZOOM_TIMEOUT = TRANSITION_DEFAULT_DURATION;\nexport const ZOOM_RANGE_DELTA = 0.1;\nexport const ZOOM_RANGE_MIDDLE = .5;\n\nexport const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nexport const WEEK_DAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\nexport const WEEK_DAYS_SHORT = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n\nexport const MILISECONDS_IN_DAY = 24 * 60 * 60 * 1000;\n\nexport const SPEED_TEST_INTERVAL = 200;\nexport const SPEED_TEST_FAST_FPS = 4;\n\nexport const SIMPLIFIER_MIN_POINTS = 1000;\nexport const SIMPLIFIER_PLOT_FACTOR = 1;\nexport const SIMPLIFIER_MINIMAP_FACTOR = 0.5;\n\nexport const ANIMATE_PROPS = [\n // Viewport X-axis\n 'begin 200 fast', 'end 200 fast', 'labelFromIndex 200 fast floor', 'labelToIndex 200 fast ceil',\n\n // X-axis labels\n 'xAxisScale 400',\n\n // Viewport Y-axis\n 'yMinViewport', 'yMaxViewport', 'yMinViewportSecond', 'yMaxViewportSecond',\n\n // Minimap Y-axis\n 'yMinMinimap', 'yMaxMinimap', 'yMinMinimapSecond', 'yMaxMinimapSecond',\n\n // Y-axis labels\n 'yAxisScale', 'yAxisScaleSecond',\n];\n","import captureKeyboardListener from './captureKeyboardListeners';\n\ntype IHandlerFunction = () => void;\n\nexport default function captureEscKeyListener(handler: IHandlerFunction) {\n return captureKeyboardListener({ onEsc: handler });\n}\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 document.dispatchEvent(new Event(ANIMATION_START_EVENT));\n isAnimating = true;\n\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n timeout = window.setTimeout(() => {\n isAnimating = false;\n document.dispatchEvent(new Event(ANIMATION_END_EVENT));\n timeout = undefined;\n }, duration);\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","export const MEMO_EMPTY_ARRAY = [];\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","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 { 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';\n\nimport './Menu.scss';\n\ntype OwnProps = {\n ref?: RefObject;\n containerRef?: RefObject;\n isOpen: boolean;\n className?: string;\n style?: string;\n positionX?: 'left' | 'right';\n positionY?: 'top' | 'bottom';\n autoClose?: boolean;\n footer?: string;\n noCloseOnBackdrop?: boolean;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n onCloseAnimationEnd?: () => void;\n onClose?: () => void;\n onMouseEnter?: (e: React.MouseEvent) => void;\n onMouseLeave?: (e: React.MouseEvent) => void;\n children: any;\n};\n\nconst ANIMATION_DURATION = 200;\n\nconst Menu: FC = ({\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}) => {\n // eslint-disable-next-line no-null/no-null\n let menuRef = useRef(null);\n if (ref) {\n menuRef = ref;\n }\n const backdropContainerRef = containerRef || menuRef;\n\n const { transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd);\n\n useEffect(() => (isOpen && onClose ? captureEscKeyListener(onClose) : undefined), [isOpen, onClose]);\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);\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 \n {isOpen && (\n // This only prevents click events triggering on underlying elements\n
\n )}\n \n {children}\n {footer &&
{footer}
}\n
\n \n );\n};\n\nexport default Menu;\n","import { RefObject } from 'react';\nimport { useState, useCallback, useEffect } from '../lib/teact/teact';\n\nexport default (\n elementRef: RefObject,\n isOpen: boolean,\n onSelectWithEnter?: () => void,\n) => {\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n useEffect(() => {\n setFocusedIndex(-1);\n }, [isOpen]);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n const element = elementRef.current;\n\n if (!element) {\n return;\n }\n\n if (e.keyCode === 13 && onSelectWithEnter) {\n onSelectWithEnter();\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(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 }, [focusedIndex, elementRef, onSelectWithEnter]);\n\n return handleKeyDown;\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 {\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();\nconst fetchPromises = new Map>();\n\nexport function fetch(\n url: string, mediaFormat: T, onProgress?: ApiOnProgress,\n): Promise> {\n if (mediaFormat === ApiMediaFormat.Progressive) {\n return (\n IS_PROGRESSIVE_SUPPORTED\n ? getProgressive(url)\n : fetch(url, ApiMediaFormat.BlobUrl, onProgress)\n ) as Promise>;\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>;\n}\n\nexport function getFromMemory(url: string) {\n return memoryCache.get(url) as ApiMediaFormatToPrepared;\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 mimeType = blob.type;\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 { throttle } from './schedulers';\n\ntype IDimensions = {\n width: number;\n height: number;\n};\n\nlet windowSize = updateSizes();\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\nconst handleResize = throttle(() => {\n windowSize = updateSizes();\n}, 250, true);\n\nwindow.addEventListener('resize', handleResize);\nwindow.addEventListener('orientationchange', handleResize);\n\nexport default {\n get: () => windowSize,\n};\n","type HandlerName = 'onEnter' | 'onBackspace' | 'onDelete' | 'onEsc' | 'onUp' | 'onDown' | 'onTab';\ntype Handler = (e: KeyboardEvent) => void;\ntype CaptureOptions = Partial>;\n\nconst keyToHandlerName: Record = {\n Enter: 'onEnter',\n Backspace: 'onBackspace',\n Delete: 'onDelete',\n Esc: 'onEsc',\n Escape: 'onEsc',\n ArrowUp: 'onUp',\n ArrowDown: 'onDown',\n Tab: 'onTab',\n};\n\nconst handlers: Record = {\n onEnter: [],\n onDelete: [],\n onBackspace: [],\n onEsc: [],\n onUp: [],\n onDown: [],\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).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).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","/* 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 { withGlobal } from '../../lib/teact/teactn';\nimport convertPunycode from '../../lib/punycode';\nimport { GlobalActions } from '../../global/types';\n\nimport { DEBUG, RE_TME_INVITE_LINK, RE_TME_LINK } from '../../config';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n url?: string;\n text: string;\n className?: string;\n children?: any;\n};\n\ntype DispatchProps = Pick;\n\nconst SafeLink: FC = ({\n url,\n text,\n className,\n children,\n openTelegramLink,\n}) => {\n const handleClick = useCallback((e: React.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 return true;\n }\n\n e.preventDefault();\n openTelegramLink({ url });\n\n return false;\n }, [openTelegramLink, 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 \n {children || text}\n \n );\n};\n\nfunction getHref(url?: string) {\n if (!url) {\n return undefined;\n }\n\n return url.includes('://') ? url : `http://${url}`;\n}\n\nfunction getDecodedUrl(url?: string) {\n if (!url) {\n return undefined;\n }\n\n const href = getHref(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(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['openTelegramLink']),\n)(SafeLink));\n","import { useEffect } from '../lib/teact/teact';\nimport usePrevious from './usePrevious';\n\nexport default (cb: (args: PT) => void, dependencies: T) => {\n const prevDeps = usePrevious(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","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","const STRIPE_ERRORS: Record> = {\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> = {\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 getShippingError(errors: Record) {\n return Object.values(errors).reduce((acc, cur) => {\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 children: any;\n};\n\nconst DropdownMenu: FC = ({\n trigger,\n className,\n children,\n positionX = 'left',\n positionY = 'top',\n footer,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const menuRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const dropdownRef = useRef(null);\n const [isOpen, setIsOpen] = useState(false);\n\n const toggleIsOpen = () => {\n setIsOpen(!isOpen);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\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 };\n\n return (\n \n {trigger({ onTrigger: toggleIsOpen, isOpen })}\n\n \n {children}\n \n \n );\n};\n\nexport default DropdownMenu;\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 MAPPED_ATTRIBUTES: { [k: string]: string } = {\n autoPlay: 'autoplay',\n autoComplete: 'autocomplete',\n};\nconst INDEX_KEY_PREFIX = '__indexKey#';\n\nconst headsByElement: Record = {};\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);\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);\n } else if (key.startsWith('data-')) {\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);\n } else if (key.startsWith('data-')) {\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","// @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","export interface ApiPhotoSize {\n type: 's' | 'm' | 'x' | 'y' | 'z';\n width: number;\n height: number;\n}\n\nexport interface ApiThumbnail {\n dataUri: string;\n height: number;\n width: number;\n}\n\nexport interface ApiPhoto {\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;\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}\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 targetUserId?: number;\n targetChatId?: number;\n type: 'historyClear' | 'other';\n}\n\nexport interface ApiWebPage {\n id: number;\n url: string;\n displayUrl: string;\n siteName?: string;\n title?: string;\n description?: string;\n photo?: ApiPhoto;\n hasDocument?: true;\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';\nexport type ApiGlobalMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio' | 'voice';\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.\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 extends ApiMediaFormat.Lottie ? AnyLiteral : string;\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).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('disable-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('disable-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","// 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;\n emojis: Record;\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])) {\n category.emojis.push(emojiRaw[1]);\n emojiData.emojis[emojiRaw[1]] = {\n id: emojiRaw[1],\n colons: `:${emojiRaw[1]}:`,\n native: unifiedToNative(emojiRaw[0]),\n image: emojiRaw[0].toLowerCase(),\n };\n }\n }\n\n emojiData.categories.push(category);\n }\n\n return emojiData;\n}\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;\n\nconst MentionLink: FC = ({\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 \n {children}\n \n );\n};\n\nexport default withGlobal(\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 { 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,\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__ + \"b3d5470f7bd89df9a2c7.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"01705582fc3eca0e007b.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"0dbbe0a906f6c2adf071.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"a66075669d8d0ac2d740.worker.js\");\n};","import { addReducer } from '../../../lib/teact/teactn';\n\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';\n\naddReducer('init', (global) => {\n const {\n theme, animationLevel, messageTextSize, language,\n } = global.settings.byKey;\n\n setLanguage(language);\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 > 0);\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","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport {\n LANG_CACHE_NAME,\n CUSTOM_BG_CACHE_NAME,\n GRAMJS_SESSION_ID_KEY,\n MEDIA_CACHE_NAME,\n MEDIA_CACHE_NAME_AVATARS,\n MEDIA_PROGRESSIVE_CACHE_NAME,\n} from '../../../config';\nimport { initApi, callApi } from '../../../api/gramjs';\nimport { unsubscribeFromPush } from '../../../util/pushNotifications';\nimport * as cacheApi from '../../../util/cacheApi';\n\naddReducer('initApi', (global: GlobalState, actions) => {\n const sessionId = localStorage.getItem(GRAMJS_SESSION_ID_KEY) || undefined;\n\n void initApi(actions.apiUpdate, sessionId);\n\n return {\n ...global,\n authIsSessionRemembered: Boolean(sessionId),\n };\n});\n\naddReducer('setAuthPhoneNumber', (global, actions, payload) => {\n const { phoneNumber } = payload!;\n\n void callApi('provideAuthPhoneNumber', phoneNumber);\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('gotToAuthQrCode', (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 { sessionId } = payload!;\n localStorage.setItem(GRAMJS_SESSION_ID_KEY, sessionId);\n});\n\naddReducer('signOut', () => {\n (async () => {\n await unsubscribeFromPush();\n await callApi('destroy');\n\n getDispatch().reset();\n })();\n});\n\naddReducer('reset', () => {\n localStorage.removeItem(GRAMJS_SESSION_ID_KEY);\n\n cacheApi.clear(MEDIA_CACHE_NAME);\n cacheApi.clear(MEDIA_CACHE_NAME_AVATARS);\n cacheApi.clear(MEDIA_PROGRESSIVE_CACHE_NAME);\n cacheApi.clear(CUSTOM_BG_CACHE_NAME);\n cacheApi.clear(LANG_CACHE_NAME);\n\n getDispatch().init();\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","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 ApiUpdateCurrentUser,\n} from '../../../api/types';\nimport { DEBUG } from '../../../config';\nimport { subscribeToPush } from '../../../util/pushNotifications';\nimport { updateUser } from '../../reducers';\nimport { setLanguage } from '../../../util/langProvider';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n if (DEBUG) {\n if (update['@type'] !== 'updateUserStatus') {\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 'updateCurrentUser':\n onUpdateCurrentUser(update);\n break;\n\n case 'error':\n if (update.error.message === 'SESSION_REVOKED') {\n actions.signOut();\n }\n\n actions.showError({ error: update.error });\n\n break;\n }\n});\n\nfunction onUpdateApiReady(global: GlobalState) {\n subscribeToPush();\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 const { sessionId } = update;\n if (sessionId && global.authRememberMe) {\n getDispatch().saveSession({ sessionId });\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 onUpdateCurrentUser(update: ApiUpdateCurrentUser) {\n const { currentUser } = update;\n\n setGlobal({\n ...updateUser(getGlobal(), currentUser.id, currentUser),\n currentUserId: currentUser.id,\n });\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_SERVICE_WORKER_SUPPORTED } from './environment';\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('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('ServiceWorker ready');\n }\n } else {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('ServiceWorker not available');\n }\n getDispatch().showError({ error: { message: 'SERVICE_WORKER_DISABLED' } });\n }\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('ServiceWorker registration failed: ', err);\n }\n }\n });\n}\n","import { GlobalState } from './types';\n\nimport { ANIMATION_LEVEL_DEFAULT, DEFAULT_MESSAGE_TEXT_SIZE_PX, DEFAULT_PATTERN_COLOR } from '../config';\n\nexport const INITIAL_STATE: GlobalState = {\n isLeftColumnShown: true,\n isChatInfoShown: false,\n uiReadyState: 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 },\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 gifs: {\n saved: {},\n search: {},\n },\n\n globalSearch: {},\n\n localTextSearch: {\n byChatThreadKey: {},\n },\n\n localMediaSearch: {\n byChatId: {},\n },\n\n management: {\n byChatId: {},\n },\n\n topPeers: {},\n\n mediaViewer: {},\n\n audioPlayer: {},\n\n forwardMessages: {},\n\n pollResults: {},\n\n payment: {},\n\n notifications: [],\n\n errors: [],\n\n activeSessions: [],\n\n settings: {\n byKey: {\n messageTextSize: DEFAULT_MESSAGE_TEXT_SIZE_PX,\n isBackgroundBlurred: true,\n patternColor: DEFAULT_PATTERN_COLOR,\n animationLevel: ANIMATION_LEVEL_DEFAULT,\n messageSendKeyCombo: 'enter',\n theme: 'light',\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 privacy: {},\n },\n\n twoFaSettings: {},\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 { 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 GRAMJS_SESSION_ID_KEY,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN, GLOBAL_STATE_CACHE_USER_LIST_LIMIT,\n} from '../config';\nimport { IS_MOBILE_SCREEN } from '../util/environment';\nimport { pick } from '../util/iteratees';\nimport { INITIAL_STATE } from './initial';\nimport { selectCurrentMessageList } from '../modules/selectors';\n\nconst UPDATE_THROTTLE = 1000;\n\nconst updateCacheThrottled = throttle(updateCache, UPDATE_THROTTLE, false);\n\nlet isAllowed = false;\n\nexport function initCache() {\n if (GLOBAL_STATE_CACHE_DISABLED) {\n return;\n }\n\n addReducer('saveSession', () => {\n isAllowed = true;\n addCallback(updateCacheThrottled);\n });\n\n addReducer('reset', () => {\n isAllowed = false;\n removeCallback(updateCacheThrottled);\n localStorage.removeItem(GLOBAL_STATE_CACHE_KEY);\n });\n}\n\nexport function loadCache(initialState: GlobalState) {\n if (!GLOBAL_STATE_CACHE_DISABLED) {\n const hasActiveSession = localStorage.getItem(GRAMJS_SESSION_ID_KEY);\n if (hasActiveSession) {\n isAllowed = true;\n addCallback(updateCacheThrottled);\n return readCache(initialState);\n } else {\n isAllowed = false;\n }\n }\n\n return undefined;\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 for new settings which may be missing in older cache\n cached.settings.byKey = {\n ...initialState.settings.byKey,\n ...cached.settings.byKey,\n };\n }\n\n return {\n ...initialState,\n ...cached,\n };\n}\n\nfunction updateCache() {\n onIdle(() => {\n if (!isAllowed) {\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 'authIsSessionRemembered',\n 'authNearestCountry',\n 'currentUserId',\n 'contactList',\n 'chatFolders',\n 'topPeers',\n 'recentEmojis',\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 };\n\n const json = JSON.stringify(reducedGlobal);\n localStorage.setItem(GLOBAL_STATE_CACHE_KEY, json);\n });\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_MOBILE_SCREEN ? undefined : [{\n ...currentMessageList,\n threadId: MAIN_THREAD_ID,\n type: 'thread',\n }],\n };\n}\n\nfunction reduceSettings(global: GlobalState): GlobalState['settings'] {\n const { byKey } = global.settings;\n\n return {\n byKey,\n privacy: {},\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';\nimport { selectCurrentMessageList } from '../modules/selectors';\n\ninitCache();\n\naddReducer('init', () => {\n const initial = cloneDeep(INITIAL_STATE);\n const newGlobal = loadCache(initial) || initial;\n\n const currentMessageList = selectCurrentMessageList(newGlobal) || {};\n window.history.replaceState(currentMessageList, '');\n\n return newGlobal;\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 } from '../../modules/selectors';\n\ntype OwnProps = {\n page: 'main' | 'authCode' | 'authPassword' | 'authPhoneNumber' | 'authQrCode';\n children: any;\n};\n\ntype StateProps = Pick & {\n hasCustomBackground?: boolean;\n isCustomBackgroundColor: boolean;\n isRightColumnShown?: boolean;\n};\n\ntype DispatchProps = Pick;\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 = ({\n page,\n children,\n hasCustomBackground,\n isCustomBackgroundColor,\n isRightColumnShown,\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 Promise.race([\n pause(MAX_PRELOAD_DELAY),\n preloadTasks[page](),\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
\n {children}\n {shouldRenderMask && (\n
\n {page === 'main' ? (\n <>\n
\n \n {isRightColumnShown &&
}\n \n ) : (\n
\n )}\n
\n )}\n
\n );\n};\n\nexport default withGlobal(\n (global): StateProps => {\n return {\n uiReadyState: global.uiReadyState,\n hasCustomBackground: Boolean(global.settings.byKey.customBackground),\n isCustomBackgroundColor: Boolean((global.settings.byKey.customBackground || '').match(/^#[a-f\\d]{6,8}$/i)),\n isRightColumnShown: selectIsRightColumnShown(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setIsUiReady']),\n)(UiLoader);\n","import React, {\n FC, useState, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\n\nimport { countryList } from '../../util/phoneNumber';\nimport searchWords from '../../util/searchWords';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from '../common/helpers/renderText';\n\nimport DropdownMenu from '../ui/DropdownMenu';\nimport MenuItem from '../ui/MenuItem';\nimport Spinner from '../ui/Spinner';\n\nimport './CountryCodeInput.scss';\nimport { ANIMATION_END_DELAY } from '../../config';\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 = ({\n id,\n value,\n isLoading,\n onChange,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [filter, setFilter] = useState();\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) => {\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) => {\n updateFilter(e.currentTarget.value);\n }, []);\n\n const handleInputKeyDown = useCallback((e: React.KeyboardEvent) => {\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
\n \n \n {isLoading ? (\n \n ) : (\n \n )}\n
\n );\n };\n\n return (\n \n {filteredList.map((country: Country) => (\n \n \n {renderText(country.flag, ['hq_emoji'])}\n {country.name}\n {country.code}\n \n ))}\n {!filteredList.length && (\n \n No countries matched your filter.\n \n )}\n \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 { GlobalActions, GlobalState } from '../../global/types';\nimport React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\nimport { 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';\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;\ntype DispatchProps = Pick;\n\nconst MIN_NUMBER_LENGTH = 10;\n\nlet isPreloadInitiated = false;\n\nconst AuthPhoneNumber: FC = ({\n connectionState,\n authState,\n authPhoneNumber,\n authIsLoading,\n authIsLoadingQrCode,\n authError,\n authRememberMe,\n authNearestCountry,\n setAuthPhoneNumber,\n setAuthRememberMe,\n loadNearestCountry,\n clearAuthError,\n gotToAuthQrCode,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [country, setCountry] = useState();\n const [phoneNumber, setPhoneNumber] = useState();\n const [isTouched, setIsTouched] = useState(false);\n const [lastSelection, setLastSelection] = useState<[number, number] | undefined>();\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 const suggestedCountry = getCountryFromPhoneNumber(newFullNumber);\n const selectedCountry = !country || (suggestedCountry && suggestedCountry.id !== country.id)\n ? suggestedCountry\n : country;\n\n if (!newFullNumber.length) {\n setCountry(undefined);\n } else if (!country || (selectedCountry && selectedCountry.code !== country.code)) {\n setCountry(selectedCountry);\n }\n\n setPhoneNumber(formatPhoneNumber(newFullNumber, selectedCountry));\n }, [country]);\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 handlePhoneNumberChange = useCallback((e: ChangeEvent) => {\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 parseFullNumber(value);\n }, [authError, clearAuthError, parseFullNumber]);\n\n const handleKeepSessionChange = useCallback((e: ChangeEvent) => {\n setAuthRememberMe(e.target.checked);\n }, [setAuthRememberMe]);\n\n function handleSubmit(event: React.FormEvent) {\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
\n
\n
\n

Sign in to Telegram

\n

\n Please confirm your country and\n
enter your phone number.\n

\n
\n \n \n \n {canSubmit && (\n isAuthReady ? (\n \n ) : (\n \n )\n )}\n {isAuthReady && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, [\n 'connectionState',\n 'authState',\n 'authPhoneNumber',\n 'authIsLoading',\n 'authIsLoadingQrCode',\n 'authError',\n 'authRememberMe',\n 'authNearestCountry',\n ]),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setAuthPhoneNumber',\n 'setAuthRememberMe',\n 'clearAuthError',\n 'loadNearestCountry',\n 'gotToAuthQrCode',\n ]),\n)(AuthPhoneNumber));\n","import React, { FC } 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 ? : ;\n};\n\nexport default AuthCodeAsync;\n","import React, { FC } 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 ? : ;\n};\n\nexport default AuthPasswordAsync;\n","import React, { FC } 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 ? : ;\n};\n\nexport default AuthRegisterAsync;\n","import React, { FC } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthQrCodeAsync: FC = () => {\n const AuthQrCode = useModuleLoader(Bundles.Auth, 'AuthQrCode');\n\n return AuthQrCode ? : ;\n};\n\nexport default AuthQrCodeAsync;\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';\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.async';\n\nimport './Auth.scss';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst Auth: FC = ({ authState, reset, initApi }) => {\n useEffect(() => {\n reset();\n initApi();\n }, [reset, initApi]);\n\n useEffect(() => {\n }, []);\n\n switch (authState) {\n case 'authorizationStateWaitCode':\n return ;\n case 'authorizationStateWaitPassword':\n return ;\n case 'authorizationStateWaitRegistration':\n return ;\n case 'authorizationStateWaitQrCode':\n return ;\n case 'authorizationStateWaitPhoneNumber':\n default:\n return ;\n }\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authState']),\n (global, actions): DispatchProps => pick(actions, ['reset', 'initApi']),\n)(Auth));\n","import React, { FC } 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 ?
: undefined;\n};\n\nexport default MainAsync;\n","import { FC, useEffect } from './lib/teact/teact';\nimport React, { withGlobal } from './lib/teact/teactn';\n\nimport { GlobalState } from './global/types';\n\nimport { pick } from './util/iteratees';\nimport { updateSizes } from './util/windowSize';\n\nimport Auth from './components/auth/Auth';\nimport UiLoader from './components/common/UiLoader';\nimport Main from './components/main/Main.async';\n// import Test from './components/test/TestNoRedundancy';\n\ntype StateProps = Pick;\n\nconst App: FC = ({ authState, authIsSessionRemembered }) => {\n useEffect(() => {\n updateSizes();\n }, []);\n\n // return ;\n\n if (authState) {\n switch (authState) {\n case 'authorizationStateWaitPhoneNumber':\n case 'authorizationStateWaitCode':\n case 'authorizationStateWaitPassword':\n case 'authorizationStateWaitRegistration':\n case 'authorizationStateWaitQrCode':\n return ;\n case 'authorizationStateClosed':\n case 'authorizationStateClosing':\n case 'authorizationStateLoggingOut':\n case 'authorizationStateReady':\n return renderMain();\n }\n }\n\n return authIsSessionRemembered ? renderMain() : ;\n};\n\nfunction renderMain() {\n return (\n \n
\n \n );\n}\n\nexport default withGlobal(\n (global): StateProps => pick(global, ['authState', 'authIsSessionRemembered']),\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 ,\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":""}