mirror of
https://github.com/danog/telegram-tt.git
synced 2024-11-27 04:45:08 +01:00
1 line
1.0 MiB
1 line
1.0 MiB
{"version":3,"file":"main.cc383ce401a379e350a0.js","mappings":"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AAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,I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M,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAAO,uBAAuB,KAA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","sources":["webpack://telegram-t/webpack/runtime/create fake namespace object","webpack://telegram-t/webpack/runtime/load script","webpack://telegram-t/webpack/runtime/css loading","webpack://telegram-t/./src/api/gramjs/worker/provider.ts","webpack://telegram-t/./src/api/types/media.ts","webpack://telegram-t/./src/api/types/messages.ts","webpack://telegram-t/./src/components/common/AnimatedIcon.tsx","webpack://telegram-t/./src/components/common/AnimatedSticker.tsx","webpack://telegram-t/./src/lib/punycode.js","webpack://telegram-t/./src/components/common/SafeLink.tsx","webpack://telegram-t/./src/components/common/helpers/animatedAssets.ts","webpack://telegram-t/./src/components/common/helpers/documentInfo.ts","webpack://telegram-t/./src/components/common/helpers/parseEmojiOnlyString.ts","webpack://telegram-t/./src/components/common/UserLink.tsx","webpack://telegram-t/./src/components/common/MessageLink.tsx","webpack://telegram-t/./src/components/common/ChatLink.tsx","webpack://telegram-t/./src/components/common/GroupCallLink.tsx","webpack://telegram-t/./src/components/common/helpers/renderActionMessageText.tsx","webpack://telegram-t/./src/components/common/helpers/renderMessageText.ts","webpack://telegram-t/./src/components/common/helpers/renderText.tsx","webpack://telegram-t/./src/components/common/spoiler/Spoiler.tsx","webpack://telegram-t/./src/components/common/code/CodeOverlay.module.scss?733a","webpack://telegram-t/./src/components/common/code/CodeOverlay.tsx","webpack://telegram-t/./src/components/common/code/PreBlock.tsx","webpack://telegram-t/./src/components/common/code/CodeBlock.tsx","webpack://telegram-t/./src/components/common/helpers/renderTextWithEntities.tsx","webpack://telegram-t/./src/components/middle/helpers/preventMessageInputBlur.ts","webpack://telegram-t/./src/components/middle/message/MentionLink.tsx","webpack://telegram-t/./src/components/ui/Button.tsx","webpack://telegram-t/./src/components/ui/Checkbox.tsx","webpack://telegram-t/./src/components/ui/DropdownMenu.tsx","webpack://telegram-t/./src/components/ui/InputText.tsx","webpack://telegram-t/./src/components/ui/Link.tsx","webpack://telegram-t/./src/components/ui/Loading.tsx","webpack://telegram-t/./src/components/ui/Menu.tsx","webpack://telegram-t/./src/components/ui/MenuItem.tsx","webpack://telegram-t/./src/components/ui/RippleEffect.tsx","webpack://telegram-t/./src/components/ui/Spinner.tsx","webpack://telegram-t/./src/components/ui/Transition.tsx","webpack://telegram-t/./src/config.ts","webpack://telegram-t/./src/global/actions/api/initial.ts","webpack://telegram-t/./src/global/actions/api/settings.ts","webpack://telegram-t/./src/global/actions/apiUpdaters/initial.ts","webpack://telegram-t/./src/global/actions/ui/initial.ts","webpack://telegram-t/./src/global/actions/ui/settings.ts","webpack://telegram-t/./src/global/cache.ts","webpack://telegram-t/./src/global/helpers/chats.ts","webpack://telegram-t/./src/global/helpers/messages.ts","webpack://telegram-t/./src/global/helpers/reactions.ts","webpack://telegram-t/./src/global/helpers/messageSummary.ts","webpack://telegram-t/./src/global/helpers/messageMedia.ts","webpack://telegram-t/./src/global/helpers/localSearch.ts","webpack://telegram-t/./src/global/helpers/payments.ts","webpack://telegram-t/./src/global/helpers/bots.ts","webpack://telegram-t/./src/global/helpers/media.ts","webpack://telegram-t/./src/global/helpers/users.ts","webpack://telegram-t/./src/global/index.ts","webpack://telegram-t/./src/global/initialState.ts","webpack://telegram-t/./src/global/reducers/chats.ts","webpack://telegram-t/./src/global/reducers/symbols.ts","webpack://telegram-t/./src/global/reducers/users.ts","webpack://telegram-t/./src/global/reducers/globalSearch.ts","webpack://telegram-t/./src/global/reducers/localSearch.ts","webpack://telegram-t/./src/global/reducers/management.ts","webpack://telegram-t/./src/global/reducers/settings.ts","webpack://telegram-t/./src/global/reducers/twoFaSettings.ts","webpack://telegram-t/./src/global/reducers/passcode.ts","webpack://telegram-t/./src/global/reducers/payments.ts","webpack://telegram-t/./src/global/reducers/statistics.ts","webpack://telegram-t/./src/global/reducers/messages.ts","webpack://telegram-t/./src/global/selectors/chats.ts","webpack://telegram-t/./src/global/selectors/symbols.ts","webpack://telegram-t/./src/global/selectors/messages.ts","webpack://telegram-t/./src/global/selectors/localSearch.ts","webpack://telegram-t/./src/global/selectors/statistics.ts","webpack://telegram-t/./src/global/selectors/management.ts","webpack://telegram-t/./src/global/selectors/ui.ts","webpack://telegram-t/./src/global/selectors/globalSearch.ts","webpack://telegram-t/./src/global/selectors/payments.ts","webpack://telegram-t/./src/global/selectors/settings.ts","webpack://telegram-t/./src/global/selectors/users.ts","webpack://telegram-t/./src/hooks/useAsync.ts","webpack://telegram-t/./src/hooks/useBackgroundMode.ts","webpack://telegram-t/./src/hooks/useCurrentOrPrev.ts","webpack://telegram-t/./src/hooks/useDebouncedCallback.ts","webpack://telegram-t/./src/hooks/useEffectWithPrevDeps.ts","webpack://telegram-t/./src/hooks/useFlag.ts","webpack://telegram-t/./src/hooks/useForceUpdate.ts","webpack://telegram-t/./src/hooks/useHeavyAnimationCheck.ts","webpack://telegram-t/./src/hooks/useHistoryBack.ts","webpack://telegram-t/./src/hooks/useKeyboardListNavigation.ts","webpack://telegram-t/./src/hooks/useLang.ts","webpack://telegram-t/./src/hooks/useMediaTransition.ts","webpack://telegram-t/./src/hooks/useModuleLoader.ts","webpack://telegram-t/./src/hooks/useOnChange.ts","webpack://telegram-t/./src/hooks/usePrevious.ts","webpack://telegram-t/./src/hooks/useShowTransition.ts","webpack://telegram-t/./src/hooks/useVirtualBackdrop.ts","webpack://telegram-t/./src/hooks/useWindowSize.ts","webpack://telegram-t/./src/lib/teact/dom-events.ts","webpack://telegram-t/./src/lib/teact/teact-dom.ts","webpack://telegram-t/./src/lib/teact/teact.ts","webpack://telegram-t/./src/lib/teact/teactn.tsx","webpack://telegram-t/./src/lib/twemojiRegex.js","webpack://telegram-t/./src/types/index.ts","webpack://telegram-t/./src/util/animation.ts","webpack://telegram-t/./src/util/appBadge.ts","webpack://telegram-t/./src/util/arePropsShallowEqual.ts","webpack://telegram-t/./src/util/buildClassName.ts","webpack://telegram-t/./src/util/buildStyle.ts","webpack://telegram-t/./src/util/cacheApi.ts","webpack://telegram-t/./src/util/callbacks.ts","webpack://telegram-t/./src/util/captureEscKeyListener.ts","webpack://telegram-t/./src/util/captureKeyboardListeners.ts","webpack://telegram-t/./src/util/clipboard.ts","webpack://telegram-t/./src/util/cssAnimationEndListeners.ts","webpack://telegram-t/./src/util/dateFormat.ts","webpack://telegram-t/./src/util/emoji.ts","webpack://telegram-t/./src/util/ensureProtocol.ts","webpack://telegram-t/./src/util/environmentWebp.ts","webpack://telegram-t/./src/util/environmentSystemTheme.ts","webpack://telegram-t/./src/util/environment.ts","webpack://telegram-t/./src/util/files.ts","webpack://telegram-t/./src/util/folderManager.ts","webpack://telegram-t/./src/util/forceReflow.ts","webpack://telegram-t/./src/util/formatCurrency.ts","webpack://telegram-t/./src/util/generateIdFor.ts","webpack://telegram-t/./src/util/getReadableErrorText.ts","webpack://telegram-t/./src/util/handleError.ts","webpack://telegram-t/./src/util/installPrompt.ts","webpack://telegram-t/./src/util/iteratees.ts","webpack://telegram-t/./src/util/langProvider.ts","webpack://telegram-t/./src/util/math.ts","webpack://telegram-t/./src/util/oggToWav.ts","webpack://telegram-t/./src/util/mediaLoader.ts","webpack://telegram-t/./src/util/memo.ts","webpack://telegram-t/./src/util/moduleLoader.ts","webpack://telegram-t/./src/util/notifications.ts","webpack://telegram-t/./src/util/passcode.ts","webpack://telegram-t/./src/util/phoneNumber.ts","webpack://telegram-t/./src/util/routing.ts","webpack://telegram-t/./src/util/schedulers.ts","webpack://telegram-t/./src/util/searchWords.ts","webpack://telegram-t/./src/util/serverTime.ts","webpack://telegram-t/./node_modules/idb-keyval/dist/index.js","webpack://telegram-t/./node_modules/safari-14-idb-fix/dist/index.js","webpack://telegram-t/./src/util/sessions.ts","webpack://telegram-t/./src/util/switchTheme.ts","webpack://telegram-t/./src/util/textFormat.ts","webpack://telegram-t/./src/util/trimText.ts","webpack://telegram-t/./src/util/webpToPng.ts","webpack://telegram-t/./src/util/websync.ts","webpack://telegram-t/./src/util/windowSize.ts","webpack://telegram-t/./src/util/withCache.ts","webpack://telegram-t/./node_modules/qr-code-styling/lib/qr-code-styling.js","webpack://telegram-t/webpack/bootstrap","webpack://telegram-t/webpack/runtime/compat get default export","webpack://telegram-t/webpack/runtime/define property getters","webpack://telegram-t/webpack/runtime/ensure chunk","webpack://telegram-t/webpack/runtime/get javascript chunk filename","webpack://telegram-t/webpack/runtime/get mini-css chunk filename","webpack://telegram-t/webpack/runtime/global","webpack://telegram-t/webpack/runtime/hasOwnProperty shorthand","webpack://telegram-t/webpack/runtime/make namespace object","webpack://telegram-t/webpack/runtime/publicPath","webpack://telegram-t/webpack/runtime/jsonp chunk loading","webpack://telegram-t/./src/util/setupServiceWorker.ts","webpack://telegram-t/./src/global/init.ts","webpack://telegram-t/./src/util/activeTabMonitor.ts","webpack://telegram-t/./src/util/fonts.ts","webpack://telegram-t/./src/hooks/useLangString.ts","webpack://telegram-t/./src/components/auth/helpers/getSuggestedLanguage.ts","webpack://telegram-t/./src/components/auth/CountryCodeInput.tsx","webpack://telegram-t/./src/components/auth/AuthPhoneNumber.tsx","webpack://telegram-t/./src/components/auth/AuthCode.async.tsx","webpack://telegram-t/./src/components/auth/AuthPassword.async.tsx","webpack://telegram-t/./src/components/auth/AuthRegister.async.tsx","webpack://telegram-t/./src/components/auth/AuthQrCode.tsx","webpack://telegram-t/./src/components/auth/Auth.tsx","webpack://telegram-t/./src/components/main/Main.async.tsx","webpack://telegram-t/./src/components/main/LockScreen.async.tsx","webpack://telegram-t/./src/components/main/AppInactive.tsx","webpack://telegram-t/./src/components/common/UiLoader.module.scss?03f6","webpack://telegram-t/./src/components/common/UiLoader.tsx","webpack://telegram-t/./src/App.tsx","webpack://telegram-t/./src/index.tsx","webpack://telegram-t/./src/util/updateWebmanifest.ts"],"sourcesContent":["var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"telegram-t:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\t;\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","var createStylesheet = (chunkId, fullhref, resolve, reject) => {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tvar onLinkComplete = (event) => {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + realHref + \")\");\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tlinkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\tdocument.head.appendChild(linkTag);\n\treturn linkTag;\n};\nvar findStylesheet = (href, fullhref) => {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = (chunkId) => {\n\treturn new Promise((resolve, reject) => {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t179: 0\n};\n\n__webpack_require__.f.miniCss = (chunkId, promises) => {\n\tvar cssChunks = {\"3041\":1,\"3472\":1,\"3779\":1,\"5769\":1,\"7916\":1,\"8878\":1,\"9954\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(() => {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, (e) => {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr","import type { Api } from '../../../lib/gramjs';\nimport type { ApiInitialArgs, ApiOnProgress, OnApiUpdate } from '../../types';\nimport type { Methods, MethodArgs, MethodResponse } from '../methods/types';\nimport type { WorkerMessageEvent, OriginRequest } from './types';\n\nimport { DEBUG } from '../../../config';\nimport generateIdFor from '../../../util/generateIdFor';\nimport { pause } from '../../../util/schedulers';\n\ntype RequestStates = {\n messageId: string;\n resolve: Function;\n reject: Function;\n callback?: AnyToVoidFunction;\n};\n\nconst HEALTH_CHECK_TIMEOUT = 150;\nconst HEALTH_CHECK_MIN_DELAY = 5 * 1000; // 5 sec\n\nlet worker: Worker;\nconst requestStates = new Map<string, RequestStates>();\nconst requestStatesByCallback = new Map<AnyToVoidFunction, RequestStates>();\n\n// TODO Re-use `util/WorkerConnector.ts`\n\nexport function initApi(onUpdate: OnApiUpdate, initialArgs: ApiInitialArgs) {\n if (!worker) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START LOAD WORKER');\n }\n\n worker = new Worker(new URL('./worker.ts', import.meta.url));\n subscribeToWorker(onUpdate);\n\n if (initialArgs.platform === 'iOS') {\n setupIosHealthCheck();\n }\n }\n\n return makeRequest({\n type: 'initApi',\n args: [initialArgs],\n });\n}\n\nexport function callApi<T extends keyof Methods>(fnName: T, ...args: MethodArgs<T>) {\n if (!worker) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('API is not initialized');\n }\n\n return undefined;\n }\n\n const promise = makeRequest({\n type: 'callMethod',\n name: fnName,\n args,\n });\n\n // Some TypeScript magic to make sure `VirtualClass` is never returned from any method\n if (DEBUG) {\n (async () => {\n try {\n type ForbiddenTypes =\n Api.VirtualClass<any>\n | (Api.VirtualClass<any> | undefined)[];\n type ForbiddenResponses =\n ForbiddenTypes\n | (AnyLiteral & { [k: string]: ForbiddenTypes });\n\n // Unwrap all chained promises\n const response = await promise;\n // Make sure responses do not include `VirtualClass` instances\n const allowedResponse: Exclude<typeof response, ForbiddenResponses> = response;\n // Suppress \"unused variable\" constraint\n void allowedResponse;\n } catch (err) {\n // Do noting\n }\n })();\n }\n\n return promise as MethodResponse<T>;\n}\n\nexport function cancelApiProgress(progressCallback: ApiOnProgress) {\n progressCallback.isCanceled = true;\n\n const { messageId } = requestStatesByCallback.get(progressCallback) || {};\n if (!messageId) {\n return;\n }\n\n worker.postMessage({\n type: 'cancelProgress',\n messageId,\n });\n}\n\nfunction subscribeToWorker(onUpdate: OnApiUpdate) {\n worker.addEventListener('message', ({ data }: WorkerMessageEvent) => {\n if (data.type === 'update') {\n onUpdate(data.update);\n } else if (data.type === 'methodResponse') {\n const requestState = requestStates.get(data.messageId);\n if (requestState) {\n if (data.error) {\n requestState.reject(data.error);\n } else {\n requestState.resolve(data.response);\n }\n }\n } else if (data.type === 'methodCallback') {\n requestStates.get(data.messageId)?.callback?.(...data.callbackArgs);\n } else if (data.type === 'unhandledError') {\n throw new Error(data.error?.message);\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<MethodResponse<keyof Methods>> = new Promise((resolve, reject) => {\n Object.assign(requestState, { resolve, reject });\n });\n\n if (('args' in payload) && 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\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\nconst startedAt = Date.now();\n\n// Workaround for iOS sometimes stops interacting with worker\nfunction setupIosHealthCheck() {\n window.addEventListener('focus', () => {\n void ensureWorkerPing();\n // Sometimes a single check is not enough\n setTimeout(() => ensureWorkerPing(), 1000);\n });\n}\n\nasync function ensureWorkerPing() {\n let isResolved = false;\n\n try {\n await Promise.race([\n makeRequest({ type: 'ping' }),\n pause(HEALTH_CHECK_TIMEOUT)\n .then(() => (isResolved ? undefined : Promise.reject(new Error('HEALTH_CHECK_TIMEOUT')))),\n ]);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n\n if (Date.now() - startedAt >= HEALTH_CHECK_MIN_DELAY) {\n window.location.reload();\n }\n } finally {\n isResolved = true;\n }\n}\n","// We cache avatars as Data URI for faster initial load\n// and messages media as Blob for smaller size.\n\nexport enum ApiMediaFormat {\n BlobUrl,\n Progressive,\n Stream,\n DownloadUrl,\n Text,\n}\n\nexport type ApiParsedMedia = string | Blob | ArrayBuffer;\nexport type ApiPreparedMedia = string;\n","import type { ApiWebDocument } from './bots';\nimport type { ApiGroupCall, PhoneCallAction } from './calls';\nimport type { ApiChat } from './chats';\n\nexport interface ApiDimensions {\n width: number;\n height: number;\n}\n\nexport interface ApiPhotoSize extends ApiDimensions {\n type: 's' | 'm' | 'x' | 'y' | 'z';\n}\n\nexport interface ApiVideoSize extends ApiDimensions {\n type: 'u' | 'v';\n videoStartTs: number;\n size: number;\n}\n\nexport interface ApiThumbnail extends ApiDimensions {\n dataUri: string;\n}\n\nexport interface ApiPhoto {\n id: string;\n thumbnail?: ApiThumbnail;\n isVideo?: boolean;\n sizes: ApiPhotoSize[];\n videoSizes?: ApiVideoSize[];\n blobUrl?: string;\n}\n\nexport interface ApiSticker {\n id: string;\n stickerSetId: string;\n stickerSetAccessHash?: string;\n emoji?: string;\n isLottie: boolean;\n isVideo: boolean;\n width?: number;\n height?: number;\n thumbnail?: ApiThumbnail;\n isPreloadedGlobally?: boolean;\n hasEffect?: boolean;\n}\n\nexport interface ApiStickerSet {\n archived?: true;\n isLottie?: true;\n isVideos?: true;\n installedDate?: number;\n id: string;\n accessHash: string;\n title: string;\n hasThumbnail?: boolean;\n count: number;\n stickers?: ApiSticker[];\n packs?: Record<string, ApiSticker[]>;\n covers?: ApiSticker[];\n shortName: string;\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 id: string;\n size: number;\n mimeType: string;\n fileName: string;\n duration: number;\n performer?: string;\n title?: string;\n thumbnailSizes?: ApiPhotoSize[];\n}\n\nexport interface ApiVoice {\n id: string;\n duration: number;\n waveform?: number[];\n}\n\nexport interface ApiDocument {\n id?: string;\n fileName: string;\n size: number;\n timestamp?: number;\n mimeType: string;\n thumbnail?: ApiThumbnail;\n previewBlobUrl?: string;\n mediaType?: 'photo' | 'video';\n mediaSize?: ApiDimensions;\n}\n\nexport interface ApiContact {\n firstName: string;\n lastName: string;\n phoneNumber: string;\n userId: string;\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 isMin?: true;\n results?: ApiPollResult[];\n totalVoters?: number;\n recentVoterIds?: string[];\n solution?: string;\n solutionEntities?: ApiMessageEntity[];\n };\n}\n\n// First type used for state, second - for API requests\nexport type ApiInputInvoice = {\n chatId: string;\n messageId: number;\n} | {\n slug: string;\n};\n\nexport type ApiRequestInputInvoice = {\n chat: ApiChat;\n messageId: number;\n} | {\n slug: string;\n};\n\nexport interface ApiInvoice {\n text: string;\n title: string;\n photo?: ApiWebDocument;\n amount: number;\n currency: string;\n receiptMsgId?: number;\n isTest?: boolean;\n isRecurring?: boolean;\n recurringTermsUrl?: string;\n}\n\ninterface ApiGeoPoint {\n long: number;\n lat: number;\n accessHash: string;\n accuracyRadius?: number;\n}\n\ninterface ApiGeo {\n type: 'geo';\n geo: ApiGeoPoint;\n}\n\ninterface ApiVenue {\n type: 'venue';\n geo: ApiGeoPoint;\n title: string;\n address: string;\n provider: string;\n venueId: string;\n venueType: string;\n}\n\ninterface ApiGeoLive {\n type: 'geoLive';\n geo: ApiGeoPoint;\n heading?: number;\n period: number;\n}\n\nexport type ApiLocation = ApiGeo | ApiVenue | ApiGeoLive;\n\nexport type ApiGame = {\n title: string;\n description: string;\n photo?: ApiPhoto;\n shortName: string;\n id: string;\n accessHash: string;\n document?: ApiDocument;\n};\n\nexport type ApiNewPoll = {\n summary: ApiPoll['summary'];\n quiz?: {\n correctAnswers: string[];\n solution?: string;\n solutionEntities?: ApiMessageEntity[];\n };\n};\n\nexport interface ApiAction {\n text: string;\n targetUserIds?: string[];\n targetChatId?: string;\n type: 'historyClear' | 'contactSignUp' | 'chatCreate' | 'other';\n photo?: ApiPhoto;\n amount?: number;\n currency?: string;\n translationValues: string[];\n call?: Partial<ApiGroupCall>;\n phoneCall?: PhoneCallAction;\n score?: number;\n}\n\nexport interface ApiWebPage {\n id: number;\n url: string;\n displayUrl: string;\n type?: string;\n siteName?: string;\n title?: string;\n description?: string;\n photo?: ApiPhoto;\n duration?: number;\n document?: ApiDocument;\n video?: ApiVideo;\n}\n\nexport interface ApiMessageForwardInfo {\n date: number;\n isChannelPost: boolean;\n channelPostId?: number;\n isLinkedChannelPost?: boolean;\n fromChatId?: string;\n senderUserId?: string;\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?: string;\n url?: string;\n language?: 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 Spoiler = 'MessageEntitySpoiler',\n Unknown = 'MessageEntityUnknown',\n}\n\nexport interface ApiFormattedText {\n text: string;\n entities?: ApiMessageEntity[];\n}\n\nexport interface ApiMessage {\n id: number;\n chatId: string;\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 location?: ApiLocation;\n game?: ApiGame;\n };\n date: number;\n isOutgoing: boolean;\n senderId?: string;\n replyToChatId?: string;\n replyToMessageId?: number;\n replyToTopMessageId?: number;\n sendingState?: 'messageSendingStatePending' | 'messageSendingStateFailed';\n forwardInfo?: ApiMessageForwardInfo;\n isDeleting?: boolean;\n previousLocalId?: number;\n views?: number;\n forwards?: number;\n isEdited?: boolean;\n editDate?: number;\n isMentioned?: boolean;\n isMediaUnread?: boolean;\n groupedId?: string;\n isInAlbum?: boolean;\n hasUnreadMention?: boolean;\n inlineButtons?: ApiKeyboardButtons;\n keyboardButtons?: ApiKeyboardButtons;\n keyboardPlaceholder?: string;\n isKeyboardSingleUse?: boolean;\n viaBotId?: string;\n threadInfo?: ApiThreadInfo;\n adminTitle?: string;\n isScheduled?: boolean;\n shouldHideKeyboardButtons?: boolean;\n isFromScheduled?: boolean;\n seenByUserIds?: string[];\n isProtected?: boolean;\n transcriptionId?: string;\n isTranscriptionError?: boolean;\n reactors?: {\n nextOffset?: string;\n count: number;\n reactions: ApiUserReaction[];\n };\n reactions?: ApiReactions;\n}\n\nexport interface ApiReactions {\n canSeeList?: boolean;\n results: ApiReactionCount[];\n recentReactions?: ApiUserReaction[];\n}\n\nexport interface ApiUserReaction {\n userId: string;\n reaction: string;\n isBig?: boolean;\n isUnread?: boolean;\n}\n\nexport interface ApiReactionCount {\n isChosen?: boolean;\n count: number;\n reaction: string;\n}\n\nexport interface ApiAvailableReaction {\n selectAnimation?: ApiDocument;\n activateAnimation?: ApiDocument;\n effectAnimation?: ApiDocument;\n staticIcon?: ApiDocument;\n centerIcon?: ApiDocument;\n aroundAnimation?: ApiDocument;\n reaction: string;\n title: string;\n isInactive?: boolean;\n isPremium?: boolean;\n}\n\nexport interface ApiThreadInfo {\n threadId: number;\n chatId: string;\n topMessageId?: number;\n originChannelId?: string;\n messagesCount: number;\n lastMessageId?: number;\n lastReadInboxMessageId?: number;\n recentReplierIds?: string[];\n}\n\nexport type ApiMessageOutgoingStatus = 'read' | 'succeeded' | 'pending' | 'failed';\n\nexport type ApiSponsoredMessage = {\n chatId?: string;\n randomId: string;\n isRecommended?: boolean;\n isBot?: boolean;\n channelPostId?: number;\n startParam?: string;\n chatInviteHash?: string;\n chatInviteTitle?: string;\n text: ApiFormattedText;\n expiresAt: number;\n};\n\n// KeyboardButtons\n\ninterface ApiKeyboardButtonSimple {\n type: 'unsupported' | 'buy' | 'command' | 'requestPhone' | 'game';\n text: string;\n}\n\ninterface ApiKeyboardButtonReceipt {\n type: 'receipt';\n text: string;\n receiptMessageId: number;\n}\n\ninterface ApiKeyboardButtonUrl {\n type: 'url';\n text: string;\n url: string;\n}\n\ninterface ApiKeyboardButtonSimpleWebView {\n type: 'simpleWebView';\n text: string;\n url: string;\n}\n\ninterface ApiKeyboardButtonWebView {\n type: 'webView';\n text: string;\n url: string;\n}\n\ninterface ApiKeyboardButtonCallback {\n type: 'callback';\n text: string;\n data: string;\n}\n\ninterface ApiKeyboardButtonRequestPoll {\n type: 'requestPoll';\n text: string;\n isQuiz?: boolean;\n}\n\ninterface ApiKeyboardButtonSwitchBotInline {\n type: 'switchBotInline';\n text: string;\n query: string;\n isSamePeer?: boolean;\n}\n\ninterface ApiKeyboardButtonUserProfile {\n type: 'userProfile';\n text: string;\n userId: string;\n}\n\ninterface ApiKeyboardButtonUrlAuth {\n type: 'urlAuth';\n text: string;\n url: string;\n buttonId: number;\n}\n\nexport type ApiTranscription = {\n text: string;\n isPending?: boolean;\n transcriptionId: string;\n};\n\nexport type ApiKeyboardButton = (\n ApiKeyboardButtonSimple\n | ApiKeyboardButtonReceipt\n | ApiKeyboardButtonUrl\n | ApiKeyboardButtonCallback\n | ApiKeyboardButtonRequestPoll\n | ApiKeyboardButtonSwitchBotInline\n | ApiKeyboardButtonUserProfile\n | ApiKeyboardButtonWebView\n | ApiKeyboardButtonSimpleWebView\n | ApiKeyboardButtonUrlAuth\n);\n\nexport type ApiKeyboardButtons = ApiKeyboardButton[][];\nexport type ApiReplyKeyboard = {\n keyboardPlaceholder?: string;\n isKeyboardSingleUse?: boolean;\n} & {\n [K in 'inlineButtons' | 'keyboardButtons']?: ApiKeyboardButtons;\n};\n\nexport type ApiMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio' | 'voice' | 'profilePhoto';\nexport type ApiGlobalMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio' | 'voice';\n\nexport type ApiReportReason = 'spam' | 'violence' | 'pornography' | 'childAbuse'\n| 'copyright' | 'geoIrrelevant' | 'fake' | 'illegalDrugs' | 'personalDetails' | 'other';\n\nexport type ApiSendMessageAction = {\n type: 'cancel' | 'typing' | 'recordAudio' | 'chooseSticker' | 'playingGame';\n};\n\nexport type ApiThemeParameters = {\n bg_color: string;\n text_color: string;\n hint_color: string;\n link_color: string;\n button_color: string;\n button_text_color: string;\n secondary_bg_color: string;\n};\n\nexport const MAIN_THREAD_ID = -1;\n\n// `Symbol` can not be transferred from worker\nexport const MESSAGE_DELETED = 'MESSAGE_DELETED';\n","import React, {\n memo, useCallback, useState,\n} from '../../lib/teact/teact';\n\nimport type { OwnProps as AnimatedStickerProps } from './AnimatedSticker';\n\nimport buildClassName from '../../util/buildClassName';\nimport useMediaTransition from '../../hooks/useMediaTransition';\nimport useFlag from '../../hooks/useFlag';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nconst DEFAULT_SIZE = 150;\n\nexport type OwnProps =\n Partial<AnimatedStickerProps>\n & { noTransition?: boolean; nonInteractive?: boolean };\n\nconst loadedAnimationUrls = new Set();\n\nfunction AnimatedIcon(props: OwnProps) {\n const {\n size = DEFAULT_SIZE,\n play = true,\n noLoop = true,\n className,\n noTransition,\n nonInteractive,\n onLoad,\n onClick,\n ...otherProps\n } = props;\n const { tgsUrl } = props;\n\n const key = `${tgsUrl}_${size}`;\n const [isAnimationLoaded, markAnimationLoaded] = useFlag(loadedAnimationUrls.has(key));\n const transitionClassNames = useMediaTransition(noTransition || isAnimationLoaded);\n\n const handleLoad = useCallback(() => {\n markAnimationLoaded();\n loadedAnimationUrls.add(key);\n\n onLoad?.();\n }, [key, markAnimationLoaded, onLoad]);\n\n const [playKey, setPlayKey] = useState(String(Math.random()));\n\n const handleClick = useCallback(() => {\n if (play === true) {\n setPlayKey(String(Math.random()));\n }\n\n onClick?.();\n }, [onClick, play]);\n\n return (\n <AnimatedSticker\n className={buildClassName(className, transitionClassNames, 'shown')}\n size={size}\n play={play === true ? playKey : play}\n noLoop={noLoop}\n onClick={!nonInteractive ? handleClick : undefined}\n onLoad={handleLoad}\n /* eslint-disable-next-line react/jsx-props-no-spreading */\n {...otherProps}\n />\n );\n}\n\nexport default memo(AnimatedIcon);\n","import type { RefObject } from 'react';\nimport type { FC } from '../../lib/teact/teact';\n\nimport React, {\n useEffect, useRef, memo, useCallback, useState,\n} from '../../lib/teact/teact';\n\nimport { fastRaf } from '../../util/schedulers';\nimport buildClassName from '../../util/buildClassName';\nimport buildStyle from '../../util/buildStyle';\nimport useHeavyAnimationCheck from '../../hooks/useHeavyAnimationCheck';\nimport useBackgroundMode from '../../hooks/useBackgroundMode';\n\nexport type OwnProps = {\n ref?: RefObject<HTMLDivElement>;\n className?: string;\n style?: string;\n tgsUrl?: string;\n play?: boolean | string;\n playSegment?: [number, number];\n speed?: number;\n noLoop?: boolean;\n size: number;\n quality?: number;\n isLowPriority?: boolean;\n forceOnHeavyAnimation?: boolean;\n color?: [number, number, number];\n onClick?: NoneToVoidFunction;\n onLoad?: NoneToVoidFunction;\n onEnded?: NoneToVoidFunction;\n};\n\ntype RLottieClass = typeof import('../../lib/rlottie/RLottie').default;\ntype RLottieInstance = import('../../lib/rlottie/RLottie').default;\nlet lottiePromise: Promise<RLottieClass>;\nlet RLottie: RLottieClass;\n\n// Time for the main interface to completely load\nconst LOTTIE_LOAD_DELAY = 3000;\n\nasync function ensureLottie() {\n if (!lottiePromise) {\n lottiePromise = import('../../lib/rlottie/RLottie') as unknown as Promise<RLottieClass>;\n RLottie = (await lottiePromise as any).default;\n }\n\n return lottiePromise;\n}\n\nsetTimeout(ensureLottie, LOTTIE_LOAD_DELAY);\n\nconst AnimatedSticker: FC<OwnProps> = ({\n ref,\n className,\n style,\n tgsUrl,\n play,\n playSegment,\n speed,\n noLoop,\n size,\n quality,\n isLowPriority,\n color,\n forceOnHeavyAnimation,\n onClick,\n onLoad,\n onEnded,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let containerRef = useRef<HTMLDivElement>(null);\n if (ref) {\n containerRef = ref;\n }\n\n const [animation, setAnimation] = useState<RLottieInstance>();\n const wasPlaying = useRef(false);\n const isFrozen = useRef(false);\n const isFirstRender = useRef(true);\n\n const playRef = useRef();\n playRef.current = play;\n const playSegmentRef = useRef<[number, number]>();\n playSegmentRef.current = playSegment;\n\n useEffect(() => {\n if (animation || !tgsUrl) {\n return;\n }\n\n const exec = () => {\n if (!containerRef.current) {\n return;\n }\n\n const newAnimation = new RLottie(\n containerRef.current,\n tgsUrl,\n {\n noLoop,\n size,\n quality,\n isLowPriority,\n },\n onLoad,\n color,\n onEnded,\n );\n\n if (speed) {\n newAnimation.setSpeed(speed);\n }\n\n setAnimation(newAnimation);\n };\n\n if (RLottie) {\n exec();\n } else {\n ensureLottie().then(() => {\n fastRaf(() => {\n if (containerRef.current) {\n exec();\n }\n });\n });\n }\n }, [color, animation, tgsUrl, isLowPriority, noLoop, onLoad, quality, size, speed, onEnded]);\n\n useEffect(() => {\n if (!animation) return;\n\n animation.setColor(color);\n }, [color, animation]);\n\n useEffect(() => {\n return () => {\n if (animation) {\n animation.destroy();\n }\n };\n }, [animation]);\n\n const playAnimation = useCallback((shouldRestart = false) => {\n if (animation && (playRef.current || playSegmentRef.current)) {\n if (playSegmentRef.current) {\n animation.playSegment(playSegmentRef.current);\n } else {\n animation.play(shouldRestart);\n }\n }\n }, [animation]);\n\n const pauseAnimation = useCallback(() => {\n if (!animation) {\n return;\n }\n\n animation.pause();\n }, [animation]);\n\n const freezeAnimation = useCallback(() => {\n isFrozen.current = true;\n\n if (!animation) {\n return;\n }\n\n if (!wasPlaying.current) {\n wasPlaying.current = animation.isPlaying();\n }\n\n pauseAnimation();\n }, [animation, pauseAnimation]);\n\n const unfreezeAnimation = useCallback(() => {\n if (wasPlaying.current) {\n playAnimation(noLoop);\n }\n\n wasPlaying.current = false;\n isFrozen.current = false;\n }, [noLoop, playAnimation]);\n\n const unfreezeAnimationOnRaf = useCallback(() => {\n fastRaf(unfreezeAnimation);\n }, [unfreezeAnimation]);\n\n useEffect(() => {\n if (!animation) {\n return;\n }\n if (play || playSegment) {\n if (isFrozen.current) {\n wasPlaying.current = true;\n } else {\n playAnimation(noLoop);\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (isFrozen.current) {\n wasPlaying.current = false;\n } else {\n pauseAnimation();\n }\n }\n }, [animation, play, playSegment, noLoop, playAnimation, pauseAnimation]);\n\n useEffect(() => {\n if (animation) {\n if (isFirstRender.current) {\n isFirstRender.current = false;\n } else if (tgsUrl) {\n animation.changeData(tgsUrl);\n playAnimation();\n }\n }\n }, [playAnimation, animation, tgsUrl]);\n\n useHeavyAnimationCheck(freezeAnimation, unfreezeAnimation, forceOnHeavyAnimation);\n // Pausing frame may not happen in background\n // so we need to make sure it happens right after focusing,\n // then we can play again.\n useBackgroundMode(freezeAnimation, unfreezeAnimationOnRaf);\n\n return (\n <div\n ref={containerRef}\n className={buildClassName('AnimatedSticker', className)}\n style={buildStyle(\n size !== undefined && `width: ${size}px; height: ${size}px;`,\n onClick && 'cursor: pointer',\n style,\n )}\n onClick={onClick}\n />\n );\n};\n\nexport default memo(AnimatedSticker);\n","/* eslint-disable no-nested-ternary */\n/* eslint-disable no-bitwise */\n/* eslint-disable @typescript-eslint/naming-convention */\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 type { FC } from '../../lib/teact/teact';\nimport React, { memo, useCallback } from '../../lib/teact/teact';\nimport { getActions } from '../../global';\nimport convertPunycode from '../../lib/punycode';\n\nimport {\n DEBUG,\n} from '../../config';\nimport buildClassName from '../../util/buildClassName';\nimport { ensureProtocol } from '../../util/ensureProtocol';\n\ntype OwnProps = {\n url?: string;\n text: string;\n className?: string;\n children?: React.ReactNode;\n isRtl?: boolean;\n};\n\nconst SafeLink: FC<OwnProps> = ({\n url,\n text,\n className,\n children,\n isRtl,\n}) => {\n const { openUrl } = getActions();\n\n const content = children || text;\n const isSafe = url === content;\n\n const handleClick = useCallback((e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {\n if (!url) return true;\n e.preventDefault();\n openUrl({ url, shouldSkipModal: isSafe });\n\n return false;\n }, [isSafe, openUrl, url]);\n\n if (!url) {\n return undefined;\n }\n\n const classNames = buildClassName(\n className || 'text-entity-link',\n text.length > 50 && 'long-word-break-all',\n );\n\n return (\n <a\n href={ensureProtocol(url)}\n title={getDomain(url)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={classNames}\n onClick={handleClick}\n dir={isRtl ? 'rtl' : 'auto'}\n >\n {content}\n </a>\n );\n};\n\nfunction getDomain(url?: string) {\n if (!url) {\n return undefined;\n }\n\n const href = ensureProtocol(url);\n if (!href) {\n return undefined;\n }\n\n try {\n let decodedHref = decodeURI(href.replace(/%%/g, '%25'));\n\n const match = decodedHref.match(/^https?:\\/\\/([^/:?#]+)(?:[/:?#]|$)/i);\n if (!match) {\n return undefined;\n }\n const domain = match[1];\n decodedHref = decodedHref.replace(domain, convertPunycode(domain));\n\n return decodedHref;\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('SafeLink.getDecodedUrl error ', url, error);\n }\n }\n\n return undefined;\n}\n\nexport default memo(SafeLink);\n","import MonkeyIdle from '../../../assets/tgs/monkeys/TwoFactorSetupMonkeyIdle.tgs';\nimport MonkeyTracking from '../../../assets/tgs/monkeys/TwoFactorSetupMonkeyTracking.tgs';\nimport MonkeyClose from '../../../assets/tgs/monkeys/TwoFactorSetupMonkeyClose.tgs';\nimport MonkeyPeek from '../../../assets/tgs/monkeys/TwoFactorSetupMonkeyPeek.tgs';\n\nimport FoldersAll from '../../../assets/tgs/settings/FoldersAll.tgs';\nimport FoldersNew from '../../../assets/tgs/settings/FoldersNew.tgs';\nimport DiscussionGroups from '../../../assets/tgs/settings/DiscussionGroupsDucks.tgs';\nimport Lock from '../../../assets/tgs/settings/Lock.tgs';\nimport Congratulations from '../../../assets/tgs/settings/Congratulations.tgs';\nimport Experimental from '../../../assets/tgs/settings/Experimental.tgs';\n\nimport CameraFlip from '../../../assets/tgs/calls/CameraFlip.tgs';\nimport HandFilled from '../../../assets/tgs/calls/HandFilled.tgs';\nimport HandOutline from '../../../assets/tgs/calls/HandOutline.tgs';\nimport Speaker from '../../../assets/tgs/calls/Speaker.tgs';\nimport VoiceAllowTalk from '../../../assets/tgs/calls/VoiceAllowTalk.tgs';\nimport VoiceMini from '../../../assets/tgs/calls/VoiceMini.tgs';\nimport VoiceMuted from '../../../assets/tgs/calls/VoiceMuted.tgs';\nimport VoiceOutlined from '../../../assets/tgs/calls/VoiceOutlined.tgs';\n\nimport Peach from '../../../assets/tgs/animatedEmojis/Peach.tgs';\nimport Eggplant from '../../../assets/tgs/animatedEmojis/Eggplant.tgs';\nimport Cumshot from '../../../assets/tgs/animatedEmojis/Cumshot.tgs';\n\nimport JoinRequest from '../../../assets/tgs/invites/Requests.tgs';\nimport Invite from '../../../assets/tgs/invites/Invite.tgs';\n\nimport QrPlane from '../../../assets/tgs/auth/QrPlane.tgs';\n\nexport const LOCAL_TGS_URLS = {\n MonkeyIdle,\n MonkeyTracking,\n MonkeyClose,\n MonkeyPeek,\n FoldersAll,\n FoldersNew,\n DiscussionGroups,\n Lock,\n CameraFlip,\n HandFilled,\n HandOutline,\n Speaker,\n VoiceAllowTalk,\n VoiceMini,\n VoiceMuted,\n VoiceOutlined,\n Peach,\n Eggplant,\n Cumshot,\n JoinRequest,\n Invite,\n QrPlane,\n Congratulations,\n Experimental,\n};\n","import type { ApiDocument } from '../../../api/types';\n\nconst ONE_GIGABYTE = 1024 * 1024 * 1024;\nconst ONE_MEGABYTE = 1024 * 1024;\n\nexport function getFileSizeString(bytes: number) {\n if (bytes > (ONE_GIGABYTE / 2)) {\n return `${(bytes / ONE_GIGABYTE).toFixed(1)} GB`;\n }\n if (bytes > (ONE_MEGABYTE / 2)) {\n return `${(bytes / ONE_MEGABYTE).toFixed(1)} MB`;\n }\n return `${(bytes / (1024)).toFixed(1)} KB`;\n}\n\nexport function getDocumentExtension(document: ApiDocument) {\n const { fileName, mimeType } = document;\n\n return getFileExtension(fileName, mimeType);\n}\n\nexport function getFileExtension(fileName: string, mimeType: string) {\n if (fileName && fileName.indexOf('.') !== -1) {\n return fileName.split('.').pop();\n } else {\n return mimeType.split('/').pop();\n }\n}\n\nexport function getColorFromExtension(extension: string) {\n switch (extension) {\n case 'apk':\n case 'xls':\n case 'xlsx':\n return 'green';\n case 'zip':\n case 'rar':\n case '7z':\n case 'tar':\n case 'gz':\n case 'ppt':\n case 'pptx':\n return 'orange';\n case 'pdf':\n case 'xps':\n return 'red';\n default:\n return 'default';\n }\n}\n\nexport function getDocumentHasPreview(document: ApiDocument) {\n return Boolean(document.previewBlobUrl || document.thumbnail);\n}\n","import 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\nconst parseEmojiOnlyString = (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\nexport default parseEmojiOnlyString;\n","import type { FC } from '../../lib/teact/teact';\nimport React, { useCallback } from '../../lib/teact/teact';\n\nimport type { ApiChat, ApiUser } from '../../api/types';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\nimport { getActions } from '../../global';\n\ntype OwnProps = {\n className?: string;\n sender?: ApiUser | ApiChat;\n children: React.ReactNode;\n};\n\nconst UserLink: FC<OwnProps> = ({\n className, sender, children,\n}) => {\n const { openChat } = getActions();\n\n const handleClick = useCallback(() => {\n if (sender) {\n openChat({ id: sender.id });\n }\n }, [sender, openChat]);\n\n if (!sender) {\n return children;\n }\n\n return (\n <Link className={buildClassName('UserLink', className)} onClick={handleClick}>{children}</Link>\n );\n};\n\nexport default UserLink;\n","import type { FC } from '../../lib/teact/teact';\nimport React, { useCallback } from '../../lib/teact/teact';\nimport { getActions } from '../../global';\n\nimport type { ApiMessage } from '../../api/types';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\n\ntype OwnProps = {\n className?: string;\n message?: ApiMessage;\n children: React.ReactNode;\n};\n\nconst MessageLink: FC<OwnProps> = ({\n className, message, children,\n}) => {\n const { focusMessage } = getActions();\n\n const handleMessageClick = useCallback((): void => {\n if (message) {\n focusMessage({ chatId: message.chatId, messageId: message.id });\n }\n }, [focusMessage, message]);\n\n if (!message) {\n return children;\n }\n\n return (\n <Link className={buildClassName('MessageLink', className)} onClick={handleMessageClick}>{children}</Link>\n );\n};\n\nexport default MessageLink;\n","import type { FC } from '../../lib/teact/teact';\nimport React, { useCallback } from '../../lib/teact/teact';\nimport { getActions } from '../../global';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\n\ntype OwnProps = {\n className?: string;\n chatId?: string;\n children: React.ReactNode;\n};\n\nconst ChatLink: FC<OwnProps> = ({\n className, chatId, children,\n}) => {\n const { openChat } = getActions();\n\n const handleClick = useCallback(() => {\n if (chatId) {\n openChat({ id: chatId });\n }\n }, [chatId, openChat]);\n\n if (!chatId) {\n return children;\n }\n\n return (\n <Link className={buildClassName('ChatLink', className)} onClick={handleClick}>{children}</Link>\n );\n};\n\nexport default ChatLink;\n","import type { FC } from '../../lib/teact/teact';\nimport React, { useCallback } from '../../lib/teact/teact';\n\nimport type { ApiGroupCall } from '../../api/types';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\nimport { getActions } from '../../global';\n\ntype OwnProps = {\n className?: string;\n groupCall?: Partial<ApiGroupCall>;\n children: React.ReactNode;\n};\n\nconst GroupCallLink: FC<OwnProps> = ({\n className, groupCall, children,\n}) => {\n const { joinGroupCall } = getActions();\n\n const handleClick = useCallback(() => {\n if (groupCall) {\n joinGroupCall({ id: groupCall.id, accessHash: groupCall.accessHash });\n }\n }, [groupCall, joinGroupCall]);\n\n if (!groupCall) {\n return children;\n }\n\n return (\n <Link className={buildClassName('GroupCallLink', className)} onClick={handleClick}>{children}</Link>\n );\n};\n\nexport default GroupCallLink;\n","import React from '../../../lib/teact/teact';\n\nimport type {\n ApiChat, ApiMessage, ApiUser, ApiGroupCall,\n} from '../../../api/types';\nimport type { TextPart } from '../../../types';\n\nimport type { LangFn } from '../../../hooks/useLang';\nimport {\n getChatTitle,\n getMessageSummaryText,\n getUserFullName,\n} from '../../../global/helpers';\nimport trimText from '../../../util/trimText';\nimport { formatCurrency } from '../../../util/formatCurrency';\nimport { renderMessageSummary } from './renderMessageText';\nimport renderText from './renderText';\n\nimport UserLink from '../UserLink';\nimport MessageLink from '../MessageLink';\nimport ChatLink from '../ChatLink';\nimport GroupCallLink from '../GroupCallLink';\n\ninterface RenderOptions {\n asPlainText?: boolean;\n asTextWithSpoilers?: boolean;\n}\n\nconst MAX_LENGTH = 32;\nconst NBSP = '\\u00A0';\n\nexport function renderActionMessageText(\n lang: LangFn,\n message: ApiMessage,\n actionOriginUser?: ApiUser,\n actionOriginChat?: ApiChat,\n targetUsers?: ApiUser[],\n targetMessage?: ApiMessage,\n targetChatId?: string,\n options: RenderOptions = {},\n) {\n if (!message.content.action) {\n return [];\n }\n\n const {\n text, translationValues, amount, currency, call, score,\n } = message.content.action;\n const content: TextPart[] = [];\n const noLinks = options.asPlainText || options.asTextWithSpoilers;\n const translationKey = text === 'Chat.Service.Group.UpdatedPinnedMessage1' && !targetMessage\n ? 'Message.PinnedGenericMessage'\n : text;\n let unprocessed = lang(translationKey, translationValues?.length ? translationValues : undefined);\n if (translationKey.includes('ScoredInGame')) { // Translation hack for games\n unprocessed = unprocessed.replace('un1', '%action_origin%').replace('un2', '%message%');\n }\n let processed: TextPart[];\n\n if (unprocessed.includes('%payment_amount%')) {\n processed = processPlaceholder(\n unprocessed,\n '%payment_amount%',\n formatCurrency(amount!, currency!, lang.code),\n );\n unprocessed = processed.pop() as string;\n content.push(...processed);\n }\n\n processed = processPlaceholder(\n unprocessed,\n '%action_origin%',\n actionOriginUser ? (\n renderUserContent(actionOriginUser, noLinks) || NBSP\n ) : actionOriginChat ? (\n renderChatContent(lang, actionOriginChat, noLinks) || NBSP\n ) : 'User',\n );\n\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n if (unprocessed.includes('%score%')) {\n processed = processPlaceholder(\n unprocessed,\n '%score%',\n score!.toString(),\n );\n unprocessed = processed.pop() as string;\n content.push(...processed);\n }\n\n processed = processPlaceholder(\n unprocessed,\n '%target_user%',\n targetUsers\n ? targetUsers.map((user) => renderUserContent(user, noLinks)).filter<TextPart>(Boolean as any)\n : 'User',\n );\n\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%message%',\n targetMessage\n ? renderMessageContent(lang, targetMessage, options)\n : 'a message',\n );\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%product%',\n targetMessage\n ? renderProductContent(targetMessage)\n : 'a product',\n );\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%target_chat%',\n targetChatId\n ? renderMigratedContent(targetChatId, noLinks)\n : 'another chat',\n );\n content.push(...processed);\n\n if (options.asPlainText) {\n return content.join('').trim();\n }\n\n if (call) {\n return renderGroupCallContent(call, content);\n }\n\n return content;\n}\n\nfunction renderProductContent(message: ApiMessage) {\n return message.content && message.content.invoice\n ? message.content.invoice.title\n : 'a product';\n}\n\nfunction renderMessageContent(lang: LangFn, message: ApiMessage, options: RenderOptions = {}) {\n const { asPlainText, asTextWithSpoilers } = options;\n\n if (asPlainText) {\n return getMessageSummaryText(lang, message, undefined, MAX_LENGTH);\n }\n\n const messageSummary = renderMessageSummary(lang, message, undefined, undefined, MAX_LENGTH);\n\n if (asTextWithSpoilers) {\n return (\n <span>{messageSummary}</span>\n );\n }\n\n return (\n <MessageLink className=\"action-link\" message={message}>{messageSummary}</MessageLink>\n );\n}\n\nfunction renderGroupCallContent(groupCall: Partial<ApiGroupCall>, text: TextPart[]): string | TextPart | undefined {\n return (\n <GroupCallLink groupCall={groupCall}>\n {text}\n </GroupCallLink>\n );\n}\n\nfunction renderUserContent(sender: ApiUser, noLinks?: boolean): string | TextPart | undefined {\n const text = trimText(getUserFullName(sender), MAX_LENGTH);\n\n if (noLinks) {\n return text;\n }\n\n return <UserLink className=\"action-link\" sender={sender}>{sender && renderText(text!)}</UserLink>;\n}\n\nfunction renderChatContent(lang: LangFn, chat: ApiChat, noLinks?: boolean): string | TextPart | undefined {\n const text = trimText(getChatTitle(lang, chat), MAX_LENGTH);\n\n if (noLinks) {\n return text;\n }\n\n return <ChatLink className=\"action-link\" chatId={chat.id}>{chat && renderText(text!)}</ChatLink>;\n}\n\nfunction renderMigratedContent(chatId: string, noLinks?: boolean): string | TextPart | undefined {\n const text = 'another chat';\n\n if (noLinks) {\n return text;\n }\n\n return <ChatLink className=\"action-link\" chatId={chatId}>{text}</ChatLink>;\n}\n\nfunction processPlaceholder(text: string, placeholder: string, replaceValue?: TextPart | TextPart[]): TextPart[] {\n const placeholderPosition = text.indexOf(placeholder);\n if (placeholderPosition < 0 || !replaceValue) {\n return [text];\n }\n\n const content: TextPart[] = [];\n content.push(text.substring(0, placeholderPosition));\n if (Array.isArray(replaceValue)) {\n replaceValue.forEach((value, index) => {\n content.push(value);\n if (index + 1 < replaceValue.length) {\n content.push(', ');\n }\n });\n } else {\n content.push(replaceValue);\n }\n content.push(text.substring(placeholderPosition + placeholder.length));\n\n return content;\n}\n","import type { ApiMessage } from '../../../api/types';\nimport { ApiMessageEntityTypes } from '../../../api/types';\nimport type { TextPart } from '../../../types';\n\nimport {\n getMessageSummaryDescription,\n getMessageSummaryEmoji,\n getMessageSummaryText,\n getMessageText,\n TRUNCATED_SUMMARY_LENGTH,\n} from '../../../global/helpers';\nimport type { LangFn } from '../../../hooks/useLang';\nimport renderText from './renderText';\nimport { renderTextWithEntities } from './renderTextWithEntities';\nimport trimText from '../../../util/trimText';\n\nexport function renderMessageText(\n message: ApiMessage,\n highlight?: string,\n shouldRenderHqEmoji?: boolean,\n isSimple?: boolean,\n truncateLength?: number,\n isProtected?: boolean,\n) {\n const { text, entities } = message.content.text || {};\n\n if (!text) {\n const contentNotSupportedText = getMessageText(message);\n return contentNotSupportedText ? [trimText(contentNotSupportedText, truncateLength)] : undefined;\n }\n\n return renderTextWithEntities(\n trimText(text, truncateLength),\n entities,\n highlight,\n shouldRenderHqEmoji,\n undefined,\n message.id,\n isSimple,\n isProtected,\n );\n}\n\nexport function renderMessageSummary(\n lang: LangFn,\n message: ApiMessage,\n noEmoji = false,\n highlight?: string,\n truncateLength = TRUNCATED_SUMMARY_LENGTH,\n): TextPart[] {\n const { entities } = message.content.text || {};\n\n const hasSpoilers = entities?.some((e) => e.type === ApiMessageEntityTypes.Spoiler);\n if (!hasSpoilers) {\n const text = trimText(getMessageSummaryText(lang, message, noEmoji), truncateLength);\n\n if (highlight) {\n return renderText(text, ['emoji', 'highlight'], { highlight });\n } else {\n return renderText(text);\n }\n }\n\n const emoji = !noEmoji && getMessageSummaryEmoji(message);\n const emojiWithSpace = emoji ? `${emoji} ` : '';\n\n const text = renderMessageText(message, highlight, undefined, true, truncateLength);\n const description = getMessageSummaryDescription(lang, message, text);\n\n return [\n emojiWithSpace,\n ...(Array.isArray(description) ? description : [description]),\n ].filter<TextPart>(Boolean);\n}\n","import React from '../../../lib/teact/teact';\nimport EMOJI_REGEX from '../../../lib/twemojiRegex';\n\nimport type { TextPart } from '../../../types';\n\nimport { RE_LINK_TEMPLATE, RE_MENTION_TEMPLATE } from '../../../config';\nimport { IS_EMOJI_SUPPORTED } from '../../../util/environment';\nimport {\n fixNonStandardEmoji,\n handleEmojiLoad,\n LOADED_EMOJIS,\n nativeToUnifiedExtendedWithCache,\n} from '../../../util/emoji';\nimport buildClassName from '../../../util/buildClassName';\nimport { compact } from '../../../util/iteratees';\n\nimport MentionLink from '../../middle/message/MentionLink';\nimport SafeLink from '../SafeLink';\n\nexport type TextFilter = (\n 'escape_html' | 'hq_emoji' | 'emoji' | 'emoji_html' | 'br' | 'br_html' | 'highlight' | 'links' |\n 'simple_markdown' | 'simple_markdown_html'\n );\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<TextFilter> = ['emoji'],\n params?: { highlight: string | undefined },\n): TextPart[] {\n if (typeof part !== 'string') {\n return [part];\n }\n\n return compact(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: TextPart[], part) => {\n if (typeof part !== 'string') {\n result.push(part);\n return result;\n }\n\n divEl.innerText = part;\n result.push(divEl.innerHTML);\n\n return result;\n }, []);\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: TextPart[], part: TextPart) => {\n if (typeof part !== 'string') {\n result.push(part);\n return result;\n }\n\n part = fixNonStandardEmoji(part);\n const parts = part.split(EMOJI_REGEX);\n const emojis: string[] = part.match(EMOJI_REGEX) || [];\n result.push(parts[0]);\n\n return emojis.reduce((emojiResult: TextPart[], emoji, i) => {\n const code = nativeToUnifiedExtendedWithCache(emoji);\n if (!code) return emojiResult;\n const src = `./img-apple-${size === 'big' ? '160' : '64'}/${code}.png`;\n const className = buildClassName(\n 'emoji',\n size === 'small' && 'emoji-small',\n );\n\n if (type === 'jsx') {\n const isLoaded = LOADED_EMOJIS.has(src);\n\n emojiResult.push(\n <img\n src={src}\n className={`${className}${!isLoaded ? ' opacity-transition slow shown' : ''}`}\n alt={emoji}\n data-path={src}\n onLoad={!isLoaded ? handleEmojiLoad : undefined}\n />,\n );\n }\n if (type === 'html') {\n emojiResult.push(\n // For preventing extra spaces in html\n // eslint-disable-next-line max-len\n `<img draggable=\"false\" class=\"${className}\" src=\"./img-apple-${size === 'big' ? '160' : '64'}/${code}.png\" alt=\"${emoji}\" />`,\n );\n }\n\n const index = i * 2 + 2;\n if (parts[index]) {\n emojiResult.push(parts[index]);\n }\n\n return emojiResult;\n }, result);\n }, [] as TextPart[]);\n}\n\nfunction addLineBreaks(textParts: TextPart[], type: 'jsx' | 'html'): TextPart[] {\n return textParts.reduce((result: TextPart[], part) => {\n if (typeof part !== 'string') {\n result.push(part);\n return result;\n }\n\n const splittenParts = part\n .split(/\\r\\n|\\r|\\n/g)\n .reduce((parts: TextPart[], line: string, i, source) => {\n // This adds non-breaking space if line was indented with spaces, to preserve the indentation\n const trimmedLine = line.trimLeft();\n const indentLength = line.length - trimmedLine.length;\n parts.push(String.fromCharCode(160).repeat(indentLength) + trimmedLine);\n\n if (i !== source.length - 1) {\n parts.push(\n type === 'jsx' ? <br /> : '<br />',\n );\n }\n\n return parts;\n }, []);\n\n return [...result, ...splittenParts];\n }, []);\n}\n\nfunction addHighlight(textParts: TextPart[], highlight: string | undefined): TextPart[] {\n return textParts.reduce<TextPart[]>((result, part) => {\n if (typeof part !== 'string' || !highlight) {\n result.push(part);\n return result;\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 result.push(part);\n return result;\n }\n\n const newParts: TextPart[] = [];\n newParts.push(part.substring(0, queryPosition));\n newParts.push(\n <span className=\"matching-text-highlight\">\n {part.substring(queryPosition, queryPosition + highlight.length)}\n </span>,\n );\n newParts.push(part.substring(queryPosition + highlight.length));\n\n return [...result, ...newParts];\n }, []);\n}\n\nconst RE_LINK = new RegExp(`${RE_LINK_TEMPLATE}|${RE_MENTION_TEMPLATE}`, 'ig');\n\nfunction addLinks(textParts: TextPart[]): TextPart[] {\n return textParts.reduce<TextPart[]>((result, part) => {\n if (typeof part !== 'string') {\n result.push(part);\n return result;\n }\n\n const links = part.match(RE_LINK);\n if (!links || !links.length) {\n result.push(part);\n return result;\n }\n\n const content: TextPart[] = [];\n\n let nextLink = links.shift();\n let lastIndex = 0;\n while (nextLink) {\n const index = part.indexOf(nextLink, lastIndex);\n content.push(part.substring(lastIndex, index));\n if (nextLink.startsWith('@')) {\n content.push(\n <MentionLink username={nextLink}>\n {nextLink}\n </MentionLink>,\n );\n } else {\n if (nextLink.endsWith('?')) {\n nextLink = nextLink.slice(0, nextLink.length - 1);\n }\n\n content.push(\n <SafeLink text={nextLink} url={nextLink} />,\n );\n }\n lastIndex = index + nextLink.length;\n nextLink = links.shift();\n }\n content.push(part.substring(lastIndex));\n\n return [...result, ...content];\n }, []);\n}\n\nfunction replaceSimpleMarkdown(textParts: TextPart[], type: 'jsx' | 'html'): TextPart[] {\n return textParts.reduce<TextPart[]>((result, part) => {\n if (typeof part !== 'string') {\n result.push(part);\n return result;\n }\n\n const parts = part.split(SIMPLE_MARKDOWN_REGEX);\n const entities = part.match(SIMPLE_MARKDOWN_REGEX) || [];\n result.push(parts[0]);\n\n return entities.reduce((entityResult: TextPart[], entity, i) => {\n if (type === 'jsx') {\n entityResult.push(\n entity.startsWith('**')\n ? <b>{entity.replace(/\\*\\*/g, '')}</b>\n : <i>{entity.replace(/__/g, '')}</i>,\n );\n } else {\n entityResult.push(\n entity.startsWith('**')\n ? `<b>${entity.replace(/\\*\\*/g, '')}</b>`\n : `<i>${entity.replace(/__/g, '')}</i>`,\n );\n }\n\n const index = i * 2 + 2;\n if (parts[index]) {\n entityResult.push(parts[index]);\n }\n\n return entityResult;\n }, result);\n }, []);\n}\n\nexport function areLinesWrapping(text: string, element: HTMLElement) {\n const lines = (text.trim().match(/\\n/g) || '').length + 1;\n const { lineHeight } = getComputedStyle(element);\n const lineHeightParsed = parseFloat(lineHeight.split('px')[0]);\n\n return element.clientHeight >= (lines + 1) * lineHeightParsed;\n}\n","import type { MouseEvent as ReactMouseEvent } from 'react';\nimport type { FC } from '../../../lib/teact/teact';\nimport React, {\n memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { createClassNameBuilder } from '../../../util/buildClassName';\nimport useFlag from '../../../hooks/useFlag';\n\nimport './Spoiler.scss';\n\ntype OwnProps = {\n children?: React.ReactNode;\n messageId?: number;\n};\n\nconst READING_SYMBOLS_PER_SECOND = 23; // Heuristics\nconst MIN_HIDE_TIMEOUT = 5000; // 5s\nconst MAX_HIDE_TIMEOUT = 60000; // 1m\n\nconst actionsByMessageId: Map<number, {\n reveal: VoidFunction;\n conceal: VoidFunction;\n}[]> = new Map();\n\nconst buildClassName = createClassNameBuilder('Spoiler');\n\nconst Spoiler: FC<OwnProps> = ({\n children,\n messageId,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const contentRef = useRef<HTMLDivElement>(null);\n\n const [isRevealed, reveal, conceal] = useFlag();\n\n const handleClick = useCallback((e: ReactMouseEvent<HTMLDivElement, MouseEvent>) => {\n e.preventDefault();\n e.stopPropagation();\n\n actionsByMessageId.get(messageId!)?.forEach((actions) => actions.reveal());\n\n const contentLength = contentRef.current!.innerText.length;\n const readingMs = Math.round(contentLength / READING_SYMBOLS_PER_SECOND) * 1000;\n const timeoutMs = Math.max(MIN_HIDE_TIMEOUT, Math.min(readingMs, MAX_HIDE_TIMEOUT));\n\n setTimeout(() => {\n actionsByMessageId.get(messageId!)?.forEach((actions) => actions.conceal());\n conceal();\n }, timeoutMs);\n }, [conceal, messageId]);\n\n useEffect(() => {\n if (!messageId) {\n return undefined;\n }\n\n if (actionsByMessageId.has(messageId)) {\n actionsByMessageId.get(messageId)!.push({ reveal, conceal });\n } else {\n actionsByMessageId.set(messageId, [{ reveal, conceal }]);\n }\n\n return () => {\n actionsByMessageId.delete(messageId);\n };\n }, [conceal, handleClick, isRevealed, messageId, reveal]);\n\n return (\n <span\n className={buildClassName(\n '&',\n !isRevealed && 'concealed',\n !isRevealed && Boolean(messageId) && 'animated',\n )}\n onClick={messageId && !isRevealed ? handleClick : undefined}\n >\n <span className={buildClassName('content')} ref={contentRef}>\n {children}\n </span>\n </span>\n );\n};\n\nexport default memo(Spoiler);\n","// extracted by mini-css-extract-plugin\nexport default {\"overlay\":\"SwhO2lEtk47g68_ixpDe\",\"copy\":\"deqdY4TS7mStC8qkslV4\",\"wrap\":\"iEZTJnlmMCct8jJztTx8\",\"wrapOn\":\"B4kEjXkw8Sse9g0Xv_OO\",\"content\":\"d09hp4fxFTuFw1emBUDA\",\"hidden\":\"We_Wcr7YvkkUM8ICjRAs\"};","import type { FC } from '../../../lib/teact/teact';\nimport React, {\n memo, useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { getActions } from '../../../global';\n\nimport { copyTextToClipboard } from '../../../util/clipboard';\nimport buildClassName from '../../../util/buildClassName';\nimport { areLinesWrapping } from '../helpers/renderText';\n\nimport useWindowSize from '../../../hooks/useWindowSize';\nimport useLang from '../../../hooks/useLang';\n\nimport styles from './CodeOverlay.module.scss';\n\nexport type OwnProps = {\n className?: string;\n text: string;\n noCopy?: boolean;\n onWordWrapToggle?: (wrap: boolean) => void;\n};\n\nconst CodeOverlay: FC<OwnProps> = ({\n text, className, noCopy, onWordWrapToggle,\n}) => {\n const { showNotification } = getActions();\n // eslint-disable-next-line no-null/no-null\n const ref = useRef<HTMLDivElement>(null);\n const windowSize = useWindowSize();\n const lang = useLang();\n const [isWordWrap, setIsWordWrap] = useState(true);\n const [withWordWrapButton, setWithWordWrapButton] = useState(false);\n\n const checkWordWrap = useCallback(() => {\n const isWrap = areLinesWrapping(text, ref.current!.parentElement!);\n setWithWordWrapButton(isWrap);\n }, [text]);\n\n useEffect(() => {\n if (isWordWrap) {\n checkWordWrap();\n }\n }, [checkWordWrap, isWordWrap, text, windowSize]);\n\n const handleCopy = useCallback(() => {\n copyTextToClipboard(text);\n showNotification({\n message: lang('TextCopied'),\n });\n }, [lang, showNotification, text]);\n\n const handleWordWrapClick = useCallback(() => {\n setIsWordWrap(!isWordWrap);\n onWordWrapToggle?.(!isWordWrap);\n }, [isWordWrap, onWordWrapToggle]);\n\n const contentClass = buildClassName(styles.content, !withWordWrapButton && noCopy && styles.hidden);\n const overlayClass = buildClassName(styles.overlay, className);\n const wrapClass = buildClassName(styles.wrap, isWordWrap && styles.wrapOn);\n\n return (\n <div className={overlayClass} ref={ref}>\n <div className={contentClass}>\n {withWordWrapButton && (\n <div className={wrapClass} onClick={handleWordWrapClick} title=\"Word Wrap\">\n <i className=\"icon-word-wrap\" />\n </div>\n )}\n {!noCopy && (\n <div className={styles.copy} onClick={handleCopy} title={lang('Copy')}>\n <i className=\"icon-copy\" />\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default memo(CodeOverlay);\n","import type { FC } from '../../../lib/teact/teact';\nimport React, { memo, useCallback, useState } from '../../../lib/teact/teact';\n\nimport buildClassName from '../../../util/buildClassName';\n\nimport CodeOverlay from './CodeOverlay';\n\ntype OwnProps = {\n text: string;\n noCopy?: boolean;\n};\n\nconst PreBlock: FC<OwnProps> = ({ text, noCopy }) => {\n const [isWordWrap, setWordWrap] = useState(true);\n\n const handleWordWrapToggle = useCallback((wrap) => {\n setWordWrap(wrap);\n }, []);\n\n const blockClass = buildClassName('text-entity-pre', !isWordWrap && 'no-word-wrap');\n\n return (\n <pre className={blockClass}>\n <div className=\"pre-code custom-scroll-x\">{text}</div>\n <CodeOverlay\n text={text}\n className=\"code-overlay\"\n onWordWrapToggle={handleWordWrapToggle}\n noCopy={noCopy}\n />\n </pre>\n );\n};\n\nexport default memo(PreBlock);\n","import type { FC } from '../../../lib/teact/teact';\nimport React, { memo, useCallback, useState } from '../../../lib/teact/teact';\n\nimport buildClassName from '../../../util/buildClassName';\n\nimport useAsync from '../../../hooks/useAsync';\n\nimport PreBlock from './PreBlock';\nimport CodeOverlay from './CodeOverlay';\n\nimport './CodeBlock.scss';\n\nexport type OwnProps = {\n text: string;\n language?: string;\n noCopy?: boolean;\n};\n\nconst CodeBlock: FC<OwnProps> = ({ text, language, noCopy }) => {\n const [isWordWrap, setWordWrap] = useState(true);\n\n const { result: highlighted } = useAsync(() => {\n if (!language) return Promise.resolve(undefined);\n return import('../../../util/highlightCode')\n .then((lib) => lib.default(text, language));\n }, [language, text]);\n\n const handleWordWrapToggle = useCallback((wrap) => {\n setWordWrap(wrap);\n }, []);\n\n if (!highlighted) {\n return <PreBlock text={text} noCopy={noCopy} />;\n }\n\n const blockClass = buildClassName('code-block', !isWordWrap && 'no-word-wrap');\n\n return (\n <pre className={blockClass}>\n {highlighted}\n <CodeOverlay\n text={text}\n className=\"code-overlay\"\n onWordWrapToggle={handleWordWrapToggle}\n noCopy={noCopy}\n />\n </pre>\n );\n};\n\nexport default memo(CodeBlock);\n","import type { MouseEvent } from 'react';\nimport React from '../../../lib/teact/teact';\nimport { getActions } from '../../../global';\n\nimport type { TextPart } from '../../../types';\nimport type { ApiFormattedText, ApiMessageEntity } from '../../../api/types';\nimport { ApiMessageEntityTypes } from '../../../api/types';\n\nimport type { TextFilter } from './renderText';\nimport renderText from './renderText';\nimport { copyTextToClipboard } from '../../../util/clipboard';\nimport { getTranslation } from '../../../util/langProvider';\n\nimport MentionLink from '../../middle/message/MentionLink';\nimport SafeLink from '../SafeLink';\nimport Spoiler from '../spoiler/Spoiler';\nimport CodeBlock from '../code/CodeBlock';\nimport buildClassName from '../../../util/buildClassName';\n\ninterface IOrganizedEntity {\n entity: ApiMessageEntity;\n organizedIndexes: Set<number>;\n nestedEntities: IOrganizedEntity[];\n}\n\nexport function renderTextWithEntities(\n text: string,\n entities?: ApiMessageEntity[],\n highlight?: string,\n shouldRenderHqEmoji?: boolean,\n shouldRenderAsHtml?: boolean,\n messageId?: number,\n isSimple?: boolean,\n isProtected?: boolean,\n) {\n if (!entities || !entities.length) {\n return renderMessagePart(text, highlight, shouldRenderHqEmoji, shouldRenderAsHtml, isSimple);\n }\n\n const result: TextPart[] = [];\n let deleteLineBreakAfterPre = false;\n\n const organizedEntities = organizeEntities(entities);\n\n // Recursive function to render regular and nested entities\n function renderEntity(\n textPartStart: number,\n textPartEnd: number,\n organizedEntity: IOrganizedEntity,\n isLastEntity: boolean,\n ) {\n const renderResult: TextPart[] = [];\n const { entity, nestedEntities } = organizedEntity;\n const { offset, length, type } = entity;\n\n // Render text before the entity\n let textBefore = text.substring(textPartStart, offset);\n const textBeforeLength = textBefore.length;\n if (textBefore) {\n if (deleteLineBreakAfterPre && textBefore.length > 0 && textBefore[0] === '\\n') {\n textBefore = textBefore.substr(1);\n deleteLineBreakAfterPre = false;\n }\n if (textBefore) {\n renderResult.push(...renderMessagePart(\n textBefore, highlight, shouldRenderHqEmoji, shouldRenderAsHtml, isSimple,\n ) as TextPart[]);\n }\n }\n\n const entityStartIndex = textPartStart + textBeforeLength;\n const entityEndIndex = entityStartIndex + length;\n\n let entityContent: TextPart = text.substring(offset, offset + length);\n const nestedEntityContent: TextPart[] = [];\n\n if (deleteLineBreakAfterPre && entityContent.length > 0 && entityContent[0] === '\\n') {\n entityContent = entityContent.substr(1);\n deleteLineBreakAfterPre = false;\n }\n\n if (type === ApiMessageEntityTypes.Pre) {\n deleteLineBreakAfterPre = true;\n }\n\n // Render nested entities, if any\n if (nestedEntities.length) {\n let nestedIndex = entityStartIndex;\n\n nestedEntities.forEach((nestedEntity, nestedEntityIndex) => {\n const {\n renderResult: nestedResult,\n entityEndIndex: nestedEntityEndIndex,\n } = renderEntity(\n nestedIndex,\n entityEndIndex,\n nestedEntity,\n nestedEntityIndex === nestedEntities.length - 1,\n );\n\n nestedEntityContent.push(...nestedResult);\n nestedIndex = nestedEntityEndIndex;\n });\n }\n\n // Render the entity itself\n const newEntity = shouldRenderAsHtml\n ? processEntityAsHtml(entity, entityContent, nestedEntityContent)\n : processEntity(\n entity, entityContent, nestedEntityContent, highlight, messageId, isSimple, isProtected,\n );\n\n if (Array.isArray(newEntity)) {\n renderResult.push(...newEntity);\n } else {\n renderResult.push(newEntity);\n }\n\n // Render text after the entity, if it is the last entity in the text,\n // or the last nested entity inside of another entity\n if (isLastEntity && entityEndIndex < textPartEnd) {\n let textAfter = text.substring(entityEndIndex, textPartEnd);\n if (deleteLineBreakAfterPre && textAfter.length > 0 && textAfter[0] === '\\n') {\n textAfter = textAfter.substring(1);\n }\n if (textAfter) {\n renderResult.push(...renderMessagePart(\n textAfter, highlight, shouldRenderHqEmoji, shouldRenderAsHtml, isSimple,\n ) as TextPart[]);\n }\n }\n\n return {\n renderResult,\n entityEndIndex,\n };\n }\n\n // Process highest-level entities\n let index = 0;\n\n organizedEntities.forEach((entity, arrayIndex) => {\n const { renderResult, entityEndIndex } = renderEntity(\n index,\n text.length,\n entity,\n arrayIndex === organizedEntities.length - 1,\n );\n\n result.push(...renderResult);\n index = entityEndIndex;\n });\n\n return result;\n}\n\nexport function getTextWithEntitiesAsHtml(formattedText?: ApiFormattedText) {\n const { text, entities } = formattedText || {};\n if (!text) {\n return '';\n }\n\n const result = renderTextWithEntities(\n text,\n entities,\n undefined,\n undefined,\n true,\n );\n\n if (Array.isArray(result)) {\n return result.join('');\n }\n\n return result;\n}\n\nfunction renderMessagePart(\n content: TextPart | TextPart[],\n highlight?: string,\n shouldRenderHqEmoji?: boolean,\n shouldRenderAsHtml?: boolean,\n isSimple?: boolean,\n) {\n if (Array.isArray(content)) {\n const result: TextPart[] = [];\n\n content.forEach((c) => {\n result.push(...renderMessagePart(c, highlight, shouldRenderHqEmoji, shouldRenderAsHtml, isSimple));\n });\n\n return result;\n }\n\n if (shouldRenderAsHtml) {\n return renderText(content, ['escape_html', 'emoji_html', 'br_html']);\n }\n\n const emojiFilter = shouldRenderHqEmoji ? 'hq_emoji' : 'emoji';\n\n const filters: TextFilter[] = [emojiFilter];\n if (!isSimple) {\n filters.push('br');\n }\n\n if (highlight) {\n return renderText(content, filters.concat('highlight'), { highlight });\n } else {\n return renderText(content, filters);\n }\n}\n\n// Organize entities in a tree-like structure to better represent how the text will be displayed\nfunction organizeEntities(entities: ApiMessageEntity[]) {\n const organizedEntityIndexes: Set<number> = new Set();\n const organizedEntities: IOrganizedEntity[] = [];\n\n entities.forEach((entity, index) => {\n if (organizedEntityIndexes.has(index)) {\n return;\n }\n\n const organizedEntity = organizeEntity(entity, index, entities, organizedEntityIndexes);\n if (organizedEntity) {\n organizedEntity.organizedIndexes.forEach((organizedIndex) => {\n organizedEntityIndexes.add(organizedIndex);\n });\n\n organizedEntities.push(organizedEntity);\n }\n });\n\n return organizedEntities;\n}\n\nfunction organizeEntity(\n entity: ApiMessageEntity,\n index: number,\n entities: ApiMessageEntity[],\n organizedEntityIndexes: Set<number>,\n): IOrganizedEntity | undefined {\n const { offset, length } = entity;\n const organizedIndexes = new Set([index]);\n\n if (organizedEntityIndexes.has(index)) {\n return undefined;\n }\n\n // Determine any nested entities inside current entity\n const nestedEntities: IOrganizedEntity[] = [];\n const parsedNestedEntities = entities\n .filter((e, i) => i > index && e.offset >= offset && e.offset < offset + length)\n .map((e) => organizeEntity(e, entities.indexOf(e), entities, organizedEntityIndexes))\n .filter<IOrganizedEntity>(Boolean as any);\n\n parsedNestedEntities.forEach((parsedEntity) => {\n let isChanged = false;\n\n parsedEntity.organizedIndexes.forEach((organizedIndex) => {\n if (!isChanged && !organizedIndexes.has(organizedIndex)) {\n isChanged = true;\n }\n\n organizedIndexes.add(organizedIndex);\n });\n\n if (isChanged) {\n nestedEntities.push(parsedEntity);\n }\n });\n\n return {\n entity,\n organizedIndexes,\n nestedEntities,\n };\n}\n\nfunction processEntity(\n entity: ApiMessageEntity,\n entityContent: TextPart,\n nestedEntityContent: TextPart[],\n highlight?: string,\n messageId?: number,\n isSimple?: boolean,\n isProtected?: boolean,\n) {\n const entityText = typeof entityContent === 'string' && entityContent;\n const renderedContent = nestedEntityContent.length ? nestedEntityContent : entityContent;\n\n function renderNestedMessagePart() {\n return renderMessagePart(\n renderedContent, highlight, undefined, undefined, isSimple,\n );\n }\n\n if (!entityText) {\n return renderNestedMessagePart();\n }\n\n if (isSimple) {\n const text = renderNestedMessagePart();\n if (entity.type === ApiMessageEntityTypes.Spoiler) {\n return <Spoiler>{text}</Spoiler>;\n }\n return text;\n }\n\n switch (entity.type) {\n case ApiMessageEntityTypes.Bold:\n return <strong>{renderNestedMessagePart()}</strong>;\n case ApiMessageEntityTypes.Blockquote:\n return <blockquote>{renderNestedMessagePart()}</blockquote>;\n case ApiMessageEntityTypes.BotCommand:\n return (\n <a\n onClick={handleBotCommandClick}\n className=\"text-entity-link\"\n dir=\"auto\"\n >\n {renderNestedMessagePart()}\n </a>\n );\n case ApiMessageEntityTypes.Hashtag:\n return (\n <a\n onClick={handleHashtagClick}\n className=\"text-entity-link\"\n dir=\"auto\"\n >\n {renderNestedMessagePart()}\n </a>\n );\n case ApiMessageEntityTypes.Cashtag:\n return (\n <a\n onClick={handleHashtagClick}\n className=\"text-entity-link\"\n dir=\"auto\"\n >\n {renderNestedMessagePart()}\n </a>\n );\n case ApiMessageEntityTypes.Code:\n return (\n <code\n className={buildClassName('text-entity-code', !isProtected && 'clickable')}\n onClick={!isProtected ? handleCodeClick : undefined}\n role=\"textbox\"\n tabIndex={0}\n >\n {renderNestedMessagePart()}\n </code>\n );\n case ApiMessageEntityTypes.Email:\n return (\n <a\n href={`mailto:${entityText}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-entity-link\"\n dir=\"auto\"\n >\n {renderNestedMessagePart()}\n </a>\n );\n case ApiMessageEntityTypes.Italic:\n return <em>{renderNestedMessagePart()}</em>;\n case ApiMessageEntityTypes.MentionName:\n return (\n <MentionLink userId={entity.userId}>\n {renderNestedMessagePart()}\n </MentionLink>\n );\n case ApiMessageEntityTypes.Mention:\n return (\n <MentionLink username={entityText}>\n {renderNestedMessagePart()}\n </MentionLink>\n );\n case ApiMessageEntityTypes.Phone:\n return (\n <a\n href={`tel:${entityText}`}\n className=\"text-entity-link\"\n dir=\"auto\"\n >\n {renderNestedMessagePart()}\n </a>\n );\n case ApiMessageEntityTypes.Pre:\n return <CodeBlock text={entityText} language={entity.language} noCopy={isProtected} />;\n case ApiMessageEntityTypes.Strike:\n return <del>{renderNestedMessagePart()}</del>;\n case ApiMessageEntityTypes.TextUrl:\n case ApiMessageEntityTypes.Url:\n return (\n <SafeLink\n url={getLinkUrl(entityText, entity)}\n text={entityText}\n >\n {renderNestedMessagePart()}\n </SafeLink>\n );\n case ApiMessageEntityTypes.Underline:\n return <ins>{renderNestedMessagePart()}</ins>;\n case ApiMessageEntityTypes.Spoiler:\n return <Spoiler messageId={messageId}>{renderNestedMessagePart()}</Spoiler>;\n default:\n return renderNestedMessagePart();\n }\n}\n\nfunction processEntityAsHtml(\n entity: ApiMessageEntity,\n entityContent: TextPart,\n nestedEntityContent: TextPart[],\n) {\n const rawEntityText = typeof entityContent === 'string' ? entityContent : undefined;\n\n // Prevent adding newlines when editing\n const content = entity.type === ApiMessageEntityTypes.Pre ? (entityContent as string).trimEnd() : entityContent;\n\n const renderedContent = nestedEntityContent.length\n ? nestedEntityContent.join('')\n : renderText(content, ['escape_html', 'emoji_html', 'br_html']).join('');\n\n if (!rawEntityText) {\n return renderedContent;\n }\n\n switch (entity.type) {\n case ApiMessageEntityTypes.Bold:\n return `<b>${renderedContent}</b>`;\n case ApiMessageEntityTypes.Italic:\n return `<i>${renderedContent}</i>`;\n case ApiMessageEntityTypes.Underline:\n return `<u>${renderedContent}</u>`;\n case ApiMessageEntityTypes.Code:\n return `<code class=\"text-entity-code\">${renderedContent}</code>`;\n case ApiMessageEntityTypes.Pre:\n return `\\`\\`\\`${entity.language || ''}<br/>${renderedContent}<br/>\\`\\`\\`<br/>`;\n case ApiMessageEntityTypes.Strike:\n return `<del>${renderedContent}</del>`;\n case ApiMessageEntityTypes.MentionName:\n return `<a\n class=\"text-entity-link\"\n data-entity-type=\"${ApiMessageEntityTypes.MentionName}\"\n data-user-id=\"${entity.userId}\"\n contenteditable=\"false\"\n dir=\"auto\"\n >${renderedContent}</a>`;\n case ApiMessageEntityTypes.Url:\n case ApiMessageEntityTypes.TextUrl:\n return `<a\n class=\"text-entity-link\"\n href=${getLinkUrl(rawEntityText, entity)}\n data-entity-type=\"${entity.type}\"\n dir=\"auto\"\n >${renderedContent}</a>`;\n case ApiMessageEntityTypes.Spoiler:\n return `<span\n class=\"spoiler\"\n data-entity-type=\"${ApiMessageEntityTypes.Spoiler}\"\n >${renderedContent}</span>`;\n default:\n return renderedContent;\n }\n}\n\nfunction getLinkUrl(entityContent: string, entity: ApiMessageEntity) {\n const { type, url } = entity;\n return type === ApiMessageEntityTypes.TextUrl && url ? url : entityContent;\n}\n\nfunction handleBotCommandClick(e: MouseEvent<HTMLAnchorElement>) {\n getActions().sendBotCommand({ command: e.currentTarget.innerText });\n}\n\nfunction handleHashtagClick(e: MouseEvent<HTMLAnchorElement>) {\n getActions().setLocalTextSearchQuery({ query: e.currentTarget.innerText });\n getActions().searchTextMessagesLocal();\n}\n\nfunction handleCodeClick(e: MouseEvent<HTMLElement>) {\n copyTextToClipboard(e.currentTarget.innerText);\n getActions().showNotification({\n message: getTranslation('TextCopied'),\n });\n}\n","import type React from '../../../lib/teact/teact';\n\nimport { EDITABLE_INPUT_ID } from '../../../config';\nimport { IS_IOS } from '../../../util/environment';\n\nexport function preventMessageInputBlur(e: React.MouseEvent<HTMLElement>, withBubbling = false) {\n if (\n IS_IOS\n || !document.activeElement\n || document.activeElement.id !== EDITABLE_INPUT_ID\n || (!withBubbling && e.target !== e.currentTarget)\n ) {\n return;\n }\n\n e.preventDefault();\n}\n\nexport function preventMessageInputBlurWithBubbling(e: React.MouseEvent<HTMLElement>) {\n preventMessageInputBlur(e, true);\n}\n","import type { FC } from '../../../lib/teact/teact';\nimport React from '../../../lib/teact/teact';\nimport { getActions, withGlobal } from '../../../global';\n\nimport type { ApiChat, ApiUser } from '../../../api/types';\n\nimport { selectUser } from '../../../global/selectors';\n\ntype OwnProps = {\n userId?: string;\n username?: string;\n children: React.ReactNode;\n};\n\ntype StateProps = {\n userOrChat?: ApiUser | ApiChat;\n};\n\nconst MentionLink: FC<OwnProps & StateProps> = ({\n username,\n userOrChat,\n children,\n}) => {\n const {\n openChat,\n openChatByUsername,\n } = getActions();\n\n const handleClick = () => {\n if (userOrChat) {\n openChat({ id: userOrChat.id });\n } else if (username) {\n openChatByUsername({ username: username.substring(1) });\n }\n };\n\n return (\n <a onClick={handleClick} className=\"text-entity-link\" dir=\"auto\">\n {children}\n </a>\n );\n};\n\nexport default withGlobal<OwnProps>(\n (global, { userId }): StateProps => {\n return {\n userOrChat: userId ? selectUser(global, userId) : undefined,\n };\n },\n)(MentionLink);\n","import type { MouseEvent as ReactMouseEvent, RefObject } from 'react';\n\nimport type { FC } from '../../lib/teact/teact';\nimport React, { useRef, useCallback, useState } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport buildStyle from '../../util/buildStyle';\n\nimport Spinner from './Spinner';\nimport RippleEffect from './RippleEffect';\n\nimport './Button.scss';\n\nexport type OwnProps = {\n ref?: RefObject<HTMLButtonElement | HTMLAnchorElement>;\n type?: 'button' | 'submit' | 'reset';\n children: React.ReactNode;\n size?: 'default' | 'smaller' | 'tiny';\n color?: (\n 'primary' | 'secondary' | 'gray' | 'danger' | 'translucent' | 'translucent-white' | 'translucent-black' | 'dark'\n );\n backgroundImage?: string;\n id?: string;\n className?: string;\n round?: boolean;\n pill?: boolean;\n fluid?: boolean;\n isText?: boolean;\n isLoading?: boolean;\n ariaLabel?: string;\n ariaControls?: string;\n hasPopup?: boolean;\n href?: string;\n download?: string;\n disabled?: boolean;\n ripple?: boolean;\n faded?: boolean;\n tabIndex?: number;\n isRtl?: boolean;\n isShiny?: boolean;\n noPreventDefault?: boolean;\n shouldStopPropagation?: boolean;\n style?: string;\n onClick?: (e: ReactMouseEvent<HTMLButtonElement, MouseEvent>) => void;\n onContextMenu?: (e: ReactMouseEvent<HTMLButtonElement, MouseEvent>) => void;\n onMouseDown?: (e: ReactMouseEvent<HTMLButtonElement>) => void;\n onMouseEnter?: NoneToVoidFunction;\n onMouseLeave?: NoneToVoidFunction;\n onFocus?: NoneToVoidFunction;\n};\n\n// Longest animation duration;\nconst CLICKED_TIMEOUT = 400;\n\nconst Button: FC<OwnProps> = ({\n ref,\n type = 'button',\n id,\n onClick,\n onContextMenu,\n onMouseDown,\n onMouseEnter,\n onMouseLeave,\n onFocus,\n children,\n size = 'default',\n color = 'primary',\n backgroundImage,\n className,\n round,\n pill,\n fluid,\n isText,\n isLoading,\n isShiny,\n ariaLabel,\n ariaControls,\n hasPopup,\n href,\n download,\n disabled,\n ripple,\n faded,\n tabIndex,\n isRtl,\n noPreventDefault,\n shouldStopPropagation,\n style,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let elementRef = useRef<HTMLButtonElement | HTMLAnchorElement>(null);\n if (ref) {\n elementRef = ref;\n }\n\n const [isClicked, setIsClicked] = useState(false);\n\n const fullClassName = buildClassName(\n 'Button',\n className,\n size,\n color,\n round && 'round',\n pill && 'pill',\n fluid && 'fluid',\n disabled && 'disabled',\n isText && 'text',\n isLoading && 'loading',\n ripple && 'has-ripple',\n faded && 'faded',\n isClicked && 'clicked',\n backgroundImage && 'with-image',\n isShiny && 'shiny',\n );\n\n const handleClick = useCallback((e: ReactMouseEvent<HTMLButtonElement, MouseEvent>) => {\n if (!disabled && onClick) {\n onClick(e);\n }\n\n if (shouldStopPropagation) e.stopPropagation();\n\n setIsClicked(true);\n setTimeout(() => {\n setIsClicked(false);\n }, CLICKED_TIMEOUT);\n }, [disabled, onClick, shouldStopPropagation]);\n\n const handleMouseDown = useCallback((e: ReactMouseEvent<HTMLButtonElement>) => {\n if (!noPreventDefault) e.preventDefault();\n\n if (!disabled && onMouseDown) {\n onMouseDown(e);\n }\n }, [disabled, noPreventDefault, onMouseDown]);\n\n if (href) {\n return (\n <a\n ref={elementRef as RefObject<HTMLAnchorElement>}\n id={id}\n className={fullClassName}\n href={href}\n title={ariaLabel}\n download={download}\n tabIndex={tabIndex}\n dir={isRtl ? 'rtl' : undefined}\n aria-label={ariaLabel}\n aria-controls={ariaControls}\n style={style}\n >\n {children}\n {!disabled && ripple && (\n <RippleEffect />\n )}\n </a>\n );\n }\n\n return (\n <button\n ref={elementRef as RefObject<HTMLButtonElement>}\n id={id}\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 aria-controls={ariaControls}\n aria-haspopup={hasPopup}\n title={ariaLabel}\n tabIndex={tabIndex}\n dir={isRtl ? 'rtl' : undefined}\n style={buildStyle(backgroundImage && `background-image: url(${backgroundImage})`)}\n >\n {isLoading ? (\n <div>\n <span dir={isRtl ? 'auto' : undefined}>Please wait...</span>\n <Spinner color={isText ? 'blue' : 'white'} />\n </div>\n ) : children}\n {!disabled && ripple && (\n <RippleEffect />\n )}\n </button>\n );\n};\n\nexport default Button;\n","import type { ChangeEvent } from 'react';\nimport type { FC, TeactNode } from '../../lib/teact/teact';\nimport React, { memo, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\nimport renderText from '../common/helpers/renderText';\n\nimport Spinner from './Spinner';\n\nimport './Checkbox.scss';\n\ntype OwnProps = {\n id?: string;\n name?: string;\n value?: string;\n label: TeactNode;\n subLabel?: string;\n checked: boolean;\n disabled?: boolean;\n tabIndex?: number;\n round?: boolean;\n blocking?: boolean;\n isLoading?: boolean;\n withCheckedCallback?: boolean;\n className?: string;\n onChange?: (e: ChangeEvent<HTMLInputElement>) => void;\n onCheck?: (isChecked: boolean) => void;\n};\n\nconst Checkbox: FC<OwnProps> = ({\n id,\n name,\n value,\n label,\n subLabel,\n checked,\n tabIndex,\n disabled,\n round,\n blocking,\n isLoading,\n className,\n onChange,\n onCheck,\n}) => {\n const lang = useLang();\n const handleChange = useCallback((event: ChangeEvent<HTMLInputElement>) => {\n if (onChange) {\n onChange(event);\n }\n\n if (onCheck) {\n onCheck(event.currentTarget.checked);\n }\n }, [onChange, onCheck]);\n\n const labelClassName = buildClassName(\n 'Checkbox',\n disabled && 'disabled',\n round && 'round',\n isLoading && 'loading',\n blocking && 'blocking',\n className,\n );\n\n return (\n <label className={labelClassName} dir={lang.isRtl ? 'rtl' : undefined}>\n <input\n type=\"checkbox\"\n id={id}\n name={name}\n value={value}\n checked={checked}\n disabled={disabled}\n tabIndex={tabIndex}\n onChange={handleChange}\n />\n <div className=\"Checkbox-main\">\n <span className=\"label\" dir=\"auto\">{typeof label === 'string' ? renderText(label) : label}</span>\n {subLabel && <span className=\"subLabel\" dir=\"auto\">{renderText(subLabel)}</span>}\n </div>\n {isLoading && <Spinner />}\n </label>\n );\n};\n\nexport default memo(Checkbox);\n","import type { FC } from '../../lib/teact/teact';\nimport React, { useState, useRef, useCallback } from '../../lib/teact/teact';\n\nimport Menu from './Menu';\n\nimport './DropdownMenu.scss';\n\ntype OwnProps = {\n className?: string;\n trigger: FC<{ onTrigger: () => void; isOpen?: boolean }>;\n positionX?: 'left' | 'right';\n positionY?: 'top' | 'bottom';\n footer?: string;\n forceOpen?: boolean;\n onOpen?: NoneToVoidFunction;\n onClose?: NoneToVoidFunction;\n children: React.ReactNode;\n};\n\nconst DropdownMenu: FC<OwnProps> = ({\n trigger,\n className,\n children,\n positionX = 'left',\n positionY = 'top',\n footer,\n forceOpen,\n onOpen,\n onClose,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const menuRef = useRef<HTMLDivElement>(null);\n // eslint-disable-next-line no-null/no-null\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [isOpen, setIsOpen] = useState(false);\n\n const toggleIsOpen = () => {\n setIsOpen(!isOpen);\n if (isOpen) {\n if (onClose) onClose();\n } else if (onOpen) onOpen();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<any>) => {\n const menu = menuRef.current;\n\n if (!isOpen || e.keyCode !== 40 || !menu) {\n return;\n }\n\n const focusedElement = document.activeElement;\n const elementChildren = Array.from(menu.children);\n\n if (!focusedElement || elementChildren.indexOf(focusedElement) === -1) {\n (elementChildren[0] as HTMLElement).focus();\n }\n };\n\n const handleClose = useCallback(() => {\n setIsOpen(false);\n if (onClose) onClose();\n }, [onClose]);\n\n return (\n <div\n ref={dropdownRef}\n className={`DropdownMenu ${className || ''}`}\n onKeyDown={handleKeyDown}\n >\n {trigger({ onTrigger: toggleIsOpen, isOpen })}\n\n <Menu\n ref={menuRef}\n containerRef={dropdownRef}\n isOpen={isOpen || Boolean(forceOpen)}\n className={className || ''}\n positionX={positionX}\n positionY={positionY}\n footer={footer}\n autoClose\n onClose={handleClose}\n shouldSkipTransition={forceOpen}\n >\n {children}\n </Menu>\n </div>\n );\n};\n\nexport default DropdownMenu;\n","import type {\n ChangeEvent, FormEvent, RefObject,\n} from 'react';\nimport type { FC } from '../../lib/teact/teact';\nimport React, { memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\ntype OwnProps = {\n ref?: RefObject<HTMLInputElement>;\n id?: string;\n className?: string;\n value?: string;\n label?: string;\n error?: string;\n success?: string;\n disabled?: boolean;\n readOnly?: boolean;\n placeholder?: string;\n autoComplete?: string;\n maxLength?: number;\n tabIndex?: number;\n teactExperimentControlled?: boolean;\n inputMode?: 'text' | 'none' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search';\n onChange?: (e: ChangeEvent<HTMLInputElement>) => void;\n onInput?: (e: FormEvent<HTMLInputElement>) => void;\n onKeyPress?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n onKeyDown?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;\n onPaste?: (e: React.ClipboardEvent<HTMLInputElement>) => void;\n};\n\nconst InputText: FC<OwnProps> = ({\n ref,\n id,\n className,\n value,\n label,\n error,\n success,\n disabled,\n readOnly,\n placeholder,\n autoComplete,\n inputMode,\n maxLength,\n tabIndex,\n teactExperimentControlled,\n onChange,\n onInput,\n onKeyPress,\n onKeyDown,\n onBlur,\n onPaste,\n}) => {\n const lang = useLang();\n const labelText = error || success || label;\n const fullClassName = buildClassName(\n 'input-group',\n value && 'touched',\n error ? 'error' : success && 'success',\n disabled && 'disabled',\n readOnly && 'disabled',\n labelText && 'with-label',\n className,\n );\n\n return (\n <div className={fullClassName} dir={lang.isRtl ? 'rtl' : undefined}>\n <input\n ref={ref}\n className=\"form-control\"\n type=\"text\"\n id={id}\n dir=\"auto\"\n value={value || ''}\n tabIndex={tabIndex}\n placeholder={placeholder}\n maxLength={maxLength}\n autoComplete={autoComplete}\n inputMode={inputMode}\n disabled={disabled}\n readOnly={readOnly}\n onChange={onChange}\n onInput={onInput}\n onKeyPress={onKeyPress}\n onKeyDown={onKeyDown}\n onBlur={onBlur}\n onPaste={onPaste}\n aria-label={labelText}\n teactExperimentControlled={teactExperimentControlled}\n />\n {labelText && (\n <label htmlFor={id}>{labelText}</label>\n )}\n </div>\n );\n};\n\nexport default memo(InputText);\n","import type { FC } from '../../lib/teact/teact';\nimport React, { useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Link.scss';\n\ntype OwnProps = {\n children: React.ReactNode;\n className?: string;\n isRtl?: boolean;\n onClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void;\n};\n\nconst Link: FC<OwnProps> = ({\n children, className, isRtl, onClick,\n}) => {\n const handleClick = useCallback((e: React.MouseEvent<HTMLAnchorElement>) => {\n e.preventDefault();\n onClick!(e);\n }, [onClick]);\n\n return (\n <a\n href=\"#\"\n className={buildClassName('Link', className)}\n dir={isRtl ? 'rtl' : 'auto'}\n onClick={onClick ? handleClick : undefined}\n >\n {children}\n </a>\n );\n};\n\nexport default Link;\n","import type { FC } from '../../lib/teact/teact';\nimport React, { memo } from '../../lib/teact/teact';\n\nimport Spinner from './Spinner';\nimport buildClassName from '../../util/buildClassName';\n\nimport './Loading.scss';\n\ntype OwnProps = {\n color?: 'blue' | 'white' | 'black' | 'yellow';\n backgroundColor?: 'light' | 'dark';\n onClick?: NoneToVoidFunction;\n};\n\nconst Loading: FC<OwnProps> = ({ color = 'blue', backgroundColor, onClick }) => {\n return (\n <div className={buildClassName('Loading', onClick && 'interactive')} onClick={onClick}>\n <Spinner color={color} backgroundColor={backgroundColor} />\n </div>\n );\n};\n\nexport default memo(Loading);\n","import type { RefObject } from 'react';\nimport type { FC } from '../../lib/teact/teact';\nimport React, { 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 buildStyle from '../../util/buildStyle';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport useHistoryBack from '../../hooks/useHistoryBack';\nimport { preventMessageInputBlurWithBubbling } from '../middle/helpers/preventMessageInputBlur';\nimport { IS_BACKDROP_BLUR_SUPPORTED, IS_COMPACT_MENU } from '../../util/environment';\n\nimport './Menu.scss';\n\ntype OwnProps = {\n ref?: RefObject<HTMLDivElement>;\n containerRef?: RefObject<HTMLElement>;\n isOpen: boolean;\n id?: string;\n className?: string;\n style?: string;\n bubbleStyle?: string;\n ariaLabelledBy?: string;\n transformOriginX?: number;\n transformOriginY?: number;\n positionX?: 'left' | 'right';\n positionY?: 'top' | 'bottom';\n autoClose?: boolean;\n shouldSkipTransition?: boolean;\n footer?: string;\n noCloseOnBackdrop?: boolean;\n noCompact?: boolean;\n onKeyDown?: (e: React.KeyboardEvent<any>) => void;\n onCloseAnimationEnd?: () => void;\n onClose: () => void;\n onMouseEnter?: (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;\n onMouseLeave?: (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;\n children: React.ReactNode;\n};\n\nconst ANIMATION_DURATION = 200;\n\nconst Menu: FC<OwnProps> = ({\n ref,\n containerRef,\n isOpen,\n id,\n className,\n style,\n bubbleStyle,\n ariaLabelledBy,\n children,\n transformOriginX,\n transformOriginY,\n positionX = 'left',\n positionY = 'top',\n autoClose = false,\n footer,\n noCloseOnBackdrop = false,\n noCompact,\n onCloseAnimationEnd,\n onClose,\n onMouseEnter,\n onMouseLeave,\n shouldSkipTransition,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let menuRef = useRef<HTMLDivElement>(null);\n if (ref) {\n menuRef = ref;\n }\n const backdropContainerRef = containerRef || menuRef;\n\n const {\n transitionClassNames,\n } = useShowTransition(\n isOpen,\n onCloseAnimationEnd,\n shouldSkipTransition,\n undefined,\n shouldSkipTransition,\n );\n\n useEffect(\n () => (isOpen ? captureEscKeyListener(onClose) : undefined),\n [isOpen, onClose],\n );\n\n useHistoryBack({\n isActive: isOpen,\n onBack: onClose,\n shouldBeReplaced: true,\n });\n\n useEffectWithPrevDeps(([prevIsOpen]) => {\n if (isOpen || (!isOpen && prevIsOpen === true)) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }\n }, [isOpen]);\n\n const handleKeyDown = useKeyboardListNavigation(menuRef, isOpen, autoClose ? onClose : undefined, undefined, true);\n\n useVirtualBackdrop(\n isOpen,\n backdropContainerRef,\n noCloseOnBackdrop ? undefined : onClose,\n );\n\n const bubbleClassName = buildClassName(\n 'bubble menu-container custom-scroll',\n positionY,\n positionX,\n footer && 'with-footer',\n transitionClassNames,\n );\n\n const transformOriginYStyle = transformOriginY !== undefined ? `${transformOriginY}px` : undefined;\n const transformOriginXStyle = transformOriginX !== undefined ? `${transformOriginX}px` : undefined;\n\n return (\n <div\n id={id}\n className={buildClassName(\n 'Menu no-selection',\n !noCompact && IS_COMPACT_MENU && 'compact',\n !IS_BACKDROP_BLUR_SUPPORTED && 'no-blur',\n className,\n )}\n style={style}\n aria-labelledby={ariaLabelledBy}\n role={ariaLabelledBy ? 'menu' : undefined}\n onKeyDown={isOpen ? handleKeyDown : undefined}\n onMouseEnter={onMouseEnter}\n onMouseLeave={isOpen ? onMouseLeave : undefined}\n >\n {isOpen && (\n // This only prevents click events triggering on underlying elements\n <div className=\"backdrop\" onMouseDown={preventMessageInputBlurWithBubbling} />\n )}\n <div\n ref={menuRef}\n className={bubbleClassName}\n style={buildStyle(\n `transform-origin: ${transformOriginXStyle || positionX} ${transformOriginYStyle || positionY}`,\n bubbleStyle,\n )}\n onClick={autoClose ? onClose : undefined}\n >\n {children}\n {footer && <div className=\"footer\">{footer}</div>}\n </div>\n </div>\n );\n};\n\nexport default Menu;\n","import type { FC } from '../../lib/teact/teact';\nimport React, { useCallback } from '../../lib/teact/teact';\n\nimport { IS_TEST } from '../../config';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\nimport { IS_COMPACT_MENU } from '../../util/environment';\n\nimport './MenuItem.scss';\n\ntype OnClickHandler = (e: React.SyntheticEvent<HTMLDivElement | HTMLAnchorElement>) => void;\n\ntype OwnProps = {\n icon?: string;\n customIcon?: React.ReactNode;\n className?: string;\n children: React.ReactNode;\n onClick?: OnClickHandler;\n onContextMenu?: (e: React.UIEvent) => void;\n href?: string;\n download?: string;\n disabled?: boolean;\n destructive?: boolean;\n ariaLabel?: string;\n};\n\nconst MenuItem: FC<OwnProps> = (props) => {\n const {\n icon,\n customIcon,\n className,\n children,\n onClick,\n href,\n download,\n disabled,\n destructive,\n ariaLabel,\n onContextMenu,\n } = props;\n\n const lang = useLang();\n const handleClick = useCallback((e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled || !onClick) {\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n\n onClick(e);\n }, [disabled, onClick]);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.keyCode !== 13 && e.keyCode !== 32) {\n return;\n }\n\n if (disabled || !onClick) {\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n\n onClick(e);\n }, [disabled, onClick]);\n\n const fullClassName = buildClassName(\n 'MenuItem',\n className,\n disabled && 'disabled',\n destructive && 'destructive',\n IS_COMPACT_MENU && 'compact',\n );\n\n const content = (\n <>\n {!customIcon && icon && (\n <i className={`icon-${icon}`} data-char={icon.startsWith('char-') ? icon.replace('char-', '') : undefined} />\n )}\n {customIcon}\n {children}\n </>\n );\n\n if (href) {\n return (\n <a\n tabIndex={0}\n className={fullClassName}\n href={href}\n download={download}\n aria-label={ariaLabel}\n title={ariaLabel}\n target={href.startsWith(window.location.origin) || IS_TEST ? '_self' : '_blank'}\n rel=\"noopener noreferrer\"\n dir={lang.isRtl ? 'rtl' : undefined}\n onClick={onClick}\n >\n {content}\n </a>\n );\n }\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n className={fullClassName}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onContextMenu={onContextMenu}\n aria-label={ariaLabel}\n title={ariaLabel}\n dir={lang.isRtl ? 'rtl' : undefined}\n >\n {content}\n </div>\n );\n};\n\nexport default MenuItem;\n","import type { FC } from '../../lib/teact/teact';\nimport React, {\n useCallback, useMemo, useState, memo,\n} from '../../lib/teact/teact';\nimport { debounce } from '../../util/schedulers';\n\nimport './RippleEffect.scss';\n\ninterface Ripple {\n x: number;\n y: number;\n size: number;\n}\n\nconst ANIMATION_DURATION_MS = 700;\n\nconst RippleEffect: FC = () => {\n const [ripples, setRipples] = useState<Ripple[]>([]);\n\n const cleanUpDebounced = useMemo(() => {\n return debounce(() => {\n setRipples([]);\n }, ANIMATION_DURATION_MS, false);\n }, []);\n\n const handleMouseDown = useCallback((e: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n if (e.button !== 0) {\n return;\n }\n\n const container = e.currentTarget as HTMLDivElement;\n const position = container.getBoundingClientRect() as DOMRect;\n\n const rippleSize = container.offsetWidth / 2;\n\n setRipples([\n ...ripples,\n {\n x: e.clientX - position.x - (rippleSize / 2),\n y: e.clientY - position.y - (rippleSize / 2),\n size: rippleSize,\n },\n ]);\n\n requestAnimationFrame(() => {\n cleanUpDebounced();\n });\n }, [ripples, cleanUpDebounced]);\n\n return (\n <div className=\"ripple-container\" onMouseDown={handleMouseDown}>\n {ripples.map(({ x, y, size }) => (\n <span\n style={`left: ${x}px; top: ${y}px; width: ${size}px; height: ${size}px;`}\n />\n ))}\n </div>\n );\n};\n\nexport default memo(RippleEffect);\n","import type { FC } from '../../lib/teact/teact';\nimport React 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' | 'yellow';\n backgroundColor?: 'light' | 'dark';\n}> = ({\n color = 'blue',\n backgroundColor,\n}) => {\n return (\n <div className={buildClassName('Spinner', color, backgroundColor && 'with-background', `bg-${backgroundColor}`)}>\n <div />\n </div>\n );\n};\n\nexport default Spinner;\n","import type { RefObject } from 'react';\nimport type { FC } from '../../lib/teact/teact';\nimport React, { useLayoutEffect, useRef } from '../../lib/teact/teact';\nimport { getGlobal } from '../../global';\nimport type { GlobalState } from '../../global/types';\n\nimport { ANIMATION_LEVEL_MIN } from '../../config';\nimport buildClassName from '../../util/buildClassName';\nimport forceReflow from '../../util/forceReflow';\nimport { waitForAnimationEnd, waitForTransitionEnd } from '../../util/cssAnimationEndListeners';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport usePrevious from '../../hooks/usePrevious';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\n\nimport './Transition.scss';\n\nexport type ChildrenFn = (isActive: boolean, isFrom: boolean, currentKey: number) => React.ReactNode;\nexport type TransitionProps = {\n ref?: RefObject<HTMLDivElement>;\n activeKey: number;\n name: (\n 'none' | 'slide' | 'slide-rtl' | 'mv-slide' | 'slide-fade' | 'zoom-fade' | 'slide-layers'\n | 'fade' | 'push-slide' | 'reveal' | 'slide-optimized' | 'slide-optimized-rtl'\n );\n direction?: 'auto' | 'inverse' | 1 | -1;\n renderCount?: number;\n shouldRestoreHeight?: boolean;\n shouldCleanup?: boolean;\n cleanupExceptionKey?: number;\n isDisabled?: boolean;\n id?: string;\n className?: string;\n onStart?: NoneToVoidFunction;\n onStop?: NoneToVoidFunction;\n children: React.ReactNode | ChildrenFn;\n};\n\nconst classNames = {\n active: 'Transition__slide--active',\n};\n\nconst Transition: FC<TransitionProps> = ({\n ref,\n activeKey,\n name,\n direction = 'auto',\n renderCount,\n shouldRestoreHeight,\n shouldCleanup,\n cleanupExceptionKey,\n id,\n className,\n onStart,\n onStop,\n children,\n}) => {\n // No need for a container to update on change\n const { animationLevel } = getGlobal().settings.byKey;\n const currentKeyRef = useRef<number>();\n\n // eslint-disable-next-line no-null/no-null\n let containerRef = useRef<HTMLDivElement>(null);\n if (ref) {\n containerRef = ref;\n }\n\n const rendersRef = useRef<Record<number, React.ReactNode | ChildrenFn>>({});\n const prevActiveKey = usePrevious<any>(activeKey);\n const forceUpdate = useForceUpdate();\n\n const activeKeyChanged = prevActiveKey !== undefined && activeKey !== prevActiveKey;\n\n if (!renderCount && activeKeyChanged) {\n rendersRef.current = { [prevActiveKey]: rendersRef.current[prevActiveKey] };\n }\n\n rendersRef.current[activeKey] = children;\n\n useLayoutEffect(() => {\n function cleanup() {\n if (!shouldCleanup) {\n return;\n }\n\n const preservedRender = cleanupExceptionKey !== undefined ? rendersRef.current[cleanupExceptionKey] : undefined;\n\n rendersRef.current = preservedRender ? { [cleanupExceptionKey!]: preservedRender } : {};\n\n forceUpdate();\n }\n\n const container = containerRef.current!;\n\n const childElements = container.children;\n if (childElements.length === 1 && !activeKeyChanged) {\n if (name.startsWith('slide-optimized')) {\n (childElements[0] as HTMLElement).style.transition = 'none';\n (childElements[0] as HTMLElement).style.transform = 'translate3d(0, 0, 0)';\n }\n\n childElements[0].classList.add(classNames.active);\n\n return;\n }\n\n const childNodes = Array.from(container.childNodes);\n\n if (!activeKeyChanged || !childNodes.length) {\n return;\n }\n\n currentKeyRef.current = activeKey;\n\n const isBackwards = (\n direction === -1\n || (direction === 'auto' && prevActiveKey > activeKey)\n || (direction === 'inverse' && prevActiveKey < activeKey)\n );\n\n const keys = Object.keys(rendersRef.current).map(Number);\n const prevActiveIndex = renderCount ? prevActiveKey : keys.indexOf(prevActiveKey);\n const activeIndex = renderCount ? activeKey : keys.indexOf(activeKey);\n\n if (name === 'slide-optimized' || name === 'slide-optimized-rtl') {\n performSlideOptimized(\n animationLevel,\n name,\n isBackwards,\n cleanup,\n activeKey,\n currentKeyRef,\n container,\n shouldRestoreHeight,\n onStart,\n onStop,\n childNodes[activeIndex] as HTMLElement,\n childNodes[prevActiveIndex] as HTMLElement,\n );\n\n return;\n }\n\n container.classList.remove('animating');\n container.classList.toggle('backwards', isBackwards);\n\n if (name === 'none' || animationLevel === ANIMATION_LEVEL_MIN) {\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove('from', 'through', 'to');\n node.classList.toggle(classNames.active, i === activeIndex);\n }\n });\n\n cleanup();\n\n return;\n }\n\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove(classNames.active);\n node.classList.toggle('from', i === prevActiveIndex);\n node.classList.toggle('through', (\n (i > prevActiveIndex && i < activeIndex) || (i < prevActiveIndex && i > activeIndex)\n ));\n node.classList.toggle('to', i === activeIndex);\n }\n });\n\n const dispatchHeavyAnimationStop = dispatchHeavyAnimationEvent();\n\n requestAnimationFrame(() => {\n container.classList.add('animating');\n\n onStart?.();\n\n function onAnimationEnd() {\n requestAnimationFrame(() => {\n if (activeKey !== currentKeyRef.current) {\n return;\n }\n\n container.classList.remove('animating', 'backwards');\n\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove('from', 'through', 'to');\n node.classList.toggle(classNames.active, i === activeIndex);\n }\n });\n\n if (shouldRestoreHeight) {\n const activeElement = container.querySelector<HTMLDivElement>(`.${classNames.active}`);\n\n if (activeElement) {\n activeElement.style.height = 'auto';\n container.style.height = `${activeElement.clientHeight}px`;\n }\n }\n\n onStop?.();\n dispatchHeavyAnimationStop();\n cleanup();\n });\n }\n\n const watchedNode = name === 'mv-slide'\n ? childNodes[activeIndex]?.firstChild\n : name === 'reveal' && isBackwards\n ? childNodes[prevActiveIndex]\n : childNodes[activeIndex];\n\n if (watchedNode) {\n waitForAnimationEnd(watchedNode, onAnimationEnd);\n } else {\n onAnimationEnd();\n }\n });\n }, [\n activeKey,\n prevActiveKey,\n activeKeyChanged,\n direction,\n name,\n onStart,\n onStop,\n renderCount,\n shouldRestoreHeight,\n shouldCleanup,\n cleanupExceptionKey,\n animationLevel,\n forceUpdate,\n ]);\n\n useLayoutEffect(() => {\n if (shouldRestoreHeight) {\n const container = containerRef.current!;\n const activeElement = container.querySelector<HTMLDivElement>(`.${classNames.active}`)\n || container.querySelector<HTMLDivElement>('.from');\n\n if (activeElement) {\n activeElement.style.height = 'auto';\n container.style.height = `${activeElement.clientHeight}px`;\n container.style.flexBasis = `${activeElement.clientHeight}px`;\n }\n }\n }, [shouldRestoreHeight, children]);\n\n const renders = rendersRef.current;\n const renderKeys = Object.keys(renderCount ? new Array(renderCount).fill(undefined) : renders).map(Number);\n const contents = renderKeys.map((key) => {\n const render = renders[key];\n if (!render) {\n return undefined;\n }\n\n return (\n <div key={key} teactOrderKey={key}>{\n typeof render === 'function'\n ? render(key === activeKey, key === prevActiveKey, activeKey)\n : render\n }\n </div>\n );\n });\n\n return (\n <div\n ref={containerRef}\n id={id}\n className={buildClassName('Transition', className, name)}\n teactFastList={!renderCount}\n >\n {contents}\n </div>\n );\n};\n\nexport default Transition;\n\nfunction performSlideOptimized(\n animationLevel: GlobalState['settings']['byKey']['animationLevel'],\n name: 'slide-optimized' | 'slide-optimized-rtl',\n isBackwards: boolean,\n cleanup: NoneToVoidFunction,\n activeKey: number,\n currentKeyRef: { current: number | undefined },\n container: HTMLElement,\n shouldRestoreHeight?: boolean,\n onStart?: NoneToVoidFunction,\n onStop?: NoneToVoidFunction,\n toSlide?: HTMLElement,\n fromSlide?: HTMLElement,\n) {\n if (!fromSlide || !toSlide) {\n return;\n }\n\n if (animationLevel === ANIMATION_LEVEL_MIN) {\n fromSlide.style.transition = 'none';\n fromSlide.style.transform = '';\n fromSlide.classList.remove(classNames.active);\n\n toSlide.style.transition = 'none';\n toSlide.style.transform = 'translate3d(0, 0, 0)';\n toSlide.classList.add(classNames.active);\n\n cleanup();\n\n return;\n }\n\n if (name === 'slide-optimized-rtl') {\n isBackwards = !isBackwards;\n }\n\n const dispatchHeavyAnimationStop = dispatchHeavyAnimationEvent();\n\n requestAnimationFrame(() => {\n onStart?.();\n\n fromSlide.style.transition = 'none';\n fromSlide.style.transform = 'translate3d(0, 0, 0)';\n\n toSlide.style.transition = 'none';\n toSlide.style.transform = `translate3d(${isBackwards ? '-' : ''}100%, 0, 0)`;\n\n forceReflow(toSlide);\n\n fromSlide.style.transition = '';\n fromSlide.style.transform = `translate3d(${isBackwards ? '' : '-'}100%, 0, 0)`;\n\n toSlide.style.transition = '';\n toSlide.style.transform = 'translate3d(0, 0, 0)';\n\n fromSlide.classList.remove(classNames.active);\n toSlide.classList.add(classNames.active);\n\n waitForTransitionEnd(fromSlide, () => {\n if (activeKey !== currentKeyRef.current) {\n return;\n }\n\n fromSlide.style.transition = 'none';\n fromSlide.style.transform = '';\n\n if (shouldRestoreHeight) {\n toSlide.style.height = 'auto';\n container.style.height = `${toSlide.clientHeight}px`;\n }\n\n onStop?.();\n dispatchHeavyAnimationStop();\n cleanup();\n });\n });\n}\n","import type { ApiLimitType } from './global/types';\n\nexport const APP_NAME = process.env.APP_NAME || 'Telegram WebZ';\nexport const APP_VERSION = process.env.APP_VERSION!;\n\nexport const PRODUCTION_HOSTNAME = 'web.telegram.org';\n\nexport const DEBUG = process.env.APP_ENV !== 'production';\nexport const DEBUG_MORE = false;\n\nexport const IS_MOCKED_CLIENT = process.env.APP_MOCKED_CLIENT === '1';\nexport const IS_TEST = process.env.APP_ENV === 'test';\nexport const IS_PERF = process.env.APP_ENV === 'perf';\nexport const IS_BETA = process.env.APP_ENV === 'staging';\n\nexport const BETA_CHANGELOG_URL = 'https://telegra.ph/WebZ-Beta-04-01';\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 PAGE_TITLE = 'Telegram';\nexport const INACTIVE_MARKER = ' [Inactive]';\n\nexport const DEBUG_PAYMENT_SMART_GLOCAL = false;\n\nexport const SESSION_USER_KEY = 'user_auth';\nexport const LEGACY_SESSION_KEY = 'GramJs:sessionId';\nexport const PASSCODE_CACHE_NAME = 'tt-passcode';\n\nexport const GLOBAL_STATE_CACHE_DISABLED = false;\nexport const GLOBAL_STATE_CACHE_KEY = 'tt-global-state';\nexport const GLOBAL_STATE_CACHE_USER_LIST_LIMIT = 500;\nexport const GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT = 200;\nexport const GLOBAL_STATE_CACHE_CHATS_WITH_MESSAGES_LIMIT = 30;\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-v12';\nexport const ASSET_CACHE_NAME = 'tt-assets';\nexport const AUTODOWNLOAD_FILESIZE_MB_LIMITS = [1, 5, 10, 50, 100, 500];\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_SLICE = isBigScreen ? 60 : 40;\nexport const MESSAGE_LIST_VIEWPORT_LIMIT = MESSAGE_LIST_SLICE * 2;\n\nexport const CHAT_HEIGHT_PX = 72;\nexport const CHAT_LIST_SLICE = isBigScreen ? 30 : 25;\nexport const CHAT_LIST_LOAD_SLICE = 100;\nexport const SHARED_MEDIA_SLICE = 42;\nexport const MESSAGE_SEARCH_SLICE = 42;\nexport const GLOBAL_SEARCH_SLICE = 20;\nexport const MEMBERS_SLICE = 30;\nexport const MEMBERS_LOAD_SLICE = 200;\nexport const PINNED_MESSAGES_LIMIT = 50;\nexport const BLOCKED_LIST_LIMIT = 100;\nexport const PROFILE_PHOTOS_LIMIT = 40;\nexport const PROFILE_SENSITIVE_AREA = 500;\nexport const COMMON_CHATS_LIMIT = 100;\nexport const GROUP_CALL_PARTICIPANTS_LIMIT = 100;\nexport const REACTION_LIST_LIMIT = 100;\nexport const REACTION_UNREAD_SLICE = 100;\nexport const MENTION_UNREAD_SLICE = 100;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 20;\n\nexport const SPONSORED_MESSAGE_CACHE_MS = 300000; // 5 min\n\nexport const DEFAULT_VOLUME = 1;\nexport const DEFAULT_PLAYBACK_RATE = 1;\nexport const PLAYBACK_RATE_FOR_AUDIO_MIN_DURATION = 20 * 60; // 20 min\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;\nexport const IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 17;\nexport const MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 15;\n\nexport const DRAFT_DEBOUNCE = 10000; // 10s\nexport const SEND_MESSAGE_ACTION_INTERVAL = 3000; // 3s\n\nexport const EDITABLE_INPUT_ID = 'editable-message-text';\nexport const EDITABLE_INPUT_MODAL_ID = 'editable-message-text-modal';\n// eslint-disable-next-line max-len\nexport const EDITABLE_INPUT_CSS_SELECTOR = `.messages-layout .Transition__slide--active #${EDITABLE_INPUT_ID}, .messages-layout .Transition > .to #${EDITABLE_INPUT_ID}`;\n\nexport const CUSTOM_APPENDIX_ATTRIBUTE = 'data-has-custom-appendix';\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 MAX_SCREEN_WIDTH_FOR_EXPAND_PINNED_MESSAGES = 1340; // 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_MIN_ID = 1e11; // `Date.now()` is always used as base\nexport const TMP_CHAT_ID = '0';\n\nexport const ANIMATION_END_DELAY = 100;\n\nexport const FAST_SMOOTH_MAX_DISTANCE = 1500;\nexport const FAST_SMOOTH_MIN_DURATION = 250;\nexport const FAST_SMOOTH_MAX_DURATION = 600;\nexport const FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE = 500; // px\n\n// Average duration of message sending animation\nexport const API_UPDATE_THROTTLE = Math.round((FAST_SMOOTH_MIN_DURATION + FAST_SMOOTH_MAX_DURATION) / 2);\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\n\nexport const LOCK_SCREEN_ANIMATION_DURATION_MS = 200;\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_PASSCODE = 160;\nexport const STICKER_SIZE_DISCUSSION_GROUPS = 140;\nexport const STICKER_SIZE_FOLDER_SETTINGS = 100;\nexport const STICKER_SIZE_INLINE_BOT_RESULT = 100;\nexport const STICKER_SIZE_JOIN_REQUESTS = 140;\nexport const STICKER_SIZE_INVITES = 140;\nexport const RECENT_STICKERS_LIMIT = 20;\nexport const NO_STICKER_SET_ID = 'NO_STICKER_SET';\nexport const RECENT_SYMBOL_SET_ID = 'recent';\nexport const FAVORITE_SYMBOL_SET_ID = 'favorite';\nexport const CHAT_STICKER_SET_ID = 'chatStickers';\nexport const PREMIUM_STICKER_SET_ID = 'premium';\n\nexport const BASE_EMOJI_KEYWORD_LANG = 'en';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\n\nexport const VIDEO_MOV_TYPE = 'video/quicktime';\nexport const VIDEO_WEBM_TYPE = 'video/webm';\n\nexport const SUPPORTED_IMAGE_CONTENT_TYPES = new Set([\n 'image/png', 'image/gif', 'image/jpeg',\n]);\n\nexport const SUPPORTED_VIDEO_CONTENT_TYPES = new Set([\n 'video/mp4', // video/quicktime added dynamically in environment.ts\n]);\n\nexport const SUPPORTED_AUDIO_CONTENT_TYPES = new Set([\n 'audio/mp3',\n 'audio/ogg',\n 'audio/wav',\n 'audio/mpeg',\n 'audio/flac',\n 'audio/aac',\n 'audio/m4a',\n 'audio/mp4',\n 'audio/x-m4a',\n]);\n\nexport const CONTENT_TYPES_WITH_PREVIEW = new Set([\n ...SUPPORTED_IMAGE_CONTENT_TYPES,\n ...SUPPORTED_VIDEO_CONTENT_TYPES,\n]);\n\nexport const CONTENT_NOT_SUPPORTED = 'The message is not supported on this version of Telegram.';\n\n// eslint-disable-next-line max-len\nexport const RE_LINK_TEMPLATE = '((ftp|https?):\\\\/\\\\/)?((www\\\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\\\.[a-zA-Z0-9()]{1,63})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_MENTION_TEMPLATE = '(@[\\\\w\\\\d_-]+)';\nexport const RE_TG_LINK = /^tg:(\\/\\/)?([?=&\\d\\w_-]+)?/;\nexport const RE_TME_LINK = /^(https?:\\/\\/)?t\\.me\\//;\nexport const RE_TELEGRAM_LINK = /^(https?:\\/\\/)?telegram\\.org\\//;\nexport const TME_LINK_PREFIX = 'https://t.me/';\n\n// eslint-disable-next-line max-len\nexport const COUNTRIES_WITH_12H_TIME_FORMAT = new Set(['AU', 'BD', 'CA', 'CO', 'EG', 'HN', 'IE', 'IN', 'JO', 'MX', 'MY', 'NI', 'NZ', 'PH', 'PK', 'SA', 'SV', 'US']);\n\n// MTProto constants\nexport const SERVICE_NOTIFICATIONS_USER_ID = '777000';\nexport const REPLIES_USER_ID = '1271266957'; // TODO For Test connection ID must be equal to 708513\nexport const ALL_FOLDER_ID = 0;\nexport const ARCHIVED_FOLDER_ID = 1;\nexport const DELETED_COMMENTS_CHANNEL_ID = '-777';\nexport const MAX_MEDIA_FILES_FOR_ALBUM = 10;\nexport const MAX_ACTIVE_PINNED_CHATS = 5;\nexport const SCHEDULED_WHEN_ONLINE = 0x7FFFFFFE;\nexport const DEFAULT_LANG_CODE = 'en';\nexport const DEFAULT_LANG_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios', 'tdesktop', 'macos'] as const;\nexport const FEEDBACK_URL = 'https://bugs.telegram.org/?tag_ids=41&sort=time';\n\nexport const LIGHT_THEME_BG_COLOR = '#99BA92';\nexport const DARK_THEME_BG_COLOR = '#0F0F0F';\nexport const DEFAULT_PATTERN_COLOR = '#4A8E3A8C';\nexport const DARK_THEME_PATTERN_COLOR = '#0A0A0A8C';\nexport const MAX_UPLOAD_FILEPART_SIZE = 524288;\n\n// Group calls\nexport const GROUP_CALL_VOLUME_MULTIPLIER = 100;\nexport const GROUP_CALL_DEFAULT_VOLUME = 100 * GROUP_CALL_VOLUME_MULTIPLIER;\nexport const ENABLE_THUMBNAIL_VIDEO = false;\n\nexport const DEFAULT_LIMITS: Record<ApiLimitType, readonly [number, number]> = {\n uploadMaxFileparts: [4000, 8000],\n stickersFaved: [5, 10],\n savedGifs: [200, 400],\n dialogFiltersChats: [100, 200],\n dialogFilters: [10, 20],\n dialogFolderPinned: [5, 10],\n captionLength: [1024, 2048],\n channels: [500, 1000],\n channelsPublic: [10, 20],\n aboutLength: [70, 140],\n};\n","import {\n addActionHandler, getActions, getGlobal, setGlobal,\n} from '../../index';\n\nimport { initApi, callApi } from '../../../api/gramjs';\n\nimport {\n LANG_CACHE_NAME,\n CUSTOM_BG_CACHE_NAME,\n MEDIA_CACHE_NAME,\n MEDIA_CACHE_NAME_AVATARS,\n MEDIA_PROGRESSIVE_CACHE_NAME,\n IS_TEST,\n LOCK_SCREEN_ANIMATION_DURATION_MS,\n} from '../../../config';\nimport {\n IS_MOV_SUPPORTED, IS_WEBM_SUPPORTED, MAX_BUFFER_SIZE, PLATFORM_ENV,\n} from '../../../util/environment';\nimport { unsubscribe } from '../../../util/notifications';\nimport * as cacheApi from '../../../util/cacheApi';\nimport { updateAppBadge } from '../../../util/appBadge';\nimport {\n storeSession,\n loadStoredSession,\n clearStoredSession,\n importLegacySession,\n clearLegacySessions,\n} from '../../../util/sessions';\nimport { forceWebsync } from '../../../util/websync';\nimport { clearGlobalForLockScreen, updatePasscodeSettings } from '../../reducers';\nimport { clearEncryptedSession, encryptSession, forgetPasscode } from '../../../util/passcode';\nimport { serializeGlobal } from '../../cache';\n\naddActionHandler('initApi', async (global, actions) => {\n if (!IS_TEST) {\n await importLegacySession();\n void clearLegacySessions();\n }\n\n void initApi(actions.apiUpdate, {\n userAgent: navigator.userAgent,\n platform: PLATFORM_ENV,\n sessionData: loadStoredSession(),\n isTest: window.location.search.includes('test'),\n isMovSupported: IS_MOV_SUPPORTED,\n isWebmSupported: IS_WEBM_SUPPORTED,\n maxBufferSize: MAX_BUFFER_SIZE,\n });\n});\n\naddActionHandler('setAuthPhoneNumber', (global, actions, payload) => {\n const { phoneNumber } = payload!;\n\n void callApi('provideAuthPhoneNumber', phoneNumber.replace(/[^\\d]/g, ''));\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddActionHandler('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\naddActionHandler('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\naddActionHandler('uploadProfilePhoto', (global, actions, payload) => {\n const { file } = payload!;\n\n void callApi('uploadProfilePhoto', file);\n});\n\naddActionHandler('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\naddActionHandler('returnToAuthPhoneNumber', (global) => {\n void callApi('restartAuth');\n\n return {\n ...global,\n authError: undefined,\n };\n});\n\naddActionHandler('goToAuthQrCode', (global) => {\n void callApi('restartAuthWithQr');\n\n return {\n ...global,\n authIsLoadingQrCode: true,\n authError: undefined,\n };\n});\n\naddActionHandler('saveSession', (global, actions, payload) => {\n if (global.passcode.isScreenLocked) {\n return;\n }\n\n const { sessionData } = payload;\n if (sessionData) {\n storeSession(payload.sessionData, global.currentUserId);\n } else {\n clearStoredSession();\n }\n});\n\naddActionHandler('signOut', async (_global, actions, payload) => {\n if ('hangUp' in actions) actions.hangUp();\n if ('leaveGroupCall' in actions) actions.leaveGroupCall();\n\n try {\n await unsubscribe();\n await callApi('destroy');\n await forceWebsync(false);\n } catch (err) {\n // Do nothing\n }\n\n getActions().reset();\n\n if (payload?.forceInitApi) {\n getActions().initApi();\n }\n});\n\naddActionHandler('reset', () => {\n clearStoredSession();\n clearEncryptedSession();\n\n void cacheApi.clear(MEDIA_CACHE_NAME);\n void cacheApi.clear(MEDIA_CACHE_NAME_AVATARS);\n void cacheApi.clear(MEDIA_PROGRESSIVE_CACHE_NAME);\n void cacheApi.clear(CUSTOM_BG_CACHE_NAME);\n\n const langCachePrefix = LANG_CACHE_NAME.replace(/\\d+$/, '');\n const langCacheVersion = (LANG_CACHE_NAME.match(/\\d+$/) || [0])[0];\n for (let i = 0; i < langCacheVersion; i++) {\n void cacheApi.clear(`${langCachePrefix}${i === 0 ? '' : i}`);\n }\n\n void clearLegacySessions();\n\n updateAppBadge(0);\n\n getActions().init();\n});\n\naddActionHandler('disconnect', () => {\n void callApi('disconnect');\n});\n\naddActionHandler('loadNearestCountry', async (global) => {\n if (global.connectionState !== 'connectionStateReady') {\n return;\n }\n\n const authNearestCountry = await callApi('fetchNearestCountry');\n\n setGlobal({\n ...getGlobal(),\n authNearestCountry,\n });\n});\n\naddActionHandler('setDeviceToken', (global, actions, deviceToken) => {\n return {\n ...global,\n push: {\n deviceToken,\n subscribedAt: Date.now(),\n },\n };\n});\n\naddActionHandler('deleteDeviceToken', (global) => {\n return {\n ...global,\n push: undefined,\n };\n});\n\naddActionHandler('lockScreen', async (global) => {\n const sessionJson = JSON.stringify({ ...loadStoredSession(), userId: global.currentUserId });\n const globalJson = serializeGlobal(global);\n\n await encryptSession(sessionJson, globalJson);\n forgetPasscode();\n clearStoredSession();\n updateAppBadge(0);\n\n global = getGlobal();\n setGlobal(updatePasscodeSettings(\n global,\n {\n isScreenLocked: true,\n invalidAttemptsCount: 0,\n },\n ));\n\n setTimeout(() => {\n setGlobal(clearGlobalForLockScreen(getGlobal()));\n }, LOCK_SCREEN_ANIMATION_DURATION_MS);\n\n try {\n await unsubscribe();\n await callApi('destroy', true);\n } catch (err) {\n // Do nothing\n }\n});\n","import { addActionHandler, getGlobal, setGlobal } from '../../index';\n\nimport type { GlobalState } from '../../types';\nimport type {\n ApiPrivacyKey, PrivacyVisibility, InputPrivacyRules, InputPrivacyContact,\n} from '../../../types';\nimport {\n ProfileEditProgress,\n UPLOADING_WALLPAPER_SLUG,\n} from '../../../types';\n\nimport { COUNTRIES_WITH_12H_TIME_FORMAT } from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { subscribe, unsubscribe } from '../../../util/notifications';\nimport { setTimeFormat } from '../../../util/langProvider';\nimport { selectUser } from '../../selectors';\nimport {\n addUsers, addBlockedContact, updateChats, updateUser, removeBlockedContact, replaceSettings, updateNotifySettings,\n addNotifyExceptions,\n} from '../../reducers';\nimport { isUserId } from '../../helpers';\n\naddActionHandler('updateProfile', async (global, actions, payload) => {\n const {\n photo, firstName, lastName, bio: about, username,\n } = payload!;\n\n const { currentUserId } = global;\n if (!currentUserId) {\n return;\n }\n\n setGlobal({\n ...getGlobal(),\n profileEdit: {\n progress: ProfileEditProgress.InProgress,\n },\n });\n\n if (photo) {\n await callApi('updateProfilePhoto', photo);\n }\n\n if (firstName || lastName || about) {\n const result = await callApi('updateProfile', { firstName, lastName, about });\n if (result) {\n global = getGlobal();\n const currentUser = currentUserId && selectUser(global, currentUserId);\n\n if (currentUser) {\n setGlobal(updateUser(\n global,\n currentUser.id,\n {\n firstName,\n lastName,\n fullInfo: {\n ...currentUser.fullInfo,\n bio: about,\n },\n },\n ));\n }\n }\n }\n\n if (username) {\n const result = await callApi('updateUsername', username);\n if (result && currentUserId) {\n setGlobal(updateUser(getGlobal(), currentUserId, { username }));\n }\n }\n\n setGlobal({\n ...getGlobal(),\n profileEdit: {\n progress: ProfileEditProgress.Complete,\n },\n });\n});\n\naddActionHandler('checkUsername', async (global, actions, payload) => {\n const { username } = payload!;\n\n // No need to check the username if profile update is already in progress\n if (global.profileEdit && global.profileEdit.progress === ProfileEditProgress.InProgress) {\n return;\n }\n\n setGlobal({\n ...global,\n profileEdit: {\n progress: global.profileEdit ? global.profileEdit.progress : ProfileEditProgress.Idle,\n isUsernameAvailable: undefined,\n },\n });\n\n const isUsernameAvailable = await callApi('checkUsername', username);\n\n global = getGlobal();\n setGlobal({\n ...global,\n profileEdit: {\n ...global.profileEdit!,\n isUsernameAvailable,\n },\n });\n});\n\naddActionHandler('loadWallpapers', async () => {\n const result = await callApi('fetchWallpapers');\n if (!result) {\n return;\n }\n\n const global = getGlobal();\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: result.wallpapers,\n },\n });\n});\n\naddActionHandler('uploadWallpaper', async (global, actions, payload) => {\n const file = payload;\n const previewBlobUrl = URL.createObjectURL(file);\n\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: [\n {\n slug: UPLOADING_WALLPAPER_SLUG,\n document: {\n fileName: '',\n size: file.size,\n mimeType: file.type,\n previewBlobUrl,\n },\n },\n ...(global.settings.loadedWallpapers || []),\n ],\n },\n });\n\n const result = await callApi('uploadWallpaper', file);\n if (!result) {\n return;\n }\n\n const { wallpaper } = result;\n\n global = getGlobal();\n if (!global.settings.loadedWallpapers) {\n return;\n }\n\n const firstWallpaper = global.settings.loadedWallpapers[0];\n if (!firstWallpaper || firstWallpaper.slug !== UPLOADING_WALLPAPER_SLUG) {\n return;\n }\n\n const withLocalMedia = {\n ...wallpaper,\n document: {\n ...wallpaper.document,\n previewBlobUrl,\n },\n };\n\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: [\n withLocalMedia,\n ...global.settings.loadedWallpapers.slice(1),\n ],\n },\n });\n});\n\naddActionHandler('loadBlockedContacts', async (global) => {\n const result = await callApi('fetchBlockedContacts');\n if (!result) {\n return;\n }\n\n global = getGlobal();\n\n if (result.users?.length) {\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n }\n if (result.chats?.length) {\n global = updateChats(global, buildCollectionByKey(result.chats, 'id'));\n }\n\n global = {\n ...global,\n blocked: {\n ...global.blocked,\n ids: [...(global.blocked.ids || []), ...result.blockedIds],\n totalCount: result.totalCount,\n },\n };\n\n setGlobal(global);\n});\n\naddActionHandler('blockContact', async (global, actions, payload) => {\n const { contactId, accessHash } = payload!;\n\n const result = await callApi('blockContact', contactId, accessHash);\n if (!result) {\n return;\n }\n\n setGlobal(addBlockedContact(getGlobal(), contactId));\n});\n\naddActionHandler('unblockContact', async (global, actions, payload) => {\n const { contactId } = payload!;\n let accessHash: string | undefined;\n const isPrivate = isUserId(contactId);\n\n if (isPrivate) {\n const user = selectUser(global, contactId);\n if (!user) {\n return;\n }\n\n accessHash = user.accessHash;\n }\n\n const result = await callApi('unblockContact', contactId, accessHash);\n if (!result) {\n return;\n }\n\n setGlobal(removeBlockedContact(getGlobal(), contactId));\n});\n\naddActionHandler('loadNotificationExceptions', async (global) => {\n const { serverTimeOffset } = global;\n\n const result = await callApi('fetchNotificationExceptions', { serverTimeOffset });\n if (!result) {\n return;\n }\n\n setGlobal(addNotifyExceptions(getGlobal(), result));\n});\n\naddActionHandler('loadNotificationSettings', async (global) => {\n const { serverTimeOffset } = global;\n const result = await callApi('fetchNotificationSettings', {\n serverTimeOffset,\n });\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), result));\n});\n\naddActionHandler('updateNotificationSettings', async (global, actions, payload) => {\n const { peerType, isSilent, shouldShowPreviews } = payload!;\n\n const result = await callApi('updateNotificationSettings', peerType, { isSilent, shouldShowPreviews });\n if (!result) {\n return;\n }\n\n setGlobal(updateNotifySettings(getGlobal(), peerType, isSilent, shouldShowPreviews));\n});\n\naddActionHandler('updateWebNotificationSettings', (global, actions, payload) => {\n setGlobal(replaceSettings(global, payload));\n\n const { hasPushNotifications, hasWebNotifications } = global.settings.byKey;\n if (hasWebNotifications && hasPushNotifications) {\n void subscribe();\n } else {\n void unsubscribe();\n }\n});\n\naddActionHandler('updateContactSignUpNotification', async (global, actions, payload) => {\n const { isSilent } = payload!;\n\n const result = await callApi('updateContactSignUpNotification', isSilent);\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), { hasContactJoinedNotifications: !isSilent }));\n});\n\naddActionHandler('loadLanguages', async () => {\n const result = await callApi('fetchLanguages');\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), { languages: result }));\n});\n\naddActionHandler('loadPrivacySettings', async (global) => {\n const [\n phoneNumberSettings,\n lastSeenSettings,\n profilePhotoSettings,\n forwardsSettings,\n chatInviteSettings,\n phoneCallSettings,\n phoneP2PSettings,\n ] = await Promise.all([\n callApi('fetchPrivacySettings', 'phoneNumber'),\n callApi('fetchPrivacySettings', 'lastSeen'),\n callApi('fetchPrivacySettings', 'profilePhoto'),\n callApi('fetchPrivacySettings', 'forwards'),\n callApi('fetchPrivacySettings', 'chatInvite'),\n callApi('fetchPrivacySettings', 'phoneCall'),\n callApi('fetchPrivacySettings', 'phoneP2P'),\n ]);\n\n if (\n !phoneNumberSettings\n || !lastSeenSettings\n || !profilePhotoSettings\n || !forwardsSettings\n || !chatInviteSettings\n || !phoneCallSettings\n || !phoneP2PSettings\n ) {\n return;\n }\n\n global = getGlobal();\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n privacy: {\n ...global.settings.privacy,\n phoneNumber: phoneNumberSettings,\n lastSeen: lastSeenSettings,\n profilePhoto: profilePhotoSettings,\n forwards: forwardsSettings,\n chatInvite: chatInviteSettings,\n phoneCall: phoneCallSettings,\n phoneP2P: phoneP2PSettings,\n },\n },\n });\n});\n\naddActionHandler('setPrivacyVisibility', async (global, actions, payload) => {\n const { privacyKey, visibility } = payload!;\n\n const {\n privacy: { [privacyKey as ApiPrivacyKey]: settings },\n } = global.settings;\n\n if (!settings) {\n return;\n }\n\n const rules = buildInputPrivacyRules(global, {\n visibility,\n allowedIds: [...settings.allowUserIds, ...settings.allowChatIds],\n deniedIds: [...settings.blockUserIds, ...settings.blockChatIds],\n });\n\n const result = await callApi('setPrivacySettings', privacyKey, rules);\n if (!result) {\n return;\n }\n\n global = getGlobal();\n\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n privacy: {\n ...global.settings.privacy,\n [privacyKey]: result,\n },\n },\n });\n});\n\naddActionHandler('setPrivacySettings', async (global, actions, payload) => {\n const { privacyKey, isAllowList, contactsIds } = payload!;\n const {\n privacy: { [privacyKey as ApiPrivacyKey]: settings },\n } = global.settings;\n\n if (!settings) {\n return;\n }\n\n const rules = buildInputPrivacyRules(global, {\n visibility: settings.visibility,\n allowedIds: isAllowList ? contactsIds : [...settings.allowUserIds, ...settings.allowChatIds],\n deniedIds: !isAllowList ? contactsIds : [...settings.blockUserIds, ...settings.blockChatIds],\n });\n\n const result = await callApi('setPrivacySettings', privacyKey, rules);\n if (!result) {\n return;\n }\n\n global = getGlobal();\n\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n privacy: {\n ...global.settings.privacy,\n [privacyKey]: result,\n },\n },\n });\n});\n\nfunction buildInputPrivacyRules(global: GlobalState, {\n visibility,\n allowedIds,\n deniedIds,\n}: {\n visibility: PrivacyVisibility;\n allowedIds: string[];\n deniedIds: string[];\n}): InputPrivacyRules {\n const {\n users: { byId: usersById },\n chats: { byId: chatsById },\n } = global;\n\n const rules: InputPrivacyRules = {\n visibility,\n };\n let users: InputPrivacyContact[];\n let chats: InputPrivacyContact[];\n\n const collectUsers = (userId: string) => {\n if (!isUserId(userId)) {\n return undefined;\n }\n const { id, accessHash } = usersById[userId] || {};\n if (!id) {\n return undefined;\n }\n\n return { id, accessHash };\n };\n\n const collectChats = (userId: string) => {\n if (isUserId(userId)) {\n return undefined;\n }\n const chat = chatsById[userId];\n\n return chat ? { id: chat.id } : undefined;\n };\n\n if (visibility === 'contacts' || visibility === 'nobody') {\n users = allowedIds.map(collectUsers).filter(Boolean) as InputPrivacyContact[];\n chats = allowedIds.map(collectChats).filter(Boolean) as InputPrivacyContact[];\n\n if (users.length > 0) {\n rules.allowedUsers = users;\n }\n if (chats.length > 0) {\n rules.allowedChats = chats;\n }\n }\n\n if (visibility === 'everybody' || visibility === 'contacts') {\n users = deniedIds.map(collectUsers).filter(Boolean) as InputPrivacyContact[];\n chats = deniedIds.map(collectChats).filter(Boolean) as InputPrivacyContact[];\n\n if (users.length > 0) {\n rules.blockedUsers = users;\n }\n if (chats.length > 0) {\n rules.blockedChats = chats;\n }\n }\n\n return rules;\n}\n\naddActionHandler('updateIsOnline', (global, actions, payload) => {\n callApi('updateIsOnline', payload);\n});\n\naddActionHandler('loadContentSettings', async () => {\n const result = await callApi('fetchContentSettings');\n if (!result) return;\n\n setGlobal(replaceSettings(getGlobal(), result));\n});\n\naddActionHandler('updateContentSettings', async (global, actions, payload) => {\n setGlobal(replaceSettings(getGlobal(), { isSensitiveEnabled: payload }));\n\n const result = await callApi('updateContentSettings', payload);\n if (!result) {\n setGlobal(replaceSettings(getGlobal(), { isSensitiveEnabled: !payload }));\n }\n});\n\naddActionHandler('loadCountryList', async (global, actions, payload = {}) => {\n let { langCode } = payload;\n if (!langCode) langCode = global.settings.byKey.language;\n\n const countryList = await callApi('fetchCountryList', { langCode });\n if (!countryList) return;\n\n setGlobal({\n ...getGlobal(),\n countryList,\n });\n});\n\naddActionHandler('ensureTimeFormat', async (global, actions) => {\n if (global.authNearestCountry) {\n const timeFormat = COUNTRIES_WITH_12H_TIME_FORMAT.has(global.authNearestCountry.toUpperCase()) ? '12h' : '24h';\n actions.setSettingOption({ timeFormat });\n setTimeFormat(timeFormat);\n }\n\n if (global.settings.byKey.wasTimeFormatSetManually) {\n return;\n }\n\n const nearestCountryCode = await callApi('fetchNearestCountry');\n if (nearestCountryCode) {\n const timeFormat = COUNTRIES_WITH_12H_TIME_FORMAT.has(nearestCountryCode.toUpperCase()) ? '12h' : '24h';\n actions.setSettingOption({ timeFormat });\n setTimeFormat(timeFormat);\n }\n});\n\naddActionHandler('loadAppConfig', async () => {\n const appConfig = await callApi('fetchAppConfig');\n if (!appConfig) return;\n\n setGlobal({\n ...getGlobal(),\n appConfig,\n });\n});\n\naddActionHandler('loadGlobalPrivacySettings', async () => {\n const globalSettings = await callApi('fetchGlobalPrivacySettings');\n if (!globalSettings) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), {\n shouldArchiveAndMuteNewNonContact: globalSettings.shouldArchiveAndMuteNewNonContact,\n }));\n});\n\naddActionHandler('updateGlobalPrivacySettings', async (global, actions, payload) => {\n const { shouldArchiveAndMuteNewNonContact } = payload;\n setGlobal(replaceSettings(getGlobal(), { shouldArchiveAndMuteNewNonContact }));\n\n const result = await callApi('updateGlobalPrivacySettings', { shouldArchiveAndMuteNewNonContact });\n\n setGlobal(replaceSettings(getGlobal(), {\n shouldArchiveAndMuteNewNonContact: !result\n ? !shouldArchiveAndMuteNewNonContact\n : result.shouldArchiveAndMuteNewNonContact,\n }));\n});\n","import {\n addActionHandler, getActions, getGlobal, setGlobal,\n} from '../../index';\n\nimport type { GlobalState } from '../../types';\n\nimport type {\n ApiUpdateAuthorizationState,\n ApiUpdateAuthorizationError,\n ApiUpdateConnectionState,\n ApiUpdateSession,\n ApiUpdateCurrentUser, ApiUpdateServerTimeOffset,\n} from '../../../api/types';\nimport { DEBUG, SESSION_USER_KEY } from '../../../config';\nimport { subscribe } from '../../../util/notifications';\nimport { updateUser } from '../../reducers';\nimport { setLanguage } from '../../../util/langProvider';\nimport { selectNotifySettings } from '../../selectors';\nimport { forceWebsync } from '../../../util/websync';\nimport { getShippingError, shouldClosePaymentModal } from '../../../util/getReadableErrorText';\n\naddActionHandler('apiUpdate', (global, actions, update) => {\n if (DEBUG) {\n if (update['@type'] !== 'updateUserStatus' && update['@type'] !== 'updateServerTimeOffset') {\n // eslint-disable-next-line no-console\n console.log('[GramJs] UPDATE', update['@type'], { update });\n }\n }\n\n switch (update['@type']) {\n case 'updateApiReady':\n onUpdateApiReady(global);\n break;\n\n case 'updateAuthorizationState':\n onUpdateAuthorizationState(update);\n break;\n\n case 'updateAuthorizationError':\n onUpdateAuthorizationError(update);\n break;\n\n case 'updateConnectionState':\n onUpdateConnectionState(update);\n break;\n\n case 'updateSession':\n onUpdateSession(update);\n break;\n\n case 'updateServerTimeOffset':\n onUpdateServerTimeOffset(update);\n break;\n\n case 'updateCurrentUser':\n onUpdateCurrentUser(update);\n break;\n\n case 'error': {\n if (update.error.message === 'SESSION_REVOKED') {\n actions.signOut();\n }\n\n const paymentShippingError = getShippingError(update.error);\n if (paymentShippingError) {\n actions.addPaymentError({ error: paymentShippingError });\n } else if (shouldClosePaymentModal(update.error)) {\n actions.closePaymentModal();\n } else if (actions.showDialog) {\n actions.showDialog({ data: update.error });\n }\n\n break;\n }\n }\n});\n\nfunction onUpdateApiReady(global: GlobalState) {\n const { hasWebNotifications, hasPushNotifications } = selectNotifySettings(global);\n if (hasWebNotifications && hasPushNotifications) {\n void subscribe();\n }\n void 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 void forceWebsync(false);\n\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 void forceWebsync(true);\n\n setGlobal({\n ...global,\n isLoggingOut: false,\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 if (connectionState === global.connectionState) {\n return;\n }\n\n setGlobal({\n ...global,\n connectionState,\n });\n\n if (connectionState === 'connectionStateBroken') {\n // When mounting Auth `initApi` will be called from an effect. Otherwise, we force it here.\n const isOnAuth = !global.authState || [\n 'authorizationStateWaitPhoneNumber',\n 'authorizationStateWaitCode',\n 'authorizationStateWaitPassword',\n 'authorizationStateWaitRegistration',\n 'authorizationStateWaitQrCode',\n ].includes(global.authState);\n\n getActions().signOut({ forceInitApi: isOnAuth });\n }\n}\n\nfunction onUpdateSession(update: ApiUpdateSession) {\n const { sessionData } = update;\n const { authRememberMe, authState } = getGlobal();\n const isEmpty = !sessionData || !sessionData.mainDcId;\n\n if (!authRememberMe || authState !== 'authorizationStateReady' || isEmpty) {\n return;\n }\n\n getActions().saveSession({ sessionData });\n}\n\nfunction onUpdateServerTimeOffset(update: ApiUpdateServerTimeOffset) {\n const global = getGlobal();\n\n if (global.serverTimeOffset === update.serverTimeOffset) {\n return;\n }\n\n setGlobal({\n ...global,\n serverTimeOffset: update.serverTimeOffset,\n });\n}\n\nfunction onUpdateCurrentUser(update: ApiUpdateCurrentUser) {\n const { currentUser } = update;\n\n setGlobal({\n ...updateUser(getGlobal(), currentUser.id, currentUser),\n currentUserId: currentUser.id,\n });\n\n updateSessionUserId(currentUser.id);\n}\n\nfunction updateSessionUserId(currentUserId: string) {\n const sessionUserAuth = localStorage.getItem(SESSION_USER_KEY);\n if (!sessionUserAuth) return;\n\n const userAuth = JSON.parse(sessionUserAuth);\n userAuth.id = currentUserId;\n\n localStorage.setItem(SESSION_USER_KEY, JSON.stringify(userAuth));\n}\n","import { addActionHandler, getGlobal, setGlobal } from '../../index';\n\nimport { ANIMATION_LEVEL_MAX } from '../../../config';\nimport {\n IS_ANDROID, IS_IOS, IS_MAC_OS, IS_SAFARI, IS_TOUCH_ENV,\n} from '../../../util/environment';\nimport { setLanguage } from '../../../util/langProvider';\nimport switchTheme from '../../../util/switchTheme';\nimport { selectTheme } from '../../selectors';\nimport { startWebsync } from '../../../util/websync';\n\nconst HISTORY_ANIMATION_DURATION = 450;\n\nsubscribeToSystemThemeChange();\n\naddActionHandler('init', (global) => {\n const { animationLevel, messageTextSize, language } = global.settings.byKey;\n const theme = selectTheme(global);\n\n void setLanguage(language, undefined, true);\n\n document.documentElement.style.setProperty(\n '--composer-text-size', `${Math.max(messageTextSize, IS_IOS ? 16 : 15)}px`,\n );\n document.documentElement.style.setProperty('--message-meta-height', `${Math.floor(messageTextSize * 1.3125)}px`);\n document.documentElement.style.setProperty('--message-text-size', `${messageTextSize}px`);\n document.documentElement.setAttribute('data-message-text-size', messageTextSize.toString());\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\n switchTheme(theme, animationLevel === ANIMATION_LEVEL_MAX);\n\n startWebsync();\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 } else if (IS_MAC_OS) {\n document.body.classList.add('is-macos');\n }\n if (IS_SAFARI) {\n document.body.classList.add('is-safari');\n }\n});\n\naddActionHandler('setInstallPrompt', (global, actions, payload) => {\n const { canInstall } = payload;\n return {\n ...global,\n canInstall,\n };\n});\n\naddActionHandler('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\naddActionHandler('setAuthPhoneNumber', (global, actions, payload) => {\n const { phoneNumber } = payload!;\n\n return {\n ...global,\n authPhoneNumber: phoneNumber,\n };\n});\n\naddActionHandler('setAuthRememberMe', (global, actions, payload) => {\n return {\n ...global,\n authRememberMe: Boolean(payload),\n };\n});\n\naddActionHandler('clearAuthError', (global) => {\n return {\n ...global,\n authError: undefined,\n };\n});\n\naddActionHandler('disableHistoryAnimations', () => {\n setTimeout(() => {\n setGlobal({\n ...getGlobal(),\n shouldSkipHistoryAnimations: false,\n });\n document.body.classList.remove('no-animate');\n }, HISTORY_ANIMATION_DURATION);\n\n setGlobal({\n ...getGlobal(),\n shouldSkipHistoryAnimations: true,\n }, { forceSyncOnIOs: true });\n});\n\nfunction subscribeToSystemThemeChange() {\n function handleSystemThemeChange() {\n const currentThemeMatch = document.documentElement.className.match(/theme-(\\w+)/);\n const currentTheme = currentThemeMatch ? currentThemeMatch[1] : 'light';\n const global = getGlobal();\n const nextTheme = selectTheme(global);\n const { animationLevel } = global.settings.byKey;\n\n if (nextTheme !== currentTheme) {\n switchTheme(nextTheme, animationLevel === ANIMATION_LEVEL_MAX);\n // Force-update component containers\n setGlobal({ ...global });\n }\n }\n\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\n if (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', handleSystemThemeChange);\n } else if (typeof mql.addListener === 'function') {\n mql.addListener(handleSystemThemeChange);\n }\n}\n","import { addActionHandler } from '../../index';\nimport type { ISettings, IThemeSettings, ThemeKey } from '../../../types';\nimport { replaceSettings, replaceThemeSettings } from '../../reducers';\n\naddActionHandler('setSettingOption', (global, actions, payload?: Partial<ISettings>) => {\n return replaceSettings(global, payload);\n});\n\naddActionHandler('setThemeSettings', (global, actions, payload: { theme: ThemeKey } & Partial<IThemeSettings>) => {\n const { theme, ...settings } = payload;\n\n return replaceThemeSettings(global, theme, settings);\n});\n\naddActionHandler('requestNextSettingsScreen', (global, actions, nextScreen) => {\n return {\n ...global,\n settings: {\n ...global.settings,\n nextScreen,\n },\n };\n});\n","import { addCallback, removeCallback } from '../lib/teact/teactn';\n\nimport { addActionHandler, getGlobal } from './index';\n\nimport type { GlobalState } from './types';\nimport { MAIN_THREAD_ID } from '../api/types';\n\nimport { onBeforeUnload, onIdle, throttle } from '../util/schedulers';\nimport {\n DEBUG,\n GLOBAL_STATE_CACHE_DISABLED,\n GLOBAL_STATE_CACHE_KEY,\n GLOBAL_STATE_CACHE_USER_LIST_LIMIT,\n GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT,\n GLOBAL_STATE_CACHE_CHATS_WITH_MESSAGES_LIMIT,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n DEFAULT_VOLUME,\n DEFAULT_PLAYBACK_RATE,\n ALL_FOLDER_ID,\n ARCHIVED_FOLDER_ID,\n DEFAULT_LIMITS,\n} from '../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../util/environment';\nimport { isHeavyAnimating } from '../hooks/useHeavyAnimationCheck';\nimport { pick, unique } from '../util/iteratees';\nimport {\n selectCurrentChat,\n selectCurrentMessageList,\n selectVisibleUsers,\n} from './selectors';\nimport { hasStoredSession } from '../util/sessions';\nimport { INITIAL_STATE } from './initialState';\nimport { parseLocationHash } from '../util/routing';\nimport { isUserId } from './helpers';\nimport { getOrderedIds } from '../util/folderManager';\nimport { clearGlobalForLockScreen } from './reducers';\nimport { encryptSession } from '../util/passcode';\n\nconst UPDATE_THROTTLE = 5000;\n\nconst updateCacheThrottled = throttle(() => onIdle(updateCache), UPDATE_THROTTLE, false);\n\nlet isCaching = false;\nlet unsubscribeFromBeforeUnload: NoneToVoidFunction | undefined;\n\nexport function initCache() {\n if (GLOBAL_STATE_CACHE_DISABLED) {\n return;\n }\n\n const resetCache = () => {\n localStorage.removeItem(GLOBAL_STATE_CACHE_KEY);\n\n if (!isCaching) {\n return;\n }\n\n clearCaching();\n };\n\n addActionHandler('saveSession', () => {\n if (isCaching) {\n return;\n }\n\n setupCaching();\n });\n\n addActionHandler('reset', resetCache);\n}\n\nexport function loadCache(initialState: GlobalState): GlobalState | undefined {\n if (GLOBAL_STATE_CACHE_DISABLED) {\n return undefined;\n }\n\n const cache = readCache(initialState);\n\n if (cache.passcode.hasPasscode || hasStoredSession(true)) {\n setupCaching();\n\n return cache;\n } else {\n clearCaching();\n\n return undefined;\n }\n}\n\nfunction setupCaching() {\n isCaching = true;\n unsubscribeFromBeforeUnload = onBeforeUnload(updateCache, true);\n window.addEventListener('blur', updateCache);\n addCallback(updateCacheThrottled);\n}\n\nfunction clearCaching() {\n isCaching = false;\n removeCallback(updateCacheThrottled);\n window.removeEventListener('blur', updateCache);\n if (unsubscribeFromBeforeUnload) {\n unsubscribeFromBeforeUnload();\n }\n}\n\nfunction readCache(initialState: GlobalState): 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 migrateCache(cached, initialState);\n }\n\n const newState = {\n ...initialState,\n ...cached,\n };\n\n const parsedMessageList = !IS_SINGLE_COLUMN_LAYOUT ? parseLocationHash() : undefined;\n\n return {\n ...newState,\n messages: {\n ...newState.messages,\n messageLists: parsedMessageList ? [parsedMessageList] : [],\n },\n };\n}\n\nexport function migrateCache(cached: GlobalState, initialState: GlobalState) {\n // Migrate from legacy setting names\n if ('shouldAutoDownloadMediaFromContacts' in cached.settings.byKey) {\n const {\n shouldAutoDownloadMediaFromContacts,\n shouldAutoDownloadMediaInPrivateChats,\n shouldAutoDownloadMediaInGroups,\n shouldAutoDownloadMediaInChannels,\n shouldAutoPlayVideos,\n shouldAutoPlayGifs,\n ...rest\n } = cached.settings.byKey;\n\n cached.settings.byKey = {\n ...rest,\n canAutoLoadPhotoFromContacts: shouldAutoDownloadMediaFromContacts,\n canAutoLoadVideoFromContacts: shouldAutoDownloadMediaFromContacts,\n canAutoLoadPhotoInPrivateChats: shouldAutoDownloadMediaInPrivateChats,\n canAutoLoadVideoInPrivateChats: shouldAutoDownloadMediaInPrivateChats,\n canAutoLoadPhotoInGroups: shouldAutoDownloadMediaInGroups,\n canAutoLoadVideoInGroups: shouldAutoDownloadMediaInGroups,\n canAutoLoadPhotoInChannels: shouldAutoDownloadMediaInChannels,\n canAutoLoadVideoInChannels: shouldAutoDownloadMediaInChannels,\n canAutoPlayVideos: shouldAutoPlayVideos,\n canAutoPlayGifs: shouldAutoPlayGifs,\n };\n }\n\n // Pre-fill settings with defaults\n cached.settings.byKey = {\n ...initialState.settings.byKey,\n ...cached.settings.byKey,\n };\n\n cached.settings.themes = {\n ...initialState.settings.themes,\n ...cached.settings.themes,\n };\n\n cached.chatFolders = {\n ...initialState.chatFolders,\n ...cached.chatFolders,\n };\n\n if (!cached.stickers.greeting) {\n cached.stickers.greeting = initialState.stickers.greeting;\n }\n\n if (!cached.stickers.premium) {\n cached.stickers.premium = initialState.stickers.premium;\n }\n\n if (!cached.activeDownloads) {\n cached.activeDownloads = {\n byChatId: {},\n };\n }\n\n if (!cached.serviceNotifications) {\n cached.serviceNotifications = [];\n }\n\n if (cached.audioPlayer.volume === undefined) {\n cached.audioPlayer.volume = DEFAULT_VOLUME;\n }\n\n if (cached.audioPlayer.playbackRate === undefined) {\n cached.audioPlayer.playbackRate = DEFAULT_PLAYBACK_RATE;\n }\n\n if (cached.mediaViewer.volume === undefined) {\n cached.mediaViewer.volume = DEFAULT_VOLUME;\n }\n\n if (cached.mediaViewer.playbackRate === undefined) {\n cached.mediaViewer.playbackRate = DEFAULT_PLAYBACK_RATE;\n }\n\n if (!cached.groupCalls) {\n cached.groupCalls = initialState.groupCalls;\n }\n\n if (!cached.users.statusesById) {\n cached.users.statusesById = {};\n }\n\n if (!cached.messages.sponsoredByChatId) {\n cached.messages.sponsoredByChatId = {};\n }\n\n if (!cached.activeReactions) {\n cached.activeReactions = {};\n }\n\n if (!cached.pollModal) {\n cached.pollModal = {\n isOpen: false,\n };\n }\n\n if (!cached.attachMenu) {\n cached.attachMenu = {\n bots: {},\n };\n }\n\n if (!cached.trustedBotIds) {\n cached.trustedBotIds = [];\n }\n\n if (!cached.passcode) {\n cached.passcode = {};\n }\n\n if (cached.activeSessions?.byHash === undefined) {\n cached.activeSessions = {\n byHash: {},\n orderedHashes: [],\n };\n }\n\n if (!cached.activeWebSessions) {\n cached.activeWebSessions = {\n byHash: {},\n orderedHashes: [],\n };\n }\n\n if (!cached.transcriptions) {\n cached.transcriptions = {};\n }\n\n if (cached.appConfig && !cached.appConfig.limits) {\n cached.appConfig.limits = DEFAULT_LIMITS;\n }\n}\n\nfunction updateCache() {\n const global = getGlobal();\n if (!isCaching || global.isLoggingOut || isHeavyAnimating()) {\n return;\n }\n\n forceUpdateCache();\n}\n\nexport function forceUpdateCache(noEncrypt = false) {\n const global = getGlobal();\n const { hasPasscode, isScreenLocked } = global.passcode;\n const serializedGlobal = serializeGlobal(global);\n\n if (hasPasscode) {\n if (!isScreenLocked && !noEncrypt) {\n void encryptSession(undefined, serializedGlobal);\n }\n\n const serializedGlobalClean = JSON.stringify(clearGlobalForLockScreen(global));\n localStorage.setItem(GLOBAL_STATE_CACHE_KEY, serializedGlobalClean);\n\n return;\n }\n\n localStorage.setItem(GLOBAL_STATE_CACHE_KEY, serializedGlobal);\n}\n\nexport function serializeGlobal(global: GlobalState) {\n const reducedGlobal: GlobalState = {\n ...INITIAL_STATE,\n ...pick(global, [\n 'appConfig',\n 'authState',\n 'authPhoneNumber',\n 'authRememberMe',\n 'authNearestCountry',\n 'currentUserId',\n 'contactList',\n 'topPeers',\n 'topInlineBots',\n 'recentEmojis',\n 'push',\n 'shouldShowContextMenuHint',\n 'leftColumnWidth',\n 'serviceNotifications',\n ]),\n audioPlayer: {\n volume: global.audioPlayer.volume,\n playbackRate: global.audioPlayer.playbackRate,\n isMuted: global.audioPlayer.isMuted,\n },\n mediaViewer: {\n volume: global.mediaViewer.volume,\n playbackRate: global.mediaViewer.playbackRate,\n isMuted: global.mediaViewer.isMuted,\n },\n isChatInfoShown: reduceShowChatInfo(global),\n users: reduceUsers(global),\n chats: reduceChats(global),\n messages: reduceMessages(global),\n globalSearch: {\n recentlyFoundChatIds: global.globalSearch.recentlyFoundChatIds,\n },\n settings: reduceSettings(global),\n chatFolders: reduceChatFolders(global),\n groupCalls: reduceGroupCalls(global),\n availableReactions: reduceAvailableReactions(global),\n isCallPanelVisible: undefined,\n trustedBotIds: global.trustedBotIds,\n passcode: pick(global.passcode, [\n 'isScreenLocked',\n 'hasPasscode',\n 'invalidAttemptsCount',\n ]),\n };\n\n return JSON.stringify(reducedGlobal);\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, statusesById }, currentUserId } = global;\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const visibleUserIds = selectVisibleUsers(global)?.map(({ id }) => id);\n\n const idsToSave = unique([\n ...currentUserId ? [currentUserId] : [],\n ...currentChatId && isUserId(currentChatId) ? [currentChatId] : [],\n ...visibleUserIds || [],\n ...global.topPeers.userIds || [],\n ...getOrderedIds(ALL_FOLDER_ID)?.filter(isUserId) || [],\n ...getOrderedIds(ARCHIVED_FOLDER_ID)?.filter(isUserId) || [],\n ...global.contactList?.userIds || [],\n ...global.globalSearch.recentlyFoundChatIds?.filter(isUserId) || [],\n ...Object.keys(byId),\n ]).slice(0, GLOBAL_STATE_CACHE_USER_LIST_LIMIT);\n\n return {\n byId: pick(byId, idsToSave),\n statusesById: pick(statusesById, idsToSave),\n };\n}\n\nfunction reduceChats(global: GlobalState): GlobalState['chats'] {\n const { chats: { byId }, currentUserId } = global;\n const currentChat = selectCurrentChat(global);\n const idsToSave = unique([\n ...currentUserId ? [currentUserId] : [],\n ...currentChat ? [currentChat.id] : [],\n ...getOrderedIds(ALL_FOLDER_ID) || [],\n ...getOrderedIds(ARCHIVED_FOLDER_ID) || [],\n ...global.globalSearch.recentlyFoundChatIds || [],\n ...Object.keys(byId),\n ]).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT);\n\n return {\n ...global.chats,\n isFullyLoaded: {},\n byId: pick(global.chats.byId, idsToSave),\n };\n}\n\nfunction reduceMessages(global: GlobalState): GlobalState['messages'] {\n const { currentUserId } = global;\n const byChatId: GlobalState['messages']['byChatId'] = {};\n const { chatId: currentChatId, threadId, type } = selectCurrentMessageList(global) || {};\n const chatIdsToSave = [\n ...currentChatId ? [currentChatId] : [],\n ...currentUserId ? [currentUserId] : [],\n ...getOrderedIds(ALL_FOLDER_ID)?.slice(0, GLOBAL_STATE_CACHE_CHATS_WITH_MESSAGES_LIMIT) || [],\n ];\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 return {\n byChatId,\n messageLists: currentChatId && threadId && type ? [{ chatId: currentChatId, threadId, type }] : [],\n sponsoredByChatId: {},\n };\n}\n\nfunction reduceSettings(global: GlobalState): GlobalState['settings'] {\n const { byKey, themes } = global.settings;\n\n return {\n byKey,\n themes,\n privacy: {},\n notifyExceptions: {},\n };\n}\n\nfunction reduceChatFolders(global: GlobalState): GlobalState['chatFolders'] {\n return {\n ...global.chatFolders,\n activeChatFolder: 0,\n };\n}\n\nfunction reduceGroupCalls(global: GlobalState): GlobalState['groupCalls'] {\n return {\n ...global.groupCalls,\n byId: {},\n activeGroupCallId: undefined,\n };\n}\n\nfunction reduceAvailableReactions(global: GlobalState): GlobalState['availableReactions'] {\n return global.availableReactions\n ?.map((r) => pick(r, ['reaction', 'staticIcon', 'title', 'isInactive']));\n}\n","import type {\n ApiChat,\n ApiUser,\n ApiChatBannedRights,\n ApiChatAdminRights,\n ApiChatFolder,\n} from '../../api/types';\nimport {\n MAIN_THREAD_ID,\n} from '../../api/types';\n\nimport type { NotifyException, NotifySettings } from '../../types';\nimport type { LangFn } from '../../hooks/useLang';\n\nimport { ARCHIVED_FOLDER_ID, REPLIES_USER_ID, TME_LINK_PREFIX } from '../../config';\nimport { orderBy } from '../../util/iteratees';\nimport { getUserFirstOrLastName } from './users';\nimport { formatDateToString, formatTime } from '../../util/dateFormat';\nimport { prepareSearchWordsForNeedle } from '../../util/searchWords';\nimport { getVideoAvatarMediaHash } from './media';\n\nconst FOREVER_BANNED_DATE = Date.now() / 1000 + 31622400; // 366 days\n\nconst VERIFIED_PRIORITY_BASE = 3e9;\nconst PINNED_PRIORITY_BASE = 3e8;\n\nexport function isUserId(entityId: string) {\n // Workaround for old-fashioned IDs stored locally\n if (typeof entityId === 'number') {\n return entityId > 0;\n }\n\n return !entityId.startsWith('-');\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 isChatWithRepliesBot(chatId: string) {\n return chatId === REPLIES_USER_ID;\n}\n\nexport function getChatTypeString(chat: ApiChat) {\n switch (chat.type) {\n case 'chatTypePrivate':\n return 'PrivateChat';\n case 'chatTypeBasicGroup':\n case 'chatTypeSuperGroup':\n return 'AccDescrGroup';\n case 'chatTypeChannel':\n return 'AccDescrChannel';\n default:\n return 'Chat';\n }\n}\n\nexport function getPrivateChatUserId(chat: ApiChat) {\n if (chat.type !== 'chatTypePrivate' && chat.type !== 'chatTypeSecret') {\n return undefined;\n }\n return chat.id;\n}\n\n// TODO Get rid of `user`\nexport function getChatTitle(lang: LangFn, chat: ApiChat, user?: ApiUser, isSelf = false) {\n if (isSelf || (user && chat.id === user.id && user.isSelf)) {\n return lang('SavedMessages');\n }\n return chat.title || lang('HiddenName');\n}\n\nexport function getChatDescription(chat: ApiChat) {\n if (!chat.fullInfo) {\n return undefined;\n }\n return chat.fullInfo.about;\n}\n\nexport function getChatLink(chat: ApiChat) {\n const { username } = chat;\n if (username) {\n return `${TME_LINK_PREFIX}${username}`;\n }\n\n const { inviteLink } = chat.fullInfo || {};\n\n return inviteLink;\n}\n\nexport function getChatAvatarHash(\n owner: ApiChat | ApiUser,\n size: 'normal' | 'big' = 'normal',\n type: 'photo' | 'video' = 'photo',\n) {\n if (!owner.avatarHash) {\n return undefined;\n }\n const { fullInfo } = owner;\n\n if (type === 'video') {\n if (fullInfo?.profilePhoto?.isVideo) {\n return getVideoAvatarMediaHash(fullInfo.profilePhoto);\n }\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?.[key])\n || (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.isForbidden || chat.migratedTo || chat.isNotJoined || isChatWithRepliesBot(chat.id)) {\n return false;\n }\n\n if (chat.isCreator) {\n return true;\n }\n\n if (isUserId(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')) && (!isUserId(chat.id) || isChatWithBot),\n canSendStickers: isAdmin || !isUserRightBanned(chat, 'sendStickers'),\n canSendGifs: isAdmin || !isUserRightBanned(chat, 'sendGifs'),\n canAttachEmbedLinks: isAdmin || !isUserRightBanned(chat, 'embedLinks'),\n };\n}\n\nexport function getMessageSendingRestrictionReason(\n lang: LangFn,\n currentUserBannedRights?: ApiChatBannedRights,\n defaultBannedRights?: ApiChatBannedRights,\n) {\n if (currentUserBannedRights?.sendMessages) {\n const { untilDate } = currentUserBannedRights;\n return untilDate && untilDate < FOREVER_BANNED_DATE\n ? lang(\n 'Channel.Persmission.Denied.SendMessages.Until',\n lang(\n 'formatDateAtTime',\n [formatDateToString(new Date(untilDate * 1000), lang.code), formatTime(lang, untilDate * 1000)],\n ),\n )\n : lang('Channel.Persmission.Denied.SendMessages.Forever');\n }\n\n if (defaultBannedRights?.sendMessages) {\n return lang('Channel.Persmission.Denied.SendMessages.DefaultRestrictedText');\n }\n\n return undefined;\n}\n\nexport function getChatSlowModeOptions(chat?: ApiChat) {\n if (!chat || !chat.fullInfo) {\n return undefined;\n }\n\n return chat.fullInfo.slowMode;\n}\n\nexport function getChatOrder(chat: ApiChat) {\n return Math.max(chat.joinDate || 0, chat.draftDate || 0, chat.lastMessage?.date || 0);\n}\n\nexport function isChatArchived(chat: ApiChat) {\n return chat.folderId === ARCHIVED_FOLDER_ID;\n}\n\nexport function selectIsChatMuted(\n chat: ApiChat, notifySettings: NotifySettings, notifyExceptions: Record<string, NotifyException> = {},\n) {\n // If this chat is in exceptions they take precedence\n if (notifyExceptions[chat.id] && notifyExceptions[chat.id].isMuted !== undefined) {\n return notifyExceptions[chat.id].isMuted;\n }\n\n return (\n chat.isMuted\n || (isUserId(chat.id) && !notifySettings.hasPrivateChatsNotifications)\n || (isChatChannel(chat) && !notifySettings.hasBroadcastNotifications)\n || (isChatGroup(chat) && !notifySettings.hasGroupNotifications)\n );\n}\n\nexport function selectShouldShowMessagePreview(\n chat: ApiChat, notifySettings: NotifySettings, notifyExceptions: Record<string, NotifyException> = {},\n) {\n const {\n hasPrivateChatsMessagePreview = true,\n hasBroadcastMessagePreview = true,\n hasGroupMessagePreview = true,\n } = notifySettings;\n // If this chat is in exceptions they take precedence\n if (notifyExceptions[chat.id] && notifyExceptions[chat.id].shouldShowPreviews !== undefined) {\n return notifyExceptions[chat.id].shouldShowPreviews;\n }\n\n return (isUserId(chat.id) && hasPrivateChatsMessagePreview)\n || (isChatChannel(chat) && hasBroadcastMessagePreview)\n || (isChatGroup(chat) && hasGroupMessagePreview);\n}\n\nexport function getCanDeleteChat(chat: ApiChat) {\n return isChatBasicGroup(chat) || ((isChatSuperGroup(chat) || isChatChannel(chat)) && chat.isCreator);\n}\n\nexport function getFolderDescriptionText(lang: LangFn, folder: ApiChatFolder, chatsCount?: number) {\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 chatsCount !== undefined && (\n Object.values(filters).filter(Boolean).length > 1\n || (excludedChatIds?.length)\n || (includedChatIds?.length)\n )) {\n return lang('Chats', chatsCount);\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\nexport function getMessageSenderName(lang: LangFn, chatId: string, sender?: ApiUser) {\n if (!sender || isUserId(chatId)) {\n return undefined;\n }\n\n if (sender.isSelf) {\n return lang('FromYou');\n }\n\n return getUserFirstOrLastName(sender);\n}\n\nexport function sortChatIds(\n chatIds: string[],\n chatsById: Record<string, ApiChat>,\n shouldPrioritizeVerified = false,\n priorityIds?: string[],\n) {\n return orderBy(chatIds, (id) => {\n const chat = chatsById[id];\n if (!chat) {\n return 0;\n }\n\n let priority = 0;\n\n if (chat.lastMessage) {\n priority += chat.lastMessage.date;\n }\n\n if (shouldPrioritizeVerified && chat.isVerified) {\n priority += VERIFIED_PRIORITY_BASE; // ~100 years in seconds\n }\n\n if (priorityIds && priorityIds.includes(id)) {\n priority = Date.now() + PINNED_PRIORITY_BASE + (priorityIds.length - priorityIds.indexOf(id));\n }\n\n return priority;\n }, 'desc');\n}\n\nexport function filterChatsByName(\n lang: LangFn,\n chatIds: string[],\n chatsById: Record<string, ApiChat>,\n query?: string,\n currentUserId?: string,\n) {\n if (!query) {\n return chatIds;\n }\n\n const searchWords = prepareSearchWordsForNeedle(query);\n\n return chatIds.filter((id) => {\n const chat = chatsById[id];\n if (!chat) {\n return false;\n }\n\n return searchWords(getChatTitle(lang, chat, undefined, id === currentUserId));\n });\n}\n","import type {\n ApiChat, ApiMessage, ApiReactions, ApiUser,\n} from '../../api/types';\nimport { ApiMessageEntityTypes } from '../../api/types';\nimport type { LangFn } from '../../hooks/useLang';\n\nimport {\n CONTENT_NOT_SUPPORTED,\n LOCAL_MESSAGE_MIN_ID,\n RE_LINK_TEMPLATE,\n SERVICE_NOTIFICATIONS_USER_ID,\n} from '../../config';\nimport { getUserFullName } from './users';\nimport { IS_OPUS_SUPPORTED, isWebpSupported } from '../../util/environment';\nimport { getChatTitle, isUserId } from './chats';\nimport parseEmojiOnlyString from '../../components/common/helpers/parseEmojiOnlyString';\nimport { getGlobal } from '../index';\n\nconst RE_LINK = new RegExp(RE_LINK_TEMPLATE, 'i');\n\nexport type MessageKey = `msg${string}-${number}`;\n\nexport function getMessageHtmlId(messageId: number) {\n return `message${messageId.toString().replace('.', '-')}`;\n}\n\nexport function getMessageKey(message: ApiMessage): MessageKey {\n const { chatId, id, previousLocalId } = message;\n\n return buildMessageKey(chatId, isServiceNotificationMessage(message) ? previousLocalId || id : id);\n}\n\nexport function buildMessageKey(chatId: string, msgId: number): MessageKey {\n return `msg${chatId}-${msgId}`;\n}\n\nexport function parseMessageKey(key: MessageKey) {\n const match = key.match(/^msg(-?\\d+)-(\\d+)/)!;\n\n return { chatId: match[1], messageId: Number(match[2]) };\n}\n\nexport function getMessageOriginalId(message: ApiMessage) {\n return message.previousLocalId || message.id;\n}\n\nexport function getMessageTranscription(message: ApiMessage) {\n const { transcriptionId } = message;\n const global = getGlobal();\n\n return transcriptionId && global.transcriptions[transcriptionId]?.text;\n}\n\nexport function getMessageText(message: ApiMessage) {\n const {\n text, sticker, photo, video, audio, voice, document, poll, webPage, contact, invoice, location,\n game, action,\n } = message.content;\n\n if (text) {\n return text.text;\n }\n\n if (sticker || photo || video || audio || voice || document\n || contact || poll || webPage || invoice || location || game || action?.phoneCall) {\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?.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?.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 Boolean(message.content.action);\n}\n\nexport function isServiceNotificationMessage(message: ApiMessage) {\n return message.chatId === SERVICE_NOTIFICATIONS_USER_ID && Math.round(message.id) !== message.id;\n}\n\nexport function isAnonymousOwnMessage(message: ApiMessage) {\n return Boolean(message.senderId) && !isUserId(message.senderId!) && isOwnMessage(message);\n}\n\nexport function getSenderTitle(lang: LangFn, sender: ApiUser | ApiChat) {\n return isUserId(sender.id) ? getUserFullName(sender as ApiUser) : getChatTitle(lang, sender as ApiChat);\n}\n\nexport function getSendingState(message: ApiMessage) {\n if (!message.sendingState) {\n return 'succeeded';\n }\n\n return message.sendingState === 'messageSendingStateFailed' ? 'failed' : 'pending';\n}\n\nexport function isMessageLocal(message: ApiMessage) {\n return message.id > LOCAL_MESSAGE_MIN_ID;\n}\n\nexport function isHistoryClearMessage(message: ApiMessage) {\n return message.content.action && message.content.action.type === 'historyClear';\n}\n\nexport function getMessageContentFilename(message: ApiMessage) {\n const { content } = message;\n\n const video = content.webPage ? content.webPage.video : content.video;\n const photo = content.webPage ? content.webPage.photo : content.photo;\n const document = content.webPage ? content.webPage.document : content.document;\n if (document) {\n return document.fileName;\n }\n\n if (video) {\n return video.fileName;\n }\n\n if (content.sticker) {\n const extension = content.sticker.isLottie ? 'tgs' : content.sticker.isVideo\n ? 'webm' : isWebpSupported() ? 'webp' : 'png';\n return `${content.sticker.id}.${extension}`;\n }\n\n if (content.audio) {\n return content.audio.fileName;\n }\n\n const baseFilename = getMessageKey(message);\n\n if (photo) {\n return `${baseFilename}.jpg`;\n }\n\n if (content.voice) {\n return IS_OPUS_SUPPORTED ? `${baseFilename}.ogg` : `${baseFilename}.wav`;\n }\n\n return baseFilename;\n}\n\nexport function areReactionsEmpty(reactions: ApiReactions) {\n return !reactions.results.some((l) => l.count > 0);\n}\n\nexport function isGeoLiveExpired(message: ApiMessage, timestamp = Date.now() / 1000) {\n const { location } = message.content;\n if (location?.type !== 'geoLive') return false;\n return (timestamp - (message.date || 0) >= location.period);\n}\n\nexport function getMessageSingleInlineButton(message: ApiMessage) {\n return message.inlineButtons?.length === 1\n && message.inlineButtons[0].length === 1\n && message.inlineButtons[0][0];\n}\n","import type { ApiMessage, ApiReactions } from '../../api/types';\nimport type { GlobalState } from '../types';\n\nexport function getMessageRecentReaction(message: Partial<ApiMessage>) {\n return message.isOutgoing ? message.reactions?.recentReactions?.[0] : undefined;\n}\nexport function checkIfHasUnreadReactions(global: GlobalState, reactions: ApiReactions) {\n const { currentUserId } = global;\n return reactions?.recentReactions?.some(\n ({ isUnread, userId }) => isUnread && userId !== currentUserId,\n );\n}\n","import type { ApiMessage } from '../../api/types';\nimport { ApiMessageEntityTypes } from '../../api/types';\nimport { CONTENT_NOT_SUPPORTED } from '../../config';\n\nimport type { TextPart } from '../../types';\nimport type { LangFn } from '../../hooks/useLang';\n\nimport trimText from '../../util/trimText';\nimport { getMessageText, getMessageTranscription } from './messages';\nimport { getMessageRecentReaction } from './reactions';\n\nconst SPOILER_CHARS = ['⠺', '⠵', '⠞', '⠟'];\nexport const TRUNCATED_SUMMARY_LENGTH = 80;\n\nexport function getMessageSummaryText(\n lang: LangFn,\n message: ApiMessage,\n noEmoji = false,\n truncateLength = TRUNCATED_SUMMARY_LENGTH,\n noReactions = true,\n isExtended = false,\n) {\n const emoji = !noEmoji && getMessageSummaryEmoji(message, noReactions);\n const emojiWithSpace = emoji ? `${emoji} ` : '';\n const text = trimText(getMessageTextWithSpoilers(message), truncateLength);\n const description = getMessageSummaryDescription(lang, message, text, noReactions, isExtended);\n\n return `${emojiWithSpace}${description}`;\n}\n\nexport function getMessageTextWithSpoilers(message: ApiMessage) {\n const transcription = getMessageTranscription(message);\n\n const textWithoutTranscription = getMessageText(message);\n if (!textWithoutTranscription) {\n return transcription;\n }\n\n const { entities } = message.content.text || {};\n if (!entities?.length) {\n return transcription ? `${transcription}\\n${textWithoutTranscription}` : textWithoutTranscription;\n }\n\n const text = entities.reduce((accText, {\n type,\n offset,\n length,\n }) => {\n if (type !== ApiMessageEntityTypes.Spoiler) {\n return accText;\n }\n\n const spoiler = generateBrailleSpoiler(length);\n\n return `${accText.substr(0, offset)}${spoiler}${accText.substr(offset + length, accText.length)}`;\n }, textWithoutTranscription);\n\n return transcription ? `${transcription}\\n${text}` : text;\n}\n\nexport function getMessageSummaryEmoji(message: ApiMessage, noReactions = true) {\n const {\n photo,\n video,\n audio,\n voice,\n document,\n sticker,\n poll,\n } = message.content;\n\n if (message.groupedId || photo) {\n return '🖼';\n }\n\n if (video) {\n return '📹';\n }\n\n if (sticker) {\n return sticker.emoji;\n }\n\n if (audio) {\n return '🎧';\n }\n\n if (voice) {\n return '🎤';\n }\n\n if (document) {\n return '📎';\n }\n\n if (poll) {\n return '📊';\n }\n\n const reaction = !noReactions && getMessageRecentReaction(message);\n if (reaction) {\n return reaction.reaction;\n }\n\n return undefined;\n}\n\nexport function getMessageSummaryDescription(\n lang: LangFn,\n message: ApiMessage,\n truncatedText?: string | TextPart[],\n noReactions = true,\n isExtended = false,\n) {\n const {\n text,\n photo,\n video,\n audio,\n voice,\n document,\n sticker,\n contact,\n poll,\n invoice,\n location,\n game,\n } = message.content;\n\n let summary: string | TextPart[] | undefined;\n\n if (message.groupedId) {\n summary = truncatedText || lang('lng_in_dlg_album');\n }\n\n if (photo) {\n summary = truncatedText || lang('AttachPhoto');\n }\n\n if (video) {\n summary = truncatedText || lang(video.isGif ? 'AttachGif' : 'AttachVideo');\n }\n\n if (sticker) {\n summary = lang('AttachSticker').trim();\n }\n\n if (audio) {\n summary = getMessageAudioCaption(message) || lang('AttachMusic');\n }\n\n if (voice) {\n summary = truncatedText || lang('AttachAudio');\n }\n\n if (document) {\n summary = isExtended ? document.fileName : (truncatedText || document.fileName);\n }\n\n if (contact) {\n summary = lang('AttachContact');\n }\n\n if (poll) {\n summary = poll.summary.question;\n }\n\n if (invoice) {\n summary = `${lang('PaymentInvoice')}: ${invoice.text}`;\n }\n\n if (text) {\n if (isExtended && summary) {\n summary += `\\n${truncatedText}`;\n } else {\n summary = truncatedText;\n }\n }\n\n if (location?.type === 'geo' || location?.type === 'venue') {\n summary = lang('Message.Location');\n }\n\n if (location?.type === 'geoLive') {\n summary = lang('Message.LiveLocation');\n }\n\n if (game) {\n summary = `🎮 ${game.title}`;\n }\n\n const reaction = !noReactions && getMessageRecentReaction(message);\n if (summary && reaction) {\n summary = `to your \"${summary}\"`;\n }\n\n return summary || CONTENT_NOT_SUPPORTED;\n}\n\nexport function generateBrailleSpoiler(length: number) {\n return new Array(length)\n .fill(undefined)\n .map(() => SPOILER_CHARS[Math.floor(Math.random() * SPOILER_CHARS.length)])\n .join('');\n}\n\nfunction getMessageAudioCaption(message: ApiMessage) {\n const {\n audio,\n text,\n } = message.content;\n\n return (audio && [audio.title, audio.performer].filter(Boolean)\n .join(' — ')) || (text?.text);\n}\n","import type {\n ApiAudio,\n ApiDimensions,\n ApiDocument,\n ApiGame,\n ApiLocation,\n ApiMessage,\n ApiMessageSearchType,\n ApiPhoto,\n ApiVideo,\n ApiWebDocument,\n} from '../../api/types';\nimport { ApiMediaFormat } from '../../api/types';\n\nimport {\n IS_OPFS_SUPPORTED,\n IS_OPUS_SUPPORTED,\n IS_PROGRESSIVE_SUPPORTED,\n IS_SAFARI,\n MAX_BUFFER_SIZE,\n} from '../../util/environment';\nimport { getMessageKey, isMessageLocal, matchLinkInMessageText } from './messages';\nimport { getDocumentHasPreview } from '../../components/common/helpers/documentInfo';\n\ntype Target =\n 'micro'\n | 'pictogram'\n | 'inline'\n | 'viewerPreview'\n | 'viewerFull'\n | 'download';\n\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?.isRound ? video : undefined;\n}\n\nexport function getMessageAction(message: ApiMessage) {\n return message.content.action;\n}\n\nexport function getMessageAudio(message: ApiMessage) {\n return message.content.audio;\n}\n\nexport function getMessageVoice(message: ApiMessage) {\n return message.content.voice;\n}\n\nexport function getMessageSticker(message: ApiMessage) {\n return message.content.sticker;\n}\n\nexport function getMessageDocument(message: ApiMessage) {\n return message.content.document;\n}\n\nexport function isMessageDocumentPhoto(message: ApiMessage) {\n const document = getMessageDocument(message);\n return document ? document.mediaType === 'photo' : undefined;\n}\n\nexport function isMessageDocumentVideo(message: ApiMessage) {\n const document = getMessageDocument(message);\n return document ? document.mediaType === 'video' : undefined;\n}\n\nexport function getMessageContact(message: ApiMessage) {\n return message.content.contact;\n}\n\nexport function getMessagePoll(message: ApiMessage) {\n return message.content.poll;\n}\n\nexport function getMessageInvoice(message: ApiMessage) {\n return message.content.invoice;\n}\n\nexport function getMessageLocation(message: ApiMessage) {\n return message.content.location;\n}\n\nexport function getMessageWebPage(message: ApiMessage) {\n return message.content.webPage;\n}\n\nexport function getMessageWebPagePhoto(message: ApiMessage) {\n return getMessageWebPage(message)?.photo;\n}\n\nexport function getMessageWebPageDocument(message: ApiMessage) {\n return getMessageWebPage(message)?.document;\n}\n\nexport function getMessageWebPageVideo(message: ApiMessage): ApiVideo | undefined {\n return getMessageWebPage(message)?.video;\n}\n\nexport function getMessageMediaThumbnail(message: ApiMessage) {\n const media = getMessagePhoto(message)\n || getMessageVideo(message)\n || getMessageDocument(message)\n || getMessageSticker(message)\n || getMessageWebPagePhoto(message)\n || getMessageWebPageVideo(message);\n\n if (!media) {\n return undefined;\n }\n\n return media.thumbnail;\n}\n\nexport function getMessageMediaThumbDataUri(message: ApiMessage) {\n return getMessageMediaThumbnail(message)?.dataUri;\n}\n\nexport function getDocumentMediaHash(document: ApiDocument) {\n return `document${document.id}`;\n}\n\nexport function buildStaticMapHash(\n geo: ApiLocation['geo'],\n width: number,\n height: number,\n zoom: number,\n scale: number,\n) {\n const {\n long, lat, accessHash, accuracyRadius,\n } = geo;\n\n // eslint-disable-next-line max-len\n return `staticMap:${accessHash}?lat=${lat}&long=${long}&w=${width}&h=${height}&zoom=${zoom}&scale=${scale}&accuracyRadius=${accuracyRadius}`;\n}\n\nexport function getMessageMediaHash(\n message: ApiMessage,\n target: Target,\n) {\n const {\n photo, video, sticker, audio, voice, document,\n } = message.content;\n const webPagePhoto = getMessageWebPagePhoto(message);\n const webPageVideo = getMessageWebPageVideo(message);\n\n const messageVideo = video || webPageVideo;\n const messagePhoto = photo || webPagePhoto;\n\n const content = messagePhoto || messageVideo || sticker || audio || voice || document;\n\n if (!content) {\n return undefined;\n }\n\n const mediaId = content.id;\n const base = `${getMessageKey(message)}${mediaId ? `:${mediaId}` : ''}`;\n\n if (messageVideo) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n return !hasMessageLocalBlobUrl(message) ? getVideoOrAudioBaseHash(messageVideo, base) : undefined;\n case 'viewerPreview':\n return `${base}?size=m`;\n case 'viewerFull':\n return getVideoOrAudioBaseHash(messageVideo, base);\n case 'download':\n return `${base}?download`;\n }\n }\n\n if (messagePhoto) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n return !hasMessageLocalBlobUrl(message) ? `${base}?size=x` : undefined;\n case 'viewerPreview':\n return `${base}?size=x`;\n case 'viewerFull':\n case 'download':\n return `${base}?size=z`;\n }\n }\n\n if (document) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n case 'inline':\n case 'viewerPreview':\n if (!getDocumentHasPreview(document) || hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n return `${base}?size=m`;\n case 'viewerFull':\n case 'download':\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 case 'inline':\n return base;\n case 'download':\n return `${base}?download`;\n }\n }\n\n if (audio) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return getAudioHasCover(audio) ? `${base}?size=m` : undefined;\n case 'inline':\n return getVideoOrAudioBaseHash(audio, base);\n case 'download':\n return `${base}?download`;\n }\n }\n\n if (voice) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return undefined;\n case 'inline':\n return base;\n case 'download':\n return `${base}?download`;\n }\n }\n\n return undefined;\n}\n\nexport function getWebDocumentHash(webDocument?: ApiWebDocument) {\n if (!webDocument) return undefined;\n return `webDocument:${webDocument.url}`;\n}\n\nexport function getGamePreviewPhotoHash(game: ApiGame) {\n const { photo } = game;\n\n if (photo) {\n return `photo${photo.id}?size=x`;\n }\n\n return undefined;\n}\n\nexport function getGamePreviewVideoHash(game: ApiGame) {\n const { document } = game;\n\n if (document) {\n return `document${document.id}`;\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 getAudioHasCover(media: ApiAudio) {\n return media.thumbnailSizes && media.thumbnailSizes.length > 0;\n}\n\nexport function getMessageMediaFormat(\n message: ApiMessage, target: Target,\n): ApiMediaFormat {\n const {\n video, audio, voice, document,\n } = message.content;\n const fullVideo = video || getMessageWebPageVideo(message);\n const size = (video || audio || document)?.size!;\n if (target === 'download') {\n if (IS_PROGRESSIVE_SUPPORTED && size > MAX_BUFFER_SIZE && !IS_OPFS_SUPPORTED) {\n return ApiMediaFormat.DownloadUrl;\n }\n return ApiMediaFormat.BlobUrl;\n }\n\n if (fullVideo && IS_PROGRESSIVE_SUPPORTED && (\n target === 'viewerFull' || target === 'inline'\n )) {\n return ApiMediaFormat.Progressive;\n }\n\n if (audio || voice) {\n // Safari\n if (voice && !IS_OPUS_SUPPORTED) {\n return ApiMediaFormat.BlobUrl;\n }\n\n return ApiMediaFormat.Progressive;\n }\n\n return ApiMediaFormat.BlobUrl;\n}\n\nexport function getMessageFileName(message: ApiMessage) {\n const {\n photo, video, document,\n } = message.content;\n const webPagePhoto = getMessageWebPagePhoto(message);\n const webPageVideo = getMessageWebPageVideo(message);\n\n if (photo || webPagePhoto) {\n return `photo${message.date}.jpeg`;\n }\n\n const { fileName } = video || webPageVideo || document || {};\n\n return fileName;\n}\n\nexport function getMessageFileSize(message: ApiMessage) {\n const { video, document } = message.content;\n const webPageVideo = getMessageWebPageVideo(message);\n const { size } = video || webPageVideo || document || {};\n\n return size;\n}\n\nexport function hasMessageLocalBlobUrl(message: ApiMessage) {\n const { photo, video, document } = message.content;\n\n return (photo?.blobUrl) || (video?.blobUrl) || (document?.previewBlobUrl);\n}\n\nexport function getChatMediaMessageIds(\n messages: Record<number, ApiMessage>, listedIds: number[], isFromSharedMedia = false,\n) {\n return getMessageContentIds(messages, listedIds, isFromSharedMedia ? 'media' : 'inlineMedia');\n}\n\nexport function getPhotoFullDimensions(photo: Pick<ApiPhoto, 'sizes' | 'thumbnail'>): ApiDimensions | undefined {\n return (\n photo.sizes.find((size) => size.type === 'z')\n || photo.sizes.find((size) => size.type === 'y')\n || getPhotoInlineDimensions(photo)\n );\n}\n\nexport function getPhotoInlineDimensions(photo: Pick<ApiPhoto, 'sizes' | 'thumbnail'>): ApiDimensions | undefined {\n return (\n photo.sizes.find((size) => size.type === 'x')\n || photo.sizes.find((size) => size.type === 'm')\n || photo.sizes.find((size) => size.type === 's')\n || photo.thumbnail\n );\n}\n\nexport function getVideoDimensions(video: ApiVideo): ApiDimensions | undefined {\n if (video.width && video.height) {\n return video as ApiDimensions;\n }\n\n return undefined;\n}\n\nexport function getMediaTransferState(message: ApiMessage, progress?: number, isLoadNeeded = false) {\n const isUploading = isMessageLocal(message);\n const isTransferring = isUploading || isLoadNeeded;\n const transferProgress = Number(progress);\n\n return {\n isUploading, isTransferring, transferProgress,\n };\n}\n\nexport function getMessageContentIds(\n messages: Record<number, ApiMessage>, messageIds: number[], contentType: ApiMessageSearchType | 'inlineMedia',\n) {\n let validator: Function;\n\n switch (contentType) {\n case 'media':\n validator = (message: ApiMessage) => {\n const video = getMessageVideo(message);\n return getMessagePhoto(message) || (video && !video.isRound && !video.isGif);\n };\n break;\n\n case 'documents':\n validator = getMessageDocument;\n break;\n\n case 'links':\n validator = (message: ApiMessage) => getMessageWebPage(message) || matchLinkInMessageText(message);\n break;\n\n case 'audio':\n validator = getMessageAudio;\n break;\n\n case 'voice':\n validator = (message: ApiMessage) => {\n const video = getMessageVideo(message);\n return getMessageVoice(message) || (video && video.isRound);\n };\n break;\n\n case 'inlineMedia':\n validator = (message: ApiMessage) => {\n const video = getMessageVideo(message);\n return (\n getMessagePhoto(message)\n || (video && !video.isRound && !video.isGif)\n || isMessageDocumentPhoto(message)\n || isMessageDocumentVideo(message)\n );\n };\n break;\n\n default:\n return [] as Array<number>;\n }\n\n return messageIds.reduce((result, messageId) => {\n if (messages[messageId] && validator(messages[messageId])) {\n result.push(messageId);\n }\n\n return result;\n }, [] as Array<number>);\n}\n\nexport function getMediaDuration(message: ApiMessage) {\n const { audio, voice, video } = getMessageContent(message);\n const media = audio || voice || video || getMessageWebPageVideo(message);\n if (!media) {\n return undefined;\n }\n\n return media.duration;\n}\n","export function buildChatThreadKey(chatId: string, threadId: number) {\n return `${chatId}_${threadId}`;\n}\n","import type { ApiFieldError } from '../../api/types';\n\nconst STRIPE_ERRORS: Record<string, ApiFieldError> = {\n missing_payment_information: {\n field: 'cardNumber',\n message: 'Incorrect card number',\n },\n invalid_number: {\n field: 'cardNumber',\n message: 'Incorrect card number',\n },\n number: {\n field: 'cardNumber',\n message: 'Incorrect card number',\n },\n exp_year: {\n field: 'expiry',\n message: 'Incorrect year',\n },\n exp_month: {\n field: 'expiry',\n message: 'Incorrect month',\n },\n invalid_expiry_year: {\n field: 'expiry',\n message: 'Incorrect year',\n },\n invalid_expiry_month: {\n field: 'expiry',\n message: 'Incorrect month',\n },\n cvc: {\n field: 'cvv',\n message: 'Incorrect CVV',\n },\n invalid_cvc: {\n field: 'cvv',\n message: 'Incorrect CVV',\n },\n};\n\nexport function getStripeError(error: {\n code: string;\n message: string;\n param?: string;\n}) {\n const { message: description, code, param } = error;\n const { field, message } = param ? STRIPE_ERRORS[param] : STRIPE_ERRORS[code];\n\n return { field, message, description };\n}\n","import type { ApiPhoto } from '../../api/types';\n\nexport function getBotCoverMediaHash(photo: ApiPhoto) {\n return `photo${photo.id}?size=x`;\n}\n","import type { ApiPhoto } from '../../api/types';\n\nexport function getVideoAvatarMediaHash(photo: ApiPhoto) {\n return `videoAvatar${photo.id}?size=u`;\n}\n","import type { ApiChat, ApiUser, ApiUserStatus } from '../../api/types';\n\nimport { SERVICE_NOTIFICATIONS_USER_ID } from '../../config';\nimport { formatFullDate, formatTime } from '../../util/dateFormat';\nimport { orderBy } from '../../util/iteratees';\nimport type { LangFn } from '../../hooks/useLang';\nimport { getServerTime } from '../../util/serverTime';\nimport { prepareSearchWordsForNeedle } from '../../util/searchWords';\nimport { formatPhoneNumber } from '../../util/phoneNumber';\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 if (user.phoneNumber) {\n return `+${formatPhoneNumber(user.phoneNumber)}`;\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(\n lang: LangFn, user: ApiUser, userStatus: ApiUserStatus | undefined, serverTimeOffset: number,\n) {\n if (user.id === SERVICE_NOTIFICATIONS_USER_ID) {\n return lang('ServiceNotifications').toLowerCase();\n }\n\n if (user.type && user.type === 'userTypeBot') {\n return lang('Bot');\n }\n\n if (!userStatus) {\n return '';\n }\n\n switch (userStatus.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 } = userStatus;\n\n if (!wasOnline) return lang('LastSeen.Offline');\n\n const now = new Date(new Date().getTime() + serverTimeOffset * 1000);\n const wasOnlineDate = new Date(wasOnline * 1000);\n\n if (wasOnlineDate >= now) {\n return lang('LastSeen.JustNow');\n }\n\n const diff = new Date(now.getTime() - wasOnlineDate.getTime());\n\n // within a minute\n if (diff.getTime() / 1000 < 60) {\n return lang('LastSeen.JustNow');\n }\n\n // within an hour\n if (diff.getTime() / 1000 < 60 * 60) {\n const minutes = Math.floor(diff.getTime() / 1000 / 60);\n return lang('LastSeen.MinutesAgo', minutes);\n }\n\n // today\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const serverToday = new Date(today.getTime() + serverTimeOffset * 1000);\n if (wasOnlineDate > serverToday) {\n // up to 6 hours ago\n if (diff.getTime() / 1000 < 6 * 60 * 60) {\n const hours = Math.floor(diff.getTime() / 1000 / 60 / 60);\n return lang('LastSeen.HoursAgo', hours);\n }\n\n // other\n return lang('LastSeen.TodayAt', formatTime(lang, wasOnlineDate));\n }\n\n // yesterday\n const yesterday = new Date();\n yesterday.setDate(now.getDate() - 1);\n yesterday.setHours(0, 0, 0, 0);\n const serverYesterday = new Date(yesterday.getTime() + serverTimeOffset * 1000);\n if (wasOnlineDate > serverYesterday) {\n return lang('LastSeen.YesterdayAt', formatTime(lang, wasOnlineDate));\n }\n\n return lang('LastSeen.AtDate', formatFullDate(lang, wasOnlineDate));\n }\n\n case 'userStatusOnline': {\n return lang('Online');\n }\n\n case 'userStatusRecently': {\n return lang('Lately');\n }\n\n default:\n return undefined;\n }\n}\n\nexport function isUserOnline(user: ApiUser, userStatus?: ApiUserStatus) {\n const { id, type } = user;\n\n if (!userStatus) {\n return false;\n }\n\n if (id === SERVICE_NOTIFICATIONS_USER_ID) {\n return false;\n }\n\n return userStatus.type === 'userStatusOnline' && type !== 'userTypeBot';\n}\n\nexport function isDeletedUser(user: ApiUser) {\n if (user.noStatus || 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 getCanAddContact(user: ApiUser) {\n return !user.isContact && !isUserBot(user);\n}\n\nexport function sortUserIds(\n userIds: string[],\n usersById: Record<string, ApiUser>,\n userStatusesById: Record<string, ApiUserStatus>,\n priorityIds?: string[],\n serverTimeOffset = 0,\n) {\n return orderBy(userIds, (id) => {\n const now = getServerTime(serverTimeOffset);\n\n if (priorityIds && priorityIds.includes(id)) {\n // Assuming that online status expiration date can't be as far as two days from now,\n // this should place prioritized on top of the list.\n // Then we subtract index of `id` in `priorityIds` to preserve selected order\n return now + (48 * 60 * 60) - (priorityIds.length - priorityIds.indexOf(id));\n }\n\n const user = usersById[id];\n const userStatus = userStatusesById[id];\n if (!user || !userStatus) {\n return 0;\n }\n\n if (userStatus.type === 'userStatusOnline') {\n return userStatus.expires;\n } else if (userStatus.type === 'userStatusOffline' && userStatus.wasOnline) {\n return userStatus.wasOnline;\n }\n\n switch (userStatus.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\nexport function filterUsersByName(\n userIds: string[],\n usersById: Record<string, ApiUser>,\n query?: string,\n currentUserId?: string,\n savedMessagesLang?: string,\n) {\n if (!query) {\n return userIds;\n }\n\n const searchWords = prepareSearchWordsForNeedle(query);\n\n return userIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n\n const name = id === currentUserId ? savedMessagesLang : getUserFullName(user);\n return (name && searchWords(name)) || searchWords(user.username);\n });\n}\n\nexport function getUserIdDividend(userId: string) {\n // Workaround for old-fashioned IDs stored locally\n if (typeof userId === 'number') {\n return Math.abs(userId);\n }\n\n return Math.abs(Number(userId));\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 ? getUserIdDividend(peer.id) % 7 : 0;\n\n return USER_COLOR_KEYS[index];\n}\n","import { typify } from '../lib/teact/teactn';\nimport type { GlobalState, ActionPayloads, NonTypedActionNames } from './types';\n\nconst typed = typify<GlobalState, ActionPayloads, NonTypedActionNames>();\n\nexport const getGlobal = typed.getGlobal;\nexport const setGlobal = typed.setGlobal;\nexport const getActions = typed.getActions;\nexport const addActionHandler = typed.addActionHandler;\nexport const withGlobal = typed.withGlobal;\n","import type { GlobalState } from './types';\nimport { NewChatMembersProgress } from '../types';\n\nimport {\n ANIMATION_LEVEL_DEFAULT, DARK_THEME_PATTERN_COLOR, DEFAULT_MESSAGE_TEXT_SIZE_PX, DEFAULT_PATTERN_COLOR,\n DEFAULT_PLAYBACK_RATE,\n DEFAULT_VOLUME,\n IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX, MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX,\n} from '../config';\nimport { IS_IOS, IS_MAC_OS } from '../util/environment';\n\nexport const INITIAL_STATE: GlobalState = {\n isLeftColumnShown: true,\n isChatInfoShown: false,\n newChatMembersProgress: NewChatMembersProgress.Closed,\n uiReadyState: 0,\n serverTimeOffset: 0,\n\n authRememberMe: true,\n countryList: {\n phoneCodes: [],\n general: [],\n },\n\n blocked: {\n ids: [],\n totalCount: 0,\n },\n\n users: {\n byId: {},\n statusesById: {},\n },\n\n chats: {\n listIds: {},\n isFullyLoaded: {},\n orderedPinnedIds: {},\n totalCount: {},\n byId: {},\n },\n\n messages: {\n byChatId: {},\n messageLists: [],\n sponsoredByChatId: {},\n },\n\n groupCalls: {\n byId: {},\n },\n\n scheduledMessages: {\n byChatId: {},\n },\n\n chatFolders: {\n byId: {},\n activeChatFolder: 0,\n },\n\n fileUploads: {\n byMessageLocalId: {},\n },\n\n recentEmojis: ['grinning', 'kissing_heart', 'christmas_tree', 'brain', 'trophy'],\n\n stickers: {\n setsById: {},\n added: {},\n recent: {\n stickers: [],\n },\n favorite: {\n stickers: [],\n },\n greeting: {\n stickers: [],\n },\n premium: {\n stickers: [],\n },\n featured: {\n setIds: [],\n },\n search: {},\n forEmoji: {},\n },\n\n emojiKeywords: {},\n\n gifs: {\n saved: {},\n search: {},\n },\n\n inlineBots: {\n isLoading: false,\n byUsername: {},\n },\n\n globalSearch: {},\n\n userSearch: {},\n\n localTextSearch: {\n byChatThreadKey: {},\n },\n\n localMediaSearch: {\n byChatId: {},\n },\n\n management: {\n byChatId: {},\n },\n\n topPeers: {},\n\n topInlineBots: {},\n\n mediaViewer: {\n volume: DEFAULT_VOLUME,\n playbackRate: DEFAULT_PLAYBACK_RATE,\n isMuted: false,\n },\n\n audioPlayer: {\n volume: DEFAULT_VOLUME,\n playbackRate: DEFAULT_PLAYBACK_RATE,\n isMuted: false,\n },\n\n forwardMessages: {},\n\n pollResults: {},\n\n payment: {},\n\n notifications: [],\n\n dialogs: [],\n\n activeSessions: {\n byHash: {},\n orderedHashes: [],\n },\n\n activeWebSessions: {\n byHash: {},\n orderedHashes: [],\n },\n\n settings: {\n byKey: {\n theme: 'light',\n shouldUseSystemTheme: true,\n messageTextSize: IS_IOS\n ? IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX\n : (IS_MAC_OS ? MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX : DEFAULT_MESSAGE_TEXT_SIZE_PX),\n animationLevel: ANIMATION_LEVEL_DEFAULT,\n messageSendKeyCombo: 'enter',\n canAutoLoadPhotoFromContacts: true,\n canAutoLoadPhotoInPrivateChats: true,\n canAutoLoadPhotoInGroups: true,\n canAutoLoadPhotoInChannels: true,\n canAutoLoadVideoFromContacts: true,\n canAutoLoadVideoInPrivateChats: true,\n canAutoLoadVideoInGroups: true,\n canAutoLoadVideoInChannels: true,\n canAutoLoadFileFromContacts: false,\n canAutoLoadFileInPrivateChats: false,\n canAutoLoadFileInGroups: false,\n canAutoLoadFileInChannels: false,\n autoLoadFileMaxSizeMb: 10,\n hasWebNotifications: true,\n hasPushNotifications: true,\n notificationSoundVolume: 5,\n canAutoPlayGifs: true,\n canAutoPlayVideos: true,\n shouldSuggestStickers: true,\n shouldLoopStickers: true,\n language: 'en',\n timeFormat: '24h',\n wasTimeFormatSetManually: false,\n isConnectionStatusMinimized: true,\n shouldArchiveAndMuteNewNonContact: false,\n },\n themes: {\n light: {\n isBlurred: true,\n patternColor: DEFAULT_PATTERN_COLOR,\n },\n dark: {\n isBlurred: true,\n patternColor: DARK_THEME_PATTERN_COLOR,\n },\n },\n privacy: {},\n notifyExceptions: {},\n },\n\n twoFaSettings: {},\n passcode: {},\n activeReactions: {},\n\n shouldShowContextMenuHint: true,\n\n activeDownloads: {\n byChatId: {},\n },\n\n serviceNotifications: [],\n\n statistics: {\n byChatId: {},\n },\n\n pollModal: {\n isOpen: false,\n },\n\n trustedBotIds: [],\n\n attachMenu: {\n bots: {},\n },\n\n transcriptions: {},\n};\n","import type { GlobalState } from '../types';\nimport type { ApiChat, ApiChatMember, ApiPhoto } from '../../api/types';\n\nimport { ARCHIVED_FOLDER_ID } from '../../config';\nimport { areSortedArraysEqual, omit } from '../../util/iteratees';\nimport { selectChatListType } from '../selectors';\n\nexport function replaceChatListIds(\n global: GlobalState,\n type: 'active' | 'archived',\n newIds: string[] | 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: string[]): GlobalState {\n const { [type]: listIds } = global.chats.listIds;\n const newIds = 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<string, ApiChat>): GlobalState {\n return {\n ...global,\n chats: {\n ...global.chats,\n byId: newById,\n },\n };\n}\n\nexport function updateChat(\n global: GlobalState, chatId: string, chatUpdate: Partial<ApiChat>, photo?: ApiPhoto,\n noOmitUnreadReactionCount = false,\n): GlobalState {\n const { byId } = global.chats;\n\n const updatedChat = getUpdatedChat(global, chatId, chatUpdate, photo, noOmitUnreadReactionCount);\n if (!updatedChat) {\n return global;\n }\n\n return replaceChats(global, {\n ...byId,\n [chatId]: updatedChat,\n });\n}\n\nexport function updateChats(global: GlobalState, newById: Record<string, ApiChat>): GlobalState {\n const updatedById = Object.keys(newById).reduce((acc: Record<string, ApiChat>, id) => {\n const updatedChat = getUpdatedChat(global, id, newById[id]);\n if (updatedChat) {\n acc[id] = updatedChat;\n }\n\n return acc;\n }, {});\n\n global = replaceChats(global, {\n ...global.chats.byId,\n ...updatedById,\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, newById: Record<string, ApiChat>): GlobalState {\n const { byId } = global.chats;\n let isUpdated = false;\n\n const addedById = Object.keys(newById).reduce<Record<string, ApiChat>>((acc, id) => {\n if (!byId[id] || (byId[id].isMin && !newById[id].isMin)) {\n const updatedChat = getUpdatedChat(global, id, newById[id]);\n if (updatedChat) {\n acc[id] = updatedChat;\n if (!isUpdated) {\n isUpdated = true;\n }\n }\n }\n return acc;\n }, {});\n\n if (!isUpdated) {\n return global;\n }\n\n global = replaceChats(global, {\n ...byId,\n ...addedById,\n });\n\n return global;\n}\n\n// @optimization Don't spread/unspread global for each element, do it in a batch\nfunction getUpdatedChat(\n global: GlobalState, chatId: string, chatUpdate: Partial<ApiChat>, photo?: ApiPhoto,\n noOmitUnreadReactionCount = false,\n) {\n const { byId } = global.chats;\n const chat = byId[chatId];\n const shouldOmitMinInfo = chatUpdate.isMin && chat && !chat.isMin;\n\n chatUpdate = noOmitUnreadReactionCount\n ? chatUpdate : omit(chatUpdate, ['unreadReactionsCount']);\n const updatedChat: ApiChat = {\n ...chat,\n ...(shouldOmitMinInfo\n ? omit(chatUpdate, ['isMin', 'accessHash'])\n : chatUpdate),\n ...(photo && { photos: [photo, ...(chat.photos || [])] }),\n };\n\n if (!updatedChat.id || !updatedChat.type) {\n return undefined;\n }\n\n return updatedChat;\n}\n\nexport function updateChatListType(\n global: GlobalState,\n chatId: string,\n folderId?: number,\n): GlobalState {\n const listType = folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active';\n\n let currentListIds = global.chats.listIds;\n (Object.keys(currentListIds) as Array<keyof typeof currentListIds>).forEach((listTypeKey) => {\n const currentFolderList = currentListIds[listTypeKey] || [];\n if (listTypeKey === listType && !currentFolderList.includes(chatId)) {\n currentListIds = {\n ...currentListIds,\n [listTypeKey]: [...currentFolderList, chatId],\n };\n } else if (listTypeKey !== listType && currentFolderList.includes(chatId)) {\n currentListIds = {\n ...currentListIds,\n [listTypeKey]: currentFolderList.filter((id) => id !== chatId),\n };\n }\n });\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n listIds: currentListIds,\n },\n };\n\n global = updateChat(global, chatId, { folderId: folderId || undefined });\n\n return global;\n}\n\nexport function updateChatListSecondaryInfo(\n global: GlobalState,\n type: 'active' | 'archived',\n info: {\n orderedPinnedIds?: string[];\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\nexport function leaveChat(global: GlobalState, leftChatId: string): GlobalState {\n const listType = selectChatListType(global, leftChatId);\n if (!listType) {\n return global;\n }\n\n const { [listType]: listIds } = global.chats.listIds;\n\n if (listIds) {\n global = replaceChatListIds(global, listType, listIds.filter((listId) => listId !== leftChatId));\n }\n\n global = updateChat(global, leftChatId, { isNotJoined: true });\n\n return global;\n}\n\nexport function addChatMembers(global: GlobalState, chat: ApiChat, membersToAdd: ApiChatMember[]): GlobalState {\n const currentMembers = chat.fullInfo?.members;\n const newMemberIds = new Set(membersToAdd.map((m) => m.userId));\n const updatedMembers = [\n ...currentMembers?.filter((m) => !newMemberIds.has(m.userId)) || [],\n ...membersToAdd,\n ];\n const currentIds = currentMembers?.map(({ userId }) => userId) || [];\n const updatedIds = updatedMembers.map(({ userId }) => userId);\n\n if (areSortedArraysEqual(currentIds, updatedIds)) {\n return global;\n }\n\n return updateChat(global, chat.id, {\n fullInfo: {\n ...chat.fullInfo,\n members: updatedMembers,\n },\n });\n}\n","import type { GlobalState } from '../types';\nimport type { 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: string,\n sets: ApiStickerSet[],\n resultIds?: string[],\n): GlobalState {\n const updatedSets = sets.map((stickerSet) => {\n const existing = global.stickers.setsById[stickerSet.id];\n if (!existing) {\n return stickerSet;\n }\n\n return {\n ...existing,\n ...stickerSet,\n };\n });\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n setsById: {\n ...global.stickers.setsById,\n ...buildCollectionByKey(updatedSets, 'id'),\n },\n [category]: {\n ...global.stickers[category],\n hash,\n ...(\n category === 'search'\n ? { resultIds }\n : { setIds: sets.map(({ id }) => id) }\n ),\n },\n },\n };\n}\n\nexport function updateStickerSet(\n global: GlobalState, stickerSetId: string, update: Partial<ApiStickerSet>,\n): GlobalState {\n const currentStickerSet = global.stickers.setsById[stickerSetId] || {};\n const addedSets = global.stickers.added.setIds || [];\n let setIds: string[] = addedSets;\n if (update.installedDate && addedSets && !addedSets.includes(stickerSetId)) {\n setIds = [stickerSetId, ...setIds];\n }\n\n if (!update.installedDate && addedSets?.includes(stickerSetId)) {\n setIds = setIds.filter((id) => id !== stickerSetId);\n }\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n added: {\n ...global.stickers.added,\n setIds,\n },\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?: string,\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 type { GlobalState } from '../types';\nimport type { ApiUser, ApiUserStatus } from '../../api/types';\n\nimport { omit, pick } from '../../util/iteratees';\nimport { MEMO_EMPTY_ARRAY } from '../../util/memo';\nimport { updateChat } from './chats';\n\nexport function replaceUsers(global: GlobalState, newById: Record<string, ApiUser>): GlobalState {\n return {\n ...global,\n users: {\n ...global.users,\n byId: newById,\n },\n };\n}\n\nfunction updateContactList(global: GlobalState, updatedUsers: ApiUser[]): GlobalState {\n const { userIds: contactUserIds } = global.contactList || {};\n\n if (!contactUserIds) return global;\n\n const newContactUserIds = updatedUsers\n .filter((user) => user?.isContact && !contactUserIds.includes(user.id))\n .map((user) => user.id);\n\n if (newContactUserIds.length === 0) return global;\n\n return {\n ...global,\n contactList: {\n userIds: [\n ...newContactUserIds,\n ...contactUserIds,\n ],\n },\n };\n}\n\nexport function updateUser(global: GlobalState, userId: string, userUpdate: Partial<ApiUser>): GlobalState {\n const { byId } = global.users;\n\n const updatedUser = getUpdatedUser(global, userId, userUpdate);\n if (!updatedUser) {\n return global;\n }\n\n global = updateContactList(global, [updatedUser]);\n\n return replaceUsers(global, {\n ...byId,\n [userId]: updatedUser,\n });\n}\n\nexport function updateUsers(global: GlobalState, newById: Record<string, ApiUser>): GlobalState {\n const updatedById = Object.keys(newById).reduce((acc: Record<string, ApiUser>, id) => {\n const updatedUser = getUpdatedUser(global, id, newById[id]);\n if (updatedUser) {\n acc[id] = updatedUser;\n }\n\n return acc;\n }, {});\n\n global = replaceUsers(global, {\n ...global.users.byId,\n ...updatedById,\n });\n\n global = updateContactList(global, Object.values(updatedById));\n\n return global;\n}\n\n// @optimization Allows to avoid redundant updates which cause a lot of renders\nexport function addUsers(global: GlobalState, newById: Record<string, ApiUser>): GlobalState {\n const { byId } = global.users;\n let isUpdated = false;\n\n const addedById = Object.keys(newById).reduce<Record<string, ApiUser>>((acc, id) => {\n if (!byId[id] || (byId[id].isMin && !newById[id].isMin)) {\n const updatedUser = getUpdatedUser(global, id, newById[id]);\n if (updatedUser) {\n acc[id] = updatedUser;\n if (!isUpdated) {\n isUpdated = true;\n }\n }\n }\n return acc;\n }, {});\n\n if (!isUpdated) {\n return global;\n }\n\n global = replaceUsers(global, {\n ...byId,\n ...addedById,\n });\n\n global = updateContactList(global, Object.values(addedById));\n\n return global;\n}\n\n// @optimization Don't spread/unspread global for each element, do it in a batch\nfunction getUpdatedUser(global: GlobalState, userId: string, userUpdate: Partial<ApiUser>) {\n const { byId } = global.users;\n const user = byId[userId];\n const shouldOmitMinInfo = userUpdate.isMin && user && !user.isMin;\n\n const updatedUser = {\n ...user,\n ...(shouldOmitMinInfo ? omit(userUpdate, ['isMin', 'accessHash']) : userUpdate),\n };\n\n if (!updatedUser.id || !updatedUser.type) {\n return undefined;\n }\n\n return updatedUser;\n}\n\nexport function deleteContact(global: GlobalState, userId: string): GlobalState {\n const { byId } = global.users;\n const { userIds } = global.contactList || {};\n\n global = {\n ...global,\n contactList: {\n userIds: userIds ? userIds.filter((id) => id !== userId) : MEMO_EMPTY_ARRAY,\n },\n };\n\n global = replaceUsers(global, {\n ...byId,\n [userId]: {\n ...byId[userId],\n isContact: undefined,\n },\n });\n\n return updateChat(global, userId, {\n settings: undefined,\n });\n}\n\nexport function updateUserSearch(\n global: GlobalState,\n searchStatePartial: Partial<GlobalState['userSearch']>,\n) {\n return {\n ...global,\n userSearch: {\n ...global.userSearch,\n ...searchStatePartial,\n },\n };\n}\n\nexport function updateUserSearchFetchingStatus(\n global: GlobalState, newState: boolean,\n) {\n return updateUserSearch(global, {\n fetchingStatus: newState,\n });\n}\n\nexport function updateUserBlockedState(global: GlobalState, userId: string, isBlocked: boolean) {\n const { byId } = global.users;\n const user = byId[userId];\n if (!user || !user.fullInfo) {\n return global;\n }\n\n return updateUser(global, userId, {\n ...user,\n fullInfo: {\n ...user.fullInfo,\n isBlocked,\n },\n });\n}\n\nexport function replaceUserStatuses(global: GlobalState, newById: Record<string, ApiUserStatus>): GlobalState {\n return {\n ...global,\n users: {\n ...global.users,\n statusesById: newById,\n },\n };\n}\n\n// @optimization Allows to avoid redundant updates which cause a lot of renders\nexport function addUserStatuses(global: GlobalState, newById: Record<string, ApiUserStatus>): GlobalState {\n const { statusesById } = global.users;\n\n const newKeys = Object.keys(newById).filter((id) => !statusesById[id]);\n if (!newKeys.length) {\n return global;\n }\n\n global = replaceUserStatuses(global, {\n ...statusesById,\n ...pick(newById, newKeys),\n });\n\n return global;\n}\n\nexport function closeNewContactDialog(global: GlobalState): GlobalState {\n return {\n ...global,\n newContact: undefined,\n };\n}\n","import type { GlobalState } from '../types';\nimport type { GlobalSearchContent } from '../../types';\nimport type { ApiGlobalMessageSearchType, ApiMessage } from '../../api/types';\nimport { areSortedArraysEqual } from '../../util/iteratees';\n\nconst getComplexKey = (message: ApiMessage) => `${message.chatId}_${message.id}`;\n\nexport function updateGlobalSearch(\n global: GlobalState,\n searchStatePartial: Partial<GlobalState['globalSearch']>,\n) {\n return {\n ...global,\n globalSearch: {\n ...global.globalSearch,\n ...searchStatePartial,\n },\n };\n}\n\nexport function updateGlobalSearchContent(\n global: GlobalState,\n currentContent: GlobalSearchContent | undefined,\n): GlobalState {\n return updateGlobalSearch(global, { currentContent });\n}\n\nexport function updateGlobalSearchResults(\n global: GlobalState,\n newFoundMessages: ApiMessage[],\n totalCount: number,\n type: ApiGlobalMessageSearchType,\n nextRate?: number,\n): GlobalState {\n const { resultsByType } = global.globalSearch || {};\n const newFoundMessagesById = newFoundMessages.reduce((result, message) => {\n result[getComplexKey(message)] = message;\n\n return result;\n }, {} as Record<string, ApiMessage>);\n const foundIdsForType = resultsByType?.[type]?.foundIds;\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 type { GlobalState } from '../types';\nimport type { ApiMessageSearchType } from '../../api/types';\n\nimport { areSortedArraysEqual, unique } from '../../util/iteratees';\nimport type { SharedMediaType } from '../../types';\nimport { buildChatThreadKey } from '../helpers';\n\ninterface TextSearchParams {\n isActive: boolean;\n query?: string;\n results?: {\n totalCount?: number;\n nextOffsetId?: number;\n foundIds?: number[];\n };\n}\n\ninterface MediaSearchParams {\n currentType?: SharedMediaType;\n resultsByType?: Partial<Record<SharedMediaType, {\n totalCount?: number;\n nextOffsetId: number;\n foundIds: number[];\n }>>;\n}\n\nfunction replaceLocalTextSearch(\n global: GlobalState,\n chatThreadKey: string,\n searchParams: TextSearchParams,\n): GlobalState {\n return {\n ...global,\n localTextSearch: {\n byChatThreadKey: {\n ...global.localTextSearch.byChatThreadKey,\n [chatThreadKey]: searchParams,\n },\n },\n };\n}\n\nexport function updateLocalTextSearch(\n global: GlobalState,\n chatId: string,\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: string,\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: string,\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?.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: string,\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: string,\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: string,\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: string,\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?.[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) => b - a);\n}\n","import type { GlobalState } from '../types';\nimport type { ManagementProgress, ManagementState } from '../../types';\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: string, update: Partial<ManagementState>): GlobalState {\n return {\n ...global,\n management: {\n ...global.management,\n byChatId: {\n ...global.management.byChatId,\n [chatId]: {\n ...(global.management.byChatId[chatId] || {}),\n ...update,\n },\n },\n },\n };\n}\n","import type { GlobalState } from '../types';\nimport type {\n ISettings, IThemeSettings, ThemeKey, NotifyException,\n} from '../../types';\nimport type { ApiNotifyException } from '../../api/types';\nimport { updateUserBlockedState } from './users';\n\nexport function replaceSettings(global: GlobalState, newSettings?: Partial<ISettings>): GlobalState {\n return {\n ...global,\n settings: {\n ...global.settings,\n byKey: {\n ...global.settings.byKey,\n ...newSettings,\n },\n },\n };\n}\n\nexport function replaceThemeSettings(\n global: GlobalState, theme: ThemeKey, newSettings?: Partial<IThemeSettings>,\n): GlobalState {\n return {\n ...global,\n settings: {\n ...global.settings,\n themes: {\n ...global.settings.themes,\n [theme]: {\n ...(global.settings.themes[theme] || {}),\n ...newSettings,\n },\n },\n },\n };\n}\n\nexport function addNotifyExceptions(\n global: GlobalState, notifyExceptions: ApiNotifyException[],\n): GlobalState {\n notifyExceptions.forEach((notifyException) => {\n const { chatId, ...exceptionData } = notifyException;\n global = addNotifyException(global, chatId, exceptionData);\n });\n\n return global;\n}\n\nexport function addNotifyException(\n global: GlobalState, id: string, notifyException: NotifyException,\n): GlobalState {\n return {\n ...global,\n settings: {\n ...global.settings,\n notifyExceptions: {\n ...global.settings.notifyExceptions,\n [id]: notifyException,\n },\n },\n };\n}\n\n// eslint-disable-next-line consistent-return\nexport function updateNotifySettings(\n global: GlobalState, peerType: 'contact' | 'group' | 'broadcast', isSilent?: boolean, shouldShowPreviews?: boolean,\n) {\n switch (peerType) {\n case 'contact':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasPrivateChatsNotifications: !isSilent }),\n ...(typeof shouldShowPreviews !== 'undefined' && { hasPrivateChatsMessagePreview: shouldShowPreviews }),\n });\n case 'group':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasGroupNotifications: !isSilent }),\n ...(typeof shouldShowPreviews !== 'undefined' && { hasGroupMessagePreview: shouldShowPreviews }),\n });\n case 'broadcast':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasBroadcastNotifications: !isSilent }),\n ...(typeof shouldShowPreviews !== 'undefined' && { hasBroadcastMessagePreview: shouldShowPreviews }),\n });\n }\n}\n\nexport function addBlockedContact(global: GlobalState, contactId: string): GlobalState {\n global = updateUserBlockedState(global, contactId, true);\n\n return {\n ...global,\n blocked: {\n ...global.blocked,\n ids: [contactId, ...global.blocked.ids],\n totalCount: global.blocked.totalCount + 1,\n },\n };\n}\n\nexport function removeBlockedContact(global: GlobalState, contactId: string): GlobalState {\n global = updateUserBlockedState(global, contactId, false);\n\n return {\n ...global,\n blocked: {\n ...global.blocked,\n ids: global.blocked.ids.filter((id) => id !== contactId),\n totalCount: global.blocked.totalCount - 1,\n },\n };\n}\n","import type { GlobalState } from '../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 type { GlobalState } from '../types';\nimport { INITIAL_STATE } from '../initialState';\n\nexport function updatePasscodeSettings(\n global: GlobalState,\n update: GlobalState['passcode'],\n): GlobalState {\n return {\n ...global,\n passcode: {\n ...global.passcode,\n ...update,\n },\n };\n}\n\nexport function clearPasscodeSettings(global: GlobalState): GlobalState {\n return {\n ...global,\n passcode: {},\n };\n}\n\nexport function clearGlobalForLockScreen(global: GlobalState): GlobalState {\n const {\n theme,\n shouldUseSystemTheme,\n animationLevel,\n language,\n } = global.settings.byKey;\n\n return {\n ...INITIAL_STATE,\n passcode: global.passcode,\n settings: {\n ...INITIAL_STATE.settings,\n byKey: {\n ...INITIAL_STATE.settings.byKey,\n theme,\n shouldUseSystemTheme,\n animationLevel,\n language,\n },\n },\n };\n}\n","import type { GlobalState } from '../types';\nimport type { ShippingOption, PaymentStep } from '../../types';\nimport type {\n ApiInvoice, ApiMessage, ApiPaymentForm, ApiReceipt,\n} 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 requestId: 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 setInvoiceInfo(global: GlobalState, invoice: ApiInvoice): GlobalState {\n const {\n title,\n text,\n amount,\n currency,\n isTest,\n photo,\n isRecurring,\n recurringTermsUrl,\n } = invoice;\n\n return {\n ...global,\n payment: {\n ...global.payment,\n invoiceContent: {\n title,\n text,\n photo,\n amount,\n currency,\n isTest,\n isRecurring,\n recurringTermsUrl,\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 setSmartGlocalCardInfo(\n global: GlobalState,\n cardInfo: { type: string; token: string },\n): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n smartGlocalCredentials: {\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 setConfirmPaymentUrl(global: GlobalState, url?: string): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n confirmPaymentUrl: url,\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 {\n photo, text, title,\n } = (messageInvoice || {});\n\n return {\n ...global,\n payment: {\n ...global.payment,\n receipt: {\n ...receipt,\n photo,\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 type { GlobalState } from '../types';\nimport type {\n ApiChannelStatistics, ApiGroupStatistics, ApiMessageStatistics, StatisticsGraph,\n} from '../../api/types';\n\nexport function updateStatistics(\n global: GlobalState, chatId: string, statistics: ApiChannelStatistics | ApiGroupStatistics,\n): GlobalState {\n return {\n ...global,\n statistics: {\n byChatId: {\n ...global.statistics.byChatId,\n [chatId]: statistics,\n },\n },\n };\n}\n\nexport function updateMessageStatistics(\n global: GlobalState, statistics: ApiMessageStatistics,\n): GlobalState {\n return {\n ...global,\n statistics: {\n ...global.statistics,\n currentMessage: statistics,\n },\n };\n}\n\nexport function updateStatisticsGraph(\n global: GlobalState, chatId: string, name: string, update: StatisticsGraph,\n): GlobalState {\n return {\n ...global,\n statistics: {\n ...global.statistics,\n byChatId: {\n ...global.statistics.byChatId,\n [chatId]: {\n ...(global.statistics.byChatId[chatId] || {}),\n [name]: update,\n },\n },\n },\n };\n}\n","import type {\n GlobalState, MessageList, MessageListType, Thread,\n} from '../types';\nimport type { ApiMessage, ApiSponsoredMessage, ApiThreadInfo } from '../../api/types';\nimport { MAIN_THREAD_ID } from '../../api/types';\nimport type { FocusDirection } from '../../types';\n\nimport {\n IS_MOCKED_CLIENT,\n IS_TEST, MESSAGE_LIST_SLICE, MESSAGE_LIST_VIEWPORT_LIMIT, TMP_CHAT_ID,\n} from '../../config';\nimport {\n selectListedIds,\n selectChatMessages,\n selectViewportIds,\n selectOutlyingIds,\n selectPinnedIds,\n selectThreadInfo,\n selectMessageIdsByGroupId,\n selectScheduledMessages,\n selectScheduledIds,\n selectCurrentMessageIds,\n selectChatMessage,\n selectCurrentMessageList,\n} from '../selectors';\nimport {\n areSortedArraysEqual, omit, pickTruthy, unique,\n} from '../../util/iteratees';\n\ntype MessageStoreSections = {\n byId: Record<number, ApiMessage>;\n threadsById: Record<number, Thread>;\n};\n\nexport function updateCurrentMessageList(\n global: GlobalState,\n chatId: string | undefined,\n threadId: number = MAIN_THREAD_ID,\n type: MessageListType = 'thread',\n shouldReplaceHistory?: boolean,\n): GlobalState {\n const { messageLists } = global.messages;\n let newMessageLists: MessageList[] = messageLists;\n if (shouldReplaceHistory || (IS_TEST && !IS_MOCKED_CLIENT)) {\n newMessageLists = chatId ? [{ chatId, threadId, type }] : [];\n } else if (chatId) {\n const last = messageLists[messageLists.length - 1];\n if (!last || last.chatId !== chatId || last.threadId !== threadId || last.type !== type) {\n if (last && last.chatId === TMP_CHAT_ID) {\n newMessageLists = [...messageLists.slice(0, -1), { chatId, threadId, type }];\n } else {\n newMessageLists = [...messageLists, { chatId, threadId, type }];\n }\n }\n } else {\n newMessageLists = messageLists.slice(0, -1);\n }\n\n return {\n ...global,\n messages: {\n ...global.messages,\n messageLists: newMessageLists,\n },\n };\n}\n\nfunction replaceChatMessages(global: GlobalState, chatId: string, newById: Record<number, ApiMessage>): GlobalState {\n return updateMessageStore(global, chatId, {\n byId: newById,\n });\n}\n\nexport function updateThread(\n global: GlobalState, chatId: string, threadId: number, threadUpdate: Partial<Thread>,\n): GlobalState {\n const current = global.messages.byChatId[chatId];\n\n return updateMessageStore(global, chatId, {\n threadsById: {\n ...(current?.threadsById),\n [threadId]: {\n ...(current?.threadsById[threadId]),\n ...threadUpdate,\n },\n },\n });\n}\n\nfunction updateMessageStore(\n global: GlobalState, chatId: string, update: Partial<MessageStoreSections>,\n): GlobalState {\n const current = global.messages.byChatId[chatId] || { byId: {}, threadsById: {} };\n\n return {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {\n ...global.messages.byChatId,\n [chatId]: {\n ...current,\n ...update,\n },\n },\n },\n };\n}\n\nexport function replaceThreadParam<T extends keyof Thread>(\n global: GlobalState, chatId: string, 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<string, Record<number, ApiMessage>>);\n\n Object.keys(addedByChatId).forEach((chatId) => {\n global = addChatMessagesById(global, chatId, addedByChatId[chatId]);\n });\n\n return global;\n}\n\nexport function addChatMessagesById(\n global: GlobalState, chatId: string, newById: Record<number, ApiMessage>,\n): GlobalState {\n const byId = selectChatMessages(global, chatId);\n\n if (byId && Object.keys(newById).every((newId) => Boolean(byId[Number(newId)]))) {\n return global;\n }\n\n return replaceChatMessages(global, chatId, {\n ...newById,\n ...byId,\n });\n}\n\nexport function updateChatMessage(\n global: GlobalState, chatId: string, messageId: number, messageUpdate: Partial<ApiMessage>,\n): GlobalState {\n const byId = selectChatMessages(global, chatId) || {};\n const message = byId[messageId];\n const updatedMessage = {\n ...message,\n ...messageUpdate,\n };\n\n if (!updatedMessage.id) {\n return global;\n }\n\n return replaceChatMessages(global, chatId, {\n ...byId,\n [messageId]: updatedMessage,\n });\n}\n\nexport function updateScheduledMessage(\n global: GlobalState, chatId: string, messageId: number, messageUpdate: Partial<ApiMessage>,\n): GlobalState {\n const byId = selectScheduledMessages(global, chatId) || {};\n const message = byId[messageId];\n const updatedMessage = {\n ...message,\n ...messageUpdate,\n };\n\n if (!updatedMessage.id) {\n return global;\n }\n\n return replaceScheduledMessages(global, chatId, {\n ...byId,\n [messageId]: updatedMessage,\n });\n}\n\nexport function deleteChatMessages(\n global: GlobalState,\n chatId: string,\n messageIds: number[],\n): GlobalState {\n const byId = selectChatMessages(global, chatId);\n if (!byId) {\n return global;\n }\n const newById = omit(byId, messageIds);\n const deletedForwardedPosts = Object.values(pickTruthy(byId, messageIds)).filter(\n ({ forwardInfo }) => forwardInfo?.isLinkedChannelPost,\n );\n\n const threadIds = Object.keys(global.messages.byChatId[chatId].threadsById).map(Number);\n threadIds.forEach((threadId) => {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n\n let listedIds = selectListedIds(global, chatId, threadId);\n let outlyingIds = selectOutlyingIds(global, chatId, threadId);\n let viewportIds = selectViewportIds(global, chatId, threadId);\n let pinnedIds = selectPinnedIds(global, chatId);\n let newMessageCount = threadInfo?.messagesCount;\n\n messageIds.forEach((messageId) => {\n if (listedIds && listedIds.includes(messageId)) {\n listedIds = listedIds.filter((id) => id !== messageId);\n if (newMessageCount !== undefined) newMessageCount -= 1;\n }\n\n if (outlyingIds && outlyingIds.includes(messageId)) {\n outlyingIds = outlyingIds.filter((id) => id !== messageId);\n }\n\n if (viewportIds && viewportIds.includes(messageId)) {\n viewportIds = viewportIds.filter((id) => id !== messageId);\n }\n\n if (pinnedIds && pinnedIds.includes(messageId)) {\n pinnedIds = pinnedIds.filter((id) => id !== messageId);\n }\n });\n\n global = replaceThreadParam(global, chatId, threadId, 'listedIds', listedIds);\n global = replaceThreadParam(global, chatId, threadId, 'outlyingIds', outlyingIds);\n global = replaceThreadParam(global, chatId, threadId, 'viewportIds', viewportIds);\n global = replaceThreadParam(global, chatId, threadId, 'pinnedIds', pinnedIds);\n\n if (threadInfo && newMessageCount !== undefined) {\n global = replaceThreadParam(global, chatId, threadId, 'threadInfo', {\n ...threadInfo,\n messagesCount: newMessageCount,\n });\n }\n });\n\n if (deletedForwardedPosts.length) {\n const currentMessageList = selectCurrentMessageList(global);\n const canDeleteCurrentThread = currentMessageList && currentMessageList.chatId === chatId\n && currentMessageList.type === 'thread';\n const currentThreadId = currentMessageList?.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: string,\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);\n\n return global;\n}\n\nexport function updateListedIds(\n global: GlobalState,\n chatId: string,\n threadId: number,\n idsUpdate: number[],\n): GlobalState {\n const listedIds = selectListedIds(global, chatId, threadId);\n const newIds = 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: string,\n threadId: number,\n idsUpdate: number[],\n): GlobalState {\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n const newIds = 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: string,\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: string,\n threadId: number,\n newViewportIds: number[],\n): GlobalState {\n const currentIds = selectViewportIds(global, chatId, threadId) || [];\n const newIds = orderHistoryIds(newViewportIds);\n\n return replaceThreadParam(\n global,\n chatId,\n threadId,\n 'viewportIds',\n areSortedArraysEqual(currentIds, newIds) ? currentIds : newIds,\n );\n}\n\nexport function updateThreadInfo(\n global: GlobalState, chatId: string, threadId: number, update: Partial<ApiThreadInfo> | undefined,\n): GlobalState {\n const newThreadInfo = {\n ...(selectThreadInfo(global, chatId, threadId) as ApiThreadInfo),\n ...update,\n };\n\n if (!newThreadInfo.threadId) {\n return global;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'threadInfo', newThreadInfo);\n}\n\nexport function updateThreadInfos(\n global: GlobalState, chatId: string, updates: Partial<ApiThreadInfo>[],\n): GlobalState {\n updates.forEach((update) => {\n global = updateThreadInfo(global, update.chatId!, update.threadId!, update);\n });\n\n return global;\n}\n\nexport function replaceScheduledMessages(\n global: GlobalState, chatId: string, newById: Record<number, ApiMessage>,\n): GlobalState {\n return updateScheduledMessages(global, chatId, {\n byId: newById,\n });\n}\n\nfunction updateScheduledMessages(\n global: GlobalState, chatId: string, update: Partial<{ byId: Record<number, ApiMessage> }>,\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?: string, messageId?: number, noHighlight = false, isResizingContainer = false,\n): GlobalState {\n return {\n ...global,\n focusedMessage: {\n ...global.focusedMessage,\n chatId,\n messageId,\n noHighlight,\n isResizingContainer,\n },\n };\n}\n\nexport function updateSponsoredMessage(\n global: GlobalState, chatId: string, message: ApiSponsoredMessage,\n): GlobalState {\n return {\n ...global,\n messages: {\n ...global.messages,\n sponsoredByChatId: {\n ...global.messages.sponsoredByChatId,\n [chatId]: message,\n },\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: string,\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: string,\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\nexport function updateThreadUnreadFromForwardedMessage(\n global: GlobalState,\n originMessage: ApiMessage,\n chatId: string,\n lastMessageId: number,\n isDeleting?: boolean,\n) {\n const { channelPostId, fromChatId } = originMessage.forwardInfo || {};\n if (channelPostId && fromChatId) {\n const threadInfoOld = selectThreadInfo(global, chatId, channelPostId);\n if (threadInfoOld) {\n global = replaceThreadParam(global, chatId, channelPostId, 'threadInfo', {\n ...threadInfoOld,\n lastMessageId,\n messagesCount: threadInfoOld.messagesCount + (isDeleting ? -1 : 1),\n });\n }\n }\n return global;\n}\n","import type { ApiAttachMenuPeerType, ApiChat } from '../../api/types';\nimport { MAIN_THREAD_ID } from '../../api/types';\nimport type { GlobalState } from '../types';\n\nimport {\n getPrivateChatUserId, isChatChannel, isUserId, isHistoryClearMessage, isUserBot, isUserOnline,\n} from '../helpers';\nimport { selectBot, selectUser } from './users';\nimport {\n ALL_FOLDER_ID, ARCHIVED_FOLDER_ID, MEMBERS_LOAD_SLICE, SERVICE_NOTIFICATIONS_USER_ID,\n} from '../../config';\n\nexport function selectChat(global: GlobalState, chatId: string): 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: string) {\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 (isUserId(chat.id) || isChatChannel(chat) || !chat.fullInfo) {\n return undefined;\n }\n\n if (!chat.fullInfo.members || chat.fullInfo.members.length === MEMBERS_LOAD_SLICE) {\n return chat.fullInfo.onlineCount;\n }\n\n return chat.fullInfo.members.reduce((onlineCount, { userId }) => {\n if (\n userId !== global.currentUserId\n && global.users.byId[userId]\n && isUserOnline(global.users.byId[userId], global.users.statusesById[userId])\n ) {\n return onlineCount + 1;\n }\n\n return onlineCount;\n }, 0);\n}\n\nexport function selectChatBot(global: GlobalState, chatId: string) {\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 selectIsTrustedBot(global: GlobalState, botId: string) {\n const bot = selectUser(global, botId);\n return bot && (bot.isVerified || global.trustedBotIds.includes(botId));\n}\n\nexport function selectAttachMenuPeerType(global: GlobalState, chatId: string) : ApiAttachMenuPeerType | undefined {\n const chat = selectChat(global, chatId);\n if (!chat) return undefined;\n\n const bot = selectBot(global, chatId);\n if (bot) {\n return 'bot';\n }\n\n const user = selectChatUser(global, chat);\n if (user) {\n return 'private';\n }\n\n if (isChatChannel(chat)) {\n return 'channel';\n }\n\n return 'chat';\n}\n\nexport function selectIsChatBotNotStarted(global: GlobalState, chatId: string) {\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: string, 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: string): '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: string, folderId = ALL_FOLDER_ID): boolean {\n const { active, archived } = global.chats.orderedPinnedIds;\n\n if (folderId === ALL_FOLDER_ID) {\n return Boolean(active?.includes(chatId));\n }\n\n if (folderId === ARCHIVED_FOLDER_ID) {\n return Boolean(archived?.includes(chatId));\n }\n\n const { byId: chatFoldersById } = global.chatFolders;\n\n const { pinnedChatIds } = chatFoldersById[folderId] || {};\n return Boolean(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 selectIsServiceChatReady(global: GlobalState) {\n return Boolean(selectChat(global, SERVICE_NOTIFICATIONS_USER_ID));\n}\n\nexport function selectSendAs(global: GlobalState, chatId: string) {\n const chat = selectChat(global, chatId);\n if (!chat) return undefined;\n\n const id = chat?.fullInfo?.sendAsId;\n if (!id) return undefined;\n\n return selectUser(global, id) || selectChat(global, id);\n}\n\nexport function selectRequestedText(global: GlobalState, chatId: string) {\n if (global.openChatWithText?.chatId === chatId) {\n return global.openChatWithText.text;\n }\n return undefined;\n}\n","import type { GlobalState } from '../types';\nimport type { 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 selectStickerSetByShortName(global: GlobalState, shortName: string) {\n return Object.values(global.stickers.setsById).find((l) => l.shortName.toLowerCase() === shortName.toLowerCase());\n}\n\nexport function selectStickersForEmoji(global: GlobalState, emoji: string) {\n const stickerSets = Object.values(global.stickers.setsById);\n let stickersForEmoji: ApiSticker[] = [];\n // Favorites\n global.stickers.favorite.stickers.forEach((sticker) => {\n if (sticker.emoji === emoji) stickersForEmoji.push(sticker);\n });\n\n // Added sets\n stickerSets.forEach(({ packs }) => {\n if (!packs) {\n return;\n }\n\n stickersForEmoji = stickersForEmoji.concat(packs[emoji] || [], packs[cleanEmoji(emoji)] || []);\n });\n return stickersForEmoji;\n}\n\nfunction cleanEmoji(emoji: string) {\n // Some emojis (❤️ for example) with a service symbol 'VARIATION SELECTOR-16' are not recognized as animated\n return emoji.replace('\\ufe0f', '');\n}\n\nexport function selectAnimatedEmoji(global: GlobalState, emoji: string) {\n const { animatedEmojis } = global;\n if (!animatedEmojis || !animatedEmojis.stickers) {\n return undefined;\n }\n\n const cleanedEmoji = cleanEmoji(emoji);\n\n return animatedEmojis.stickers.find((sticker) => sticker.emoji === emoji || sticker.emoji === cleanedEmoji);\n}\n\nexport function selectAnimatedEmojiEffect(global: GlobalState, emoji: string) {\n const { animatedEmojiEffects } = global;\n if (!animatedEmojiEffects || !animatedEmojiEffects.stickers) {\n return undefined;\n }\n\n const cleanedEmoji = cleanEmoji(emoji);\n\n return animatedEmojiEffects.stickers.find((sticker) => sticker.emoji === emoji || sticker.emoji === cleanedEmoji);\n}\n\nexport function selectAnimatedEmojiSound(global: GlobalState, emoji: string) {\n return global?.appConfig?.emojiSounds[cleanEmoji(emoji)];\n}\n\nexport function selectLocalAnimatedEmoji(global: GlobalState, emoji: string) {\n const cleanedEmoji = cleanEmoji(emoji);\n\n return cleanedEmoji === '🍑' ? 'Peach' : (cleanedEmoji === '🍆' ? 'Eggplant' : undefined);\n}\n\nexport function selectLocalAnimatedEmojiEffect(emoji: string) {\n return emoji === 'Eggplant' ? 'Cumshot' : undefined;\n}\n\nexport function selectLocalAnimatedEmojiEffectByName(name: string) {\n return name === 'Cumshot' ? '🍆' : undefined;\n}\n","import type { GlobalState, MessageListType, Thread } from '../types';\nimport type {\n ApiChat,\n ApiMessage,\n ApiMessageOutgoingStatus,\n ApiUser,\n} from '../../api/types';\nimport {\n MAIN_THREAD_ID,\n} from '../../api/types';\n\nimport { LOCAL_MESSAGE_MIN_ID, REPLIES_USER_ID, SERVICE_NOTIFICATIONS_USER_ID } from '../../config';\nimport {\n selectChat, selectChatBot, selectIsChatWithBot, selectIsChatWithSelf,\n} from './chats';\nimport { selectIsUserOrChatContact, selectUser, selectUserStatus } from './users';\nimport {\n getSendingState,\n isChatChannel,\n isMessageLocal,\n isUserId,\n isForwardedMessage,\n getCanPostInChat,\n isUserRightBanned,\n getHasAdminRight,\n isChatBasicGroup,\n isCommonBoxChat,\n isServiceNotificationMessage,\n isOwnMessage,\n isActionMessage,\n isChatGroup,\n isChatSuperGroup,\n getMessageVideo,\n getMessageWebPageVideo,\n getMessagePhoto,\n getMessageAudio,\n getMessageVoice,\n getMessageDocument,\n getMessageWebPagePhoto,\n getMessageOriginalId,\n} from '../helpers';\nimport { findLast } from '../../util/iteratees';\nimport { selectIsStickerFavorite } from './symbols';\nimport { getServerTime } from '../../util/serverTime';\nimport { MEMO_EMPTY_ARRAY } from '../../util/memo';\n\nconst MESSAGE_EDIT_ALLOWED_TIME = 172800; // 48 hours\n\nexport function selectCurrentMessageList(global: GlobalState) {\n const { messageLists } = global.messages;\n\n if (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: string) {\n return global.messages.byChatId[chatId]?.byId;\n}\n\nexport function selectScheduledMessages(global: GlobalState, chatId: string) {\n return global.scheduledMessages.byChatId[chatId]?.byId;\n}\n\nexport function selectThreadParam<K extends keyof Thread>(\n global: GlobalState,\n chatId: string,\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: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'listedIds');\n}\n\nexport function selectOutlyingIds(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'outlyingIds');\n}\n\nexport function selectCurrentMessageIds(\n global: GlobalState, chatId: string, 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: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'viewportIds');\n}\n\nexport function selectPinnedIds(global: GlobalState, chatId: string) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'pinnedIds');\n}\n\nexport function selectScheduledIds(global: GlobalState, chatId: string) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds');\n}\n\nexport function selectScrollOffset(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'scrollOffset');\n}\n\nexport function selectReplyingToId(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'replyingToId');\n}\n\nexport function selectEditingId(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'editingId');\n}\n\nexport function selectEditingDraft(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'editingDraft');\n}\n\nexport function selectEditingScheduledId(global: GlobalState, chatId: string) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'editingScheduledId');\n}\n\nexport function selectEditingScheduledDraft(global: GlobalState, chatId: string) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'editingScheduledDraft');\n}\n\nexport function selectDraft(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'draft');\n}\n\nexport function selectNoWebPage(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'noWebPage');\n}\n\nexport function selectThreadInfo(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'threadInfo');\n}\n\nexport function selectFirstMessageId(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'firstMessageId');\n}\n\nexport function selectReplyStack(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'replyStack');\n}\n\nexport function selectThreadOriginChat(global: GlobalState, chatId: string, 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: string, 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: string, message: ApiMessage) {\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return undefined;\n }\n\n const { replyToMessageId, replyToTopMessageId } = message;\n if (!replyToMessageId && !replyToTopMessageId) {\n return undefined;\n }\n\n return Object.values<Thread>(messageInfo.threadsById).find((thread) => {\n return thread.threadInfo && (\n (replyToMessageId && replyToMessageId === thread.threadInfo.topMessageId)\n || (replyToTopMessageId && replyToTopMessageId === thread.threadInfo.topMessageId)\n );\n });\n}\n\nexport function selectIsMessageInCurrentMessageList(global: GlobalState, chatId: string, 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: string, 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_MIN_ID && !selectChatMessage(global, chatId, lastMessageId)) {\n return true;\n }\n\n return viewportIds[viewportIds.length - 1] >= lastMessageId;\n}\n\nexport function selectChatMessage(global: GlobalState, chatId: string, messageId: number) {\n const chatMessages = selectChatMessages(global, chatId);\n\n return chatMessages ? chatMessages[messageId] : undefined;\n}\n\nexport function selectScheduledMessage(global: GlobalState, chatId: string, messageId: number) {\n const chatMessages = selectScheduledMessages(global, chatId);\n\n return chatMessages ? chatMessages[messageId] : undefined;\n}\n\nexport function selectEditingMessage(\n global: GlobalState, chatId: string, 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: string) {\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 isUserId(senderId) ? selectUser(global, senderId) : selectChat(global, senderId);\n}\n\nexport function selectReplySender(global: GlobalState, message: ApiMessage, isForwarded = false) {\n if (isForwarded) {\n const { senderUserId, hiddenUserName } = message.forwardInfo || {};\n if (senderUserId) {\n return isUserId(senderUserId) ? selectUser(global, senderUserId) : selectChat(global, senderUserId);\n }\n if (hiddenUserName) return undefined;\n }\n\n const { senderId } = message;\n if (!senderId) {\n return undefined;\n }\n\n return isUserId(senderId) ? 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) || selectChat(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 = isUserId(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 isLocal = isMessageLocal(message);\n const isServiceNotification = isServiceNotificationMessage(message);\n const isOwn = isOwnMessage(message);\n const isAction = isActionMessage(message);\n const { content } = message;\n\n const canEditMessagesIndefinitely = isChatWithSelf\n || (isSuperGroup && getHasAdminRight(chat, 'pinMessages'))\n || (isChannel && getHasAdminRight(chat, 'editMessages'));\n const isMessageEditable = (\n (\n canEditMessagesIndefinitely\n || getServerTime(global.serverTimeOffset) - message.date < MESSAGE_EDIT_ALLOWED_TIME\n ) && !(\n content.sticker || content.contact || content.poll || content.action || content.audio\n || (content.video?.isRound) || content.location\n )\n && !isForwardedMessage(message)\n && !message.viaBotId\n && !chat.isForbidden\n );\n\n const canReply = !isLocal && !isServiceNotification && !chat.isForbidden && getCanPostInChat(chat, threadId);\n\n const hasPinPermission = isPrivate || (\n chat.isCreator\n || (!isChannel && !isUserRightBanned(chat, 'pinMessages'))\n || getHasAdminRight(chat, 'pinMessages')\n );\n\n let canPin = !isLocal && !isServiceNotification && !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 = !isLocal && !isServiceNotification && (\n isPrivate\n || isOwn\n || isBasicGroup\n || chat.isCreator\n || getHasAdminRight(chat, 'deleteMessages')\n );\n\n const canReport = !isPrivate && !isOwn;\n\n const canDeleteForAll = canDelete && !chat.isForbidden && (\n (isPrivate && !isChatWithSelf)\n || (isBasicGroup && (\n isOwn || getHasAdminRight(chat, 'deleteMessages') || chat.isCreator\n ))\n );\n\n const canEdit = !isLocal && !isAction && isMessageEditable && (\n isOwn\n || (isChannel && (chat.isCreator || getHasAdminRight(chat, 'editMessages')))\n );\n\n const canForward = !isLocal && !isAction;\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\n const canDownload = Boolean(content.webPage?.document || content.webPage?.video || content.webPage?.photo\n || content.audio || content.voice || content.photo || content.video || content.document || content.sticker);\n\n const canSaveGif = message.content.video?.isGif;\n\n const poll = content.poll;\n const canRevote = !poll?.summary.closed && !poll?.summary.quiz && poll?.results.results?.some((r) => r.isChosen);\n const canClosePoll = isOwn && poll && !poll.summary.closed;\n\n const noOptions = [\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canReport,\n canDelete,\n canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n canDownload,\n canSaveGif,\n canRevote,\n canClosePoll,\n ].every((ability) => !ability);\n\n return {\n noOptions,\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canReport,\n canDelete,\n canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n canDownload,\n canSaveGif,\n canRevote,\n canClosePoll,\n };\n}\n\n// This selector always returns a new object which can not be safely used in shallow-equal checks\nexport function selectCanDeleteSelectedMessages(global: GlobalState) {\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const chatMessages = chatId && selectChatMessages(global, chatId);\n if (!chatMessages || !selectedMessageIds || !threadId) {\n return {};\n }\n\n const messageActions = selectedMessageIds\n .map((id) => chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId))\n .filter(Boolean);\n\n return {\n canDelete: messageActions.every((actions) => actions.canDelete),\n canDeleteForAll: messageActions.every((actions) => actions.canDeleteForAll),\n };\n}\n\nexport function selectCanReportSelectedMessages(global: GlobalState) {\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const chatMessages = chatId && selectChatMessages(global, chatId);\n if (!chatMessages || !selectedMessageIds || !threadId) {\n return false;\n }\n\n const messageActions = selectedMessageIds\n .map((id) => chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId))\n .filter(Boolean);\n\n return messageActions.every((actions) => actions.canReport);\n}\n\nexport function selectCanDownloadSelectedMessages(global: GlobalState) {\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const chatMessages = chatId && selectChatMessages(global, chatId);\n if (!chatMessages || !selectedMessageIds || !threadId) {\n return false;\n }\n\n const messageActions = selectedMessageIds\n .map((id) => chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId))\n .filter(Boolean);\n\n return messageActions.some((actions) => actions.canDownload);\n}\n\nexport function selectIsDownloading(global: GlobalState, message: ApiMessage) {\n const activeInChat = global.activeDownloads.byChatId[message.chatId];\n return activeInChat ? activeInChat.includes(message.id) : false;\n}\n\nexport function selectActiveDownloadIds(global: GlobalState, chatId: string) {\n return global.activeDownloads.byChatId[chatId] || MEMO_EMPTY_ARRAY;\n}\n\nexport function selectUploadProgress(global: GlobalState, message: ApiMessage) {\n return global.fileUploads.byMessageLocalId[getMessageOriginalId(message)]?.progress;\n}\n\nexport function selectRealLastReadId(global: GlobalState, chatId: string, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n // `lastReadInboxMessageId` is empty for new chats\n if (!chat.lastReadInboxMessageId) {\n return undefined;\n }\n\n if (!chat.lastMessage) {\n return chat.lastReadInboxMessageId;\n }\n\n if (isMessageLocal(chat.lastMessage)) {\n return chat.lastMessage.id;\n }\n\n // Some previously read messages may be deleted\n return Math.min(chat.lastMessage.id, chat.lastReadInboxMessageId);\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n if (!threadInfo.lastReadInboxMessageId) {\n return threadInfo.topMessageId;\n }\n\n // Some previously read messages may be deleted\n return Math.min(threadInfo.lastReadInboxMessageId, threadInfo.lastMessageId || Infinity);\n }\n}\n\nexport function selectFirstUnreadId(global: GlobalState, chatId: string, threadId: number) {\n const chat = selectChat(global, chatId);\n\n if (threadId === MAIN_THREAD_ID) {\n if (!chat) {\n return undefined;\n }\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo\n || (threadInfo.lastMessageId !== undefined && threadInfo.lastMessageId === threadInfo.lastReadInboxMessageId)) {\n return undefined;\n }\n }\n\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n const listedIds = selectListedIds(global, chatId, threadId);\n const byId = selectChatMessages(global, chatId);\n if (!byId || !(outlyingIds || listedIds)) {\n return undefined;\n }\n\n const lastReadId = selectRealLastReadId(global, chatId, threadId);\n if (!lastReadId && chat && chat.isNotJoined) {\n return undefined;\n }\n\n const lastReadServiceNotificationId = chatId === SERVICE_NOTIFICATIONS_USER_ID\n ? global.serviceNotifications.reduce((max, notification) => {\n return !notification.isUnread && notification.id > max ? notification.id : max;\n }, -1)\n : -1;\n\n function findAfterLastReadId(listIds: number[]) {\n return listIds.find((id) => {\n return (\n (!lastReadId || id > lastReadId)\n && byId[id]\n && (!byId[id].isOutgoing || byId[id].isFromScheduled)\n && id > lastReadServiceNotificationId\n );\n });\n }\n\n if (outlyingIds) {\n const found = findAfterLastReadId(outlyingIds);\n if (found) {\n return found;\n }\n }\n\n if (listedIds) {\n const found = findAfterLastReadId(listedIds);\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, switchBotInline } = global;\n return Boolean(switchBotInline || 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 Object.keys(byChatId).find((chatId) => {\n const chat = selectChat(global, 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: string, 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: string, 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: string, 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: string,\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 selectCanAutoLoadMedia(global: GlobalState, message: ApiMessage) {\n const chat = selectChat(global, message.chatId);\n if (!chat) {\n return undefined;\n }\n\n const sender = selectSender(global, message);\n\n const isPhoto = Boolean(getMessagePhoto(message) || getMessageWebPagePhoto(message));\n const isVideo = Boolean(getMessageVideo(message) || getMessageWebPageVideo(message));\n const isFile = Boolean(getMessageAudio(message) || getMessageVoice(message) || getMessageDocument(message));\n\n const {\n canAutoLoadPhotoFromContacts,\n canAutoLoadPhotoInPrivateChats,\n canAutoLoadPhotoInGroups,\n canAutoLoadPhotoInChannels,\n canAutoLoadVideoFromContacts,\n canAutoLoadVideoInPrivateChats,\n canAutoLoadVideoInGroups,\n canAutoLoadVideoInChannels,\n canAutoLoadFileFromContacts,\n canAutoLoadFileInPrivateChats,\n canAutoLoadFileInGroups,\n canAutoLoadFileInChannels,\n } = global.settings.byKey;\n\n if (isPhoto) {\n return canAutoLoadMedia({\n global,\n chat,\n sender,\n canAutoLoadMediaFromContacts: canAutoLoadPhotoFromContacts,\n canAutoLoadMediaInPrivateChats: canAutoLoadPhotoInPrivateChats,\n canAutoLoadMediaInGroups: canAutoLoadPhotoInGroups,\n canAutoLoadMediaInChannels: canAutoLoadPhotoInChannels,\n });\n }\n\n if (isVideo) {\n return canAutoLoadMedia({\n global,\n chat,\n sender,\n canAutoLoadMediaFromContacts: canAutoLoadVideoFromContacts,\n canAutoLoadMediaInPrivateChats: canAutoLoadVideoInPrivateChats,\n canAutoLoadMediaInGroups: canAutoLoadVideoInGroups,\n canAutoLoadMediaInChannels: canAutoLoadVideoInChannels,\n });\n }\n\n if (isFile) {\n return canAutoLoadMedia({\n global,\n chat,\n sender,\n canAutoLoadMediaFromContacts: canAutoLoadFileFromContacts,\n canAutoLoadMediaInPrivateChats: canAutoLoadFileInPrivateChats,\n canAutoLoadMediaInGroups: canAutoLoadFileInGroups,\n canAutoLoadMediaInChannels: canAutoLoadFileInChannels,\n });\n }\n\n return true;\n}\n\nfunction canAutoLoadMedia({\n global,\n chat,\n sender,\n canAutoLoadMediaFromContacts,\n canAutoLoadMediaInPrivateChats,\n canAutoLoadMediaInGroups,\n canAutoLoadMediaInChannels,\n}: {\n global: GlobalState;\n chat: ApiChat;\n canAutoLoadMediaFromContacts: boolean;\n canAutoLoadMediaInPrivateChats: boolean;\n canAutoLoadMediaInGroups: boolean;\n canAutoLoadMediaInChannels: boolean;\n sender?: ApiChat | ApiUser;\n}) {\n const isMediaFromContact = Boolean(sender && (\n sender.id === global.currentUserId || selectIsUserOrChatContact(global, sender)\n ));\n\n return Boolean(\n (isMediaFromContact && canAutoLoadMediaFromContacts)\n || (!isMediaFromContact && canAutoLoadMediaInPrivateChats && isUserId(chat.id))\n || (canAutoLoadMediaInGroups && isChatGroup(chat))\n || (canAutoLoadMediaInChannels && isChatChannel(chat)),\n );\n}\n\nexport function selectCanAutoPlayMedia(global: GlobalState, message: ApiMessage) {\n const video = getMessageVideo(message) || getMessageWebPageVideo(message);\n if (!video) {\n return undefined;\n }\n\n const {\n canAutoPlayVideos,\n canAutoPlayGifs,\n } = global.settings.byKey;\n\n const asGif = video.isGif || video.isRound;\n\n return (canAutoPlayVideos && !asGif) || (canAutoPlayGifs && asGif);\n}\n\nexport function selectShouldLoopStickers(global: GlobalState) {\n return global.settings.byKey.shouldLoopStickers;\n}\n\nexport function selectLastServiceNotification(global: GlobalState) {\n const { serviceNotifications } = global;\n const maxId = Math.max(...serviceNotifications.map(({ id }) => id));\n\n return serviceNotifications.find(({ id, isHidden }) => !isHidden && id === maxId);\n}\n\nexport function selectIsMessageProtected(global: GlobalState, message?: ApiMessage) {\n return message ? message.isProtected || selectChat(global, message.chatId)?.isProtected : false;\n}\n\nexport function selectHasProtectedMessage(global: GlobalState, chatId: string, messageIds?: number[]) {\n if (selectChat(global, chatId)?.isProtected) {\n return true;\n }\n\n if (!messageIds) {\n return false;\n }\n\n const messages = selectChatMessages(global, chatId);\n\n return messageIds.some((messageId) => messages[messageId]?.isProtected);\n}\n\nexport function selectSponsoredMessage(global: GlobalState, chatId: string) {\n const chat = selectChat(global, chatId);\n const message = chat && isChatChannel(chat) ? global.messages.sponsoredByChatId[chatId] : undefined;\n\n return message && message.expiresAt >= Math.round(Date.now() / 1000) ? message : undefined;\n}\n\nexport function selectDefaultReaction(global: GlobalState, chatId: string) {\n if (chatId === SERVICE_NOTIFICATIONS_USER_ID) return undefined;\n\n const isPrivate = isUserId(chatId);\n const defaultReaction = global.appConfig?.defaultReaction;\n const { availableReactions } = global;\n if (!defaultReaction || !availableReactions?.some(\n (l) => l.reaction === defaultReaction && !l.isInactive,\n )) {\n return undefined;\n }\n\n if (isPrivate) {\n return defaultReaction;\n }\n\n const enabledReactions = selectChat(global, chatId)?.fullInfo?.enabledReactions;\n if (!enabledReactions?.includes(defaultReaction)) {\n return undefined;\n }\n\n return defaultReaction;\n}\n\n// Slow, not to be used in `withGlobal`\nexport function selectVisibleUsers(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const messageIds = selectThreadParam(global, chatId, threadId, 'viewportIds');\n if (!messageIds) {\n return undefined;\n }\n\n return messageIds.map((messageId) => {\n const { senderId } = selectChatMessage(global, chatId, messageId) || {};\n return senderId ? selectUser(global, senderId) : undefined;\n }).filter(Boolean);\n}\n\nexport function selectShouldSchedule(global: GlobalState) {\n return selectCurrentMessageList(global)?.type === 'scheduled';\n}\n\nexport function selectCanScheduleUntilOnline(global: GlobalState, id: string) {\n const isChatWithSelf = selectIsChatWithSelf(global, id);\n const chatBot = id === REPLIES_USER_ID && selectChatBot(global, id);\n return Boolean(\n !isChatWithSelf && !chatBot && isUserId(id) && selectUserStatus(global, id)?.wasOnline,\n );\n}\n","import type { GlobalState } from '../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 selectCurrentMediaSearch(global: GlobalState) {\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return undefined;\n }\n\n return global.localMediaSearch.byChatId[chatId];\n}\n","import type { GlobalState } from '../types';\n\nimport { selectCurrentMessageList } from './messages';\nimport { selectChat } from './chats';\n\nexport function selectStatistics(global: GlobalState, chatId: string) {\n return global.statistics.byChatId[chatId];\n}\n\nexport function selectIsStatisticsShown(global: GlobalState) {\n if (!global.isStatisticsShown) {\n return false;\n }\n\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const chat = currentChatId ? selectChat(global, currentChatId) : undefined;\n\n return chat?.fullInfo?.canViewStatistics;\n}\n\nexport function selectIsMessageStatisticsShown(global: GlobalState) {\n if (!global.isStatisticsShown) {\n return false;\n }\n\n return Boolean(global.statistics.currentMessageId);\n}\n","import type { GlobalState } from '../types';\n\nimport { selectCurrentMessageList } from './messages';\nimport { selectChat } from './chats';\nimport { isChatGroup, isUserId } from '../helpers';\n\nexport function selectManagement(global: GlobalState, chatId: string) {\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 (isUserId(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 type { GlobalState } from '../types';\nimport { NewChatMembersProgress, RightColumnContent } from '../../types';\n\nimport { getSystemTheme, IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { selectCurrentMessageList, selectIsPollResultsOpen } from './messages';\nimport { selectCurrentTextSearch } from './localSearch';\nimport { selectCurrentStickerSearch, selectCurrentGifSearch } from './symbols';\nimport { selectIsStatisticsShown, selectIsMessageStatisticsShown } from './statistics';\nimport { selectCurrentManagement } from './management';\n\nexport function selectIsMediaViewerOpen(global: GlobalState) {\n const { mediaViewer } = global;\n return Boolean(mediaViewer.mediaId || mediaViewer.avatarOwnerId);\n}\n\nexport function selectRightColumnContentKey(global: GlobalState) {\n return selectIsPollResultsOpen(global) ? (\n RightColumnContent.PollResults\n ) : !IS_SINGLE_COLUMN_LAYOUT && selectCurrentTextSearch(global) ? (\n RightColumnContent.Search\n ) : selectCurrentManagement(global) ? (\n RightColumnContent.Management\n ) : selectIsMessageStatisticsShown(global) ? (\n RightColumnContent.MessageStatistics\n ) : selectIsStatisticsShown(global) ? (\n RightColumnContent.Statistics\n ) : selectCurrentStickerSearch(global).query !== undefined ? (\n RightColumnContent.StickerSearch\n ) : selectCurrentGifSearch(global).query !== undefined ? (\n RightColumnContent.GifSearch\n ) : global.newChatMembersProgress !== NewChatMembersProgress.Closed ? (\n RightColumnContent.AddingMembers\n ) : global.isChatInfoShown && selectCurrentMessageList(global) ? (\n RightColumnContent.ChatInfo\n ) : undefined;\n}\n\nexport function selectIsRightColumnShown(global: GlobalState) {\n return selectRightColumnContentKey(global) !== undefined;\n}\n\nexport function selectTheme(global: GlobalState) {\n const { theme, shouldUseSystemTheme } = global.settings.byKey;\n\n return shouldUseSystemTheme ? getSystemTheme() : theme;\n}\n","import type { GlobalState } from '../types';\n\nexport function selectCurrentGlobalSearchQuery(global: GlobalState) {\n return global.globalSearch.query;\n}\n","import type { GlobalState } from '../types';\n\nexport function selectPaymentInputInvoice(global: GlobalState) {\n return global.payment.inputInvoice;\n}\n\nexport function selectPaymentFormId(global: GlobalState) {\n return global.payment.formId;\n}\n\nexport function selectPaymentRequestId(global: GlobalState) {\n return global.payment.requestId;\n}\n\nexport function selectProviderPublishableKey(global: GlobalState) {\n return global.payment.nativeParams?.publishableKey;\n}\n\nexport function selectProviderPublicToken(global: GlobalState) {\n return global.payment.nativeParams?.publicToken;\n}\n\nexport function selectStripeCredentials(global: GlobalState) {\n return global.payment.stripeCredentials;\n}\n\nexport function selectSmartGlocalCredentials(global: GlobalState) {\n return global.payment.smartGlocalCredentials;\n}\n","import type { GlobalState } from '../types';\n\nexport function selectNotifySettings(global: GlobalState) {\n return global.settings.byKey;\n}\n\nexport function selectNotifyExceptions(global: GlobalState) {\n return global.settings.notifyExceptions;\n}\n","import type { GlobalState } from '../types';\nimport type { ApiChat, ApiUser, ApiUserStatus } from '../../api/types';\nimport { isUserBot } from '../helpers';\n\nexport function selectUser(global: GlobalState, userId: string): ApiUser | undefined {\n return global.users.byId[userId];\n}\n\nexport function selectUserStatus(global: GlobalState, userId: string): ApiUserStatus | undefined {\n return global.users.statusesById[userId];\n}\n\nexport function selectIsUserBlocked(global: GlobalState, userId: string) {\n const user = selectUser(global, userId);\n\n return user?.fullInfo?.isBlocked;\n}\n\nexport function selectIsCurrentUserPremium(global: GlobalState) {\n if (!global.currentUserId) return false;\n\n return Boolean(global.users.byId[global.currentUserId].isPremium);\n}\n\nexport function selectIsPremiumPurchaseBlocked(global: GlobalState) {\n return global.appConfig?.isPremiumPurchaseBlocked ?? true;\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\n// Slow, not to be used in `withGlobal`\nexport function selectUserByPhoneNumber(global: GlobalState, phoneNumber: string) {\n const phoneNumberCleaned = phoneNumber.replace(/[^0-9]/g, '');\n\n return Object.values(global.users.byId).find((user) => user?.phoneNumber === phoneNumberCleaned);\n}\n\nexport function selectIsUserOrChatContact(global: GlobalState, userOrChat: ApiUser | ApiChat) {\n return global.contactList && global.contactList.userIds.includes(userOrChat.id);\n}\n\nexport function selectBot(global: GlobalState, userId: string): ApiUser | undefined {\n const user = selectUser(global, userId);\n if (!user || !isUserBot(user)) {\n return undefined;\n }\n\n return user;\n}\n","import { useEffect, useState } from '../lib/teact/teact';\n\nconst useAsync = <T>(fn: () => Promise<T>, deps: any[], defaultValue?: T) => {\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<Error | undefined>();\n const [result, setResult] = useState<T | undefined>(defaultValue);\n useEffect(() => {\n setIsLoading(true);\n let wasCancelled = false;\n fn().then((res) => {\n if (wasCancelled) return;\n setIsLoading(false);\n setResult(res);\n }, (err) => {\n if (wasCancelled) return;\n setIsLoading(false);\n setError(err);\n });\n return () => {\n wasCancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps);\n return { isLoading, error, result };\n};\n\nexport default useAsync;\n","import { useEffect } from '../lib/teact/teact';\n\nexport default function useBackgroundMode(\n onBlur?: AnyToVoidFunction,\n onFocus?: AnyToVoidFunction,\n) {\n useEffect(() => {\n if (onBlur && !document.hasFocus()) {\n onBlur();\n }\n\n if (onBlur) {\n window.addEventListener('blur', onBlur);\n }\n\n if (onFocus) {\n window.addEventListener('focus', onFocus);\n }\n\n return () => {\n if (onFocus) {\n window.removeEventListener('focus', onFocus);\n }\n\n if (onBlur) {\n window.removeEventListener('blur', onBlur);\n }\n };\n }, [onBlur, onFocus]);\n}\n","import usePrevious from './usePrevious';\n\nexport default function useCurrentOrPrev<T extends any>(\n current: T, shouldSkipUndefined = false, shouldForceCurrent = false,\n): T | undefined {\n const prev = usePrevious(current, shouldSkipUndefined);\n\n // eslint-disable-next-line no-null/no-null\n return shouldForceCurrent || (current !== null && current !== undefined) ? current : prev;\n}\n","import { useCallback, useMemo } from '../lib/teact/teact';\n\nimport { debounce } from '../util/schedulers';\n\nexport default function useDebouncedCallback<T extends AnyToVoidFunction>(\n fn: T,\n deps: any[],\n ms: number,\n noFirst?: boolean,\n noLast?: boolean,\n) {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const fnMemo = useCallback(fn, deps);\n\n return useMemo(() => {\n return debounce(fnMemo, ms, !noFirst, !noLast);\n }, [fnMemo, ms, noFirst, noLast]);\n}\n","import { useEffect } from '../lib/teact/teact';\nimport usePrevious from './usePrevious';\n\nconst useEffectWithPrevDeps = <T extends readonly any[]>(\n cb: (args: T | readonly []) => void, dependencies: T, debugKey?: string,\n) => {\n const prevDeps = usePrevious<T>(dependencies);\n return useEffect(() => {\n return cb(prevDeps || []);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies, debugKey);\n};\n\nexport default useEffectWithPrevDeps;\n","import { useCallback, useState } from '../lib/teact/teact';\n\nconst useFlag = (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\nexport default useFlag;\n","import { useCallback, useState } from '../lib/teact/teact';\n\nconst useForceUpdate = () => {\n const [, setTrigger] = useState<boolean>(false);\n\n return useCallback(() => {\n setTrigger((trigger) => !trigger);\n }, []);\n};\n\nexport default useForceUpdate;\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\n// Make sure to end even if end callback was not called (which was some hardly-reproducible bug)\nconst AUTO_END_TIMEOUT = 1000;\n\nconst useHeavyAnimationCheck = (\n handleAnimationStart: AnyToVoidFunction,\n handleAnimationEnd: AnyToVoidFunction,\n isDisabled = false,\n) => {\n useEffect(() => {\n if (isDisabled) {\n return undefined;\n }\n\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 }, [isDisabled, handleAnimationEnd, handleAnimationStart]);\n};\n\nexport function isHeavyAnimating() {\n return isAnimating;\n}\n\nexport function dispatchHeavyAnimationEvent(duration = AUTO_END_TIMEOUT) {\n if (!isAnimating) {\n isAnimating = true;\n document.dispatchEvent(new Event(ANIMATION_START_EVENT));\n }\n\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n // Race condition may happen if another `dispatchHeavyAnimationEvent` is called before `onEnd`\n function onEnd() {\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n isAnimating = false;\n document.dispatchEvent(new Event(ANIMATION_END_EVENT));\n }\n\n timeout = window.setTimeout(onEnd, duration);\n\n return onEnd;\n}\n\nexport default useHeavyAnimationCheck;\n","import useOnChange from './useOnChange';\nimport { useEffect, useRef } from '../lib/teact/teact';\nimport { IS_TEST } from '../config';\nimport { fastRaf } from '../util/schedulers';\nimport { IS_IOS } from '../util/environment';\nimport { getActions } from '../lib/teact/teactn';\n\nexport const LOCATION_HASH = window.location.hash;\nconst PATH_BASE = `${window.location.pathname}${window.location.search}`;\n// Carefully selected by swiping and observing visual changes\n// TODO: may be different on other devices such as iPad, maybe take dpi into account?\nconst SAFARI_EDGE_BACK_GESTURE_LIMIT = 300;\nconst SAFARI_EDGE_BACK_GESTURE_DURATION = 350;\n\ntype HistoryRecord = {\n index: number;\n // Should this record be replaced by the next record (for example Menu)\n shouldBeReplaced?: boolean;\n // Mark this record as replaced by the next record. Only used to check if needed to perform effectBack\n markReplaced?: VoidFunction;\n onBack?: VoidFunction;\n // Set if the element is closed in the UI, but not in the real history\n isClosed?: boolean;\n};\n\ntype HistoryOperationGo = {\n type: 'go';\n delta: number;\n};\n\ntype HistoryOperationState = {\n type: 'pushState' | 'replaceState';\n data: any;\n hash?: string;\n};\n\ntype HistoryOperation = HistoryOperationGo | HistoryOperationState;\n\n// Needed to dismiss any 'trashed' history records from the previous page reloads.\nconst historyUniqueSessionId = Number(new Date());\n// Reflects real history state, but also contains information on which records should be replaced by the next record and\n// which records are deferred to close on the next operation\nlet historyState: HistoryRecord[];\n// Reflects current real history index\nlet historyCursor: number;\n// If we alter real history programmatically, the popstate event will be fired, which we don't need\nlet isAlteringHistory = false;\n// Unfortunately Safari doesn't really like when there's 2+ consequent history operations in one frame, so we need\n// to delay them to the next raf\nlet deferredHistoryOperations: HistoryOperation[] = [];\nlet deferredPopstateOperations: HistoryOperationState[] = [];\nlet isSafariGestureAnimation = false;\n\n// Do not remove: used for history unit tests\nif (IS_TEST) {\n (window as any).TEST_getHistoryState = () => historyState;\n (window as any).TEST_getHistoryCursor = () => historyCursor;\n}\n\nfunction handleTouchStart(event: TouchEvent) {\n const x = event.touches[0].pageX;\n\n if (x <= SAFARI_EDGE_BACK_GESTURE_LIMIT || x >= window.innerWidth - SAFARI_EDGE_BACK_GESTURE_LIMIT) {\n isSafariGestureAnimation = true;\n }\n}\n\nfunction handleTouchEnd() {\n if (!isSafariGestureAnimation) {\n return;\n }\n\n setTimeout(() => {\n isSafariGestureAnimation = false;\n }, SAFARI_EDGE_BACK_GESTURE_DURATION);\n}\n\nif (IS_IOS) {\n window.addEventListener('touchstart', handleTouchStart);\n window.addEventListener('touchend', handleTouchEnd);\n window.addEventListener('popstate', handleTouchEnd);\n}\n\nfunction applyDeferredHistoryOperations() {\n const goOperations = deferredHistoryOperations.filter((op) => op.type === 'go') as HistoryOperationGo[];\n const stateOperations = deferredHistoryOperations.filter((op) => op.type !== 'go') as HistoryOperationState[];\n const goCount = goOperations.reduce((acc, op) => acc + op.delta, 0);\n\n deferredHistoryOperations = [];\n\n if (goCount) {\n window.history.go(goCount);\n\n // If we have some `state` operations after the `go` operations, we need to wait until the popstate event\n // so the order of operations is correctly preserved\n if (stateOperations.length) {\n deferredPopstateOperations.push(...stateOperations);\n return;\n }\n }\n\n processStateOperations(stateOperations);\n}\n\nfunction processStateOperations(stateOperations: HistoryOperationState[]) {\n stateOperations.forEach((op) => window.history[op.type](op.data, '', op.hash));\n}\n\nfunction deferHistoryOperation(historyOperation: HistoryOperation) {\n if (!deferredHistoryOperations.length) fastRaf(applyDeferredHistoryOperations);\n deferredHistoryOperations.push(historyOperation);\n}\n\n// Resets history to the `root` state\nfunction resetHistory() {\n historyCursor = 0;\n historyState = [{\n index: 0,\n onBack: () => window.history.back(),\n }];\n\n window.history.replaceState({ index: 0, historyUniqueSessionId }, PATH_BASE);\n}\n\nresetHistory();\n\nfunction cleanupClosed(alreadyClosedCount = 1) {\n let countClosed = alreadyClosedCount;\n for (let i = historyCursor - 1; i > 0; i--) {\n if (!historyState[i].isClosed) break;\n countClosed++;\n }\n if (countClosed) {\n isAlteringHistory = true;\n deferHistoryOperation({\n type: 'go',\n delta: -countClosed,\n });\n }\n return countClosed;\n}\n\nfunction cleanupTrashedState() {\n // Navigation to previous page reload, state of which was trashed by reload\n for (let i = historyState.length - 1; i > 0; i--) {\n if (historyState[i].isClosed) {\n continue;\n }\n if (isSafariGestureAnimation) {\n getActions().disableHistoryAnimations();\n }\n historyState[i].onBack?.();\n }\n\n resetHistory();\n}\n\nwindow.addEventListener('popstate', ({ state }: PopStateEvent) => {\n if (isAlteringHistory) {\n isAlteringHistory = false;\n if (deferredPopstateOperations.length) {\n processStateOperations(deferredPopstateOperations);\n deferredPopstateOperations = [];\n }\n return;\n }\n\n if (!state) {\n cleanupTrashedState();\n\n if (!window.location.hash) {\n return;\n }\n return;\n }\n\n const { index, historyUniqueSessionId: previousUniqueSessionId } = state;\n if (previousUniqueSessionId !== historyUniqueSessionId) {\n cleanupTrashedState();\n return;\n }\n\n // New real history state matches the old virtual one. Not possible in theory, but in practice we have Safari\n if (index === historyCursor) {\n return;\n }\n\n if (index < historyCursor) {\n // Navigating back\n let alreadyClosedCount = 0;\n for (let i = historyCursor; i > index - alreadyClosedCount; i--) {\n if (historyState[i].isClosed) {\n alreadyClosedCount++;\n continue;\n }\n if (isSafariGestureAnimation) {\n getActions().disableHistoryAnimations();\n }\n historyState[i].onBack?.();\n }\n\n const countClosed = cleanupClosed(alreadyClosedCount);\n historyCursor += index - historyCursor - countClosed;\n\n // Can happen when we have deferred a real back for some element (for example Menu), closed via UI,\n // pressed back button and caused a pushState.\n if (historyCursor < 0) {\n historyCursor = 0;\n }\n } else if (index > historyCursor) {\n // Forward navigation is not yet supported\n isAlteringHistory = true;\n deferHistoryOperation({\n type: 'go',\n delta: -(index - historyCursor),\n });\n }\n});\n\nexport default function useHistoryBack({\n isActive,\n shouldBeReplaced,\n hash,\n onBack,\n}: {\n isActive?: boolean;\n shouldBeReplaced?: boolean;\n hash?: string;\n title?: string;\n onBack: VoidFunction;\n}) {\n // Active index of the record\n const indexRef = useRef<number>();\n const wasReplaced = useRef(false);\n\n const isFirstRender = useRef(true);\n\n const pushState = (forceReplace = false) => {\n // Check if the old state should be replaced\n const shouldReplace = forceReplace || historyState[historyCursor].shouldBeReplaced;\n indexRef.current = shouldReplace ? historyCursor : ++historyCursor;\n\n historyCursor = indexRef.current;\n\n // Mark the previous record as replaced so effectBack doesn't perform back operation on the new record\n const previousRecord = historyState[indexRef.current];\n if (previousRecord && !previousRecord.isClosed) {\n previousRecord.markReplaced?.();\n }\n\n historyState[indexRef.current] = {\n index: indexRef.current,\n onBack,\n shouldBeReplaced,\n markReplaced: () => {\n wasReplaced.current = true;\n },\n };\n\n // Delete forward navigation in the virtual history. Not really needed, just looks better when debugging `logState`\n for (let i = indexRef.current + 1; i < historyState.length; i++) {\n delete historyState[i];\n }\n\n deferHistoryOperation({\n type: shouldReplace ? 'replaceState' : 'pushState',\n data: {\n index: indexRef.current,\n historyUniqueSessionId,\n },\n hash: hash ? `#${hash}` : undefined,\n });\n };\n\n const processBack = () => {\n // Only process back on open records\n if (indexRef.current && historyState[indexRef.current] && !wasReplaced.current) {\n historyState[indexRef.current].isClosed = true;\n wasReplaced.current = true;\n if (indexRef.current === historyCursor && !shouldBeReplaced) {\n historyCursor -= cleanupClosed();\n }\n }\n };\n\n // Process back navigation when element is unmounted\n useEffect(() => {\n isFirstRender.current = false;\n return () => {\n if (!isActive || wasReplaced.current) return;\n processBack();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useOnChange(() => {\n if (isFirstRender.current && !isActive) return;\n\n if (isActive) {\n pushState();\n } else {\n processBack();\n }\n }, [isActive]);\n}\n","import type { RefObject } from 'react';\nimport { useState, useCallback, useEffect } from '../lib/teact/teact';\n\nconst useKeyboardListNavigation = (\n elementRef: RefObject<HTMLElement>,\n isOpen: boolean,\n onSelectWithEnter?: (index: number) => void,\n itemSelector?: string,\n noCaptureFocus?: boolean,\n) => {\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n useEffect(() => {\n setFocusedIndex(-1);\n\n const element = elementRef.current;\n if (isOpen && element && !noCaptureFocus) {\n element.tabIndex = -1;\n element.focus();\n }\n }, [elementRef, isOpen, noCaptureFocus]);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent<any>) => {\n const element = elementRef.current;\n\n if (!element) {\n return;\n }\n\n if (e.keyCode === 13 && onSelectWithEnter) {\n onSelectWithEnter(focusedIndex);\n return;\n }\n\n if (e.keyCode !== 38 && e.keyCode !== 40) {\n return;\n }\n\n const focusedElement = document.activeElement;\n const elementChildren = Array.from(itemSelector ? element.querySelectorAll(itemSelector) : element.children);\n\n let newIndex = (focusedElement && elementChildren.indexOf(focusedElement)) || focusedIndex;\n\n if (e.keyCode === 38 && newIndex > 0) {\n newIndex--;\n } else if (e.keyCode === 40 && newIndex < elementChildren.length - 1) {\n newIndex++;\n } else if (elementChildren.length === 1) {\n newIndex = 0;\n } else {\n return;\n }\n\n const item = elementChildren[newIndex] as HTMLElement;\n if (item) {\n setFocusedIndex(newIndex);\n item.focus();\n }\n }, [elementRef, onSelectWithEnter, itemSelector, focusedIndex]);\n\n return handleKeyDown;\n};\n\nexport default useKeyboardListNavigation;\n","import * as langProvider from '../util/langProvider';\nimport useForceUpdate from './useForceUpdate';\nimport useOnChange from './useOnChange';\n\nexport type LangFn = typeof langProvider.getTranslation;\n\nconst useLang = (): LangFn => {\n const forceUpdate = useForceUpdate();\n\n useOnChange(() => {\n return langProvider.addCallback(forceUpdate);\n }, [forceUpdate]);\n\n return langProvider.getTranslation;\n};\n\nexport default useLang;\n","import useShowTransition from './useShowTransition';\n\nexport default function useMediaTransition(mediaData?: any) {\n const isMediaReady = Boolean(mediaData);\n const { transitionClassNames } = useShowTransition(isMediaReady, undefined, isMediaReady, 'slow');\n\n return transitionClassNames;\n}\n","import { useEffect } from '../lib/teact/teact';\n\nimport type { BundleModules, Bundles } from '../util/moduleLoader';\nimport { getModuleFromMemory, loadModule, addLoadListener } from '../util/moduleLoader';\n\nimport useForceUpdate from './useForceUpdate';\n\nconst useModuleLoader = <B extends Bundles, M extends BundleModules<B>>(\n bundleName: B, moduleName: M, noLoad = false, autoUpdate = false,\n) => {\n const module = getModuleFromMemory(bundleName, moduleName);\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n if (!autoUpdate) {\n return undefined;\n }\n\n return addLoadListener(forceUpdate);\n }, [autoUpdate, forceUpdate]);\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\nexport default useModuleLoader;\n","import usePrevious from './usePrevious';\n\nconst useOnChange = <T extends readonly any[]>(cb: (args: T | readonly []) => void, dependencies: T) => {\n const prevDeps = usePrevious<T>(dependencies);\n if (!prevDeps || dependencies.some((d, i) => d !== prevDeps[i])) {\n cb(prevDeps || []);\n }\n};\n\nexport default useOnChange;\n","import { useRef } from '../lib/teact/teact';\n\nfunction usePrevious<T extends any>(next: T): T | undefined;\nfunction usePrevious<T extends any>(next: T, shouldSkipUndefined: true): Exclude<T, undefined> | undefined;\nfunction usePrevious<T extends any>(next: T, shouldSkipUndefined?: boolean): Exclude<T, undefined> | undefined;\nfunction usePrevious<T extends any>(next: T, shouldSkipUndefined?: boolean) {\n const ref = useRef<T>();\n const { current } = ref;\n if (!shouldSkipUndefined || next !== undefined) {\n ref.current = next;\n }\n\n return current;\n}\n\nexport default usePrevious;\n","import { useRef, useState } from '../lib/teact/teact';\nimport buildClassName from '../util/buildClassName';\n\nconst CLOSE_DURATION = 350;\n\nconst useShowTransition = (\n isOpen = false,\n onCloseTransitionEnd?: () => void,\n noOpenTransition = false,\n className: string | false = 'fast',\n noCloseTransition = false,\n) => {\n const [isClosed, setIsClosed] = useState(!isOpen);\n const closeTimeoutRef = useRef<number>();\n // СSS class should be added in a separate tick to turn on CSS transition.\n const [hasOpenClassName, setHasOpenClassName] = useState(isOpen && noOpenTransition);\n\n if (isOpen) {\n setIsClosed(false);\n setHasOpenClassName(true);\n\n if (closeTimeoutRef.current) {\n window.clearTimeout(closeTimeoutRef.current);\n closeTimeoutRef.current = undefined;\n }\n } else {\n setHasOpenClassName(false);\n\n if (!isClosed && !closeTimeoutRef.current) {\n const exec = () => {\n setIsClosed(true);\n\n if (onCloseTransitionEnd) {\n onCloseTransitionEnd();\n }\n\n closeTimeoutRef.current = undefined;\n };\n\n if (noCloseTransition) {\n exec();\n } else {\n closeTimeoutRef.current = window.setTimeout(exec, CLOSE_DURATION);\n }\n }\n }\n\n // `noCloseTransition`, when set to true, should remove the open class immediately\n const shouldHaveOpenClassName = hasOpenClassName && !(noCloseTransition && !isOpen);\n const isClosing = Boolean(closeTimeoutRef.current);\n const shouldRender = isOpen || isClosing;\n const transitionClassNames = buildClassName(\n className && 'opacity-transition',\n className,\n shouldHaveOpenClassName && 'open',\n shouldRender && 'shown',\n isClosing && 'closing',\n );\n\n return {\n shouldRender,\n transitionClassNames,\n hasShownClass: shouldRender,\n hasOpenClass: shouldHaveOpenClassName,\n };\n};\n\nexport default useShowTransition;\n","import type { RefObject } from 'react';\nimport { useEffect } from '../lib/teact/teact';\n\nconst BACKDROP_CLASSNAME = 'backdrop';\n\n// This effect implements closing menus by clicking outside of them\n// without adding extra elements to the DOM\nexport default function useVirtualBackdrop(\n isOpen: boolean,\n menuRef: RefObject<HTMLElement>,\n onClose?: () => void | undefined,\n) {\n useEffect(() => {\n const handleEvent = (e: Event) => {\n const menu = menuRef.current;\n const target = e.target as HTMLElement | null;\n if (!menu || !target) {\n return;\n }\n\n if (\n !menu.contains(e.target as Node | null)\n || target.classList.contains(BACKDROP_CLASSNAME)\n ) {\n e.preventDefault();\n e.stopPropagation();\n if (onClose) {\n onClose();\n }\n }\n };\n\n if (isOpen && onClose) {\n document.addEventListener('mousedown', handleEvent);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleEvent);\n };\n }, [isOpen, menuRef, onClose]);\n}\n","import { useEffect, useState } from '../lib/teact/teact';\nimport type { ApiDimensions } from '../api/types';\n\nimport { throttle } from '../util/schedulers';\nimport windowSize from '../util/windowSize';\nimport useDebouncedCallback from './useDebouncedCallback';\n\nconst THROTTLE = 250;\n\nconst useWindowSize = () => {\n const [size, setSize] = useState<ApiDimensions>(windowSize.get());\n const [isResizing, setIsResizing] = useState(false);\n const setIsResizingDebounced = useDebouncedCallback(setIsResizing, [], THROTTLE, true);\n\n useEffect(() => {\n const throttledSetIsResizing = throttle(() => {\n setIsResizing(true);\n }, THROTTLE, true);\n\n const throttledSetSize = throttle(() => {\n setSize(windowSize.get());\n setIsResizingDebounced(false);\n }, THROTTLE, false);\n\n const handleResize = () => {\n throttledSetIsResizing();\n throttledSetSize();\n };\n\n window.addEventListener('resize', handleResize);\n\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n }, [setIsResizingDebounced]);\n\n return { ...size, isResizing };\n};\n\nexport default useWindowSize;\n","import { DEBUG } from '../../config';\n\ntype Handler = (e: Event) => void;\ntype DelegationRegistry = Map<HTMLElement, Handler>;\n\nconst NON_BUBBLEABLE_EVENTS = new Set(['scroll', 'mouseenter', 'mouseleave', 'load']);\n\nconst documentEventCounters: Record<string, number> = {};\nconst delegationRegistryByEventType: Record<string, DelegationRegistry> = {};\nconst delegatedEventTypesByElement = new Map<HTMLElement, Set<string>>();\n\nexport function addEventListener(element: HTMLElement, propName: string, handler: Handler, asCapture = false) {\n const eventType = resolveEventType(propName, element);\n if (canUseEventDelegation(eventType, element, asCapture)) {\n addDelegatedListener(eventType, element, handler);\n } else {\n element.addEventListener(eventType, handler, asCapture);\n }\n}\n\nexport function removeEventListener(element: HTMLElement, propName: string, handler: Handler, asCapture = false) {\n const eventType = resolveEventType(propName, element);\n if (canUseEventDelegation(eventType, element, asCapture)) {\n removeDelegatedListener(eventType, element);\n } else {\n element.removeEventListener(eventType, handler, asCapture);\n }\n}\n\nfunction resolveEventType(propName: string, element: HTMLElement) {\n const eventType = propName\n .replace(/^on/, '')\n .replace(/Capture$/, '').toLowerCase();\n\n if (eventType === '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 (eventType === 'doubleclick') {\n return 'dblclick';\n }\n\n // Replace focus/blur by their \"bubbleable\" versions\n if (eventType === 'focus') {\n return 'focusin';\n }\n\n if (eventType === 'blur') {\n return 'focusout';\n }\n\n return eventType;\n}\n\nfunction canUseEventDelegation(realEventType: string, element: HTMLElement, asCapture: boolean) {\n return (\n !asCapture\n && !NON_BUBBLEABLE_EVENTS.has(realEventType)\n && element.tagName !== 'VIDEO'\n && element.tagName !== 'IFRAME'\n );\n}\n\nfunction addDelegatedListener(eventType: string, element: HTMLElement, handler: Handler) {\n if (!documentEventCounters[eventType]) {\n documentEventCounters[eventType] = 0;\n document.addEventListener(eventType, handleEvent);\n }\n\n resolveDelegationRegistry(eventType).set(element, handler);\n resolveDelegatedEventTypes(element).add(eventType);\n documentEventCounters[eventType]++;\n}\n\nfunction removeDelegatedListener(eventType: string, element: HTMLElement) {\n documentEventCounters[eventType]--;\n if (!documentEventCounters[eventType]) {\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(eventType, handleEvent);\n }\n\n delegationRegistryByEventType[eventType].delete(element);\n delegatedEventTypesByElement.get(element)!.delete(eventType);\n}\n\nexport function removeAllDelegatedListeners(element: HTMLElement) {\n const eventTypes = delegatedEventTypesByElement.get(element);\n if (!eventTypes) {\n return;\n }\n\n eventTypes.forEach((eventType) => removeDelegatedListener(eventType, element));\n delegatedEventTypesByElement.delete(element);\n}\n\nfunction handleEvent(realEvent: Event) {\n const events = delegationRegistryByEventType[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 resolveDelegationRegistry(eventType: string) {\n if (!delegationRegistryByEventType[eventType]) {\n delegationRegistryByEventType[eventType] = new Map();\n }\n\n return delegationRegistryByEventType[eventType];\n}\n\nfunction resolveDelegatedEventTypes(element: HTMLElement) {\n const existing = delegatedEventTypesByElement.get(element);\n if (existing) {\n return existing;\n }\n\n const newSet = new Set<string>();\n delegatedEventTypesByElement.set(element, newSet);\n\n return newSet;\n}\n\nif (DEBUG) {\n document.addEventListener('dblclick', () => {\n const documentListenersCount = Object.keys(documentEventCounters).length;\n const delegatedHandlersCount1 = Object.values(documentEventCounters)\n .reduce((acc, counter) => acc + counter, 0);\n const delegationRegistriesCount = Object.keys(delegationRegistryByEventType).length;\n const delegatedHandlersCount2 = Object.values(delegationRegistryByEventType)\n .reduce((acc, delegationRegistry) => acc + delegationRegistry.size, 0);\n const delegationElementsCount = delegatedEventTypesByElement.size;\n const delegatedEventTypesCount = Array.from(delegatedEventTypesByElement.values())\n .reduce((acc, eventTypes) => acc + eventTypes.size, 0);\n\n // eslint-disable-next-line no-console\n console.warn('DELEGATED EVENTS STATS', {\n delegatedHandlersCount1,\n delegatedHandlersCount2,\n delegatedEventTypesCount,\n delegationRegistriesCount,\n delegationElementsCount,\n documentListenersCount,\n });\n });\n}\n","import type {\n VirtualElement,\n VirtualElementComponent,\n VirtualElementTag,\n VirtualElementParent,\n VirtualElementChildren,\n VirtualElementReal,\n} from './teact';\nimport {\n hasElementChanged,\n isComponentElement,\n isTagElement,\n isParentElement,\n isTextElement,\n isEmptyElement,\n mountComponent,\n renderComponent,\n unmountComponent,\n} from './teact';\nimport generateIdFor from '../../util/generateIdFor';\nimport { DEBUG } from '../../config';\nimport { addEventListener, removeAllDelegatedListeners, removeEventListener } from './dom-events';\nimport { unique } from '../../util/iteratees';\n\ntype VirtualDomHead = {\n children: [VirtualElement] | [];\n};\n\nconst FILTERED_ATTRIBUTES = new Set(['key', 'ref', 'teactFastList', 'teactOrderKey']);\nconst HTML_ATTRIBUTES = new Set(['dir', 'role', 'form']);\nconst CONTROLLABLE_TAGS = ['INPUT', 'TEXTAREA', 'SELECT'];\nconst MAPPED_ATTRIBUTES: { [k: string]: string } = {\n autoPlay: 'autoplay',\n autoComplete: 'autocomplete',\n};\nconst INDEX_KEY_PREFIX = '__indexKey#';\n\nconst headsByElement: Record<string, VirtualDomHead> = {};\n// eslint-disable-next-line @typescript-eslint/naming-convention\nlet DEBUG_virtualTreeSize = 1;\n\nfunction render($element: VirtualElement | undefined, parentEl: HTMLElement) {\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 const $newElement = renderWithVirtual(parentEl, $head.children[0], $element, $head, 0);\n $head.children = $newElement ? [$newElement] : [];\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<T extends VirtualElement | undefined>(\n parentEl: HTMLElement,\n $current: VirtualElement | undefined,\n $new: T,\n $parent: VirtualElementParent | VirtualDomHead,\n index: number,\n options: {\n skipComponentUpdate?: boolean;\n nextSibling?: ChildNode;\n fragment?: DocumentFragment;\n } = {},\n): T {\n const { skipComponentUpdate, fragment } = options;\n let { nextSibling } = options;\n\n const isCurrentComponent = $current && isComponentElement($current);\n const isNewComponent = $new && isComponentElement($new);\n const $newAsReal = $new as VirtualElementReal;\n\n if (\n !skipComponentUpdate\n && isCurrentComponent && isNewComponent\n && !hasElementChanged($current!, $new!)\n ) {\n $new = updateComponent($current, $new as VirtualElementComponent) as typeof $new;\n }\n\n // Parent element may have changed, so we need to update the listener closure.\n if (!skipComponentUpdate && isNewComponent && ($new as VirtualElementComponent).componentInstance.isMounted) {\n setupComponentUpdateListener(parentEl, $new as VirtualElementComponent, $parent, index);\n }\n\n if ($current === $new) {\n return $new;\n }\n\n if (DEBUG && $new) {\n const newTarget = 'target' in $new && $new.target;\n if (newTarget && (!$current || ('target' in $current && newTarget !== $current.target))) {\n throw new Error('[Teact] Cached virtual element was moved within tree');\n }\n }\n\n if (!$current && $new) {\n if (isNewComponent) {\n $new = initComponent(parentEl, $new as VirtualElementComponent, $parent, index) as typeof $new;\n mountComponentChildren(parentEl, $new as VirtualElementComponent, { nextSibling, fragment });\n } else {\n const node = createNode($newAsReal);\n $newAsReal.target = node;\n insertBefore(fragment || parentEl, node, nextSibling);\n }\n } else if ($current && !$new) {\n remount(parentEl, $current, undefined);\n } else if ($current && $new) {\n if (hasElementChanged($current, $new)) {\n if (!nextSibling) {\n nextSibling = getNextSibling($current);\n }\n\n if (isNewComponent) {\n $new = initComponent(parentEl, $new as VirtualElementComponent, $parent, index) as typeof $new;\n remount(parentEl, $current, undefined);\n mountComponentChildren(parentEl, $new as VirtualElementComponent, { nextSibling, fragment });\n } else {\n const node = createNode($newAsReal);\n $newAsReal.target = node;\n remount(parentEl, $current, node, nextSibling);\n }\n } else {\n const isComponent = isCurrentComponent && isNewComponent;\n if (isComponent) {\n ($new as VirtualElementComponent).children = renderChildren(\n $current,\n $new as VirtualElementComponent,\n parentEl,\n nextSibling,\n );\n } else {\n const $currentAsReal = $current as VirtualElementReal;\n const currentTarget = $currentAsReal.target!;\n\n $newAsReal.target = currentTarget;\n $currentAsReal.target = undefined; // Help GC\n\n const isTag = isTagElement($current);\n if (isTag) {\n const $newAsTag = $new as VirtualElementTag;\n\n $newAsTag.props.ref = $current.props.ref;\n\n if (nextSibling) {\n insertBefore(parentEl, currentTarget, nextSibling);\n }\n\n updateAttributes($current, $newAsTag, currentTarget as HTMLElement);\n\n $newAsTag.children = renderChildren(\n $current,\n $newAsTag,\n currentTarget as HTMLElement,\n );\n }\n }\n }\n }\n\n return $new;\n}\n\nfunction initComponent(\n parentEl: HTMLElement,\n $element: VirtualElementComponent,\n $parent: VirtualElementParent | VirtualDomHead,\n index: number,\n) {\n const { componentInstance } = $element;\n\n if (!componentInstance.isMounted) {\n $element = mountComponent(componentInstance);\n setupComponentUpdateListener(parentEl, $element, $parent, index);\n\n const $firstChild = $element.children[0];\n if (isComponentElement($firstChild)) {\n $element.children = [initComponent(parentEl, $firstChild, $element, 0)];\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 parentEl: HTMLElement,\n $element: VirtualElementComponent,\n $parent: VirtualElementParent | VirtualDomHead,\n index: number,\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 );\n };\n}\n\nfunction mountComponentChildren(parentEl: HTMLElement, $element: VirtualElementComponent, options: {\n nextSibling?: ChildNode;\n fragment?: DocumentFragment;\n}) {\n $element.children = $element.children.map(($child, i) => {\n return renderWithVirtual(parentEl, undefined, $child, $element, i, options);\n });\n}\n\nfunction unmountComponentChildren(parentEl: HTMLElement, $element: VirtualElementComponent) {\n $element.children.forEach(($child) => {\n renderWithVirtual(parentEl, $child, undefined, $element, -1);\n });\n}\n\nfunction createNode($element: VirtualElementReal): Node {\n if (isEmptyElement($element)) {\n return document.createTextNode('');\n }\n\n if (isTextElement($element)) {\n return document.createTextNode($element.value);\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 processControlled(tag, props);\n\n Object.entries(props).forEach(([key, value]) => {\n if (props[key] !== undefined) {\n setAttribute(element, key, value);\n }\n });\n\n processUncontrolledOnMount(element, props);\n\n $element.children = children.map(($child, i) => (\n renderWithVirtual(element, undefined, $child, $element, i)\n ));\n\n return element;\n}\n\nfunction remount(\n parentEl: HTMLElement,\n $current: VirtualElement,\n node: Node | undefined,\n componentNextSibling?: ChildNode,\n) {\n if (isComponentElement($current)) {\n unmountComponent($current.componentInstance);\n unmountComponentChildren(parentEl, $current);\n\n if (node) {\n insertBefore(parentEl, node, componentNextSibling);\n }\n } else {\n if (node) {\n parentEl.replaceChild(node, $current.target!);\n } else {\n parentEl.removeChild($current.target!);\n }\n\n unmountRealTree($current);\n }\n}\n\nexport function unmountRealTree($element: VirtualElement) {\n if (isComponentElement($element)) {\n unmountComponent($element.componentInstance);\n } else {\n if (isTagElement($element)) {\n if ($element.target) {\n removeAllDelegatedListeners($element.target as HTMLElement);\n }\n\n if ($element.props.ref) {\n $element.props.ref.current = undefined; // Help GC\n }\n }\n\n if ($element.target) {\n $element.target = undefined; // Help GC\n }\n\n if (!isParentElement($element)) {\n return;\n }\n }\n\n $element.children.forEach(unmountRealTree);\n}\n\nfunction insertBefore(parentEl: HTMLElement | DocumentFragment, node: Node, nextSibling?: ChildNode) {\n if (nextSibling) {\n parentEl.insertBefore(node, nextSibling);\n } else {\n parentEl.appendChild(node);\n }\n}\n\nfunction getNextSibling($current: VirtualElement): ChildNode | undefined {\n if (isComponentElement($current)) {\n const lastChild = $current.children[$current.children.length - 1];\n return getNextSibling(lastChild);\n }\n\n const target = $current.target!;\n const { nextSibling } = target;\n return nextSibling || undefined;\n}\n\nfunction renderChildren(\n $current: VirtualElementParent, $new: VirtualElementParent, currentEl: HTMLElement, nextSibling?: ChildNode,\n) {\n if (DEBUG) {\n DEBUG_checkKeyUniqueness($new.children);\n }\n\n if ($new.props.teactFastList) {\n return renderFastListChildren($current, $new, currentEl);\n }\n\n const currentChildrenLength = $current.children.length;\n const newChildrenLength = $new.children.length;\n const maxLength = Math.max(currentChildrenLength, newChildrenLength);\n const newChildren = [];\n\n const fragment = newChildrenLength > currentChildrenLength ? document.createDocumentFragment() : undefined;\n const lastCurrentChild = $current.children[currentChildrenLength - 1];\n const fragmentNextSibling = nextSibling || (\n newChildrenLength > currentChildrenLength && lastCurrentChild ? getNextSibling(lastCurrentChild) : undefined\n );\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 >= currentChildrenLength ? { fragment } : { nextSibling },\n );\n\n if ($newChild) {\n newChildren.push($newChild);\n }\n }\n\n if (fragment) {\n insertBefore(currentEl, fragment, fragmentNextSibling);\n }\n\n return newChildren;\n}\n\n// This function allows to prepend/append a bunch of new DOM nodes to the top/bottom of preserved ones.\n// It also allows to selectively move particular preserved nodes within their DOM list.\nfunction renderFastListChildren($current: VirtualElementParent, $new: VirtualElementParent, currentEl: HTMLElement) {\n const newKeys = new Set(\n $new.children.map(($newChild) => {\n const key = 'props' in $newChild && $newChild.props.key;\n\n // eslint-disable-next-line no-null/no-null\n if (DEBUG && isParentElement($newChild) && (key === undefined || key === null)) {\n // eslint-disable-next-line no-console\n console.warn('Missing `key` in `teactFastList`');\n }\n\n return key;\n }),\n );\n\n // Build a collection of old children that also remain in the new list\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 // eslint-disable-next-line no-null/no-null\n const isKeyPresent = key !== undefined && key !== null;\n\n // First we process removed children\n if (isKeyPresent && !newKeys.has(key)) {\n renderWithVirtual(currentEl, $currentChild, undefined, $new, -1);\n\n return acc;\n } else if (!isKeyPresent) {\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 // Otherwise, we just remove it\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 orderKey: 'props' in $currentChild ? $currentChild.props.teactOrderKey : undefined,\n };\n return acc;\n }, {} as Record<string, { $element: VirtualElement; index: number; orderKey?: number }>);\n\n let newChildren: VirtualElement[] = [];\n\n let fragmentElements: 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 if (!fragmentElements) {\n fragmentElements = [];\n fragmentIndex = i;\n }\n\n fragmentElements.push($newChild);\n return;\n }\n\n // This prepends new children to the top\n if (fragmentElements) {\n newChildren = newChildren.concat(renderFragment(fragmentElements, fragmentIndex!, currentEl, $new));\n fragmentElements = undefined;\n fragmentIndex = undefined;\n }\n\n // Now we check if a preserved node was moved within preserved list\n const newOrderKey = 'props' in $newChild ? $newChild.props.teactOrderKey : undefined;\n // That is indicated by a changed `teactOrderKey` value\n const shouldMoveNode = (\n currentChildInfo.index !== currentPreservedIndex && currentChildInfo.orderKey !== newOrderKey\n );\n const isMovingDown = shouldMoveNode && currentPreservedIndex > currentChildInfo.index;\n\n if (!shouldMoveNode || isMovingDown) {\n currentPreservedIndex++;\n }\n\n newChildren.push(\n renderWithVirtual(currentEl, currentChildInfo.$element, $newChild, $new, i, {\n // `+ 1` is needed because before moving down the node still takes place above\n nextSibling: shouldMoveNode ? currentEl.childNodes[isMovingDown ? i + 1 : i] : undefined,\n }),\n );\n });\n\n // This appends new children to the bottom\n if (fragmentElements) {\n newChildren = newChildren.concat(renderFragment(fragmentElements, fragmentIndex!, currentEl, $new));\n }\n\n return newChildren;\n}\n\nfunction renderFragment(\n elements: VirtualElement[], fragmentIndex: number, parentEl: HTMLElement, $parent: VirtualElementParent,\n) {\n const nextSibling = parentEl.childNodes[fragmentIndex];\n\n if (elements.length === 1) {\n return [renderWithVirtual(parentEl, undefined, elements[0], $parent, fragmentIndex, { nextSibling })];\n }\n\n const fragment = document.createDocumentFragment();\n const newChildren = elements.map(($element, i) => (\n renderWithVirtual(parentEl, undefined, $element, $parent, fragmentIndex + i, { fragment })\n ));\n\n insertBefore(parentEl, fragment, nextSibling);\n\n return newChildren;\n}\n\nfunction processControlled(tag: string, props: AnyLiteral) {\n // TODO Remove after tests\n if (!props.teactExperimentControlled) {\n return;\n }\n\n const isValueControlled = props.value !== undefined;\n const isCheckedControlled = props.checked !== undefined;\n const isControlled = (isValueControlled || isCheckedControlled) && CONTROLLABLE_TAGS.includes(tag.toUpperCase());\n if (!isControlled) {\n return;\n }\n\n const {\n value, checked, onInput, onChange,\n } = props;\n\n props.onChange = undefined;\n props.onInput = (e: React.ChangeEvent<HTMLInputElement>) => {\n onInput?.(e);\n onChange?.(e);\n\n if (value !== undefined) {\n e.currentTarget.value = value;\n }\n\n if (checked !== undefined) {\n e.currentTarget.checked = checked;\n }\n };\n}\n\nfunction processUncontrolledOnMount(element: HTMLElement, props: AnyLiteral) {\n if (!CONTROLLABLE_TAGS.includes(element.tagName)) {\n return;\n }\n\n if (props.defaultValue) {\n setAttribute(element, 'value', props.defaultValue);\n }\n\n if (props.defaultChecked) {\n setAttribute(element, 'checked', props.defaultChecked);\n }\n}\n\nfunction updateAttributes($current: VirtualElementParent, $new: VirtualElementParent, element: HTMLElement) {\n processControlled(element.tagName, $new.props);\n\n const currentEntries = Object.entries($current.props);\n const newEntries = Object.entries($new.props);\n\n currentEntries.forEach(([key, currentValue]) => {\n const newValue = $new.props[key];\n\n if (\n currentValue !== undefined\n && (\n newValue === undefined\n || (currentValue !== newValue && key.startsWith('on'))\n )\n ) {\n removeAttribute(element, key, currentValue);\n }\n });\n\n newEntries.forEach(([key, newValue]) => {\n const currentValue = $current.props[key];\n\n if (newValue !== undefined && newValue !== currentValue) {\n setAttribute(element, key, newValue);\n }\n });\n}\n\nfunction setAttribute(element: HTMLElement, key: string, value: any) {\n // An optimization attempt\n if (key === 'className') {\n element.className = value;\n // An optimization attempt\n } else if (key === 'value') {\n if ((element as HTMLInputElement).value !== value) {\n (element as HTMLInputElement).value = value;\n }\n } else if (key === 'style') {\n element.style.cssText = value;\n } else if (key === 'dangerouslySetInnerHTML') {\n // eslint-disable-next-line no-underscore-dangle\n element.innerHTML = value.__html;\n } else if (key.startsWith('on')) {\n addEventListener(element, key, value, key.endsWith('Capture'));\n } else if (key.startsWith('data-') || key.startsWith('aria-') || HTML_ATTRIBUTES.has(key)) {\n element.setAttribute(key, value);\n } else if (!FILTERED_ATTRIBUTES.has(key)) {\n (element as any)[MAPPED_ATTRIBUTES[key] || key] = value;\n }\n}\n\nfunction removeAttribute(element: HTMLElement, key: string, value: any) {\n if (key === 'className') {\n element.className = '';\n } else if (key === 'value') {\n (element as HTMLInputElement).value = '';\n } else if (key === 'style') {\n element.style.cssText = '';\n } else if (key === 'dangerouslySetInnerHTML') {\n element.innerHTML = '';\n } else if (key.startsWith('on')) {\n removeEventListener(element, key, value, key.endsWith('Capture'));\n } else if (key.startsWith('data-') || key.startsWith('aria-') || HTML_ATTRIBUTES.has(key)) {\n element.removeAttribute(key);\n } else if (!FILTERED_ATTRIBUTES.has(key)) {\n delete (element as any)[MAPPED_ATTRIBUTES[key] || key];\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction DEBUG_addToVirtualTreeSize($current: VirtualElementParent | VirtualDomHead) {\n DEBUG_virtualTreeSize += $current.children.length;\n\n $current.children.forEach(($child) => {\n if (isParentElement($child)) {\n DEBUG_addToVirtualTreeSize($child);\n }\n });\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction DEBUG_checkKeyUniqueness(children: VirtualElementChildren) {\n const firstChild = children[0];\n if (firstChild && 'props' in firstChild && firstChild.props.key !== undefined) {\n const keys = children.reduce((acc: any[], child) => {\n if ('props' in child && child.props.key) {\n acc.push(child.props.key);\n }\n\n return acc;\n }, []);\n\n if (keys.length !== unique(keys).length) {\n throw new Error('[Teact] Children keys are not unique');\n }\n }\n}\n\nconst TeactDOM = { render };\nexport default TeactDOM;\n","import type { ReactElement } from 'react';\nimport { DEBUG, DEBUG_MORE } from '../../config';\nimport {\n fastRaf, fastRafPrimary, onTickEnd, onTickEndPrimary, throttleWithPrimaryRaf, throttleWithRaf,\n} from '../../util/schedulers';\nimport { orderBy } from '../../util/iteratees';\nimport { getUnequalProps } from '../../util/arePropsShallowEqual';\nimport { handleError } from '../../util/handleError';\n\nexport type Props = AnyLiteral;\nexport type FC<P extends Props = any> = (props: P) => any;\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport type FC_withDebug = FC & {\n DEBUG_contentComponentName?: string;\n};\n\nexport enum VirtualElementTypesEnum {\n Empty,\n Text,\n Tag,\n Component,\n}\n\ninterface VirtualElementEmpty {\n type: VirtualElementTypesEnum.Empty;\n target?: Node;\n}\n\ninterface VirtualElementText {\n type: VirtualElementTypesEnum.Text;\n target?: Node;\n value: string;\n}\n\nexport interface VirtualElementTag {\n type: VirtualElementTypesEnum.Tag;\n target?: Node;\n tag: string;\n props: Props;\n children: VirtualElementChildren;\n}\n\nexport interface VirtualElementComponent {\n type: VirtualElementTypesEnum.Component;\n componentInstance: ComponentInstance;\n props: Props;\n children: VirtualElementChildren;\n}\n\nexport type StateHookSetter<T> = (newValue: ((current: T) => T) | T) => void;\n\ninterface ComponentInstance {\n $element: VirtualElementComponent;\n Component: FC;\n name: string;\n props: Props;\n renderedValue?: any;\n isMounted: boolean;\n hooks: {\n state: {\n cursor: number;\n byCursor: {\n value: any;\n nextValue: any;\n setter: StateHookSetter<any>;\n }[];\n };\n effects: {\n cursor: number;\n byCursor: {\n effect: () => void;\n dependencies?: readonly any[];\n cleanup?: Function;\n }[];\n };\n memos: {\n cursor: number;\n byCursor: {\n value: any;\n dependencies: any[];\n }[];\n };\n refs: {\n cursor: number;\n byCursor: {\n current: any;\n }[];\n };\n };\n prepareForFrame?: () => void;\n forceUpdate?: () => void;\n onUpdate?: () => void;\n}\n\nexport type VirtualElement =\n VirtualElementEmpty\n | VirtualElementText\n | VirtualElementTag\n | VirtualElementComponent;\nexport type VirtualElementParent =\n VirtualElementTag\n | VirtualElementComponent;\nexport type VirtualElementChildren = VirtualElement[];\nexport type VirtualElementReal = Exclude<VirtualElement, VirtualElementComponent>;\n\n// Compatibility with JSX types\nexport type TeactNode =\n ReactElement\n | string\n | number\n | boolean;\n\nconst Fragment = Symbol('Fragment');\n\nconst DEBUG_RENDER_THRESHOLD = 7;\nconst DEBUG_EFFECT_THRESHOLD = 7;\nconst DEBUG_SILENT_RENDERS_FOR = new Set(['TeactMemoWrapper', 'TeactNContainer', 'Button', 'ListItem', 'MenuItem']);\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 isParentElement($element: VirtualElement): $element is VirtualElementParent {\n return isTagElement($element) || isComponentElement($element);\n}\n\nfunction createElement(\n source: string | FC | typeof Fragment,\n props: Props,\n ...children: any[]\n): VirtualElementParent | VirtualElementChildren {\n if (!props) {\n props = {};\n }\n\n children = children.flat();\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 refs: {\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 builtChildren = dropEmptyTail(children).map(buildChildElement);\n\n return {\n type: VirtualElementTypesEnum.Component,\n componentInstance,\n props: componentInstance.props,\n children: builtChildren.length ? builtChildren : [buildEmptyElement()],\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 (isParentElement(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\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst DEBUG_components: AnyLiteral = {};\n\ndocument.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.warn('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 componentInstance.hooks.refs.cursor = 0;\n\n const { Component, props } = componentInstance;\n let newRenderedValue;\n\n try {\n // eslint-disable-next-line @typescript-eslint/naming-convention\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 (!DEBUG_SILENT_RENDERS_FOR.has(componentName)) {\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 duration = performance.now() - DEBUG_startAt!;\n const componentName = componentInstance.name;\n if (duration > DEBUG_RENDER_THRESHOLD) {\n // eslint-disable-next-line no-console\n console.warn(`[Teact] Slow component render: ${componentName}, ${Math.round(duration)} ms`);\n }\n DEBUG_components[componentName].renderTimes.push(duration);\n DEBUG_components[componentName].renderCount++;\n }\n } catch (err: any) {\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 children = Array.isArray(newRenderedValue) ? newRenderedValue : [newRenderedValue];\n componentInstance.$element = buildComponentElement(componentInstance, children);\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 mountComponent(componentInstance: ComponentInstance) {\n renderComponent(componentInstance);\n componentInstance.isMounted = true;\n return componentInstance.$element;\n}\n\nexport function unmountComponent(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted) {\n return;\n }\n\n componentInstance.hooks.effects.byCursor.forEach((effect) => {\n if (effect.cleanup) {\n try {\n effect.cleanup();\n } catch (err: any) {\n handleError(err);\n } finally {\n effect.cleanup = undefined;\n }\n }\n });\n\n componentInstance.isMounted = false;\n\n helpGc(componentInstance);\n}\n\n// We need to remove all references to DOM objects. We also clean all other references, just in case\nfunction helpGc(componentInstance: ComponentInstance) {\n componentInstance.hooks.effects.byCursor.forEach((hook) => {\n hook.cleanup = undefined;\n hook.effect = undefined as any;\n hook.dependencies = undefined;\n });\n\n componentInstance.hooks.state.byCursor.forEach((hook) => {\n hook.value = undefined;\n hook.nextValue = undefined;\n hook.setter = undefined as any;\n });\n\n componentInstance.hooks.memos.byCursor.forEach((hook) => {\n hook.value = undefined as any;\n hook.dependencies = undefined as any;\n });\n\n componentInstance.hooks.refs.byCursor.forEach((hook) => {\n hook.current = undefined as any;\n });\n\n componentInstance.hooks = undefined as any;\n componentInstance.$element = undefined as any;\n componentInstance.renderedValue = undefined;\n componentInstance.Component = undefined as any;\n componentInstance.props = undefined as any;\n componentInstance.forceUpdate = undefined;\n componentInstance.onUpdate = undefined;\n}\n\nfunction prepareComponentForFrame(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted) {\n return;\n }\n\n componentInstance.hooks.state.byCursor.forEach((hook) => {\n hook.value = hook.nextValue;\n });\n\n componentInstance.prepareForFrame = throttleWithPrimaryRaf(() => prepareComponentForFrame(componentInstance));\n componentInstance.forceUpdate = throttleWithRaf(() => forceUpdateComponent(componentInstance));\n}\n\nfunction forceUpdateComponent(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted || !componentInstance.onUpdate) {\n return;\n }\n\n const currentElement = componentInstance.$element;\n\n renderComponent(componentInstance);\n\n if (componentInstance.$element !== currentElement) {\n componentInstance.onUpdate();\n }\n}\n\nexport function useState<T>(initial?: T, debugKey?: string): [T, StateHookSetter<T>] {\n const { cursor, byCursor } = renderingInstance.hooks.state;\n\n if (byCursor[cursor] === undefined) {\n byCursor[cursor] = {\n value: initial,\n nextValue: initial,\n setter: ((componentInstance) => (newValue: ((current: T) => T) | T) => {\n if (byCursor[cursor].nextValue !== newValue) {\n byCursor[cursor].nextValue = typeof newValue === 'function'\n ? (newValue as (current: T) => T)(byCursor[cursor].value)\n : newValue;\n\n if (!componentInstance.prepareForFrame || !componentInstance.forceUpdate) {\n componentInstance.prepareForFrame = throttleWithPrimaryRaf(\n () => prepareComponentForFrame(componentInstance),\n );\n componentInstance.forceUpdate = throttleWithRaf(\n () => forceUpdateComponent(componentInstance),\n );\n }\n\n componentInstance.prepareForFrame();\n componentInstance.forceUpdate();\n\n if (DEBUG_MORE) {\n if (componentInstance.name !== 'TeactNContainer') {\n // eslint-disable-next-line no-console\n console.log(\n '[Teact.useState]',\n componentInstance.name,\n // `componentInstance.Component` may be set to `null` by GC helper\n componentInstance.Component && (componentInstance.Component as FC_withDebug).DEBUG_contentComponentName\n ? `> ${(componentInstance.Component as FC_withDebug).DEBUG_contentComponentName}`\n : '',\n debugKey\n ? `State update for ${debugKey}, next value: `\n : `State update at cursor #${cursor}, next value: `,\n byCursor[cursor].nextValue,\n );\n }\n }\n }\n })(renderingInstance),\n };\n }\n\n renderingInstance.hooks.state.cursor++;\n\n return [\n byCursor[cursor].value,\n byCursor[cursor].setter,\n ];\n}\n\nfunction useLayoutEffectBase(\n schedulerFn: typeof onTickEnd | typeof requestAnimationFrame,\n primarySchedulerFn: typeof onTickEnd | typeof requestAnimationFrame,\n effect: () => Function | void,\n dependencies?: readonly any[],\n debugKey?: string,\n) {\n const { cursor, byCursor } = renderingInstance.hooks.effects;\n const componentInstance = renderingInstance;\n\n function execCleanup() {\n if (!componentInstance.isMounted) {\n return;\n }\n\n const { cleanup } = byCursor[cursor];\n if (!cleanup) {\n return;\n }\n\n try {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n let DEBUG_startAt: number | undefined;\n if (DEBUG) {\n DEBUG_startAt = performance.now();\n }\n\n cleanup();\n\n if (DEBUG) {\n const duration = performance.now() - DEBUG_startAt!;\n const componentName = componentInstance.name;\n if (duration > DEBUG_EFFECT_THRESHOLD) {\n // eslint-disable-next-line no-console\n console.warn(\n `[Teact] Slow cleanup at effect cursor #${cursor}: ${componentName}, ${Math.round(duration)} ms`,\n );\n }\n }\n } catch (err: any) {\n handleError(err);\n } finally {\n byCursor[cursor].cleanup = undefined;\n }\n }\n\n function exec() {\n if (!componentInstance.isMounted) {\n return;\n }\n\n execCleanup();\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n let DEBUG_startAt: number | undefined;\n if (DEBUG) {\n DEBUG_startAt = performance.now();\n }\n\n const result = effect();\n if (typeof result === 'function') {\n byCursor[cursor].cleanup = result;\n }\n\n if (DEBUG) {\n const duration = performance.now() - DEBUG_startAt!;\n const componentName = componentInstance.name;\n if (duration > DEBUG_EFFECT_THRESHOLD) {\n // eslint-disable-next-line no-console\n console.warn(`[Teact] Slow effect at cursor #${cursor}: ${componentName}, ${Math.round(duration)} ms`);\n }\n }\n }\n\n if (byCursor[cursor] !== undefined && dependencies && byCursor[cursor].dependencies) {\n if (dependencies.some((dependency, i) => dependency !== byCursor[cursor].dependencies![i])) {\n if (debugKey) {\n const causedBy = dependencies.reduce((res, newValue, i) => {\n const prevValue = byCursor[cursor].dependencies![i];\n if (newValue !== prevValue) {\n res.push(`${i}: ${prevValue} => ${newValue}`);\n }\n\n return res;\n }, []);\n\n // eslint-disable-next-line no-console\n console.log(`[Teact] Effect \"${debugKey}\" caused by dependencies.`, causedBy.join(', '));\n }\n\n primarySchedulerFn(execCleanup);\n schedulerFn(exec);\n }\n } else {\n if (debugKey) {\n // eslint-disable-next-line no-console\n console.log(`[Teact] Effect \"${debugKey}\" caused by missing dependencies.`);\n }\n\n primarySchedulerFn(execCleanup);\n schedulerFn(exec);\n }\n\n byCursor[cursor] = {\n effect,\n dependencies,\n cleanup: byCursor[cursor]?.cleanup,\n };\n\n renderingInstance.hooks.effects.cursor++;\n}\n\nexport function useEffect(effect: () => Function | void, dependencies?: readonly any[], debugKey?: string) {\n return useLayoutEffectBase(fastRaf, fastRafPrimary, effect, dependencies, debugKey);\n}\n\nexport function useLayoutEffect(effect: () => Function | void, dependencies?: readonly any[], debugKey?: string) {\n return useLayoutEffectBase(onTickEnd, onTickEndPrimary, effect, dependencies, debugKey);\n}\n\nexport function useMemo<T extends any>(resolver: () => T, dependencies: any[], debugKey?: string): T {\n const { cursor, byCursor } = renderingInstance.hooks.memos;\n let { value } = byCursor[cursor] || {};\n\n if (\n byCursor[cursor] === undefined\n || dependencies.some((dependency, i) => dependency !== byCursor[cursor].dependencies[i])\n ) {\n if (DEBUG && debugKey) {\n // eslint-disable-next-line no-console\n console.log(\n `[Teact.useMemo] ${renderingInstance.name} (${debugKey}): Update is caused by:`,\n byCursor[cursor]\n ? getUnequalProps(dependencies, byCursor[cursor].dependencies).join(', ')\n : '[first render]',\n );\n }\n\n value = resolver();\n }\n\n byCursor[cursor] = {\n value,\n dependencies,\n };\n\n renderingInstance.hooks.memos.cursor++;\n\n return value;\n}\n\nexport function useCallback<F extends AnyFunction>(newCallback: F, dependencies: any[], debugKey?: string): F {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => newCallback, dependencies, debugKey);\n}\n\nexport function useRef<T>(initial: T): { current: T };\nexport function useRef<T>(): { current: T | undefined }; // TT way (empty is `undefined`)\nexport function useRef<T>(initial: null): { current: T | null }; // React way (empty is `null`)\n// eslint-disable-next-line no-null/no-null\nexport function useRef<T>(initial?: T | null) {\n const { cursor, byCursor } = renderingInstance.hooks.refs;\n if (!byCursor[cursor]) {\n byCursor[cursor] = {\n current: initial,\n };\n }\n\n renderingInstance.hooks.refs.cursor++;\n\n return byCursor[cursor];\n}\n\nexport function memo<T extends FC>(Component: T, debugKey?: string) {\n return function TeactMemoWrapper(props: Props) {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => createElement(Component, props), Object.values(props), debugKey);\n } as T;\n}\n\nexport default {\n createElement,\n Fragment,\n};\n","import type { FC, FC_withDebug, Props } from './teact';\nimport React, { useEffect, useState } from './teact';\n\nimport { DEBUG, DEBUG_MORE } from '../../config';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport generateIdFor from '../../util/generateIdFor';\nimport { fastRaf, throttleWithTickEnd } from '../../util/schedulers';\nimport arePropsShallowEqual, { getUnequalProps } from '../../util/arePropsShallowEqual';\nimport { orderBy } from '../../util/iteratees';\nimport { handleError } from '../../util/handleError';\nimport { isHeavyAnimating } from '../../hooks/useHeavyAnimationCheck';\n\nexport default React;\n\ntype GlobalState =\n AnyLiteral\n & { DEBUG_capturedId?: number };\ntype ActionNames = string;\ntype ActionPayload = any;\n\ninterface ActionOptions {\n forceOnHeavyAnimation?: boolean;\n // Workaround for iOS gesture history navigation\n forceSyncOnIOs?: boolean;\n}\n\ntype Actions = Record<ActionNames, (payload?: ActionPayload, options?: ActionOptions) => void>;\n\ntype ActionHandler = (\n global: GlobalState,\n actions: Actions,\n payload: any,\n) => GlobalState | void | Promise<void>;\n\ntype MapStateToProps<OwnProps = undefined> = ((global: GlobalState, ownProps: OwnProps) => AnyLiteral);\n\nlet currentGlobal = {} as GlobalState;\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nlet DEBUG_currentCapturedId: number | undefined;\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst DEBUG_releaseCapturedIdThrottled = throttleWithTickEnd(() => {\n DEBUG_currentCapturedId = undefined;\n});\n\nconst actionHandlers: Record<string, ActionHandler[]> = {};\nconst callbacks: Function[] = [updateContainers];\nconst actions = {} as Actions;\nconst containers = new Map<string, {\n mapStateToProps: MapStateToProps<any>;\n ownProps: Props;\n mappedProps?: Props;\n forceUpdate: Function;\n areMappedPropsChanged: boolean;\n DEBUG_updates: number;\n DEBUG_componentName: string;\n}>();\n\nconst runCallbacksThrottled = throttleWithTickEnd(runCallbacks);\n\nfunction runCallbacks(forceOnHeavyAnimation = false) {\n if (!forceOnHeavyAnimation && isHeavyAnimating()) {\n fastRaf(runCallbacksThrottled);\n return;\n }\n\n callbacks.forEach((cb) => cb(currentGlobal));\n}\n\nexport function setGlobal(newGlobal?: GlobalState, options?: ActionOptions) {\n if (typeof newGlobal === 'object' && newGlobal !== currentGlobal) {\n if (DEBUG) {\n if (newGlobal.DEBUG_capturedId && newGlobal.DEBUG_capturedId !== DEBUG_currentCapturedId) {\n throw new Error('[TeactN.setGlobal] Attempt to set an outdated global');\n }\n\n DEBUG_currentCapturedId = undefined;\n }\n\n currentGlobal = newGlobal;\n if (options?.forceSyncOnIOs) {\n runCallbacks(true);\n } else {\n runCallbacksThrottled(options?.forceOnHeavyAnimation);\n }\n }\n}\n\nexport function getGlobal() {\n if (DEBUG) {\n DEBUG_currentCapturedId = Math.random();\n currentGlobal = {\n ...currentGlobal,\n DEBUG_capturedId: DEBUG_currentCapturedId,\n };\n DEBUG_releaseCapturedIdThrottled();\n }\n\n return currentGlobal;\n}\n\nexport function getActions() {\n return actions;\n}\n\nlet actionQueue: NoneToVoidFunction[] = [];\n\nfunction handleAction(name: string, payload?: ActionPayload, options?: ActionOptions) {\n actionQueue.push(() => {\n actionHandlers[name]?.forEach((handler) => {\n const response = handler(DEBUG ? getGlobal() : currentGlobal, actions, payload);\n if (!response || typeof response.then === 'function') {\n return;\n }\n\n setGlobal(response as GlobalState, options);\n });\n });\n\n if (actionQueue.length === 1) {\n try {\n while (actionQueue.length) {\n actionQueue[0]();\n actionQueue.shift();\n }\n } finally {\n actionQueue = [];\n }\n }\n}\n\nfunction updateContainers() {\n // eslint-disable-next-line @typescript-eslint/naming-convention\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, ownProps, mappedProps, forceUpdate,\n } = container;\n\n let newMappedProps;\n\n try {\n newMappedProps = mapStateToProps(currentGlobal, ownProps);\n } catch (err: any) {\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 addActionHandler(name: ActionNames, handler: ActionHandler) {\n if (!actionHandlers[name]) {\n actionHandlers[name] = [];\n\n actions[name] = (payload?: ActionPayload, options?: ActionOptions) => {\n handleAction(name, payload, options);\n };\n }\n\n actionHandlers[name].push(handler);\n}\n\nexport function addCallback(cb: Function) {\n callbacks.push(cb);\n}\n\nexport function removeCallback(cb: Function) {\n const index = callbacks.indexOf(cb);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n}\n\nexport function withGlobal<OwnProps>(\n mapStateToProps: MapStateToProps<OwnProps> = () => ({}),\n) {\n return (Component: FC) => {\n return function TeactNContainer(props: OwnProps) {\n (TeactNContainer as FC_withDebug).DEBUG_contentComponentName = Component.name;\n\n const [id] = useState(generateIdFor(containers));\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n return () => {\n containers.delete(id);\n };\n }, [id]);\n\n let container = containers.get(id);\n if (!container) {\n container = {\n mapStateToProps,\n 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 = mapStateToProps(currentGlobal, props);\n } catch (err: any) {\n handleError(err);\n }\n }\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return <Component {...container.mappedProps} {...props} />;\n };\n };\n}\n\nexport function typify<ProjectGlobalState, ActionPayloads, NonTypedActionNames extends string = never>() {\n type NonTypedActionPayloads = {\n [ActionName in NonTypedActionNames]: ActionPayload;\n };\n\n type ProjectActionTypes =\n ActionPayloads\n & NonTypedActionPayloads;\n\n type ProjectActionNames = keyof ProjectActionTypes;\n\n type ProjectActions = {\n [ActionName in ProjectActionNames]: (\n payload?: ProjectActionTypes[ActionName],\n options?: ActionOptions,\n ) => void;\n };\n\n type ActionHandlers = {\n [ActionName in keyof ProjectActionTypes]: (\n global: ProjectGlobalState,\n actions: ProjectActions,\n payload: ProjectActionTypes[ActionName],\n ) => ProjectGlobalState | void | Promise<void>;\n };\n\n return {\n getGlobal: getGlobal as () => ProjectGlobalState,\n setGlobal: setGlobal as (state: ProjectGlobalState, options?: ActionOptions) => void,\n getActions: getActions as () => ProjectActions,\n addActionHandler: addActionHandler as <ActionName extends ProjectActionNames>(\n name: ActionName,\n handler: ActionHandlers[ActionName],\n ) => void,\n withGlobal: withGlobal as <OwnProps>(\n mapStateToProps: ((global: ProjectGlobalState, ownProps: OwnProps) => AnyLiteral),\n ) => (Component: FC) => FC<OwnProps>,\n };\n}\n\nif (DEBUG) {\n (window as any).getGlobal = getGlobal;\n\n document.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.warn(\n 'GLOBAL CONTAINERS',\n orderBy(\n Array.from(containers.values())\n .map(({ DEBUG_componentName, DEBUG_updates }) => ({ DEBUG_componentName, DEBUG_updates })),\n 'DEBUG_updates',\n 'desc',\n ),\n );\n });\n}\n","// Copyright Twitter Inc. Licensed under MIT\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\n// Version f8312f3 12.03.2022\n\nconst vs16RegExp = /\\uFE0F/g;\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\n\nexport function removeVS16s(rawEmoji) {\n return rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji;\n}\n\n// This file is generated by source/emoji/scripts/generate.sh\n// eslint-disable-next-line max-len\nexport default /(?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\udef1\\ud83c\\udffb\\u200d\\ud83e\\udef2\\ud83c[\\udffc-\\udfff]|\\ud83e\\udef1\\ud83c\\udffc\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\udef1\\ud83c\\udffd\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\udef1\\ud83c\\udffe\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\udef1\\ud83c\\udfff\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc8f\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc91\\ud83c[\\udffb-\\udfff]|\\ud83e\\udd1d\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d\\udc8f\\udc91]|\\ud83e\\udd1d)|(?:\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1)(?:\\ud83c[\\udffb-\\udfff])?\\u200d(?:\\u2695\\ufe0f|\\u2696\\ufe0f|\\u2708\\ufe0f|\\ud83c[\\udf3e\\udf73\\udf7c\\udf84\\udf93\\udfa4\\udfa8\\udfeb\\udfed]|\\ud83d[\\udcbb\\udcbc\\udd27\\udd2c\\ude80\\ude92]|\\ud83e[\\uddaf-\\uddb3\\uddbc\\uddbd])|(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75]|\\u26f9)((?:\\ud83c[\\udffb-\\udfff]|\\ufe0f)\\u200d[\\u2640\\u2642]\\ufe0f)|(?:\\ud83c[\\udfc3\\udfc4\\udfca]|\\ud83d[\\udc6e\\udc70\\udc71\\udc73\\udc77\\udc81\\udc82\\udc86\\udc87\\ude45-\\ude47\\ude4b\\ude4d\\ude4e\\udea3\\udeb4-\\udeb6]|\\ud83e[\\udd26\\udd35\\udd37-\\udd39\\udd3d\\udd3e\\uddb8\\uddb9\\uddcd-\\uddcf\\uddd4\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f|(?:\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83c\\udff3\\ufe0f\\u200d\\u26a7\\ufe0f|\\ud83c\\udff3\\ufe0f\\u200d\\ud83c\\udf08|\\ud83d\\ude36\\u200d\\ud83c\\udf2b\\ufe0f|\\u2764\\ufe0f\\u200d\\ud83d\\udd25|\\u2764\\ufe0f\\u200d\\ud83e\\ude79|\\ud83c\\udff4\\u200d\\u2620\\ufe0f|\\ud83d\\udc15\\u200d\\ud83e\\uddba|\\ud83d\\udc3b\\u200d\\u2744\\ufe0f|\\ud83d\\udc41\\u200d\\ud83d\\udde8|\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc6f\\u200d\\u2640\\ufe0f|\\ud83d\\udc6f\\u200d\\u2642\\ufe0f|\\ud83d\\ude2e\\u200d\\ud83d\\udca8|\\ud83d\\ude35\\u200d\\ud83d\\udcab|\\ud83e\\udd3c\\u200d\\u2640\\ufe0f|\\ud83e\\udd3c\\u200d\\u2642\\ufe0f|\\ud83e\\uddde\\u200d\\u2640\\ufe0f|\\ud83e\\uddde\\u200d\\u2642\\ufe0f|\\ud83e\\udddf\\u200d\\u2640\\ufe0f|\\ud83e\\udddf\\u200d\\u2642\\ufe0f|\\ud83d\\udc08\\u200d\\u2b1b)|[#*0-9]\\ufe0f?\\u20e3|(?:[©®\\u2122\\u265f]\\ufe0f)|(?:\\ud83c[\\udc04\\udd70\\udd71\\udd7e\\udd7f\\ude02\\ude1a\\ude2f\\ude37\\udf21\\udf24-\\udf2c\\udf36\\udf7d\\udf96\\udf97\\udf99-\\udf9b\\udf9e\\udf9f\\udfcd\\udfce\\udfd4-\\udfdf\\udff3\\udff5\\udff7]|\\ud83d[\\udc3f\\udc41\\udcfd\\udd49\\udd4a\\udd6f\\udd70\\udd73\\udd76-\\udd79\\udd87\\udd8a-\\udd8d\\udda5\\udda8\\uddb1\\uddb2\\uddbc\\uddc2-\\uddc4\\uddd1-\\uddd3\\udddc-\\uddde\\udde1\\udde3\\udde8\\uddef\\uddf3\\uddfa\\udecb\\udecd-\\udecf\\udee0-\\udee5\\udee9\\udef0\\udef3]|[\\u203c\\u2049\\u2139\\u2194-\\u2199\\u21a9\\u21aa\\u231a\\u231b\\u2328\\u23cf\\u23ed-\\u23ef\\u23f1\\u23f2\\u23f8-\\u23fa\\u24c2\\u25aa\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u2600-\\u2604\\u260e\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262a\\u262e\\u262f\\u2638-\\u263a\\u2640\\u2642\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267b\\u267f\\u2692-\\u2697\\u2699\\u269b\\u269c\\u26a0\\u26a1\\u26a7\\u26aa\\u26ab\\u26b0\\u26b1\\u26bd\\u26be\\u26c4\\u26c5\\u26c8\\u26cf\\u26d1\\u26d3\\u26d4\\u26e9\\u26ea\\u26f0-\\u26f5\\u26f8\\u26fa\\u26fd\\u2702\\u2708\\u2709\\u270f\\u2712\\u2714\\u2716\\u271d\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u2764\\u27a1\\u2934\\u2935\\u2b05-\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u3030\\u303d\\u3297\\u3299])(?:\\ufe0f|(?!\\ufe0e))|(?:(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75\\udd90]|[\\u261d\\u26f7\\u26f9\\u270c\\u270d])(?:\\ufe0f|(?!\\ufe0e))|(?:\\ud83c[\\udf85\\udfc2-\\udfc4\\udfc7\\udfca]|\\ud83d[\\udc42\\udc43\\udc46-\\udc50\\udc66-\\udc69\\udc6e\\udc70-\\udc78\\udc7c\\udc81-\\udc83\\udc85-\\udc87\\udcaa\\udd7a\\udd95\\udd96\\ude45-\\ude47\\ude4b-\\ude4f\\udea3\\udeb4-\\udeb6\\udec0\\udecc]|\\ud83e[\\udd0c\\udd0f\\udd18-\\udd1c\\udd1e\\udd1f\\udd26\\udd30-\\udd39\\udd3d\\udd3e\\udd77\\uddb5\\uddb6\\uddb8\\uddb9\\uddbb\\uddcd-\\uddcf\\uddd1-\\udddd\\udec3-\\udec5\\udef0-\\udef6]|[\\u270a\\u270b]))(?:\\ud83c[\\udffb-\\udfff])?|(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f|\\ud83c\\udde6\\ud83c[\\udde8-\\uddec\\uddee\\uddf1\\uddf2\\uddf4\\uddf6-\\uddfa\\uddfc\\uddfd\\uddff]|\\ud83c\\udde7\\ud83c[\\udde6\\udde7\\udde9-\\uddef\\uddf1-\\uddf4\\uddf6-\\uddf9\\uddfb\\uddfc\\uddfe\\uddff]|\\ud83c\\udde8\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\uddee\\uddf0-\\uddf5\\uddf7\\uddfa-\\uddff]|\\ud83c\\udde9\\ud83c[\\uddea\\uddec\\uddef\\uddf0\\uddf2\\uddf4\\uddff]|\\ud83c\\uddea\\ud83c[\\udde6\\udde8\\uddea\\uddec\\udded\\uddf7-\\uddfa]|\\ud83c\\uddeb\\ud83c[\\uddee-\\uddf0\\uddf2\\uddf4\\uddf7]|\\ud83c\\uddec\\ud83c[\\udde6\\udde7\\udde9-\\uddee\\uddf1-\\uddf3\\uddf5-\\uddfa\\uddfc\\uddfe]|\\ud83c\\udded\\ud83c[\\uddf0\\uddf2\\uddf3\\uddf7\\uddf9\\uddfa]|\\ud83c\\uddee\\ud83c[\\udde8-\\uddea\\uddf1-\\uddf4\\uddf6-\\uddf9]|\\ud83c\\uddef\\ud83c[\\uddea\\uddf2\\uddf4\\uddf5]|\\ud83c\\uddf0\\ud83c[\\uddea\\uddec-\\uddee\\uddf2\\uddf3\\uddf5\\uddf7\\uddfc\\uddfe\\uddff]|\\ud83c\\uddf1\\ud83c[\\udde6-\\udde8\\uddee\\uddf0\\uddf7-\\uddfb\\uddfe]|\\ud83c\\uddf2\\ud83c[\\udde6\\udde8-\\udded\\uddf0-\\uddff]|\\ud83c\\uddf3\\ud83c[\\udde6\\udde8\\uddea-\\uddec\\uddee\\uddf1\\uddf4\\uddf5\\uddf7\\uddfa\\uddff]|\\ud83c\\uddf4\\ud83c\\uddf2|\\ud83c\\uddf5\\ud83c[\\udde6\\uddea-\\udded\\uddf0-\\uddf3\\uddf7-\\uddf9\\uddfc\\uddfe]|\\ud83c\\uddf6\\ud83c\\udde6|\\ud83c\\uddf7\\ud83c[\\uddea\\uddf4\\uddf8\\uddfa\\uddfc]|\\ud83c\\uddf8\\ud83c[\\udde6-\\uddea\\uddec-\\uddf4\\uddf7-\\uddf9\\uddfb\\uddfd-\\uddff]|\\ud83c\\uddf9\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\udded\\uddef-\\uddf4\\uddf7\\uddf9\\uddfb\\uddfc\\uddff]|\\ud83c\\uddfa\\ud83c[\\udde6\\uddec\\uddf2\\uddf3\\uddf8\\uddfe\\uddff]|\\ud83c\\uddfb\\ud83c[\\udde6\\udde8\\uddea\\uddec\\uddee\\uddf3\\uddfa]|\\ud83c\\uddfc\\ud83c[\\uddeb\\uddf8]|\\ud83c\\uddfd\\ud83c\\uddf0|\\ud83c\\uddfe\\ud83c[\\uddea\\uddf9]|\\ud83c\\uddff\\ud83c[\\udde6\\uddf2\\uddfc]|\\ud83c[\\udccf\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01\\ude32-\\ude36\\ude38-\\ude3a\\ude50\\ude51\\udf00-\\udf20\\udf2d-\\udf35\\udf37-\\udf7c\\udf7e-\\udf84\\udf86-\\udf93\\udfa0-\\udfc1\\udfc5\\udfc6\\udfc8\\udfc9\\udfcf-\\udfd3\\udfe0-\\udff0\\udff4\\udff8-\\udfff]|\\ud83d[\\udc00-\\udc3e\\udc40\\udc44\\udc45\\udc51-\\udc65\\udc6a\\udc6f\\udc79-\\udc7b\\udc7d-\\udc80\\udc84\\udc88-\\udc8e\\udc90\\udc92-\\udca9\\udcab-\\udcfc\\udcff-\\udd3d\\udd4b-\\udd4e\\udd50-\\udd67\\udda4\\uddfb-\\ude44\\ude48-\\ude4a\\ude80-\\udea2\\udea4-\\udeb3\\udeb7-\\udebf\\udec1-\\udec5\\uded0-\\uded2\\uded5-\\uded7\\udedd-\\udedf\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb\\udff0]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcc\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7c\\ude80-\\ude86\\ude90-\\udeac\\udeb0-\\udeba\\udec0-\\udec2\\uded0-\\uded9\\udee0-\\udee7]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f/g;\n","import type { TeactNode } from '../lib/teact/teact';\nimport type {\n ApiBotInlineMediaResult, ApiBotInlineResult, ApiBotInlineSwitchPm,\n ApiChatInviteImporter,\n ApiExportedInvite,\n ApiLanguage, ApiMessage, ApiShippingAddress, ApiStickerSet, ApiWebDocument,\n} from '../api/types';\n\nexport type TextPart = TeactNode;\n\nexport enum LoadMoreDirection {\n Backwards,\n Forwards,\n Around,\n}\n\nexport enum FocusDirection {\n Up,\n Down,\n Static,\n}\n\nexport interface IAlbum {\n albumId: string;\n messages: ApiMessage[];\n mainMessage: ApiMessage;\n}\n\nexport type ThemeKey = 'light' | 'dark';\n\nexport interface IThemeSettings {\n background?: string;\n backgroundColor?: string;\n patternColor?: string;\n isBlurred?: boolean;\n}\n\nexport type NotifySettings = {\n hasPrivateChatsNotifications?: boolean;\n hasPrivateChatsMessagePreview?: boolean;\n hasGroupNotifications?: boolean;\n hasGroupMessagePreview?: boolean;\n hasBroadcastNotifications?: boolean;\n hasBroadcastMessagePreview?: boolean;\n hasContactJoinedNotifications?: boolean;\n hasWebNotifications: boolean;\n hasPushNotifications: boolean;\n notificationSoundVolume: number;\n};\n\nexport type LangCode = (\n 'en' | 'ar' | 'be' | 'ca' | 'nl' | 'fr' | 'de' | 'id' | 'it' | 'ko' | 'ms' | 'fa' | 'pl' | 'pt-br' | 'ru' | 'es'\n | 'tr' | 'uk' | 'uz'\n);\n\nexport type TimeFormat = '24h' | '12h';\n\nexport interface ISettings extends NotifySettings, Record<string, any> {\n theme: ThemeKey;\n shouldUseSystemTheme: boolean;\n messageTextSize: number;\n animationLevel: 0 | 1 | 2;\n messageSendKeyCombo: 'enter' | 'ctrl-enter';\n canAutoLoadPhotoFromContacts: boolean;\n canAutoLoadPhotoInPrivateChats: boolean;\n canAutoLoadPhotoInGroups: boolean;\n canAutoLoadPhotoInChannels: boolean;\n canAutoLoadVideoFromContacts: boolean;\n canAutoLoadVideoInPrivateChats: boolean;\n canAutoLoadVideoInGroups: boolean;\n canAutoLoadVideoInChannels: boolean;\n canAutoLoadFileFromContacts: boolean;\n canAutoLoadFileInPrivateChats: boolean;\n canAutoLoadFileInGroups: boolean;\n canAutoLoadFileInChannels: boolean;\n autoLoadFileMaxSizeMb: number;\n canAutoPlayGifs: boolean;\n canAutoPlayVideos: boolean;\n shouldSuggestStickers: boolean;\n shouldLoopStickers: boolean;\n hasPassword?: boolean;\n languages?: ApiLanguage[];\n language: LangCode;\n isSensitiveEnabled?: boolean;\n canChangeSensitive?: boolean;\n timeFormat: TimeFormat;\n wasTimeFormatSetManually: boolean;\n isConnectionStatusMinimized: boolean;\n shouldArchiveAndMuteNewNonContact?: boolean;\n}\n\nexport interface ApiPrivacySettings {\n visibility: PrivacyVisibility;\n allowUserIds: string[];\n allowChatIds: string[];\n blockUserIds: string[];\n blockChatIds: string[];\n}\n\nexport interface InputPrivacyContact {\n id: string;\n accessHash?: string;\n}\n\nexport interface InputPrivacyRules {\n visibility: PrivacyVisibility;\n allowedUsers?: InputPrivacyContact[];\n allowedChats?: InputPrivacyContact[];\n blockedUsers?: InputPrivacyContact[];\n blockedChats?: InputPrivacyContact[];\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 photo?: ApiWebDocument;\n text?: string;\n title?: string;\n}\n\nexport enum SettingsScreens {\n Main,\n EditProfile,\n Notifications,\n DataStorage,\n Language,\n ActiveSessions,\n General,\n GeneralChatBackground,\n GeneralChatBackgroundColor,\n Privacy,\n PrivacyPhoneNumber,\n PrivacyLastSeen,\n PrivacyProfilePhoto,\n PrivacyPhoneCall,\n PrivacyPhoneP2P,\n PrivacyForwarding,\n PrivacyGroupChats,\n PrivacyPhoneNumberAllowedContacts,\n PrivacyPhoneNumberDeniedContacts,\n PrivacyLastSeenAllowedContacts,\n PrivacyLastSeenDeniedContacts,\n PrivacyProfilePhotoAllowedContacts,\n PrivacyProfilePhotoDeniedContacts,\n PrivacyPhoneCallAllowedContacts,\n PrivacyPhoneCallDeniedContacts,\n PrivacyPhoneP2PAllowedContacts,\n PrivacyPhoneP2PDeniedContacts,\n PrivacyForwardingAllowedContacts,\n PrivacyForwardingDeniedContacts,\n PrivacyGroupChatsAllowedContacts,\n PrivacyGroupChatsDeniedContacts,\n PrivacyBlockedUsers,\n Folders,\n FoldersCreateFolder,\n FoldersEditFolder,\n FoldersEditFolderFromChatList,\n FoldersIncludedChats,\n FoldersIncludedChatsFromChatList,\n FoldersExcludedChats,\n FoldersExcludedChatsFromChatList,\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 QuickReaction,\n ActiveWebsites,\n PasscodeDisabled,\n PasscodeNewPasscode,\n PasscodeNewPasscodeConfirm,\n PasscodeEnabled,\n PasscodeChangePasscodeCurrent,\n PasscodeChangePasscodeNew,\n PasscodeChangePasscodeConfirm,\n PasscodeTurnOff,\n PasscodeCongratulations,\n Experimental,\n}\n\nexport type StickerSetOrRecent = Pick<ApiStickerSet, (\n 'id' | 'title' | 'count' | 'stickers' | 'hasThumbnail' | 'isLottie' | 'isVideos'\n)>;\n\nexport enum LeftColumnContent {\n ChatList,\n GlobalSearch,\n Settings,\n Contacts,\n Archived,\n NewChannelStep1,\n NewChannelStep2,\n NewGroupStep1,\n NewGroupStep2,\n}\n\nexport enum GlobalSearchContent {\n ChatList,\n Media,\n Links,\n Files,\n Music,\n Voice,\n}\n\nexport enum RightColumnContent {\n ChatInfo,\n Search,\n Management,\n Statistics,\n MessageStatistics,\n StickerSearch,\n GifSearch,\n PollResults,\n AddingMembers,\n}\n\nexport enum MediaViewerOrigin {\n Inline,\n ScheduledInline,\n SharedMedia,\n ProfileAvatar,\n SettingsAvatar,\n MiddleHeaderAvatar,\n Album,\n ScheduledAlbum,\n SearchResult,\n}\n\nexport enum AudioOrigin {\n Inline,\n SharedMedia,\n Search,\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 interface ManagementState {\n isActive: boolean;\n nextScreen?: ManagementScreens;\n isUsernameAvailable?: boolean;\n error?: string;\n invites?: ApiExportedInvite[];\n revokedInvites?: ApiExportedInvite[];\n editingInvite?: ApiExportedInvite;\n inviteInfo?: {\n invite: ApiExportedInvite;\n importers?: ApiChatInviteImporter[];\n requesters?: ApiChatInviteImporter[];\n };\n}\n\nexport enum NewChatMembersProgress {\n Closed,\n InProgress,\n Loading,\n}\n\nexport type ProfileTabType = 'members' | 'commonChats' | 'media' | 'documents' | 'links' | 'audio' | 'voice';\nexport type SharedMediaType = 'media' | 'documents' | 'links' | 'audio' | 'voice';\nexport type ApiPrivacyKey = 'phoneNumber' | 'lastSeen' | 'profilePhoto' |\n'forwards' | 'chatInvite' | 'phoneCall' | 'phoneP2P';\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 ConfirmPayment,\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 ChannelRemovedUsers,\n GroupUserPermissionsCreate,\n GroupUserPermissions,\n ChatAdministrators,\n GroupRecentActions,\n ChatAdminRights,\n ChatNewAdminRights,\n GroupMembers,\n GroupAddAdmins,\n Invites,\n EditInvite,\n Reactions,\n InviteInfo,\n JoinRequests,\n}\n\nexport type ManagementType = 'user' | 'group' | 'channel';\n\nexport type NotifyException = {\n isMuted: boolean;\n isSilent?: boolean;\n shouldShowPreviews?: boolean;\n};\n\nexport type EmojiKeywords = {\n isLoading?: boolean;\n version: number;\n keywords: Record<string, string[]>;\n};\n\nexport type InlineBotSettings = {\n id: string;\n help?: string;\n query?: string;\n offset?: string;\n canLoadMore?: boolean;\n results?: (ApiBotInlineResult | ApiBotInlineMediaResult)[];\n isGallery?: boolean;\n switchPm?: ApiBotInlineSwitchPm;\n};\n","import { 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 if (!instance!.isCancelled && tick()) {\n fastRaf(() => {\n animateSingle(tick, instance);\n });\n }\n}\n\nexport function animate(tick: Function) {\n if (tick()) {\n fastRaf(() => {\n animate(tick);\n });\n }\n}\n\nexport type TimingFn = (t: number) => number;\n\nexport type AnimateNumberProps = {\n to: number | number[];\n from: number | number[];\n duration: number;\n onUpdate: (value: any) => void;\n timing?: TimingFn;\n onEnd?: () => void;\n};\n\nexport const timingFunctions = {\n linear: (t: number) => t,\n easeIn: (t: number) => t ** 1.675,\n easeOut: (t: number) => -1 * t ** 1.675,\n easeInOut: (t: number) => 0.5 * (Math.sin((t - 0.5) * Math.PI) + 1),\n easeInQuad: (t: number) => t * t,\n easeOutQuad: (t: number) => t * (2 - t),\n easeInOutQuad: (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n easeInCubic: (t: number) => t ** 3,\n easeOutCubic: (t: number) => (--t) * t * t + 1,\n easeInOutCubic: (t: number) => (t < 0.5 ? 4 * t ** 3 : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1),\n easeInQuart: (t: number) => t ** 4,\n easeOutQuart: (t: number) => 1 - (--t) * t ** 3,\n easeInOutQuart: (t: number) => (t < 0.5 ? 8 * t ** 4 : 1 - 8 * (--t) * t ** 3),\n easeInQuint: (t: number) => t ** 5,\n easeOutQuint: (t: number) => 1 + (--t) * t ** 4,\n easeInOutQuint: (t: number) => (t < 0.5 ? 16 * t ** 5 : 1 + 16 * (--t) * t ** 4),\n};\n\nexport function animateNumber({\n timing = timingFunctions.linear,\n onUpdate,\n duration,\n onEnd,\n from,\n to,\n}: AnimateNumberProps) {\n const t0 = Date.now();\n let canceled = false;\n\n animate(() => {\n if (canceled) return false;\n const t1 = Date.now();\n let t = (t1 - t0) / duration;\n if (t > 1) t = 1;\n const progress = timing(t);\n if (typeof from === 'number' && typeof to === 'number') {\n onUpdate(from + ((to - from) * progress));\n } else if (Array.isArray(from) && Array.isArray(to)) {\n const result = from.map((f, i) => f + ((to[i] - f) * progress));\n onUpdate(result);\n }\n if (t === 1 && onEnd) onEnd();\n return t < 1;\n });\n\n return () => {\n canceled = true;\n if (onEnd) onEnd();\n };\n}\n","import { DEBUG } from '../config';\n\nexport function updateAppBadge(unreadCount: number) {\n if (typeof window.navigator.setAppBadge !== 'function') {\n return;\n }\n\n window.navigator.setAppBadge(unreadCount).catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n });\n}\n","export default function arePropsShallowEqual(currentProps: AnyLiteral, newProps: AnyLiteral) {\n if (currentProps === newProps) {\n return true;\n }\n\n const currentKeys = Object.keys(currentProps);\n const currentKeysLength = currentKeys.length;\n const newKeysLength = Object.keys(newProps).length;\n\n if (currentKeysLength !== newKeysLength) {\n return false;\n }\n\n if (currentKeysLength === 0) {\n return true;\n }\n\n for (let i = 0; i < currentKeysLength; i++) {\n const prop = currentKeys[i];\n if (currentProps[prop] !== newProps[prop]) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function getUnequalProps(currentProps: AnyLiteral, newProps: AnyLiteral) {\n const currentKeys = Object.keys(currentProps);\n const currentKeysLength = currentKeys.length;\n const newKeysLength = Object.keys(newProps).length;\n\n if (currentKeysLength !== newKeysLength) {\n return ['%LENGTH%'];\n }\n\n return currentKeys.reduce((res, prop) => {\n if (currentProps[prop] !== newProps[prop]) {\n res.push(`${prop}: ${currentProps[prop]} => ${newProps[prop]}`);\n }\n\n return res;\n }, [] as string[]);\n}\n","type Parts = (string | false | undefined)[];\ntype PartsWithGlobals = (string | false | undefined | string[])[];\ntype ClassNameBuilder =\n ((elementName: string, ...modifiers: PartsWithGlobals) => string)\n & Record<string, string>;\n\nexport default function buildClassName(...parts: Parts) {\n return parts.filter(Boolean).join(' ');\n}\n\nexport function createClassNameBuilder(componentName: string) {\n return ((elementName: string, ...modifiers: PartsWithGlobals) => {\n const baseName = elementName === '&' ? componentName : `${componentName}__${elementName}`;\n\n return modifiers.reduce<string[]>((acc, modifier) => {\n if (modifier) {\n // A bit hacky way to pass global class names\n if (Array.isArray(modifier)) {\n acc.push(...modifier);\n } else {\n acc.push(`${baseName}--${modifier}`);\n }\n }\n\n return acc;\n }, [baseName]).join(' ');\n }) as ClassNameBuilder;\n}\n","type Parts = (string | false | undefined)[];\n\nexport default function buildStyle(...parts: Parts) {\n return parts.filter(Boolean).join(';');\n}\n","// eslint-disable-next-line no-restricted-globals\nconst cacheApi = self.caches;\n\nexport enum Type {\n Text,\n Blob,\n Json,\n ArrayBuffer,\n}\n\nexport async function fetch(\n cacheName: string, key: string, type: Type, isHtmlAllowed = false,\n) {\n if (!cacheApi) {\n return undefined;\n }\n\n try {\n // To avoid the error \"Request scheme 'webdocument' is unsupported\"\n const request = new Request(key.replace(/:/g, '_'));\n const cache = await cacheApi.open(cacheName);\n const response = await cache.match(request);\n if (!response) {\n return undefined;\n }\n\n const contentType = response.headers.get('Content-Type');\n\n switch (type) {\n case Type.Text:\n return await response.text();\n case Type.Blob: {\n // Ignore deprecated data-uri avatars\n if (key.startsWith('avatar') && contentType && contentType.startsWith('text')) {\n return undefined;\n }\n\n const blob = await response.blob();\n const shouldRecreate = !blob.type || (!isHtmlAllowed && blob.type.includes('html'));\n // iOS Safari fails to preserve `type` in cache\n let resolvedType = blob.type || contentType;\n\n if (!(shouldRecreate && resolvedType)) {\n return blob;\n }\n\n // Prevent HTML-in-video attacks (for files that were cached before fix)\n if (!isHtmlAllowed) {\n resolvedType = resolvedType.replace(/html/gi, '');\n }\n\n return new Blob([blob], { type: resolvedType });\n }\n case Type.Json:\n return await response.json();\n case Type.ArrayBuffer:\n return await response.arrayBuffer();\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 | ArrayBuffer | string) {\n if (!cacheApi) {\n return undefined;\n }\n\n try {\n const cacheData = typeof data === 'string' || data instanceof Blob || data instanceof ArrayBuffer\n ? data\n : JSON.stringify(data);\n // To avoid the error \"Request scheme 'webdocument' is unsupported\"\n const request = new Request(key.replace(/:/g, '_'));\n const response = new Response(cacheData);\n const cache = await cacheApi.open(cacheName);\n return await cache.put(request, response);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n\nexport async function remove(cacheName: string, key: string) {\n try {\n if (!cacheApi) {\n return undefined;\n }\n\n const cache = await cacheApi.open(cacheName);\n return await cache.delete(key);\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","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 function hasCallbacks() {\n return Boolean(callbacks.length);\n }\n\n return {\n runCallbacks,\n addCallback,\n removeCallback,\n hasCallbacks,\n };\n}\n\nexport type CallbackManager = ReturnType<typeof createCallbackManager>;\n","import captureKeyboardListener from './captureKeyboardListeners';\n\ntype IHandlerFunction = () => void;\n\nexport default function captureEscKeyListener(handler: IHandlerFunction) {\n return captureKeyboardListener({ onEsc: handler });\n}\n","type HandlerName = 'onEnter' | 'onBackspace' | 'onDelete' | 'onEsc' | 'onUp' | 'onDown' | 'onLeft' | 'onRight'\n| 'onTab';\ntype Handler = (e: KeyboardEvent) => void;\ntype CaptureOptions = Partial<Record<HandlerName, Handler>>;\n\nconst keyToHandlerName: Record<string, HandlerName> = {\n Enter: 'onEnter',\n Backspace: 'onBackspace',\n Delete: 'onDelete',\n Esc: 'onEsc',\n Escape: 'onEsc',\n ArrowUp: 'onUp',\n ArrowDown: 'onDown',\n ArrowLeft: 'onLeft',\n ArrowRight: 'onRight',\n Tab: 'onTab',\n};\n\nconst handlers: Record<HandlerName, Handler[]> = {\n onEnter: [],\n onDelete: [],\n onBackspace: [],\n onEsc: [],\n onUp: [],\n onDown: [],\n onLeft: [],\n onRight: [],\n onTab: [],\n};\n\nexport default function captureKeyboardListeners(options: CaptureOptions) {\n if (!hasActiveHandlers()) {\n document.addEventListener('keydown', handleKeyDown, true);\n }\n\n (Object.keys(options) as Array<HandlerName>).forEach((handlerName) => {\n const handler = options[handlerName];\n if (!handler) {\n return;\n }\n\n const currentEventHandlers = handlers[handlerName];\n if (currentEventHandlers) {\n currentEventHandlers.push(handler);\n }\n });\n\n return () => {\n releaseKeyboardListener(options);\n };\n}\n\nfunction hasActiveHandlers() {\n return Object.values(handlers).some((keyHandlers) => Boolean(keyHandlers.length));\n}\n\nfunction handleKeyDown(e: KeyboardEvent) {\n const handlerName = keyToHandlerName[e.key];\n if (!handlerName) {\n return;\n }\n\n const { length } = handlers[handlerName];\n if (!length) {\n return;\n }\n e.stopPropagation();\n\n const handler = handlers[handlerName][length - 1];\n handler!(e);\n}\n\nfunction releaseKeyboardListener(options: CaptureOptions) {\n (Object.keys(options) as Array<HandlerName>).forEach((handlerName) => {\n const handler = options[handlerName];\n const currentEventHandlers = handlers[handlerName];\n if (currentEventHandlers) {\n const index = currentEventHandlers.findIndex((cb) => cb === handler);\n if (index !== -1) {\n currentEventHandlers.splice(index, 1);\n }\n }\n });\n\n if (!hasActiveHandlers()) {\n document.removeEventListener('keydown', handleKeyDown, false);\n }\n}\n","import { DEBUG } from '../config';\n\nexport const CLIPBOARD_ITEM_SUPPORTED = window.navigator.clipboard && window.ClipboardItem;\n\nconst textCopyEl = document.createElement('textarea');\ntextCopyEl.setAttribute('readonly', '');\ntextCopyEl.tabIndex = -1;\ntextCopyEl.className = 'visually-hidden';\n\nexport const copyTextToClipboard = (str: string): void => {\n textCopyEl.value = str;\n document.body.appendChild(textCopyEl);\n const selection = document.getSelection();\n\n if (selection) {\n // Store previous selection\n const rangeToRestore = selection.rangeCount > 0 && selection.getRangeAt(0);\n textCopyEl.select();\n document.execCommand('copy');\n // Restore the original selection\n if (rangeToRestore) {\n selection.removeAllRanges();\n selection.addRange(rangeToRestore);\n }\n }\n\n document.body.removeChild(textCopyEl);\n};\n\nexport const copyImageToClipboard = (imageUrl?: string) => {\n if (!imageUrl) return;\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n const imageEl = new Image();\n imageEl.onload = (e: Event) => {\n if (ctx && e.currentTarget) {\n const img = e.currentTarget as HTMLImageElement;\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0, img.width, img.height);\n canvas.toBlob(copyBlobToClipboard, 'image/png', 1);\n }\n };\n\n imageEl.src = imageUrl;\n};\n\nasync function copyBlobToClipboard(pngBlob: Blob | null) {\n if (!pngBlob || !CLIPBOARD_ITEM_SUPPORTED) {\n return;\n }\n\n try {\n await window.navigator.clipboard.write?.([\n new ClipboardItem({\n [pngBlob.type]: pngBlob,\n }),\n ]);\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n }\n}\n","// Sometimes event is fired earlier than animation completes\nconst ANIMATION_END_DELAY = 50;\n\nexport function waitForTransitionEnd(node: Node, handler: NoneToVoidFunction, propertyName?: string) {\n waitForEndEvent('transitionend', node, handler, propertyName);\n}\n\nexport function waitForAnimationEnd(node: Node, handler: NoneToVoidFunction, animationName?: string) {\n waitForEndEvent('animationend', node, handler, animationName);\n}\n\nfunction waitForEndEvent(\n eventType: 'transitionend' | 'animationend',\n node: Node,\n handler: NoneToVoidFunction,\n detailedName?: string,\n) {\n let isHandled = false;\n\n node.addEventListener(eventType, function handleAnimationEnd(e: TransitionEvent | AnimationEvent) {\n if (isHandled || e.target !== e.currentTarget) {\n return;\n }\n\n if (detailedName && (\n (e instanceof TransitionEvent && e.propertyName === detailedName)\n || (e instanceof AnimationEvent && e.animationName === detailedName)\n )) {\n return;\n }\n\n isHandled = true;\n\n node.removeEventListener(eventType, handleAnimationEnd as EventListener);\n\n setTimeout(() => {\n handler();\n }, ANIMATION_END_DELAY);\n } as EventListener);\n}\n","import type { LangFn } from '../hooks/useLang';\nimport withCache from './withCache';\n\nconst WEEKDAYS_FULL = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\nconst MONTHS_FULL = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December',\n];\n\nconst MONTHS_FULL_LOWERCASE = MONTHS_FULL.map((month) => month.toLowerCase());\nconst MIN_SEARCH_YEAR = 2015;\nconst MAX_DAY_IN_MONTH = 31;\nconst MAX_MONTH_IN_YEAR = 12;\nexport const MILLISECONDS_IN_DAY = 24 * 60 * 60 * 1000;\n\nexport function isToday(date: Date) {\n return getDayStartAt(new Date()) === getDayStartAt(date);\n}\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\n// @optimization `toLocaleTimeString` is avoided because of bad performance\nexport function formatTime(lang: LangFn, datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n const timeFormat = lang.timeFormat || '24h';\n\n let hours = date.getHours();\n let marker = '';\n if (timeFormat === '12h') {\n marker = hours >= 12 ? ' PM' : ' AM';\n hours = hours > 12 ? hours % 12 : hours;\n }\n\n return `${String(hours).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}${marker}`;\n}\n\nexport function formatPastTimeShort(lang: LangFn, datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n const today = getDayStart(new Date());\n if (date >= today) {\n return formatTime(lang, date);\n }\n\n const weekAgo = new Date(today);\n weekAgo.setDate(today.getDate() - 7);\n if (date >= weekAgo) {\n return lang(`Weekday.Short${WEEKDAYS_FULL[date.getDay()]}`);\n }\n\n const noYear = date.getFullYear() === today.getFullYear();\n\n return formatDateToString(date, lang.code, noYear);\n}\n\nexport function formatFullDate(lang: LangFn, datetime: number | Date) {\n return formatDateToString(datetime, lang.code, false, 'numeric');\n}\n\nexport function formatMonthAndYear(lang: LangFn, date: Date, isShort = false) {\n return formatDateToString(date, lang.code, false, isShort ? 'short' : 'long', true);\n}\n\nexport function formatCountdown(\n lang: LangFn,\n msLeft: number,\n) {\n const days = Math.floor(msLeft / MILLISECONDS_IN_DAY);\n if (msLeft < 0) {\n return 0;\n } else if (days < 1) {\n return formatMediaDuration(msLeft / 1000);\n } else if (days < 7) {\n return lang('Days', days);\n } else if (days < 30) {\n return lang('Weeks', Math.floor(days / 7));\n } else if (days < 365) {\n return lang('Months', Math.floor(days / 30));\n } else {\n return lang('Years', Math.floor(days / 365));\n }\n}\n\nexport function formatCountdownShort(lang: LangFn, msLeft: number) {\n if (msLeft < 60 * 1000) {\n return Math.ceil(msLeft / 1000);\n } else if (msLeft < 60 * 60 * 1000) {\n return Math.ceil(msLeft / (60 * 1000));\n } else if (msLeft < MILLISECONDS_IN_DAY) {\n return lang('MessageTimer.ShortHours', Math.ceil(msLeft / (60 * 60 * 1000)));\n } else {\n return lang('MessageTimer.ShortDays', Math.ceil(msLeft / MILLISECONDS_IN_DAY));\n }\n}\n\nexport function formatLastUpdated(lang: LangFn, currentTime: number, lastUpdated = currentTime) {\n const seconds = currentTime - lastUpdated;\n if (seconds < 60) {\n return lang('LiveLocationUpdated.JustNow');\n } else if (seconds < 60 * 60) {\n return lang('LiveLocationUpdated.MinutesAgo', Math.floor(seconds / 60));\n } else {\n return lang('LiveLocationUpdated.TodayAt', formatTime(lang, lastUpdated));\n }\n}\n\ntype DurationType = 'Seconds' | 'Minutes' | 'Hours' | 'Days' | 'Weeks';\n\nexport function formatTimeDuration(lang: LangFn, duration: number, showLast = 2) {\n if (!duration) {\n return undefined;\n }\n\n const durationRecords: { duration: number; type: DurationType }[] = [];\n const labels = [\n { multiplier: 1, type: 'Seconds' },\n { multiplier: 60, type: 'Minutes' },\n { multiplier: 60, type: 'Hours' },\n { multiplier: 24, type: 'Days' },\n { multiplier: 7, type: 'Weeks' },\n ] as Array<{ multiplier: number; type: DurationType }>;\n let t = 1;\n labels.forEach((label, idx) => {\n t *= label.multiplier;\n\n if (duration < t) {\n return;\n }\n\n const modulus = labels[idx === (labels.length - 1) ? idx : idx + 1].multiplier!;\n durationRecords.push({\n duration: Math.floor((duration / t) % modulus),\n type: label.type,\n });\n });\n\n const out = durationRecords.slice(-showLast).reverse();\n for (let i = out.length - 1; i >= 0; --i) {\n if (out[i].duration === 0) {\n out.splice(i, 1);\n }\n }\n\n // TODO In arabic we don't use \",\" as delimiter rather we use \"and\" each time\n return out.map((l) => lang(l.type, l.duration, 'i')).join(', ');\n}\n\nexport function formatHumanDate(\n lang: LangFn,\n datetime: number | Date,\n isShort = false,\n noWeekdays = false,\n isUpperFirst?: boolean,\n) {\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 (isUpperFirst || !isShort ? upperFirst : lowerFirst)(lang('Weekday.Today'));\n }\n\n const yesterday = new Date(today);\n yesterday.setDate(today.getDate() - 1);\n if (toIsoString(date) === toIsoString(yesterday)) {\n return (isUpperFirst || !isShort ? upperFirst : lowerFirst)(lang('Weekday.Yesterday'));\n }\n\n const weekAgo = new Date(today);\n const weekAhead = new Date(today);\n weekAgo.setDate(today.getDate() - 7);\n weekAhead.setDate(today.getDate() + 7);\n if (date >= weekAgo && date <= weekAhead) {\n const weekDay = WEEKDAYS_FULL[date.getDay()];\n const weekDayString = isShort ? lang(`Weekday.Short${weekDay}`) : lang(`Weekday.${weekDay}`);\n\n return (isUpperFirst || !isShort ? upperFirst : lowerFirst)(weekDayString);\n }\n }\n\n const noYear = date.getFullYear() === today.getFullYear();\n const formattedDate = formatDateToString(date, lang.code, noYear, isShort ? 'short' : 'long');\n\n return (isUpperFirst || !isShort ? upperFirst : lowerFirst)(formattedDate);\n}\n\nexport function formatMediaDateTime(\n lang: LangFn,\n datetime: number | Date,\n isUpperFirst?: boolean,\n) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n return `${formatHumanDate(lang, date, true, undefined, isUpperFirst)}, ${formatTime(lang, date)}`;\n}\n\nexport function formatMediaDuration(duration: number, maxValue?: 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 const maxHours = maxValue ? Math.floor(maxValue / 3600) : 0;\n const maxMinutes = maxValue ? Math.floor((maxValue % 3600) / 60) : 0;\n let string = '';\n if (hours > 0 || maxHours > 0) {\n string += `${String(hours).padStart(2, '0')}:`;\n string += `${String(minutes).padStart(2, '0')}:`;\n } else if (maxMinutes >= 10) {\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\nconst formatDayToStringWithCache = withCache((\n dayStartAt: number,\n locale: string,\n noYear?: boolean,\n monthFormat: 'short' | 'long' | 'numeric' = 'short',\n noDay?: boolean,\n) => {\n return new Date(dayStartAt).toLocaleString(\n locale,\n {\n year: noYear ? undefined : 'numeric',\n month: monthFormat,\n day: noDay ? undefined : 'numeric',\n },\n );\n});\n\nexport function formatDateToString(\n datetime: Date | number,\n locale = 'en-US',\n noYear = false,\n monthFormat: 'short' | 'long' | 'numeric' = 'short',\n noDay = false,\n) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n const dayStartAt = getDayStartAt(date);\n\n return formatDayToStringWithCache(dayStartAt, locale, noYear, monthFormat, noDay);\n}\n\nexport function formatDateTimeToString(datetime: Date | number, locale = 'en-US') {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n return date.toLocaleString(\n locale,\n {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: '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 + MILLISECONDS_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 EMOJI_REGEX, { removeVS16s } from '../lib/twemojiRegex';\nimport withCache from './withCache';\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\nconst ISO_FLAGS_OFFSET = 127397;\n\nexport type EmojiRawData = typeof import('emoji-data-ios/emoji-data.json');\nexport type EmojiModule = { default: EmojiRawData };\n\nexport type EmojiData = {\n categories: Array<EmojiCategory>;\n emojis: Record<string, Emoji>;\n};\n\n// Non-standard variations of emojis, used on some devices\nconst EMOJI_EXCEPTIONS: [string | RegExp, string][] = [\n [/\\u{1f3f3}\\u200d\\u{1f308}/gu, '\\u{1f3f3}\\ufe0f\\u200d\\u{1f308}'], // 🏳🌈\n [/\\u{1f3f3}\\u200d\\u26a7\\ufe0f/gu, '\\u{1f3f3}\\ufe0f\\u200d\\u26a7\\ufe0f'], // 🏳️⚧️\n [/\\u{1f937}\\u200d\\u2642[^\\ufe0f]/gu, '\\u{1f937}\\u200d\\u2642\\ufe0f'], // 🤷♂️\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 const LOADED_EMOJIS = new Set<string>();\n\nexport function handleEmojiLoad(event: React.SyntheticEvent<HTMLImageElement>) {\n event.currentTarget.classList.add('open');\n LOADED_EMOJIS.add(event.currentTarget.dataset.path!);\n}\n\nexport function fixNonStandardEmoji(text: string) {\n // Non-standard sequences typically parsed as separate emojis, so no need to fix text without any\n if (!text.match(EMOJI_REGEX)) return text;\n // eslint-disable-next-line no-restricted-syntax\n for (const [regex, replacement] of EMOJI_EXCEPTIONS) {\n text = text.replace(regex, replacement);\n }\n\n return text;\n}\n\nexport function nativeToUnified(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\nfunction nativeToUnifiedExtended(emoji: string) {\n return nativeToUnified(removeVS16s(emoji));\n}\n\nexport const nativeToUnifiedExtendedWithCache = withCache(nativeToUnifiedExtended);\n\nexport function uncompressEmoji(data: EmojiRawData): EmojiData {\n const emojiData: EmojiData = { categories: [], emojis: {} };\n\n for (let i = 0; i < data.length; i += 2) {\n const category = {\n id: data[i][0],\n name: data[i][1],\n emojis: [],\n } as EmojiCategory;\n\n for (let j = 0; j < data[i + 1].length; j++) {\n const emojiRaw = data[i + 1][j];\n if (!EXCLUDE_EMOJIS.includes(emojiRaw[1][0])) {\n category.emojis.push(emojiRaw[1][0]);\n emojiData.emojis[emojiRaw[1][0]] = {\n id: emojiRaw[1][0],\n names: emojiRaw[1] as string[],\n native: unifiedToNative(emojiRaw[0] as string),\n image: (emojiRaw[0] as string).toLowerCase(),\n };\n }\n }\n\n emojiData.categories.push(category);\n }\n\n return emojiData;\n}\n\nexport function isoToEmoji(iso: string) {\n const code = iso.toUpperCase();\n\n if (!/^[A-Z]{2}$/.test(code)) return iso;\n const codePoints = [...code].map((c) => c.codePointAt(0)! + ISO_FLAGS_OFFSET);\n return String.fromCodePoint(...codePoints);\n}\n","export function ensureProtocol(url?: string) {\n if (!url) {\n return undefined;\n }\n\n // HTTP was chosen by default as a fix for https://bugs.telegram.org/c/10712.\n // It is also the default protocol in the official TDesktop client.\n return url.includes('://') ? url : `http://${url}`;\n}\n","let isWebpSupportedCache: boolean | undefined;\n\nexport function isWebpSupported() {\n return Boolean(isWebpSupportedCache);\n}\n\nfunction testWebp(): Promise<boolean> {\n return new Promise((resolve) => {\n const webp = new Image();\n // eslint-disable-next-line max-len\n webp.src = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';\n const handleLoadOrError = () => {\n resolve(webp.height === 2);\n };\n webp.onload = handleLoadOrError;\n webp.onerror = handleLoadOrError;\n });\n}\n\ntestWebp().then((hasWebp) => {\n isWebpSupportedCache = hasWebp;\n});\n","import type { ThemeKey } from '../types';\n\nlet systemThemeCache: ThemeKey = (\n window.matchMedia?.('(prefers-color-scheme: dark)').matches\n) ? 'dark' : 'light';\n\nexport function getSystemTheme() {\n return systemThemeCache;\n}\n\nfunction handleSystemThemeChange(e: MediaQueryListEventMap['change']) {\n systemThemeCache = e.matches ? 'dark' : 'light';\n}\n\nconst mql = window.matchMedia('(prefers-color-scheme: dark)');\nif (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', handleSystemThemeChange);\n} else if (typeof mql.addListener === 'function') {\n mql.addListener(handleSystemThemeChange);\n}\n","import {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT,\n MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH,\n IS_TEST,\n SUPPORTED_VIDEO_CONTENT_TYPES,\n VIDEO_MOV_TYPE,\n CONTENT_TYPES_WITH_PREVIEW,\n PRODUCTION_HOSTNAME,\n} from '../config';\n\nexport * from './environmentWebp';\n\nexport * from './environmentSystemTheme';\n\nexport function getPlatform() {\n const { userAgent, platform } = window.navigator;\n const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'];\n const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'];\n const iosPlatforms = ['iPhone', 'iPad', 'iPod'];\n let os: 'macOS' | 'iOS' | 'Windows' | 'Android' | 'Linux' | undefined;\n\n if (macosPlatforms.indexOf(platform) !== -1) {\n os = 'macOS';\n } else if (iosPlatforms.indexOf(platform) !== -1) {\n os = 'iOS';\n } else if (windowsPlatforms.indexOf(platform) !== -1) {\n os = 'Windows';\n } else if (/Android/.test(userAgent)) {\n os = 'Android';\n } else if (/Linux/.test(platform)) {\n os = 'Linux';\n }\n\n return os;\n}\n\nexport const IS_PRODUCTION_HOST = window.location.host === PRODUCTION_HOSTNAME;\nexport const PLATFORM_ENV = getPlatform();\nexport const IS_MAC_OS = PLATFORM_ENV === 'macOS';\nexport const IS_IOS = PLATFORM_ENV === 'iOS';\nexport const IS_ANDROID = PLATFORM_ENV === 'Android';\nexport const IS_SAFARI = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\nexport const IS_PWA = (\n window.matchMedia('(display-mode: standalone)').matches\n || (window.navigator as any).standalone\n || document.referrer.includes('android-app://')\n);\n\nexport const IS_TOUCH_ENV = window.matchMedia('(pointer: coarse)').matches;\n// Keep in mind the landscape orientation\nexport const IS_SINGLE_COLUMN_LAYOUT = window.innerWidth <= MOBILE_SCREEN_MAX_WIDTH || (\n window.innerWidth <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH && window.innerHeight <= MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT\n);\n// Special layout, 1 column while chat opened, 2 columns while collapsed\nexport const IS_TABLET_COLUMN_LAYOUT = !IS_SINGLE_COLUMN_LAYOUT && (\n window.innerWidth <= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n);\nexport const IS_VOICE_RECORDING_SUPPORTED = Boolean(\n window.navigator.mediaDevices && 'getUserMedia' in window.navigator.mediaDevices && (\n window.AudioContext || (window as any).webkitAudioContext\n ),\n);\nexport const IS_SMOOTH_SCROLL_SUPPORTED = 'scrollBehavior' in document.documentElement.style;\nexport const IS_EMOJI_SUPPORTED = PLATFORM_ENV && (IS_MAC_OS || IS_IOS) && isLastEmojiVersionSupported();\nexport const IS_SERVICE_WORKER_SUPPORTED = 'serviceWorker' in navigator;\n// TODO Consider failed service worker\nexport const IS_PROGRESSIVE_SUPPORTED = IS_SERVICE_WORKER_SUPPORTED;\nexport const IS_STREAMING_SUPPORTED = 'MediaSource' in window;\nexport const IS_OPUS_SUPPORTED = Boolean((new Audio()).canPlayType('audio/ogg; codecs=opus'));\nexport const IS_CANVAS_FILTER_SUPPORTED = (\n !IS_TEST && 'filter' in (document.createElement('canvas').getContext('2d') || {})\n);\nexport const IS_REQUEST_FULLSCREEN_SUPPORTED = 'requestFullscreen' in document.createElement('div');\nexport const ARE_CALLS_SUPPORTED = !navigator.userAgent.includes('Firefox');\nexport const LAYERS_ANIMATION_NAME = IS_ANDROID ? 'slide-fade' : IS_IOS ? 'slide-layers' : 'push-slide';\n\nconst TEST_VIDEO = document.createElement('video');\n// `canPlayType(VIDEO_MOV_TYPE)` returns false negative at least for macOS Chrome and iOS Safari\nexport const IS_MOV_SUPPORTED = Boolean(\n TEST_VIDEO.canPlayType(VIDEO_MOV_TYPE).replace('no', '') || IS_IOS || IS_MAC_OS,\n);\n\nif (IS_MOV_SUPPORTED) {\n SUPPORTED_VIDEO_CONTENT_TYPES.add(VIDEO_MOV_TYPE);\n CONTENT_TYPES_WITH_PREVIEW.add(VIDEO_MOV_TYPE);\n}\n\nexport const IS_WEBM_SUPPORTED = Boolean(TEST_VIDEO.canPlayType('video/webm; codecs=\"vp9\"').replace('no', ''))\n && !(IS_MAC_OS && IS_SAFARI); // Safari on MacOS has some issues with WebM\n\nexport const DPR = window.devicePixelRatio || 1;\n\nexport const MASK_IMAGE_DISABLED = true;\nexport const IS_OPFS_SUPPORTED = Boolean(navigator.storage?.getDirectory);\nif (IS_OPFS_SUPPORTED) {\n // Clear old contents\n (async () => {\n try {\n const directory = await navigator.storage.getDirectory();\n await directory.removeEntry('downloads', { recursive: true });\n } catch {\n // Ignore\n }\n })();\n}\n\nexport const IS_BACKDROP_BLUR_SUPPORTED = !IS_TEST && (\n CSS.supports('backdrop-filter: blur()') || CSS.supports('-webkit-backdrop-filter: blur()')\n);\nexport const IS_COMPACT_MENU = !IS_TOUCH_ENV;\nexport const IS_SCROLL_PATCH_NEEDED = !IS_MAC_OS && !IS_IOS && !IS_ANDROID;\nexport const IS_INSTALL_PROMPT_SUPPORTED = 'onbeforeinstallprompt' in window;\n\n// Smaller area reduces scroll jumps caused by `patchChromiumScroll`\nexport const MESSAGE_LIST_SENSITIVE_AREA = IS_SCROLL_PATCH_NEEDED ? 300 : 750;\n\nexport const MAX_BUFFER_SIZE = (IS_ANDROID || IS_IOS ? 512 : 2000) * 1024 ** 2; // 512 OR 2000 MB\n\nfunction isLastEmojiVersionSupported() {\n const ALLOWABLE_CALCULATION_ERROR_SIZE = 5;\n const inlineEl = document.createElement('span');\n inlineEl.classList.add('emoji-test-element');\n document.body.appendChild(inlineEl);\n\n inlineEl.innerText = '🫱🏻'; // Emoji from 14.0 version\n const newEmojiWidth = inlineEl.offsetWidth;\n inlineEl.innerText = '❤️'; // Emoji from 1.0 version\n const legacyEmojiWidth = inlineEl.offsetWidth;\n\n document.body.removeChild(inlineEl);\n\n return Math.abs(newEmojiWidth - legacyEmojiWidth) < ALLOWABLE_CALCULATION_ERROR_SIZE;\n}\n","import { pause } from './schedulers';\n\n// Polyfill for Safari: `File` is not available in web worker\nif (typeof File === 'undefined') {\n // eslint-disable-next-line no-global-assign, no-restricted-globals, func-names\n self.File = class extends Blob {\n name: string;\n\n constructor(fileBits: BlobPart[], fileName: string, options?: FilePropertyBag) {\n if (options) {\n const { type, ...rest } = options;\n super(fileBits, { type });\n Object.assign(this, rest);\n } else {\n super(fileBits);\n }\n\n this.name = fileName;\n }\n } as typeof File;\n}\n\nexport function dataUriToBlob(dataUri: string) {\n const arr = dataUri.split(',');\n const mime = arr[0].match(/:(.*?);/)![1];\n const bstr = atob(arr[1]);\n let n = bstr.length;\n const u8arr = new Uint8Array(n);\n\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n\n return new Blob([u8arr], { type: mime });\n}\n\nexport function blobToDataUri(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = (e: ProgressEvent<FileReader>) => {\n const { result } = e.target || {};\n if (typeof result === 'string') {\n resolve(result);\n }\n\n reject(new Error('Failed to read blob'));\n };\n\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n}\n\nexport function blobToFile(blob: Blob, fileName: string) {\n return new File([blob], fileName, {\n lastModified: Date.now(),\n type: blob.type,\n });\n}\n\nexport function preloadImage(url: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = url;\n });\n}\n\nexport function preloadVideo(url: string): Promise<HTMLVideoElement> {\n return new Promise((resolve, reject) => {\n const video = document.createElement('video');\n video.volume = 0;\n video.onloadedmetadata = () => resolve(video);\n video.onerror = reject;\n video.src = url;\n });\n}\n\nexport async function createPosterForVideo(url: string): Promise<string | undefined> {\n const video = await preloadVideo(url);\n\n return Promise.race([\n pause(2000) as Promise<undefined>,\n new Promise<string | undefined>((resolve, reject) => {\n video.onseeked = () => {\n if (!video.videoWidth || !video.videoHeight) {\n resolve(undefined);\n }\n\n const canvas = document.createElement('canvas');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(video, 0, 0);\n resolve(canvas.toDataURL('image/jpeg'));\n };\n video.onerror = reject;\n video.currentTime = Math.min(video.duration, 1);\n }),\n ]);\n}\n\nexport async function fetchBlob(blobUrl: string) {\n const response = await fetch(blobUrl);\n return response.blob();\n}\n\nexport async function fetchFile(blobUrl: string, fileName: string) {\n const blob = await fetchBlob(blobUrl);\n return blobToFile(blob, fileName);\n}\n\nexport function imgToCanvas(img: HTMLImageElement) {\n const canvas = document.createElement('canvas');\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(img, 0, 0);\n\n return canvas;\n}\n","import { addCallback } from '../lib/teact/teactn';\nimport { addActionHandler, getGlobal } from '../global';\n\nimport type { GlobalState } from '../global/types';\nimport type { NotifyException, NotifySettings } from '../types';\nimport type { ApiChat, ApiChatFolder, ApiUser } from '../api/types';\n\nimport { ALL_FOLDER_ID, ARCHIVED_FOLDER_ID, DEBUG } from '../config';\nimport { selectNotifySettings, selectNotifyExceptions } from '../global/selectors';\nimport { selectIsChatMuted } from '../global/helpers';\nimport { onIdle, throttle } from './schedulers';\nimport { areSortedArraysEqual, unique } from './iteratees';\nimport arePropsShallowEqual from './arePropsShallowEqual';\nimport type { CallbackManager } from './callbacks';\nimport { createCallbackManager } from './callbacks';\n\ninterface FolderSummary {\n id: number;\n listIds?: Set<string>;\n orderedPinnedIds?: string[];\n contacts?: true;\n nonContacts?: true;\n groups?: true;\n channels?: true;\n bots?: true;\n excludeMuted?: true;\n excludeRead?: true;\n excludeArchived?: true;\n excludedChatIds?: Set<string>;\n includedChatIds?: Set<string>;\n pinnedChatIds?: Set<string>;\n}\n\ninterface ChatSummary {\n id: string;\n type: ApiChat['type'];\n isListed: boolean;\n isArchived: boolean;\n isMuted: boolean;\n isUnread: boolean;\n unreadCount?: number;\n unreadMentionsCount?: number;\n order: number;\n isUserBot?: boolean;\n isUserContact?: boolean;\n}\n\nconst UPDATE_THROTTLE = 500;\nconst DEBUG_DURATION_LIMIT = 6;\n\nconst initials = buildInitials();\n\nlet prevGlobal: {\n allFolderListIds?: GlobalState['chats']['listIds']['active'];\n allFolderPinnedIds?: GlobalState['chats']['orderedPinnedIds']['active'];\n archivedFolderListIds?: GlobalState['chats']['listIds']['archived'];\n archivedFolderPinnedIds?: GlobalState['chats']['orderedPinnedIds']['archived'];\n isAllFolderFullyLoaded?: boolean;\n isArchivedFolderFullyLoaded?: boolean;\n chatsById: Record<string, ApiChat>;\n foldersById: Record<string, ApiChatFolder>;\n usersById: Record<string, ApiUser>;\n notifySettings: NotifySettings;\n notifyExceptions?: Record<number, NotifyException>;\n} = initials.prevGlobal;\n\nlet prepared: {\n folderSummariesById: Record<string, FolderSummary>;\n chatSummariesById: Map<string, ChatSummary>;\n folderIdsByChatId: Record<string, number[]>;\n chatIdsByFolderId: Record<number, Set<string> | undefined>;\n isOrderedListJustPatched: Record<number, boolean | undefined>;\n} = initials.prepared;\n\nlet results: {\n orderedIdsByFolderId: Record<string, string[] | undefined>;\n pinnedCountByFolderId: Record<string, number | undefined>; // Also watched by `callbacks.orderedIdsByFolderId`\n chatsCountByFolderId: Record<string, number | undefined>;\n unreadCountersByFolderId: Record<string, {\n chatsCount: number;\n notificationsCount: number;\n } | undefined>;\n} = initials.results;\n\nlet callbacks: {\n orderedIdsByFolderId: Record<number, CallbackManager>;\n chatsCountByFolderId: CallbackManager;\n unreadCountersByFolderId: CallbackManager;\n} = initials.callbacks;\n\nconst updateFolderManagerThrottled = throttle(() => {\n onIdle(() => {\n updateFolderManager(getGlobal());\n });\n}, UPDATE_THROTTLE);\n\nlet inited = false;\n\n/* Getters */\n\nexport function init() {\n inited = true;\n\n addCallback(updateFolderManagerThrottled);\n addActionHandler('reset', reset);\n\n updateFolderManager(getGlobal());\n}\n\nexport function getOrderedIds(folderId: number) {\n if (!inited) init();\n\n return results.orderedIdsByFolderId[folderId];\n}\n\nexport function getPinnedChatsCount(folderId: number) {\n if (!inited) init();\n\n return results.pinnedCountByFolderId[folderId] || 0;\n}\n\nexport function getChatsCount() {\n if (!inited) init();\n\n return results.chatsCountByFolderId;\n}\n\nexport function getUnreadCounters() {\n if (!inited) init();\n\n return results.unreadCountersByFolderId;\n}\n\nexport function getAllNotificationsCount() {\n return getUnreadCounters()[ALL_FOLDER_ID]?.notificationsCount || 0;\n}\n\nexport function getOrderKey(chatId: string) {\n return prepared.chatSummariesById.get(chatId)!.order;\n}\n\n/* Callback managers */\n\nexport function addOrderedIdsCallback(folderId: number, callback: (orderedIds: string[]) => void) {\n if (!callbacks.orderedIdsByFolderId[folderId]) {\n callbacks.orderedIdsByFolderId[folderId] = createCallbackManager();\n }\n\n return callbacks.orderedIdsByFolderId[folderId].addCallback(callback);\n}\n\nexport function addChatsCountCallback(callback: (chatsCount: typeof results.chatsCountByFolderId) => void) {\n return callbacks.chatsCountByFolderId.addCallback(callback);\n}\n\nexport function addUnreadCountersCallback(callback: (unreadCounters: typeof results.unreadCountersByFolderId) => void) {\n return callbacks.unreadCountersByFolderId.addCallback(callback);\n}\n\n/* Global update handlers */\n\nfunction updateFolderManager(global: GlobalState) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n let DEBUG_startedAt: number;\n if (DEBUG) {\n DEBUG_startedAt = performance.now();\n }\n\n const isAllFolderChanged = Boolean(\n global.chats.listIds.active\n && isMainFolderChanged(ALL_FOLDER_ID, global.chats.listIds.active, global.chats.orderedPinnedIds.active),\n );\n const isArchivedFolderChanged = Boolean(\n global.chats.listIds.archived\n && isMainFolderChanged(ARCHIVED_FOLDER_ID, global.chats.listIds.archived, global.chats.orderedPinnedIds.archived),\n );\n const isAllFullyLoadedChanged = global.chats.isFullyLoaded.active !== prevGlobal.isAllFolderFullyLoaded;\n const isArchivedFullyLoadedChanged = global.chats.isFullyLoaded.archived !== prevGlobal.isArchivedFolderFullyLoaded;\n\n const areFoldersChanged = global.chatFolders.byId !== prevGlobal.foldersById;\n const areChatsChanged = global.chats.byId !== prevGlobal.chatsById;\n const areUsersChanged = global.users.byId !== prevGlobal.usersById;\n const areNotifySettingsChanged = selectNotifySettings(global) !== prevGlobal.notifySettings;\n const areNotifyExceptionsChanged = selectNotifyExceptions(global) !== prevGlobal.notifyExceptions;\n\n let affectedFolderIds: number[] = [];\n\n if (isAllFullyLoadedChanged || isArchivedFullyLoadedChanged) {\n affectedFolderIds = affectedFolderIds.concat(\n updateFullyLoaded(global, isArchivedFullyLoadedChanged),\n );\n }\n\n if (!(\n isAllFolderChanged || isArchivedFolderChanged || areFoldersChanged\n || areChatsChanged || areUsersChanged || areNotifySettingsChanged || areNotifyExceptionsChanged\n )\n ) {\n if (affectedFolderIds.length) {\n updateResults(affectedFolderIds);\n }\n\n return;\n }\n\n const prevAllFolderListIds = prevGlobal.allFolderListIds;\n const prevArchivedFolderListIds = prevGlobal.archivedFolderListIds;\n\n updateFolders(global, isAllFolderChanged, isArchivedFolderChanged, areFoldersChanged);\n\n affectedFolderIds = affectedFolderIds.concat(updateChats(\n global,\n areFoldersChanged || isAllFolderChanged || isArchivedFolderChanged,\n areNotifySettingsChanged,\n areNotifyExceptionsChanged,\n prevAllFolderListIds,\n prevArchivedFolderListIds,\n ));\n\n updateResults(unique(affectedFolderIds));\n\n if (DEBUG) {\n const duration = performance.now() - DEBUG_startedAt!;\n if (duration > DEBUG_DURATION_LIMIT) {\n // eslint-disable-next-line no-console\n console.warn(`Slow \\`updateFolderManager\\`: ${Math.round(duration)} ms`);\n }\n }\n}\n\nfunction isMainFolderChanged(folderId: number, newListIds?: string[], newPinnedIds?: string[]) {\n const currentListIds = folderId === ALL_FOLDER_ID\n ? prevGlobal.allFolderListIds\n : prevGlobal.archivedFolderListIds;\n const currentPinnedIds = folderId === ALL_FOLDER_ID\n ? prevGlobal.allFolderPinnedIds\n : prevGlobal.archivedFolderPinnedIds;\n\n return currentListIds !== newListIds || currentPinnedIds !== newPinnedIds;\n}\n\nfunction updateFullyLoaded(\n global: GlobalState,\n isArchivedFullyLoadedChanged = false,\n) {\n let affectedFolderIds = [];\n\n if (isArchivedFullyLoadedChanged) {\n affectedFolderIds.push(ARCHIVED_FOLDER_ID);\n }\n\n const isAllFolderFullyLoaded = global.chats.isFullyLoaded.active;\n const isArchivedFolderFullyLoaded = global.chats.isFullyLoaded.archived;\n\n if (isAllFolderFullyLoaded && isArchivedFolderFullyLoaded) {\n const emptyFolderIds = Object.keys(prepared.folderSummariesById)\n .filter((folderId) => !results.orderedIdsByFolderId[folderId])\n .map(Number);\n\n affectedFolderIds = affectedFolderIds.concat(emptyFolderIds);\n }\n\n prevGlobal.isAllFolderFullyLoaded = isAllFolderFullyLoaded;\n prevGlobal.isArchivedFolderFullyLoaded = isArchivedFolderFullyLoaded;\n\n return affectedFolderIds;\n}\n\nfunction updateFolders(\n global: GlobalState, isAllFolderChanged: boolean, isArchivedFolderChanged: boolean, areFoldersChanged: boolean,\n) {\n const changedFolders = [];\n\n if (isAllFolderChanged) {\n const newListIds = global.chats.listIds.active!;\n const newPinnedIds = global.chats.orderedPinnedIds.active;\n\n prepared.folderSummariesById[ALL_FOLDER_ID] = buildFolderSummaryFromMainList(\n ALL_FOLDER_ID, newListIds, newPinnedIds,\n );\n\n prevGlobal.allFolderListIds = newListIds;\n prevGlobal.allFolderPinnedIds = newPinnedIds;\n\n changedFolders.push(ALL_FOLDER_ID);\n }\n\n if (isArchivedFolderChanged) {\n const newListIds = global.chats.listIds.archived!;\n const newPinnedIds = global.chats.orderedPinnedIds.archived;\n\n prepared.folderSummariesById[ARCHIVED_FOLDER_ID] = buildFolderSummaryFromMainList(\n ARCHIVED_FOLDER_ID, newListIds, newPinnedIds,\n );\n\n prevGlobal.archivedFolderListIds = newListIds;\n prevGlobal.archivedFolderPinnedIds = newPinnedIds;\n\n changedFolders.push(ARCHIVED_FOLDER_ID);\n }\n\n if (areFoldersChanged) {\n const newFoldersById = global.chatFolders.byId;\n\n Object.values(newFoldersById).forEach((folder) => {\n if (folder === prevGlobal.foldersById[folder.id]) {\n return;\n }\n\n prepared.folderSummariesById[folder.id] = buildFolderSummary(folder);\n\n changedFolders.push(folder.id);\n });\n\n prevGlobal.foldersById = newFoldersById;\n }\n\n return changedFolders;\n}\n\nfunction buildFolderSummaryFromMainList(\n folderId: number, listIds: string[], orderedPinnedIds?: string[],\n): FolderSummary {\n return {\n id: folderId,\n listIds: new Set(listIds),\n orderedPinnedIds,\n pinnedChatIds: new Set(orderedPinnedIds),\n };\n}\n\nfunction buildFolderSummary(folder: ApiChatFolder): FolderSummary {\n return {\n ...folder,\n orderedPinnedIds: folder.pinnedChatIds,\n excludedChatIds: folder.excludedChatIds ? new Set(folder.excludedChatIds) : undefined,\n includedChatIds: folder.excludedChatIds ? new Set(folder.includedChatIds) : undefined,\n pinnedChatIds: folder.excludedChatIds ? new Set(folder.pinnedChatIds) : undefined,\n };\n}\n\nfunction updateChats(\n global: GlobalState,\n areFoldersChanged: boolean,\n areNotifySettingsChanged: boolean,\n areNotifyExceptionsChanged: boolean,\n prevAllFolderListIds?: string[],\n prevArchivedFolderListIds?: string[],\n) {\n const newChatsById = global.chats.byId;\n const newUsersById = global.users.byId;\n const newNotifySettings = selectNotifySettings(global);\n const newNotifyExceptions = selectNotifyExceptions(global);\n const folderSummaries = Object.values(prepared.folderSummariesById);\n const affectedFolderIds = new Set<number>();\n\n const newAllFolderListIds = global.chats.listIds.active;\n const newArchivedFolderListIds = global.chats.listIds.archived;\n let allIds = [...newAllFolderListIds || [], ...newArchivedFolderListIds || []];\n if (newAllFolderListIds !== prevAllFolderListIds || newArchivedFolderListIds !== prevArchivedFolderListIds) {\n allIds = unique(allIds.concat(prevAllFolderListIds || [], prevArchivedFolderListIds || []));\n }\n\n allIds.forEach((chatId) => {\n const chat = newChatsById[chatId];\n\n if (\n !areFoldersChanged\n && !areNotifySettingsChanged\n && !areNotifyExceptionsChanged\n && chat === prevGlobal.chatsById[chatId]\n && newUsersById[chatId] === prevGlobal.usersById[chatId]\n ) {\n return;\n }\n\n let newFolderIds: number[];\n if (chat) {\n const currentSummary = prepared.chatSummariesById.get(chatId);\n const newSummary = buildChatSummary(chat, newNotifySettings, newNotifyExceptions, newUsersById[chatId]);\n if (!areFoldersChanged && currentSummary && arePropsShallowEqual(newSummary, currentSummary)) {\n return;\n }\n\n prepared.chatSummariesById.set(chatId, newSummary);\n\n newFolderIds = buildChatFolderIds(newSummary, folderSummaries);\n newFolderIds.forEach((folderId) => {\n affectedFolderIds.add(folderId);\n });\n } else {\n prepared.chatSummariesById.delete(chatId);\n newFolderIds = [];\n }\n\n const currentFolderIds = prepared.folderIdsByChatId[chatId] || [];\n if (areSortedArraysEqual(newFolderIds, currentFolderIds)) {\n return;\n }\n\n const deletedFolderIds = updateListsForChat(chatId, currentFolderIds, newFolderIds);\n deletedFolderIds.forEach((folderId) => {\n affectedFolderIds.add(folderId);\n });\n });\n\n prevGlobal.chatsById = newChatsById;\n prevGlobal.usersById = newUsersById;\n prevGlobal.notifySettings = newNotifySettings;\n prevGlobal.notifyExceptions = newNotifyExceptions;\n\n return Array.from(affectedFolderIds);\n}\n\nfunction buildChatSummary(\n chat: ApiChat,\n notifySettings: NotifySettings,\n notifyExceptions?: Record<number, NotifyException>,\n user?: ApiUser,\n): ChatSummary {\n const {\n id, type, lastMessage, isRestricted, isNotJoined, migratedTo, folderId,\n unreadCount, unreadMentionsCount, hasUnreadMark,\n joinDate, draftDate,\n } = chat;\n\n const userInfo = type === 'chatTypePrivate' && user;\n\n return {\n id,\n type,\n isListed: Boolean(lastMessage && !isRestricted && !isNotJoined && !migratedTo),\n isArchived: folderId === ARCHIVED_FOLDER_ID,\n isMuted: selectIsChatMuted(chat, notifySettings, notifyExceptions),\n isUnread: Boolean(unreadCount || unreadMentionsCount || hasUnreadMark),\n unreadCount,\n unreadMentionsCount,\n order: Math.max(joinDate || 0, draftDate || 0, lastMessage?.date || 0),\n isUserBot: userInfo ? userInfo.type === 'userTypeBot' : undefined,\n isUserContact: userInfo ? userInfo.isContact : undefined,\n };\n}\n\nfunction buildChatFolderIds(chatSummary: ChatSummary, folderSummaries: FolderSummary[]) {\n return folderSummaries.reduce<number[]>((acc, folderSummary) => {\n if (isChatInFolder(chatSummary, folderSummary)) {\n acc.push(folderSummary.id);\n }\n\n return acc;\n }, []).sort();\n}\n\nfunction isChatInFolder(\n chatSummary: ChatSummary,\n folderSummary: FolderSummary,\n) {\n if (!chatSummary.isListed) {\n return false;\n }\n\n const { id: chatId, type } = chatSummary;\n\n if (folderSummary.listIds) {\n if (\n (chatSummary.isArchived && folderSummary.id === ALL_FOLDER_ID)\n || (!chatSummary.isArchived && folderSummary.id === ARCHIVED_FOLDER_ID)\n ) {\n return false;\n }\n\n return folderSummary.listIds.has(chatId);\n }\n\n if (folderSummary.excludedChatIds?.has(chatId)) {\n return false;\n }\n\n if (folderSummary.includedChatIds?.has(chatId)) {\n return true;\n }\n\n if (folderSummary.pinnedChatIds?.has(chatId)) {\n return true;\n }\n\n if (folderSummary.excludeArchived && chatSummary.isArchived) {\n return false;\n }\n\n if (folderSummary.excludeRead && !chatSummary.isUnread) {\n return false;\n }\n\n if (folderSummary.excludeMuted && chatSummary.isMuted && !chatSummary.unreadMentionsCount) {\n return false;\n }\n\n if (type === 'chatTypePrivate') {\n if (chatSummary.isUserBot) {\n if (folderSummary.bots) {\n return true;\n }\n } else {\n if (folderSummary.contacts && chatSummary.isUserContact) {\n return true;\n }\n\n if (folderSummary.nonContacts && !chatSummary.isUserContact) {\n return true;\n }\n }\n } else if (type === 'chatTypeChannel') {\n return Boolean(folderSummary.channels);\n } else if (type === 'chatTypeBasicGroup' || type === 'chatTypeSuperGroup') {\n return Boolean(folderSummary.groups);\n }\n\n return false;\n}\n\nfunction updateListsForChat(chatId: string, currentFolderIds: number[], newFolderIds: number[]) {\n const currentFolderIdsSet = new Set(currentFolderIds);\n const newFolderIdsSet = new Set(newFolderIds);\n const deletedFolderIds: number[] = [];\n\n unique([...currentFolderIds, ...newFolderIds]).forEach((folderId) => {\n let currentFolderOrderedIds = results.orderedIdsByFolderId[folderId];\n\n if (currentFolderIdsSet.has(folderId) && !newFolderIdsSet.has(folderId)) {\n prepared.chatIdsByFolderId[folderId]!.delete(chatId);\n\n deletedFolderIds.push(folderId);\n\n if (currentFolderOrderedIds) {\n currentFolderOrderedIds = currentFolderOrderedIds.filter((id) => id !== chatId);\n prepared.isOrderedListJustPatched[folderId] = true;\n }\n } else if (!currentFolderIdsSet.has(folderId) && newFolderIdsSet.has(folderId)) {\n if (!prepared.chatIdsByFolderId[folderId]) {\n prepared.chatIdsByFolderId[folderId] = new Set();\n }\n\n prepared.chatIdsByFolderId[folderId]!.add(chatId);\n\n if (currentFolderOrderedIds) {\n currentFolderOrderedIds.push(chatId);\n prepared.isOrderedListJustPatched[folderId] = true;\n }\n }\n\n results.orderedIdsByFolderId[folderId] = currentFolderOrderedIds;\n });\n\n prepared.folderIdsByChatId[chatId] = newFolderIds;\n\n return deletedFolderIds;\n}\n\nfunction updateResults(affectedFolderIds: number[]) {\n let wasUnreadCountersChanged = false;\n let wasChatsCountChanged = false;\n\n Array.from(affectedFolderIds).forEach((folderId) => {\n const { pinnedCount: newPinnedCount, orderedIds: newOrderedIds } = buildFolderOrderedIds(folderId);\n // When signed out\n if (!newOrderedIds) {\n return;\n }\n\n const currentOrderedIds = results.orderedIdsByFolderId[folderId];\n const currentPinnedCount = results.pinnedCountByFolderId[folderId];\n const areOrderedIdsChanged = (\n !currentOrderedIds\n || currentPinnedCount === undefined || currentPinnedCount !== newPinnedCount\n || prepared.isOrderedListJustPatched[folderId]\n || !areSortedArraysEqual(newOrderedIds, currentOrderedIds)\n );\n if (areOrderedIdsChanged) {\n prepared.isOrderedListJustPatched[folderId] = false;\n results.orderedIdsByFolderId[folderId] = newOrderedIds;\n results.pinnedCountByFolderId[folderId] = newPinnedCount;\n callbacks.orderedIdsByFolderId[folderId]?.runCallbacks(newOrderedIds);\n }\n\n const currentChatsCount = results.chatsCountByFolderId[folderId];\n const newChatsCount = newOrderedIds.length;\n if (!wasChatsCountChanged) {\n wasChatsCountChanged = currentChatsCount !== newChatsCount;\n }\n results.chatsCountByFolderId[folderId] = newChatsCount;\n\n const currentUnreadCounters = results.unreadCountersByFolderId[folderId];\n const newUnreadCounters = buildFolderUnreadCounters(folderId);\n if (!wasUnreadCountersChanged) {\n wasUnreadCountersChanged = (\n !currentUnreadCounters || !arePropsShallowEqual(newUnreadCounters, currentUnreadCounters)\n );\n }\n results.unreadCountersByFolderId[folderId] = newUnreadCounters;\n });\n\n if (wasChatsCountChanged) {\n // We need to update the entire object as it will be returned from a hook\n const newValue = { ...results.chatsCountByFolderId };\n results.chatsCountByFolderId = newValue;\n callbacks.chatsCountByFolderId.runCallbacks(newValue);\n }\n\n if (wasUnreadCountersChanged) {\n // We need to update the entire object as it will be returned from a hook\n const newValue = { ...results.unreadCountersByFolderId };\n results.unreadCountersByFolderId = newValue;\n callbacks.unreadCountersByFolderId.runCallbacks(newValue);\n }\n}\n\nfunction buildFolderOrderedIds(folderId: number) {\n const folderSummary = prepared.folderSummariesById[folderId];\n if (!folderSummary) {\n return {};\n }\n\n const { orderedPinnedIds, pinnedChatIds } = folderSummary;\n const {\n chatSummariesById,\n chatIdsByFolderId: { [folderId]: chatIds },\n } = prepared;\n const {\n orderedIdsByFolderId: { [folderId]: prevOrderedIds },\n } = results;\n\n const sortedPinnedIds = chatIds ? orderedPinnedIds?.filter((id) => chatIds.has(id)) : orderedPinnedIds;\n const allListIds = prevOrderedIds || (chatIds && Array.from(chatIds)) || [];\n const notPinnedIds = pinnedChatIds ? allListIds.filter((id) => !pinnedChatIds.has(id)) : allListIds;\n const sortedNotPinnedIds = notPinnedIds.sort((chatId1: string, chatId2: string) => {\n return chatSummariesById.get(chatId2)!.order - chatSummariesById.get(chatId1)!.order;\n });\n\n return {\n pinnedCount: sortedPinnedIds?.length || 0,\n orderedIds: [\n ...(sortedPinnedIds || []),\n ...sortedNotPinnedIds,\n ],\n };\n}\n\nfunction buildFolderUnreadCounters(folderId: number) {\n const {\n chatSummariesById,\n } = prepared;\n const {\n orderedIdsByFolderId: { [folderId]: orderedIds },\n } = results;\n\n return orderedIds!.reduce((newUnreadCounters, chatId) => {\n const chatSummary = chatSummariesById.get(chatId);\n if (!chatSummary) {\n return newUnreadCounters;\n }\n\n if (chatSummary.isUnread) {\n newUnreadCounters.chatsCount++;\n\n if (chatSummary.unreadMentionsCount) {\n newUnreadCounters.notificationsCount += chatSummary.unreadMentionsCount;\n }\n\n if (!chatSummary.isMuted) {\n if (chatSummary.unreadCount) {\n newUnreadCounters.notificationsCount += chatSummary.unreadCount;\n } else if (!chatSummary.unreadMentionsCount) {\n newUnreadCounters.notificationsCount += 1; // Manually marked unread\n }\n }\n }\n\n return newUnreadCounters;\n }, {\n chatsCount: 0,\n notificationsCount: 0,\n });\n}\n\nfunction buildInitials() {\n return {\n prevGlobal: {\n foldersById: {},\n chatsById: {},\n usersById: {},\n notifySettings: {} as NotifySettings,\n notifyExceptions: {},\n },\n\n prepared: {\n folderSummariesById: {},\n chatSummariesById: new Map(),\n folderIdsByChatId: {},\n chatIdsByFolderId: {},\n isOrderedListJustPatched: {},\n },\n\n results: {\n orderedIdsByFolderId: {},\n pinnedCountByFolderId: {},\n chatsCountByFolderId: {},\n unreadCountersByFolderId: {},\n },\n\n callbacks: {\n orderedIdsByFolderId: {},\n chatsCountByFolderId: createCallbackManager(),\n unreadCountersByFolderId: createCallbackManager(),\n },\n };\n}\n\nfunction reset() {\n const newInitials = buildInitials();\n\n prevGlobal = newInitials.prevGlobal;\n prepared = newInitials.prepared;\n results = newInitials.results;\n callbacks = newInitials.callbacks;\n}\n","// Used before applying CSS transition\nexport default function forceReflow(element: HTMLElement) {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n element.offsetWidth;\n}\n","import type { LangCode } from '../types';\n\nexport function formatCurrency(totalPrice: number, currency: string, locale: LangCode = 'en') {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n }).format(totalPrice / 10 ** getCurrencyExp(currency));\n}\n\nfunction getCurrencyExp(currency: string) {\n if (currency === 'CLF') {\n return 4;\n }\n if (['BHD', 'IQD', 'JOD', 'KWD', 'LYD', 'OMR', 'TND'].includes(currency)) {\n return 3;\n }\n if ([\n 'BIF', 'BYR', 'CLP', 'CVE', 'DJF', 'GNF', 'ISK', 'JPY', 'KMF', 'KRW', 'MGA', 'PYG', 'RWF', 'UGX', 'UYI',\n 'VND', 'VUV', 'XAF', 'XOF', 'XPF',\n ].includes(currency)) {\n return 0;\n }\n if (currency === 'MRO') {\n return 1;\n }\n return 2;\n}\n","const generateIdFor = (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\nexport default generateIdFor;\n","import type { ApiError, ApiFieldError } from '../api/types';\n\nimport { DEBUG } from '../config';\n\nconst READABLE_ERROR_MESSAGES: Record<string, string> = {\n CHAT_RESTRICTED: 'You can\\'t send messages in this chat, you were restricted',\n CHAT_SEND_POLL_FORBIDDEN: 'You can\\'t create polls in this chat',\n CHAT_SEND_STICKERS_FORBIDDEN: 'You can\\'t send stickers in this chat',\n CHAT_SEND_GIFS_FORBIDDEN: 'You can\\'t send gifs in this chat',\n CHAT_SEND_MEDIA_FORBIDDEN: 'You can\\'t send media in this chat',\n CHAT_LINK_EXISTS: 'The chat is public, you can\\'t hide the history to new users',\n // eslint-disable-next-line max-len\n SLOWMODE_WAIT_X: 'Slowmode is enabled in this chat: you must wait for the specified number of seconds before sending another message to the chat.',\n USER_BANNED_IN_CHANNEL: 'You\\'re banned from sending messages in supergroups / channels',\n USER_IS_BLOCKED: 'You were blocked by this user',\n YOU_BLOCKED_USER: 'You blocked this user',\n IMAGE_PROCESS_FAILED: 'Failure while processing image',\n MEDIA_EMPTY: 'The provided media object is invalid',\n MEDIA_INVALID: 'Media invalid',\n PHOTO_EXT_INVALID: 'The extension of the photo is invalid',\n PHOTO_INVALID_DIMENSIONS: 'The photo dimensions are invalid',\n PHOTO_SAVE_FILE_INVALID: 'Internal issues, try again later',\n // eslint-disable-next-line max-len\n MESSAGE_DELETE_FORBIDDEN: 'You can\\'t delete one of the messages you tried to delete, most likely because it is a service message.',\n MESSAGE_POLL_CLOSED: 'Poll closed',\n MESSAGE_EDIT_TIME_EXPIRED: 'You can\\'t edit this message anymore.',\n PINNED_DIALOGS_TOO_MUCH: 'Sorry, you can only pin 5 chats to the top',\n CHANNEL_PRIVATE: 'This channel is private',\n MEDIA_CAPTION_TOO_LONG: 'The provided caption is too long',\n ADDRESS_STREET_LINE1_INVALID: 'The address you provided is not valid',\n ADDRESS_STREET_LINE2_INVALID: 'The address you provided is not valid',\n ADDRESS_CITY_INVALID: 'The city you provided is not valid',\n ADDRESS_COUNTRY_INVALID: 'The country you provided is not valid',\n ADDRESS_POSTCODE_INVALID: 'The postcode you provided is not valid',\n ADDRESS_STATE_INVALID: 'The state you provided is not valid',\n REQ_INFO_NAME_INVALID: 'The name you provided is not valid',\n REQ_INFO_PHONE_INVALID: 'The phone you provided is not valid',\n REQ_INFO_EMAIL_INVALID: 'The email you provided is not valid',\n // TODO Bring back after fixing the weird bug\n // CHANNEL_INVALID: 'An error occurred. Please try again later',\n LINK_NOT_MODIFIED: 'This discussion is already linked to the channel',\n MESSAGE_TOO_LONG: 'Message is too long',\n\n // Non-API errors\n // eslint-disable-next-line max-len\n SERVICE_WORKER_DISABLED: 'Service Worker is disabled. Streaming media may not be supported. Try reloading the page without holding <Shift> key',\n // eslint-disable-next-line max-len\n MESSAGE_TOO_LONG_PLEASE_REMOVE_CHARACTERS: 'The provided message is too long. Please remove {EXTRA_CHARS_COUNT} character{PLURAL_S}.',\n // eslint-disable-next-line max-len\n FRESH_RESET_AUTHORISATION_FORBIDDEN: 'You can’t logout other sessions if less than 24 hours have passed since you logged on the current session',\n\n BOTS_TOO_MUCH: 'There are too many bots in this chat/channel',\n BOT_GROUPS_BLOCKED: 'This bot can\\'t be added to groups',\n USERS_TOO_MUCH: 'The maximum number of users has been exceeded',\n USER_CHANNELS_TOO_MUCH: 'One of the users you tried to add is already in too many channels/supergroups',\n USER_KICKED: 'This user was kicked from this supergroup/channel',\n USER_NOT_MUTUAL_CONTACT: 'The provided user is not a mutual contact',\n USER_PRIVACY_RESTRICTED: 'The user\\'s privacy settings do not allow you to do this',\n INVITE_HASH_EMPTY: 'The invite hash is empty',\n INVITE_HASH_EXPIRED: 'The invite link has expired',\n INVITE_HASH_INVALID: 'The invite hash is invalid',\n CHANNELS_TOO_MUCH: 'You have joined too many channels/supergroups',\n USER_ALREADY_PARTICIPANT: 'You already in the group',\n SCHEDULE_DATE_INVALID: 'Invalid schedule date provided',\n WALLPAPER_DIMENSIONS_INVALID: 'The wallpaper dimensions are invalid, please select another file',\n ADMINS_TOO_MUCH: 'There are too many admins',\n ADMIN_RANK_EMOJI_NOT_ALLOWED: 'An admin rank cannot contain emojis',\n ADMIN_RANK_INVALID: 'The specified admin rank is invalid',\n FRESH_CHANGE_ADMINS_FORBIDDEN: 'You were just elected admin, you can\\'t add or modify other admins yet',\n INPUT_USER_DEACTIVATED: 'The specified user was deleted',\n BOT_PRECHECKOUT_TIMEOUT: 'The request for payment has expired',\n};\n\nif (DEBUG) {\n READABLE_ERROR_MESSAGES.CHAT_WRITE_FORBIDDEN = 'You can\\'t write in this chat';\n READABLE_ERROR_MESSAGES.CHAT_ADMIN_REQUIRED = 'You must be an admin in this chat to do this';\n}\n\nexport const SHIPPING_ERRORS: Record<string, ApiFieldError> = {\n ADDRESS_STREET_LINE1_INVALID: {\n field: 'streetLine1',\n message: 'Incorrect street address',\n },\n ADDRESS_STREET_LINE2_INVALID: {\n field: 'streetLine2',\n message: 'Incorrect street address',\n },\n ADDRESS_CITY_INVALID: {\n field: 'city',\n message: 'Incorrect city',\n },\n ADDRESS_COUNTRY_INVALID: {\n field: 'countryIso2',\n message: 'Incorrect country',\n },\n ADDRESS_POSTCODE_INVALID: {\n field: 'postCode',\n message: 'Incorrect post code',\n },\n ADDRESS_STATE_INVALID: {\n field: 'state',\n message: 'Incorrect state',\n },\n REQ_INFO_NAME_INVALID: {\n field: 'fullName',\n message: 'Incorrect name',\n },\n REQ_INFO_PHONE_INVALID: {\n field: 'phone',\n message: 'Incorrect phone',\n },\n REQ_INFO_EMAIL_INVALID: {\n field: 'email',\n message: 'Incorrect email',\n },\n};\n\nconst FINAL_PAYMENT_ERRORS = new Set([\n 'BOT_PRECHECKOUT_FAILED',\n 'PAYMENT_FAILED',\n]);\n\nexport default function getReadableErrorText(error: ApiError) {\n const { message, isSlowMode, textParams } = error;\n // Currently, Telegram API doesn't return `SLOWMODE_WAIT_X` error as described in the docs\n if (isSlowMode) {\n const extraPartIndex = message.indexOf(' (caused by');\n return extraPartIndex > 0 ? message.substring(0, extraPartIndex) : message;\n }\n let errorMessage = READABLE_ERROR_MESSAGES[message];\n if (errorMessage && textParams) {\n errorMessage = Object.keys(textParams).reduce((acc, current) => {\n return acc.replace(current, textParams[current]);\n }, errorMessage as string);\n }\n return errorMessage;\n}\n\nexport function getShippingError(error: ApiError): ApiFieldError | undefined {\n return SHIPPING_ERRORS[error.message];\n}\n\nexport function shouldClosePaymentModal(error: ApiError): boolean {\n return FINAL_PAYMENT_ERRORS.has(error.message);\n}\n","import { DEBUG_ALERT_MSG } from '../config';\nimport { throttle } from './schedulers';\n\nwindow.addEventListener('error', handleErrorEvent);\nwindow.addEventListener('unhandledrejection', handleErrorEvent);\n\n// eslint-disable-next-line prefer-destructuring\nconst APP_ENV = process.env.APP_ENV;\n\nfunction handleErrorEvent(e: ErrorEvent | PromiseRejectionEvent) {\n // https://stackoverflow.com/questions/49384120/resizeobserver-loop-limit-exceeded\n if (e instanceof ErrorEvent && e.message === 'ResizeObserver loop limit exceeded') {\n return;\n }\n\n e.preventDefault();\n\n handleError(e instanceof ErrorEvent ? (e.error || e.message) : e.reason);\n}\n\nconst throttledAlert = throttle(window.alert, 1000);\n\nexport function handleError(err: Error) {\n // eslint-disable-next-line no-console\n console.error(err);\n\n if (APP_ENV === 'development' || APP_ENV === 'staging') {\n throttledAlert(`${DEBUG_ALERT_MSG}\\n\\n${(err?.message) || err}\\n${err?.stack}`);\n }\n}\n","import { getActions } from '../global';\n\nlet promptInstall: () => Promise<void>;\n\nexport function setupBeforeInstallPrompt() {\n window.addEventListener('beforeinstallprompt', (e: any) => {\n promptInstall = async () => {\n e.prompt();\n const userChoice = await e.userChoice;\n const isInstalled = userChoice.outcome === 'accepted';\n\n if (!isInstalled) return;\n getActions().setInstallPrompt({ canInstall: false });\n };\n getActions().setInstallPrompt({ canInstall: true });\n });\n}\n\nexport function getPromptInstall() {\n return promptInstall;\n}\n","type CollectionByKey<Member> = Record<number | string, Member>;\n\ntype OrderDirection =\n 'asc'\n | 'desc';\n\ninterface OrderCallback<T> {\n (member: T): any;\n}\n\nexport function buildCollectionByKey<T extends AnyLiteral>(collection: T[], key: keyof T) {\n return collection.reduce((byKey: CollectionByKey<T>, member: T) => {\n byKey[member[key]] = member;\n\n return byKey;\n }, {});\n}\n\nexport function mapValues<R extends any, M extends any>(\n byKey: CollectionByKey<M>,\n callback: (member: M, key: string, index: number, originalByKey: CollectionByKey<M>) => R,\n): CollectionByKey<R> {\n return Object.keys(byKey).reduce((newByKey: CollectionByKey<R>, key, index) => {\n newByKey[key] = callback(byKey[key], key, index, byKey);\n return newByKey;\n }, {});\n}\n\nexport function pick<T, K extends keyof T>(object: T, keys: K[]) {\n return keys.reduce((result, key) => {\n result[key] = object[key];\n return result;\n }, {} as Pick<T, K>);\n}\n\nexport function pickTruthy<T, K extends keyof T>(object: T, keys: K[]) {\n return keys.reduce((result, key) => {\n if (object[key]) {\n result[key] = object[key];\n }\n\n return result;\n }, {} as Pick<T, K>);\n}\n\nexport function omit<T, K extends keyof T>(object: T, keys: K[]) {\n const stringKeys = new Set(keys.map(String));\n const savedKeys = Object.keys(object)\n .filter((key) => !stringKeys.has(key)) as Array<Exclude<keyof T, K>>;\n\n return pick(object, savedKeys);\n}\n\nexport function orderBy<T>(\n collection: T[],\n orderRule: (keyof T) | OrderCallback<T> | ((keyof T) | OrderCallback<T>)[],\n mode: OrderDirection | [OrderDirection, OrderDirection] = 'asc',\n): T[] {\n function compareValues(a: T, b: T, currentOrderRule: (keyof T) | OrderCallback<T>, isAsc: boolean) {\n const aValue = (typeof currentOrderRule === 'function' ? currentOrderRule(a) : a[currentOrderRule]) || 0;\n const bValue = (typeof currentOrderRule === 'function' ? currentOrderRule(b) : b[currentOrderRule]) || 0;\n\n return isAsc ? aValue - bValue : bValue - aValue;\n }\n\n if (Array.isArray(orderRule)) {\n const [mode1, mode2] = Array.isArray(mode) ? mode : [mode, mode];\n const [orderRule1, orderRule2] = orderRule;\n const isAsc1 = mode1 === 'asc';\n const isAsc2 = mode2 === 'asc';\n\n return collection.sort((a, b) => {\n return compareValues(a, b, orderRule1, isAsc1) || compareValues(a, b, orderRule2, isAsc2);\n });\n }\n\n const isAsc = mode === 'asc';\n return collection.sort((a, b) => {\n return compareValues(a, b, orderRule, isAsc);\n });\n}\n\nexport function unique<T extends any>(array: T[]): T[] {\n return Array.from(new Set(array));\n}\n\nexport function compact<T extends any>(array: T[]) {\n return array.filter(Boolean);\n}\n\nexport function areSortedArraysEqual(array1: any[], array2: any[]) {\n if (array1.length !== array2.length) {\n return false;\n }\n\n return array1.every((item, i) => item === array2[i]);\n}\n\nexport function areSortedArraysIntersecting(array1: any[], array2: any[]) {\n return array1[0] <= array2[array2.length - 1] && array1[array1.length - 1] >= array2[0];\n}\n\nexport function findIntersectionWithSet<T>(array: T[], set: Set<T>): T[] {\n return array.filter((a) => set.has(a));\n}\n\nexport function split<T extends any>(array: T[], chunkSize: number) {\n const result: T[][] = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n result.push(array.slice(i, i + chunkSize));\n }\n\n return result;\n}\n\nexport function cloneDeep<T>(value: T): T {\n if (typeof value !== 'object') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map(cloneDeep) as typeof value;\n }\n\n return Object.keys(value).reduce((acc, key) => {\n acc[key as keyof T] = cloneDeep(value[key as keyof T]);\n return acc;\n }, {} as T);\n}\n\nexport function findLast<T>(array: Array<T>, predicate: (value: T, index: number, obj: T[]) => boolean): T | undefined {\n let cursor = array.length;\n\n while (cursor--) {\n if (predicate(array[cursor], cursor, array)) {\n return array[cursor];\n }\n }\n\n return undefined;\n}\n","import { getGlobal } from '../global';\n\nimport type { ApiLangPack, ApiLangString } from '../api/types';\nimport type { LangCode, TimeFormat } from '../types';\n\nimport {\n DEFAULT_LANG_CODE, DEFAULT_LANG_PACK, LANG_CACHE_NAME, LANG_PACKS,\n} from '../config';\nimport * as cacheApi from './cacheApi';\nimport { callApi } from '../api/gramjs';\nimport { createCallbackManager } from './callbacks';\nimport { formatInteger } from './textFormat';\n\ninterface LangFn {\n (key: string, value?: any, format?: 'i'): any;\n\n isRtl?: boolean;\n code?: LangCode;\n langName?: string;\n timeFormat?: TimeFormat;\n}\n\nconst SUBSTITUTION_REGEX = /%\\d?\\$?[sdf@]/g;\nconst PLURAL_OPTIONS = ['value', 'zeroValue', 'oneValue', 'twoValue', 'fewValue', 'manyValue', 'otherValue'] as const;\nconst PLURAL_RULES = {\n /* eslint-disable max-len */\n en: (n: number) => (n !== 1 ? 6 : 2),\n ar: (n: number) => (n === 0 ? 1 : n === 1 ? 2 : n === 2 ? 3 : n % 100 >= 3 && n % 100 <= 10 ? 4 : n % 100 >= 11 ? 5 : 6),\n ca: (n: number) => (n !== 1 ? 6 : 2),\n de: (n: number) => (n !== 1 ? 6 : 2),\n es: (n: number) => (n !== 1 ? 6 : 2),\n fa: (n: number) => (n > 1 ? 6 : 2),\n fr: (n: number) => (n > 1 ? 6 : 2),\n id: () => 0,\n it: (n: number) => (n !== 1 ? 6 : 2),\n ko: () => 0,\n ms: () => 0,\n nl: (n: number) => (n !== 1 ? 6 : 2),\n pl: (n: number) => (n === 1 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n pt_BR: (n: number) => (n > 1 ? 6 : 2),\n ru: (n: number) => (n % 10 === 1 && n % 100 !== 11 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n tr: (n: number) => (n > 1 ? 6 : 2),\n uk: (n: number) => (n % 10 === 1 && n % 100 !== 11 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n uz: (n: number) => (n > 1 ? 6 : 2),\n /* eslint-enable max-len */\n};\n\nconst cache = new Map<string, string>();\n\nlet langPack: ApiLangPack | undefined;\nlet fallbackLangPack: ApiLangPack | undefined;\n\nconst {\n addCallback,\n removeCallback,\n runCallbacks,\n} = createCallbackManager();\n\nexport { addCallback, removeCallback };\n\nlet currentLangCode: string | undefined;\nlet currentTimeFormat: TimeFormat | undefined;\n\nexport const getTranslation: LangFn = (key: string, value?: any, format?: 'i') => {\n if (value !== undefined) {\n const cacheValue = Array.isArray(value) ? JSON.stringify(value) : value;\n const cached = cache.get(`${key}_${cacheValue}_${format}`);\n if (cached) {\n return cached;\n }\n }\n\n if (!langPack && !fallbackLangPack) {\n return key;\n }\n\n const langString = (langPack?.[key]) || (fallbackLangPack?.[key]);\n if (!langString) {\n if (!fallbackLangPack) {\n void importFallbackLangPack();\n }\n\n return key;\n }\n\n return processTranslation(langString, key, value, format);\n};\n\nexport async function getTranslationForLangString(langCode: string, key: string) {\n let translateString: ApiLangString | undefined = await cacheApi.fetch(\n LANG_CACHE_NAME,\n `${DEFAULT_LANG_PACK}_${langCode}_${key}`,\n cacheApi.Type.Json,\n );\n\n if (!translateString) {\n translateString = await fetchRemoteString(DEFAULT_LANG_PACK, langCode, key);\n }\n\n return processTranslation(translateString, key);\n}\n\nexport async function setLanguage(langCode: LangCode, callback?: NoneToVoidFunction, withFallback = false) {\n if (langPack && langCode === currentLangCode) {\n if (callback) {\n callback();\n }\n\n return;\n }\n\n let newLangPack = await cacheApi.fetch(LANG_CACHE_NAME, langCode, cacheApi.Type.Json);\n if (!newLangPack) {\n if (withFallback) {\n await importFallbackLangPack();\n }\n\n newLangPack = await fetchRemote(langCode);\n if (!newLangPack) {\n return;\n }\n }\n\n cache.clear();\n\n currentLangCode = langCode;\n langPack = newLangPack;\n document.documentElement.lang = langCode;\n\n const { languages, timeFormat } = getGlobal().settings.byKey;\n const langInfo = languages?.find((l) => l.langCode === langCode);\n getTranslation.isRtl = Boolean(langInfo?.rtl);\n getTranslation.code = langCode;\n getTranslation.langName = langInfo?.nativeName;\n getTranslation.timeFormat = timeFormat;\n\n if (callback) {\n callback();\n }\n\n runCallbacks();\n}\n\nexport function setTimeFormat(timeFormat: TimeFormat) {\n if (timeFormat && timeFormat === currentTimeFormat) {\n return;\n }\n\n currentTimeFormat = timeFormat;\n getTranslation.timeFormat = timeFormat;\n\n runCallbacks();\n}\n\nasync function importFallbackLangPack() {\n if (fallbackLangPack) {\n return;\n }\n\n fallbackLangPack = (await import('./fallbackLangPack')).default;\n runCallbacks();\n}\n\nasync function fetchRemote(langCode: string): Promise<ApiLangPack | undefined> {\n const remote = await callApi('fetchLangPack', { sourceLangPacks: LANG_PACKS, langCode });\n if (remote) {\n await cacheApi.save(LANG_CACHE_NAME, langCode, remote.langPack);\n return remote.langPack;\n }\n\n return undefined;\n}\n\nasync function fetchRemoteString(\n remoteLangPack: typeof LANG_PACKS[number], langCode: string, key: string,\n): Promise<ApiLangString | undefined> {\n const remote = await callApi('fetchLangStrings', {\n langPack: remoteLangPack,\n langCode,\n keys: [key],\n });\n\n if (remote?.length) {\n await cacheApi.save(LANG_CACHE_NAME, `${remoteLangPack}_${langCode}_${key}`, remote[0]);\n\n return remote[0];\n }\n\n return undefined;\n}\n\nfunction getPluralOption(amount: number) {\n const langCode = currentLangCode || DEFAULT_LANG_CODE;\n const optionIndex = PLURAL_RULES[langCode as keyof typeof PLURAL_RULES]\n ? PLURAL_RULES[langCode as keyof typeof PLURAL_RULES](amount)\n : 0;\n\n return PLURAL_OPTIONS[optionIndex];\n}\n\nfunction processTemplate(template: string, value: any) {\n value = Array.isArray(value) ? value : [value];\n const translationSlices = template.split(SUBSTITUTION_REGEX);\n const initialValue = translationSlices.shift();\n\n return translationSlices.reduce((result, str, index) => {\n return `${result}${String(value[index] || '')}${str}`;\n }, initialValue || '');\n}\n\nfunction processTranslation(langString: ApiLangString | undefined, key: string, value?: any, format?: 'i') {\n const preferedPluralOption = typeof value === 'number' ? getPluralOption(value) : 'value';\n const template = langString ? (\n langString[preferedPluralOption] || langString.otherValue || langString.value\n ) : undefined;\n if (!template || !template.trim()) {\n const parts = key.split('.');\n\n return parts[parts.length - 1];\n }\n\n if (value !== undefined) {\n const formattedValue = format === 'i' ? formatInteger(value) : value;\n const result = processTemplate(template, formattedValue);\n const cacheValue = Array.isArray(value) ? JSON.stringify(value) : value;\n cache.set(`${key}_${cacheValue}_${format}`, result);\n return result;\n }\n\n return template;\n}\n","export const clamp = (num: number, min: number, max: number) => (Math.min(max, Math.max(min, num)));\nexport const isBetween = (num: number, min: number, max: number) => (num >= min && num <= max);\nexport const round = (num: number, decimals: number = 0) => Math.round(num * 10 ** decimals) / 10 ** decimals;\nexport const lerp = (start: number, end: number, interpolationRatio: number) => {\n return (1 - interpolationRatio) * start + interpolationRatio * end;\n};\n","const SAMPLE_RATE = 48000;\nconst BIT_DEPTH = 16;\n\nexport async function oggToWav(opusData: Blob): Promise<Blob> {\n const arrayBuffer = await new Response(opusData).arrayBuffer();\n\n return new Promise((resolve) => {\n const typedArray = new Uint8Array(arrayBuffer);\n\n let decoderWorker: Worker | undefined = new Worker(\n new URL('opus-recorder/dist/decoderWorker.min.js', import.meta.url),\n );\n let wavWorker: Worker | undefined = new Worker(new URL('opus-recorder/dist/waveWorker.min.js', import.meta.url));\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 type {\n ApiOnProgress,\n ApiParsedMedia,\n ApiPreparedMedia,\n} from '../api/types';\nimport {\n ApiMediaFormat,\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 {\n IS_OPUS_SUPPORTED, IS_PROGRESSIVE_SUPPORTED, isWebpSupported,\n} from './environment';\nimport { oggToWav } from './oggToWav';\nimport { webpToPng } from './webpToPng';\n\nconst asCacheApiType = {\n [ApiMediaFormat.BlobUrl]: cacheApi.Type.Blob,\n [ApiMediaFormat.Text]: cacheApi.Type.Text,\n [ApiMediaFormat.DownloadUrl]: undefined,\n [ApiMediaFormat.Progressive]: undefined,\n [ApiMediaFormat.Stream]: undefined,\n};\n\nconst PROGRESSIVE_URL_PREFIX = './progressive/';\nconst URL_DOWNLOAD_PREFIX = './download/';\n\nconst memoryCache = new Map<string, ApiPreparedMedia>();\nconst fetchPromises = new Map<string, Promise<ApiPreparedMedia | undefined>>();\nconst progressCallbacks = new Map<string, Map<string, ApiOnProgress>>();\nconst cancellableCallbacks = new Map<string, ApiOnProgress>();\n\nexport function fetch<T extends ApiMediaFormat>(\n url: string,\n mediaFormat: T,\n isHtmlAllowed = false,\n onProgress?: ApiOnProgress,\n callbackUniqueId?: string,\n): Promise<ApiPreparedMedia> {\n if (mediaFormat === ApiMediaFormat.Progressive) {\n return (\n IS_PROGRESSIVE_SUPPORTED\n ? getProgressive(url)\n : fetch(url, ApiMediaFormat.BlobUrl, isHtmlAllowed, onProgress, callbackUniqueId)\n ) as Promise<ApiPreparedMedia>;\n }\n\n if (mediaFormat === ApiMediaFormat.DownloadUrl) {\n return (\n IS_PROGRESSIVE_SUPPORTED\n ? getDownloadUrl(url)\n : fetch(url, ApiMediaFormat.BlobUrl, isHtmlAllowed, onProgress, callbackUniqueId)\n ) as Promise<ApiPreparedMedia>;\n }\n\n if (!fetchPromises.has(url)) {\n const promise = fetchFromCacheOrRemote(url, mediaFormat, isHtmlAllowed)\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 progressCallbacks.delete(url);\n cancellableCallbacks.delete(url);\n });\n\n fetchPromises.set(url, promise);\n }\n\n if (onProgress && callbackUniqueId) {\n let activeCallbacks = progressCallbacks.get(url);\n if (!activeCallbacks) {\n activeCallbacks = new Map<string, ApiOnProgress>();\n progressCallbacks.set(url, activeCallbacks);\n }\n activeCallbacks.set(callbackUniqueId, onProgress);\n }\n\n return fetchPromises.get(url) as Promise<ApiPreparedMedia>;\n}\n\nexport function getFromMemory(url: string) {\n return memoryCache.get(url) as ApiPreparedMedia;\n}\n\nexport function cancelProgress(progressCallback: ApiOnProgress) {\n progressCallbacks.forEach((map, url) => {\n map.forEach((callback) => {\n if (callback === progressCallback) {\n const parentCallback = cancellableCallbacks.get(url);\n if (!parentCallback) return;\n\n cancelApiProgress(parentCallback);\n cancellableCallbacks.delete(url);\n progressCallbacks.delete(url);\n }\n });\n });\n}\n\nexport function removeCallback(url: string, callbackUniqueId: string) {\n const callbacks = progressCallbacks.get(url);\n if (!callbacks) return;\n callbacks.delete(callbackUniqueId);\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\nfunction getDownloadUrl(url: string) {\n return Promise.resolve(`${URL_DOWNLOAD_PREFIX}${url}`);\n}\n\nasync function fetchFromCacheOrRemote(\n url: string, mediaFormat: ApiMediaFormat, isHtmlAllowed: boolean,\n) {\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]!, isHtmlAllowed);\n\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 const onProgress = makeOnProgress(url, mediaSource, sourceBuffer);\n cancellableCallbacks.set(url, onProgress);\n\n void callApi('downloadMedia', { url, mediaFormat }, onProgress);\n });\n\n memoryCache.set(url, streamUrl);\n return streamUrl;\n }\n\n const onProgress = makeOnProgress(url);\n cancellableCallbacks.set(url, onProgress);\n\n const remote = await callApi('downloadMedia', { url, mediaFormat, isHtmlAllowed }, onProgress);\n if (!remote) {\n throw new Error(`Failed to fetch media ${url}`);\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 = media.type;\n }\n\n if (mimeType === 'image/webp' && !isWebpSupported()) {\n const blob = await fetchBlob(prepared as string);\n URL.revokeObjectURL(prepared as string);\n const media = await webpToPng(url, blob);\n if (media) {\n prepared = prepareMedia(media);\n }\n }\n\n memoryCache.set(url, prepared);\n\n return prepared;\n}\n\nfunction makeOnProgress(url: string, mediaSource?: MediaSource, sourceBuffer?: SourceBuffer) {\n const onProgress: ApiOnProgress = (progress: number, arrayBuffer: ArrayBuffer) => {\n progressCallbacks.get(url)?.forEach((callback) => {\n callback(progress);\n if (callback.isCanceled) onProgress.isCanceled = true;\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 return onProgress;\n}\n\nfunction prepareMedia(mediaData: Exclude<ApiParsedMedia, ArrayBuffer>): 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","export const MEMO_EMPTY_ARRAY = [];\n","import { DEBUG } from '../config';\nimport { createCallbackManager } from './callbacks';\n\nexport enum Bundles {\n Auth,\n Main,\n Extra,\n Calls,\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 [Bundles.Calls]: typeof import('../bundles/calls');\n}\n\ntype BundlePromises = {\n [K in keyof ImportedBundles]: Promise<ImportedBundles[K]>\n};\n\nexport type BundleModules<B extends keyof ImportedBundles> = keyof ImportedBundles[B];\n\nconst LOAD_PROMISES: Partial<BundlePromises> = {};\nconst MEMORY_CACHE: Partial<ImportedBundles> = {};\n\nconst { addCallback, runCallbacks } = createCallbackManager();\n\nexport async function loadModule<B extends Bundles, M extends BundleModules<B>>(bundleName: B, moduleName: M) {\n if (!LOAD_PROMISES[bundleName]) {\n switch (bundleName) {\n case Bundles.Auth:\n LOAD_PROMISES[Bundles.Auth] = import(/* webpackChunkName: \"BundleAuth\" */ '../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(/* webpackChunkName: \"BundleMain\" */ '../bundles/main');\n break;\n case Bundles.Extra:\n LOAD_PROMISES[Bundles.Extra] = import(/* webpackChunkName: \"BundleExtra\" */ '../bundles/extra');\n break;\n case Bundles.Calls:\n LOAD_PROMISES[Bundles.Calls] = import(/* webpackChunkName: \"BundleCalls\" */ '../bundles/calls');\n break;\n }\n\n (LOAD_PROMISES[bundleName] as Promise<ImportedBundles[B]>).then(runCallbacks);\n }\n\n const bundle = (await LOAD_PROMISES[bundleName]) as unknown as ImportedBundles[B];\n\n if (!MEMORY_CACHE[bundleName]) {\n MEMORY_CACHE[bundleName] = bundle;\n }\n\n return getModuleFromMemory(bundleName, moduleName);\n}\n\nexport function getModuleFromMemory<B extends Bundles, M extends BundleModules<B>>(bundleName: B, moduleName: M) {\n const bundle = MEMORY_CACHE[bundleName] as ImportedBundles[B];\n\n if (!bundle) {\n return undefined;\n }\n\n return bundle[moduleName];\n}\n\nexport const addLoadListener = addCallback;\n","import { callApi } from '../api/gramjs';\nimport type {\n ApiChat, ApiMessage, ApiPhoneCall, ApiUser, ApiUserReaction,\n} from '../api/types';\nimport { ApiMediaFormat } from '../api/types';\nimport { renderActionMessageText } from '../components/common/helpers/renderActionMessageText';\nimport { APP_NAME, DEBUG, IS_TEST } from '../config';\nimport { getActions, getGlobal, setGlobal } from '../global';\nimport {\n getChatAvatarHash,\n getChatTitle,\n getMessageAction,\n getMessageRecentReaction,\n getMessageSenderName,\n getMessageSummaryText,\n getPrivateChatUserId, getUserFullName,\n isActionMessage,\n isChatChannel,\n selectIsChatMuted,\n selectShouldShowMessagePreview,\n} from '../global/helpers';\nimport { addNotifyExceptions, replaceSettings } from '../global/reducers';\nimport {\n selectChatMessage,\n selectCurrentMessageList,\n selectNotifyExceptions,\n selectNotifySettings,\n selectUser,\n} from '../global/selectors';\nimport { IS_SERVICE_WORKER_SUPPORTED, IS_TOUCH_ENV } from './environment';\nimport { getTranslation } from './langProvider';\nimport * as mediaLoader from './mediaLoader';\nimport { debounce } from './schedulers';\n\nfunction getDeviceToken(subscription: PushSubscription) {\n const data = subscription.toJSON();\n return JSON.stringify({\n endpoint: data.endpoint,\n keys: data.keys,\n });\n}\n\nfunction checkIfPushSupported() {\n if (!IS_SERVICE_WORKER_SUPPORTED) return false;\n if (!('showNotification' in ServiceWorkerRegistration.prototype)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] Push notifications aren\\'t supported.');\n }\n return false;\n }\n\n // Check the current Notification permission.\n // If its denied, it's a permanent block until the\n // user changes the permission\n if (Notification.permission === 'denied') {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] The user has blocked push notifications.');\n }\n return false;\n }\n\n // Check if push messaging is supported\n if (!('PushManager' in window)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] Push messaging isn\\'t supported.');\n }\n return false;\n }\n return true;\n}\n\nfunction checkIfNotificationsSupported() {\n // Let's check if the browser supports notifications\n if (!('Notification' in window)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] This browser does not support desktop notification');\n }\n return false;\n }\n\n if (Notification.permission === 'denied' as NotificationPermission) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] The user has blocked push notifications.');\n }\n return false;\n }\n return true;\n}\n\nconst expirationTime = 12 * 60 * 60 * 1000; // 12 hours\n// Notification id is removed from soundPlayed cache after 3 seconds\nconst soundPlayedDelay = 3 * 1000;\nconst soundPlayedIds = new Set<string>();\n\nexport async function playNotifySound(id?: string, volume?: number) {\n if (id !== undefined && soundPlayedIds.has(id)) return;\n const { notificationSoundVolume } = selectNotifySettings(getGlobal());\n const currentVolume = volume ? volume / 10 : notificationSoundVolume / 10;\n if (currentVolume === 0) return;\n\n const audio = new Audio('./notification.mp3');\n audio.volume = currentVolume;\n audio.setAttribute('mozaudiochannel', 'notification');\n if (id !== undefined) {\n audio.addEventListener('ended', () => {\n soundPlayedIds.add(id);\n }, { once: true });\n\n setTimeout(() => {\n soundPlayedIds.delete(id);\n }, soundPlayedDelay);\n }\n\n try {\n await audio.play();\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] Unable to play notification sound');\n }\n }\n}\n\nexport const playNotifySoundDebounced = debounce(playNotifySound, 1000, true, false);\n\nfunction checkIfShouldResubscribe(subscription: PushSubscription | null) {\n const global = getGlobal();\n if (!global.push || !subscription) return true;\n if (getDeviceToken(subscription) !== global.push.deviceToken) return true;\n return Date.now() - global.push.subscribedAt > expirationTime;\n}\n\nasync function requestPermission() {\n if (!('Notification' in window)) return;\n if (!['granted', 'denied'].includes(Notification.permission)) {\n await Notification.requestPermission();\n }\n}\n\nasync function unsubscribeFromPush(subscription: PushSubscription | null) {\n const global = getGlobal();\n const dispatch = getActions();\n if (subscription) {\n try {\n const deviceToken = getDeviceToken(subscription);\n await callApi('unregisterDevice', deviceToken);\n await subscription.unsubscribe();\n dispatch.deleteDeviceToken();\n return;\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] Unable to unsubscribe from push.', error);\n }\n }\n }\n if (global.push) {\n await callApi('unregisterDevice', global.push.deviceToken);\n dispatch.deleteDeviceToken();\n }\n}\n\nexport async function unsubscribe() {\n if (!checkIfPushSupported()) return;\n const serviceWorkerRegistration = await navigator.serviceWorker.ready;\n const subscription = await serviceWorkerRegistration.pushManager.getSubscription();\n await unsubscribeFromPush(subscription);\n}\n\n// Indicates if notification settings are loaded from the api\nlet areSettingsLoaded = false;\n\n// Load notification settings from the api\nasync function loadNotificationSettings() {\n if (areSettingsLoaded) return selectNotifySettings(getGlobal());\n const [resultSettings, resultExceptions] = await Promise.all([\n callApi('fetchNotificationSettings', {\n serverTimeOffset: getGlobal().serverTimeOffset,\n }),\n callApi('fetchNotificationExceptions', {\n serverTimeOffset: getGlobal().serverTimeOffset,\n }),\n ]);\n if (!resultSettings) return selectNotifySettings(getGlobal());\n\n let global = replaceSettings(getGlobal(), resultSettings);\n if (resultExceptions) {\n global = addNotifyExceptions(global, resultExceptions);\n }\n setGlobal(global);\n areSettingsLoaded = true;\n return selectNotifySettings(global);\n}\n\nexport async function subscribe() {\n if (!checkIfPushSupported()) {\n // Ask for notification permissions only if service worker notifications are not supported\n // As pushManager.subscribe automatically triggers permission popup\n await requestPermission();\n return;\n }\n const serviceWorkerRegistration = await navigator.serviceWorker.ready;\n let subscription = await serviceWorkerRegistration.pushManager.getSubscription();\n if (!checkIfShouldResubscribe(subscription)) return;\n await unsubscribeFromPush(subscription);\n try {\n subscription = await serviceWorkerRegistration.pushManager.subscribe({\n userVisibleOnly: true,\n });\n const deviceToken = getDeviceToken(subscription);\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] Received push subscription: ', deviceToken);\n }\n await callApi('registerDevice', deviceToken);\n getActions()\n .setDeviceToken(deviceToken);\n } catch (error: any) {\n if (Notification.permission === 'denied' as NotificationPermission) {\n // The user denied the notification permission which\n // means we failed to subscribe and the user will need\n // to manually change the notification permission to\n // subscribe to push messages\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] The user has blocked push notifications.');\n }\n } else if (DEBUG) {\n // A problem occurred with the subscription, this can\n // often be down to an issue or lack of the gcm_sender_id\n // and / or gcm_user_visible_only\n // eslint-disable-next-line no-console\n console.log('[PUSH] Unable to subscribe to push.', error);\n\n // Request permissions and fall back to local notifications\n // if pushManager.subscribe was aborted due to invalid VAPID key.\n if (error.code === DOMException.ABORT_ERR) {\n await requestPermission();\n }\n }\n }\n}\n\nfunction checkIfShouldNotify(chat: ApiChat) {\n if (!areSettingsLoaded) return false;\n const global = getGlobal();\n const isMuted = selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global));\n if (isMuted || chat.isNotJoined || !chat.isListed) {\n return false;\n }\n // On touch devices show notifications when chat is not active\n if (IS_TOUCH_ENV) {\n const {\n chatId,\n type,\n } = selectCurrentMessageList(global) || {};\n return !(chatId === chat.id && type === 'thread');\n }\n // On desktop show notifications when window is not focused\n return !document.hasFocus();\n}\n\nfunction getNotificationContent(chat: ApiChat, message: ApiMessage, reaction?: ApiUserReaction) {\n const global = getGlobal();\n const {\n replyToMessageId,\n } = message;\n let {\n senderId,\n } = message;\n if (reaction) senderId = reaction.userId;\n\n const { isScreenLocked } = global.passcode;\n const messageSender = senderId ? selectUser(global, senderId) : undefined;\n const messageAction = getMessageAction(message as ApiMessage);\n const actionTargetMessage = messageAction && replyToMessageId\n ? selectChatMessage(global, chat.id, replyToMessageId)\n : undefined;\n const {\n targetUserIds: actionTargetUserIds,\n targetChatId: actionTargetChatId,\n } = messageAction || {};\n\n const actionTargetUsers = actionTargetUserIds\n ? actionTargetUserIds.map((userId) => selectUser(global, userId))\n .filter<ApiUser>(Boolean as any)\n : undefined;\n const privateChatUserId = getPrivateChatUserId(chat);\n const privateChatUser = privateChatUserId ? selectUser(global, privateChatUserId) : undefined;\n\n let body: string;\n if (\n !isScreenLocked\n && selectShouldShowMessagePreview(chat, selectNotifySettings(global), selectNotifyExceptions(global))\n ) {\n if (isActionMessage(message)) {\n const isChat = chat && (isChatChannel(chat) || message.senderId === message.chatId);\n\n body = renderActionMessageText(\n getTranslation,\n message,\n !isChat ? messageSender : undefined,\n isChat ? chat : undefined,\n actionTargetUsers,\n actionTargetMessage,\n actionTargetChatId,\n { asPlainText: true },\n ) as string;\n } else {\n const senderName = getMessageSenderName(getTranslation, chat.id, messageSender);\n const summary = getMessageSummaryText(getTranslation, message, false, 60, false);\n\n body = senderName ? `${senderName}: ${summary}` : summary;\n }\n } else {\n body = 'New message';\n }\n\n return {\n title: isScreenLocked ? APP_NAME : getChatTitle(getTranslation, chat, privateChatUser),\n body,\n };\n}\n\nasync function getAvatar(chat: ApiChat | ApiUser) {\n const imageHash = getChatAvatarHash(chat);\n if (!imageHash) return undefined;\n let mediaData = mediaLoader.getFromMemory(imageHash);\n if (!mediaData) {\n await mediaLoader.fetch(imageHash, ApiMediaFormat.BlobUrl);\n mediaData = mediaLoader.getFromMemory(imageHash);\n }\n return mediaData;\n}\n\nexport async function notifyAboutCall({\n call, user,\n}: {\n call: ApiPhoneCall; user: ApiUser;\n}) {\n const { hasWebNotifications } = await loadNotificationSettings();\n if (document.hasFocus() || !hasWebNotifications) return;\n const areNotificationsSupported = checkIfNotificationsSupported();\n if (!areNotificationsSupported) return;\n\n const icon = await getAvatar(user);\n\n const options: NotificationOptions = {\n body: getUserFullName(user),\n icon,\n badge: icon,\n tag: `call_${call.id}`,\n };\n\n if ('vibrate' in navigator) {\n options.vibrate = [200, 100, 200];\n }\n\n const notification = new Notification(getTranslation('VoipIncoming'), options);\n\n notification.onclick = () => {\n notification.close();\n if (window.focus) {\n window.focus();\n }\n };\n}\n\nexport async function notifyAboutMessage({\n chat,\n message,\n isReaction = false,\n}: { chat: ApiChat; message: Partial<ApiMessage>; isReaction?: boolean }) {\n const { hasWebNotifications } = await loadNotificationSettings();\n if (!checkIfShouldNotify(chat)) return;\n const areNotificationsSupported = checkIfNotificationsSupported();\n if (!hasWebNotifications || !areNotificationsSupported) {\n // Do not play notification sound for reactions if web notifications are disabled\n if (isReaction) return;\n // Only play sound if web notifications are disabled\n playNotifySoundDebounced(String(message.id) || chat.id);\n return;\n }\n if (!areNotificationsSupported) return;\n\n if (!message.id) return;\n\n const activeReaction = getMessageRecentReaction(message);\n // Do not notify about reactions on messages that are not outgoing\n if (isReaction && !activeReaction) return;\n\n const icon = await getAvatar(chat);\n\n const {\n title,\n body,\n } = getNotificationContent(chat, message as ApiMessage, activeReaction);\n\n if (checkIfPushSupported()) {\n if (navigator.serviceWorker?.controller) {\n // notify service worker about new message notification\n navigator.serviceWorker.controller.postMessage({\n type: 'showMessageNotification',\n payload: {\n title,\n body,\n icon,\n chatId: chat.id,\n messageId: message.id,\n shouldReplaceHistory: true,\n reaction: activeReaction?.reaction,\n },\n });\n }\n } else {\n const dispatch = getActions();\n const options: NotificationOptions = {\n body,\n icon,\n badge: icon,\n tag: String(message.id),\n };\n\n if ('vibrate' in navigator) {\n options.vibrate = [200, 100, 200];\n }\n\n const notification = new Notification(title, options);\n\n notification.onclick = () => {\n notification.close();\n dispatch.focusMessage({\n chatId: chat.id,\n messageId: message.id,\n shouldReplaceHistory: true,\n });\n if (window.focus) {\n window.focus();\n }\n };\n\n // Play sound when notification is displayed\n notification.onshow = () => {\n // TODO Remove when reaction badges are implemented\n if (isReaction) return;\n playNotifySoundDebounced(String(message.id) || chat.id);\n };\n }\n}\n\nexport function closeMessageNotifications(payload: { chatId: string; lastReadInboxMessageId?: number }) {\n if (IS_TEST || !navigator.serviceWorker?.controller) return;\n navigator.serviceWorker.controller.postMessage({\n type: 'closeMessageNotifications',\n payload,\n });\n}\n\n// Notify service worker that client is fully loaded\nexport function notifyClientReady() {\n if (!navigator.serviceWorker?.controller) return;\n navigator.serviceWorker.controller.postMessage({\n type: 'clientReady',\n });\n}\n","import * as cacheApi from './cacheApi';\nimport { PASSCODE_CACHE_NAME } from '../config';\n\nconst IV_LENGTH = 12;\nconst SALT = 'harder better faster stronger';\n\nlet currentPasscodeHash: ArrayBuffer | undefined;\n\nexport async function setupPasscode(passcode: string) {\n currentPasscodeHash = await sha256(passcode);\n}\n\nexport async function encryptSession(sessionJson?: string, globalJson?: string) {\n if (!currentPasscodeHash) {\n throw new Error('[api/passcode] Missing current passcode');\n }\n\n await Promise.all([\n (async () => {\n if (!sessionJson) return;\n\n const sessionEncrypted = await aesEncrypt(sessionJson, currentPasscodeHash);\n await store('sessionEncrypted', sessionEncrypted);\n })(),\n (async () => {\n if (!globalJson) return;\n\n const globalEncrypted = await aesEncrypt(globalJson, currentPasscodeHash);\n await store('globalEncrypted', globalEncrypted);\n })(),\n ]);\n}\n\nexport async function decryptSession(passcode: string) {\n const passcodeHash = await sha256(passcode);\n\n const [sessionEncrypted, globalEncrypted] = await Promise.all([\n load('sessionEncrypted'),\n load('globalEncrypted'),\n ]);\n\n if (!sessionEncrypted || !globalEncrypted) {\n throw new Error('[api/passcode] Missing required stored fields');\n }\n\n const [sessionJson, globalJson] = await Promise.all([\n aesDecrypt(sessionEncrypted, passcodeHash),\n aesDecrypt(globalEncrypted, passcodeHash),\n ]);\n\n currentPasscodeHash = passcodeHash;\n\n return { sessionJson, globalJson };\n}\n\nexport function forgetPasscode() {\n currentPasscodeHash = undefined;\n}\n\nexport function clearEncryptedSession() {\n forgetPasscode();\n return cacheApi.clear(PASSCODE_CACHE_NAME);\n}\n\nfunction sha256(plaintext: string) {\n return crypto.subtle.digest('SHA-256', new TextEncoder().encode(`${plaintext}${SALT}`));\n}\n\nasync function store(key: string, value: ArrayBuffer) {\n await cacheApi.save(PASSCODE_CACHE_NAME, key, value);\n}\n\nfunction load(key: string) {\n return cacheApi.fetch(PASSCODE_CACHE_NAME, key, cacheApi.Type.ArrayBuffer);\n}\n\nasync function aesEncrypt(plaintext: string, pwHash: ArrayBuffer) {\n const iv = crypto.getRandomValues(new Uint8Array(IV_LENGTH));\n const alg = { name: 'AES-GCM', iv };\n const key = await crypto.subtle.importKey('raw', pwHash, alg, false, ['encrypt']);\n const ptUint8 = new TextEncoder().encode(plaintext);\n const ctBuffer = await crypto.subtle.encrypt(alg, key, ptUint8);\n const ct = new Uint8Array(ctBuffer);\n const result = new Uint8Array(IV_LENGTH + ct.length);\n result.set(iv, 0);\n result.set(ct, IV_LENGTH);\n return result.buffer;\n}\n\nasync function aesDecrypt(data: ArrayBuffer, pwHash: ArrayBuffer) {\n const dataArray = new Uint8Array(data);\n const iv = dataArray.slice(0, IV_LENGTH);\n const alg = { name: 'AES-GCM', iv };\n const key = await crypto.subtle.importKey('raw', pwHash, alg, false, ['decrypt']);\n const ct = dataArray.slice(IV_LENGTH);\n const plainBuffer = await crypto.subtle.decrypt(alg, key, ct);\n\n return new TextDecoder().decode(plainBuffer);\n}\n","import type { ApiCountryCode } from '../api/types';\n\nconst PATTERN_PLACEHOLDER = 'X';\nconst DEFAULT_PATTERN = 'XXX XXX XXX XXX';\n\nexport function getCountryCodesByIso(phoneCodeList: ApiCountryCode[], iso: string) {\n return phoneCodeList.filter((country) => country.iso2 === iso);\n}\n\nexport function getCountryFromPhoneNumber(phoneCodeList: ApiCountryCode[], input = '') {\n let phoneNumber = input.replace(/[^\\d+]+/g, '');\n if (phoneNumber.startsWith('+')) {\n phoneNumber = phoneNumber.substr(1);\n }\n\n const possibleCountries = phoneCodeList\n .filter((country) => phoneNumber.startsWith(country.countryCode));\n const codesWithPrefix: { code: string; country: ApiCountryCode }[] = possibleCountries\n .map((country) => (country.prefixes || ['']).map((prefix) => {\n return {\n code: `${country.countryCode}${prefix}`,\n country,\n };\n }))\n .flat();\n\n const bestMatches = codesWithPrefix\n .filter(({ code }) => phoneNumber.startsWith(code))\n .sort((a, b) => a.code.length - b.code.length);\n\n return bestMatches[bestMatches.length - 1]?.country;\n}\n\nexport function formatPhoneNumber(input: string, country?: ApiCountryCode) {\n if (!input) {\n return '';\n }\n\n let phoneNumber = input.replace(/[^\\d]+/g, '');\n if (country) {\n phoneNumber = phoneNumber.substr(country.countryCode.length);\n } else if (input.startsWith('+')) {\n return input;\n }\n const pattern = getBestPattern(phoneNumber, country?.patterns);\n\n const result: string[] = []; // Result character array\n let j = 0; // Position inside pattern\n for (let i = 0; i < phoneNumber.length; i++) {\n while (pattern[j] !== PATTERN_PLACEHOLDER && j < pattern.length) {\n result.push(pattern[j]);\n if (pattern[j] === phoneNumber[i]) { // If pattern contains digits, move input position too\n i++;\n if (i === phoneNumber.length) break; // But don't overdo it, or it will insert full pattern unexpectedly\n }\n j++;\n }\n\n result.push(phoneNumber[i]); // For placeholder characters, setting current input digit\n j++;\n }\n\n return result.join('');\n}\n\nfunction getBestPattern(numberWithoutCode: string, patterns?: string[]) {\n if (!patterns || patterns.length === 0) return DEFAULT_PATTERN;\n if (patterns.length === 1) return patterns[0];\n\n const defaultPattern = patterns.find((pattern) => pattern.startsWith(PATTERN_PLACEHOLDER)) || DEFAULT_PATTERN;\n\n const bestMatches = patterns.filter((pattern) => {\n const stripped = pattern.replace(/[^\\dX]+/g, '');\n if (stripped.startsWith(PATTERN_PLACEHOLDER)) return false; // Don't consider default number format here\n for (let i = 0; i < numberWithoutCode.length; i++) {\n if (i > stripped.length - 1 || (stripped[i] !== PATTERN_PLACEHOLDER && stripped[i] !== numberWithoutCode[i])) {\n return false;\n }\n }\n return true;\n });\n\n // Playing it safe: if not sure, use default for that region\n return bestMatches.length === 1 ? bestMatches[0] : defaultPattern;\n}\n\nexport function formatPhoneNumberWithCode(phoneCodeList: ApiCountryCode[], phoneNumber: string) {\n if (!phoneNumber) {\n return '';\n }\n\n const numberWithPlus = phoneNumber.startsWith('+') ? phoneNumber : `+${phoneNumber}`;\n const country = getCountryFromPhoneNumber(phoneCodeList, numberWithPlus);\n if (!country) {\n return numberWithPlus;\n }\n return `+${country.countryCode} ${formatPhoneNumber(numberWithPlus, country)}`;\n}\n","import type { MessageListType } from '../global/types';\nimport { MAIN_THREAD_ID } from '../api/types';\nimport { LOCATION_HASH } from '../hooks/useHistoryBack';\n\nexport const createMessageHash = (chatId: string, type: string, threadId: number): string => (\n chatId.toString()\n + (type !== 'thread' ? `_${type}`\n : (threadId !== -1 ? `_${threadId}` : ''))\n);\n\nexport function parseLocationHash() {\n if (!LOCATION_HASH) return undefined;\n\n const [chatId, typeOrThreadId] = LOCATION_HASH.replace(/^#/, '').split('_');\n if (!chatId?.match(/^-?\\d+$/)) return undefined;\n\n const isType = ['thread', 'pinned', 'scheduled'].includes(typeOrThreadId);\n\n return {\n chatId,\n type: Boolean(typeOrThreadId) && isType ? (typeOrThreadId as MessageListType) : 'thread',\n threadId: Boolean(typeOrThreadId) && !isType ? Number(typeOrThreadId) : MAIN_THREAD_ID,\n };\n}\n","type Scheduler =\n typeof requestAnimationFrame\n | typeof onTickEnd;\n\nexport function debounce<F extends AnyToVoidFunction>(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n shouldRunLast = true,\n) {\n let waitingTimeout: number | undefined;\n\n return (...args: Parameters<F>) => {\n if (waitingTimeout) {\n clearTimeout(waitingTimeout);\n waitingTimeout = undefined;\n } else if (shouldRunFirst) {\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n waitingTimeout = self.setTimeout(() => {\n if (shouldRunLast) {\n fn(...args);\n }\n\n waitingTimeout = undefined;\n }, ms);\n };\n}\n\nexport function throttle<F extends AnyToVoidFunction>(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n) {\n let interval: number | undefined;\n let isPending: boolean;\n let args: Parameters<F>;\n\n return (..._args: Parameters<F>) => {\n isPending = true;\n args = _args;\n\n if (!interval) {\n if (shouldRunFirst) {\n isPending = false;\n 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 fn(...args);\n }, ms);\n }\n };\n}\n\nexport function throttleWithRaf<F extends AnyToVoidFunction>(fn: F) {\n return throttleWith(fastRaf, fn);\n}\n\nexport function throttleWithPrimaryRaf<F extends AnyToVoidFunction>(fn: F) {\n return throttleWith(fastRafPrimary, fn);\n}\n\nexport function throttleWithTickEnd<F extends AnyToVoidFunction>(fn: F) {\n return throttleWith(onTickEnd, fn);\n}\n\nexport function throttleWith<F extends AnyToVoidFunction>(schedulerFn: Scheduler, fn: F) {\n let waiting = false;\n let args: Parameters<F>;\n\n return (..._args: Parameters<F>) => {\n args = _args;\n\n if (!waiting) {\n waiting = true;\n\n schedulerFn(() => {\n waiting = false;\n fn(...args);\n });\n }\n };\n}\n\nexport function onIdle(cb: NoneToVoidFunction, timeout?: number) {\n // eslint-disable-next-line no-restricted-globals\n if (self.requestIdleCallback) {\n // eslint-disable-next-line no-restricted-globals\n self.requestIdleCallback(cb, { timeout });\n } else {\n onTickEnd(cb);\n }\n}\n\nexport const pause = (ms: number) => new Promise<void>((resolve) => {\n setTimeout(() => resolve(), ms);\n});\n\nexport function rafPromise() {\n return new Promise<void>((resolve) => {\n fastRaf(resolve);\n });\n}\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\nlet fastRafPrimaryCallbacks: NoneToVoidFunction[] | undefined;\n\n// May result in an immediate execution if called from another `requestAnimationFrame` callback\nexport function fastRaf(callback: NoneToVoidFunction, isPrimary = false) {\n if (!fastRafCallbacks) {\n fastRafCallbacks = isPrimary ? [] : [callback];\n fastRafPrimaryCallbacks = isPrimary ? [callback] : [];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n const currentPrimaryCallbacks = fastRafPrimaryCallbacks!;\n fastRafCallbacks = undefined;\n fastRafPrimaryCallbacks = undefined;\n currentPrimaryCallbacks.forEach((cb) => cb());\n currentCallbacks.forEach((cb) => cb());\n });\n } else if (isPrimary) {\n fastRafPrimaryCallbacks!.push(callback);\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nexport function fastRafPrimary(callback: NoneToVoidFunction) {\n fastRaf(callback, true);\n}\n\nlet onTickEndCallbacks: NoneToVoidFunction[] | undefined;\nlet onTickEndPrimaryCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function onTickEnd(callback: NoneToVoidFunction, isPrimary = false) {\n if (!onTickEndCallbacks) {\n onTickEndCallbacks = isPrimary ? [] : [callback];\n onTickEndPrimaryCallbacks = isPrimary ? [callback] : [];\n\n Promise.resolve().then(() => {\n const currentCallbacks = onTickEndCallbacks!;\n const currentPrimaryCallbacks = onTickEndPrimaryCallbacks!;\n onTickEndCallbacks = undefined;\n onTickEndPrimaryCallbacks = undefined;\n currentPrimaryCallbacks.forEach((cb) => cb());\n currentCallbacks.forEach((cb) => cb());\n });\n } else if (isPrimary) {\n onTickEndPrimaryCallbacks!.push(callback);\n } else {\n onTickEndCallbacks.push(callback);\n }\n}\n\nexport function onTickEndPrimary(callback: NoneToVoidFunction) {\n onTickEnd(callback, true);\n}\n\nlet beforeUnloadCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function onBeforeUnload(callback: NoneToVoidFunction, isLast = false) {\n if (!beforeUnloadCallbacks) {\n beforeUnloadCallbacks = [];\n // eslint-disable-next-line no-restricted-globals\n self.addEventListener('beforeunload', () => {\n beforeUnloadCallbacks!.forEach((cb) => cb());\n });\n }\n\n if (isLast) {\n beforeUnloadCallbacks.push(callback);\n } else {\n beforeUnloadCallbacks.unshift(callback);\n }\n\n return () => {\n beforeUnloadCallbacks = beforeUnloadCallbacks!.filter((cb) => cb !== callback);\n };\n}\n","let RE_NOT_LETTER: RegExp;\n\ntry {\n RE_NOT_LETTER = /[^\\p{L}\\p{M}]+/ui;\n} catch (e) {\n // Support for older versions of firefox\n RE_NOT_LETTER = /[^\\wа-яё]+/i;\n}\n\nexport default function searchWords(haystack: string, needle: string | string[]) {\n if (!haystack || !needle) {\n return false;\n }\n\n const needleWords = typeof needle === 'string' ? needle.toLowerCase().split(RE_NOT_LETTER) : needle;\n const haystackLower = haystack.toLowerCase();\n\n // @optimization\n if (needleWords.length === 1 && !haystackLower.includes(needleWords[0])) {\n return false;\n }\n\n let haystackWords: string[];\n\n return needleWords.every((needleWord) => {\n if (!haystackLower.includes(needleWord)) {\n return false;\n }\n\n if (!haystackWords) {\n haystackWords = haystackLower.split(RE_NOT_LETTER);\n }\n\n return haystackWords.some((haystackWord) => haystackWord.startsWith(needleWord));\n });\n}\n\nexport function prepareSearchWordsForNeedle(needle: string) {\n const needleWords = needle.toLowerCase().split(RE_NOT_LETTER);\n\n return (haystack: string) => searchWords(haystack, needleWords);\n}\n","export const getServerTime = (serverTimeOffset: number) => {\n return Math.floor(Date.now() / 1000) + serverTimeOffset;\n};\n","import safariFix from 'safari-14-idb-fix';\n\nfunction promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n const dbp = safariFix().then(() => {\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n return promisifyRequest(request);\n });\n return (txMode, callback) => dbp.then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction delMany(keys, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n keys.forEach((key) => store.delete(key));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.key)).then(() => items);\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.value)).then(() => items);\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([\n promisifyRequest(store.getAllKeys()),\n promisifyRequest(store.getAll()),\n ]).then(([keys, values]) => keys.map((key, i) => [key, values[i]]));\n }\n const items = [];\n return customStore('readonly', (store) => eachCursor(store, (cursor) => items.push([cursor.key, cursor.value])).then(() => items));\n });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","/**\n * Work around Safari 14 IndexedDB open bug.\n *\n * Safari has a horrible bug where IDB requests can hang while the browser is starting up. https://bugs.webkit.org/show_bug.cgi?id=226547\n * The only solution is to keep nudging it until it's awake.\n */\nfunction idbReady() {\n var isSafari = !navigator.userAgentData &&\n /Safari\\//.test(navigator.userAgent) &&\n !/Chrom(e|ium)\\//.test(navigator.userAgent);\n // No point putting other browsers or older versions of Safari through this mess.\n if (!isSafari || !indexedDB.databases)\n return Promise.resolve();\n var intervalId;\n return new Promise(function (resolve) {\n var tryIdb = function () { return indexedDB.databases().finally(resolve); };\n intervalId = setInterval(tryIdb, 100);\n tryIdb();\n }).finally(function () { return clearInterval(intervalId); });\n}\n\nexport default idbReady;\n","import * as idb from 'idb-keyval';\n\nimport type { ApiSessionData } from '../api/types';\n\nimport {\n DEBUG, GLOBAL_STATE_CACHE_KEY, LEGACY_SESSION_KEY, SESSION_USER_KEY,\n} from '../config';\nimport * as cacheApi from './cacheApi';\n\nconst DC_IDS = [1, 2, 3, 4, 5];\n\nexport function hasStoredSession(withLegacy = false) {\n if (withLegacy && localStorage.getItem(LEGACY_SESSION_KEY)) {\n return true;\n }\n\n if (checkSessionLocked()) {\n return true;\n }\n\n const userAuthJson = localStorage.getItem(SESSION_USER_KEY);\n if (!userAuthJson) {\n return false;\n }\n\n try {\n const userAuth = JSON.parse(userAuthJson);\n return Boolean(userAuth && userAuth.id && userAuth.dcID);\n } catch (err) {\n // Do nothing.\n return false;\n }\n}\n\nexport function storeSession(sessionData: ApiSessionData, currentUserId?: string) {\n const { mainDcId, keys, hashes } = sessionData;\n\n localStorage.setItem(SESSION_USER_KEY, JSON.stringify({ dcID: mainDcId, id: currentUserId }));\n localStorage.setItem('dc', String(mainDcId));\n Object.keys(keys).map(Number).forEach((dcId) => {\n localStorage.setItem(`dc${dcId}_auth_key`, JSON.stringify(keys[dcId]));\n });\n\n if (hashes) {\n Object.keys(hashes).map(Number).forEach((dcId) => {\n localStorage.setItem(`dc${dcId}_hash`, JSON.stringify(hashes[dcId]));\n });\n }\n}\n\nexport function clearStoredSession() {\n [\n SESSION_USER_KEY,\n 'dc',\n ...DC_IDS.map((dcId) => `dc${dcId}_auth_key`),\n ...DC_IDS.map((dcId) => `dc${dcId}_hash`),\n ...DC_IDS.map((dcId) => `dc${dcId}_server_salt`),\n ].forEach((key) => {\n localStorage.removeItem(key);\n });\n}\n\nexport function loadStoredSession(): ApiSessionData | undefined {\n if (!hasStoredSession()) {\n return undefined;\n }\n\n const userAuth = JSON.parse(localStorage.getItem(SESSION_USER_KEY)!);\n if (!userAuth) {\n return undefined;\n }\n const mainDcId = Number(userAuth.dcID);\n const keys: Record<number, string> = {};\n const hashes: Record<number, string> = {};\n\n DC_IDS.forEach((dcId) => {\n try {\n const key = localStorage.getItem(`dc${dcId}_auth_key`);\n if (key) {\n keys[dcId] = JSON.parse(key);\n }\n\n const hash = localStorage.getItem(`dc${dcId}_hash`);\n if (hash) {\n hashes[dcId] = JSON.parse(hash);\n }\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('Failed to load stored session', err);\n }\n // Do nothing.\n }\n });\n\n if (!Object.keys(keys).length) return undefined;\n\n return {\n mainDcId,\n keys,\n hashes,\n };\n}\n\nexport async function importLegacySession() {\n const sessionId = localStorage.getItem(LEGACY_SESSION_KEY);\n if (!sessionId) return;\n\n const sessionJson = await idb.get(`GramJs:${sessionId}`);\n try {\n const sessionData = JSON.parse(sessionJson) as ApiSessionData;\n storeSession(sessionData);\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('Failed to load legacy session', err);\n }\n // Do nothing.\n }\n}\n\n// Remove previously created IndexedDB and cache API sessions\nexport async function clearLegacySessions() {\n localStorage.removeItem(LEGACY_SESSION_KEY);\n\n const idbKeys = await idb.keys();\n\n await Promise.all<Promise<any>>([\n cacheApi.clear('GramJs'),\n ...idbKeys\n .filter((k) => typeof k === 'string' && k.startsWith('GramJs:GramJs-session-'))\n .map((k) => idb.del(k)),\n ]);\n}\n\nexport function importTestSession() {\n const sessionJson = process.env.TEST_SESSION!;\n try {\n const sessionData = JSON.parse(sessionJson) as ApiSessionData & { userId: string };\n storeSession(sessionData, sessionData.userId);\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('Failed to load test session', err);\n }\n // Do nothing.\n }\n}\n\nfunction checkSessionLocked() {\n const stateFromCache = JSON.parse(localStorage.getItem(GLOBAL_STATE_CACHE_KEY) || '{}');\n\n return Boolean(stateFromCache?.passcode?.isScreenLocked);\n}\n","import type { ISettings } from '../types';\n\nimport { animateSingle } from './animation';\nimport { fastRaf } from './schedulers';\n\nimport themeColors from '../styles/themes.json';\nimport { lerp } from './math';\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;\nconst RGB_VARIABLES = new Set([\n '--color-primary-shade',\n '--color-text-secondary',\n]);\n\nconst colors = (Object.keys(themeColors) as Array<keyof typeof themeColors>).map((property) => ({\n property,\n colors: [hexToRgb(themeColors[property][0]), hexToRgb(themeColors[property][1])],\n}));\n\nconst switchTheme = (theme: ISettings['theme'], withAnimation: boolean) => {\n const themeClassName = `theme-${theme}`;\n if (document.documentElement.classList.contains(themeClassName)) {\n return;\n }\n const isDarkTheme = theme === 'dark';\n const shouldAnimate = isInitialized && withAnimation;\n const startIndex = isDarkTheme ? 0 : 1;\n const endIndex = isDarkTheme ? 1 : 0;\n const startAt = Date.now();\n const themeColorTag = document.querySelector('meta[name=\"theme-color\"]');\n\n document.documentElement.classList.remove(`theme-${isDarkTheme ? 'light' : 'dark'}`);\n if (isInitialized) {\n document.documentElement.classList.add('no-animations');\n }\n document.documentElement.classList.add(themeClassName);\n if (themeColorTag) {\n themeColorTag.setAttribute('content', isDarkTheme ? '#212121' : '#fff');\n }\n\n setTimeout(() => {\n document.documentElement.classList.remove('no-animations');\n }, ENABLE_ANIMATION_DELAY_MS);\n\n isInitialized = true;\n\n if (shouldAnimate) {\n fastRaf(() => {\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 });\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 if (RGB_VARIABLES.has(property)) {\n document.documentElement.style.setProperty(`${property}-rgb`, `${r},${g},${b}`);\n }\n });\n}\n\nexport default switchTheme;\n","import type { LangFn } from '../hooks/useLang';\nimport EMOJI_REGEX from '../lib/twemojiRegex';\nimport { fixNonStandardEmoji } from './emoji';\nimport withCache from './withCache';\n\nexport 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 const getFirstLetters = withCache((phrase: string, count = 2) => {\n return phrase\n .replace(/[.,!@#$%^&*()_+=\\-`~[\\]/\\\\{}:\"|<>?]+/gi, '')\n .trim()\n .split(/\\s+/)\n .slice(0, count)\n .map((word: string) => {\n if (!word.length) return '';\n word = fixNonStandardEmoji(word);\n const emojis = word.match(EMOJI_REGEX);\n if (emojis && word.startsWith(emojis[0])) {\n return emojis[0];\n }\n return word.match(/./u)![0].toUpperCase();\n })\n .join('');\n});\n\nconst FILE_SIZE_UNITS = ['B', 'KB', 'MB', 'GB'];\nexport function formatFileSize(lang: LangFn, bytes: number, decimals = 1): string {\n if (bytes === 0) {\n return lang('FileSize.B', 0);\n }\n\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const value = (bytes / (k ** i)).toFixed(Math.max(decimals, 0));\n\n return lang(`FileSize.${FILE_SIZE_UNITS[i]}`, value);\n}\n","export default function trimText<T extends string | undefined>(text: T, length?: number) {\n if (!text || !length || text.length <= length) {\n return text;\n }\n\n return `${text.substring(0, length)}...`;\n}\n","import { isWebpSupported } from './environment';\nimport { dataUriToBlob, blobToDataUri } from './files';\nimport { pause } from './schedulers';\n\nconst WORKER_INITIALIZATION_TIMEOUT = 2000;\n\nlet canvas: HTMLCanvasElement;\nlet worker: IWebpWorker;\n\nexport const EMPTY_IMAGE_DATA_URI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk'\n + 'YAAAAAYAAjCB0C8AAAAASUVORK5CYII=';\n\nexport async function webpToPng(url: string, blob: Blob): Promise<Blob | undefined> {\n initWebpWorker();\n\n while (!worker.wasmReady) {\n await pause(WORKER_INITIALIZATION_TIMEOUT);\n }\n\n const { result, width, height } = await getDecodePromise(url, blob);\n if (!width || !height) {\n return undefined;\n }\n\n return createPng({ result, width, height });\n}\n\nexport async function webpToPngBase64(key: string, dataUri: string): Promise<string> {\n if (isWebpSupported() || dataUri.substr(0, 15) !== 'data:image/webp') {\n return dataUri;\n }\n\n initWebpWorker();\n\n const pngBlob = await webpToPng(key, dataUriToBlob(dataUri));\n\n if (!pngBlob) {\n throw new Error(`Can't convert webp to png. Url: ${dataUri}`);\n }\n\n return blobToDataUri(pngBlob);\n}\n\nfunction initWebpWorker() {\n if (!worker) {\n worker = new Worker(new URL('../lib/webp/webp_wasm.worker.js', import.meta.url)) as IWebpWorker;\n worker.wasmReady = false;\n worker.onmessage = handleLibWebpMessage;\n }\n}\n\nfunction createPng({ result, width, height }: TEncodedImage): Promise<Blob | undefined> {\n if (!canvas) {\n canvas = document.createElement('canvas');\n }\n\n return new Promise((resolve) => {\n const img = new ImageData(result, width, height);\n\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d')!;\n ctx.putImageData(img, 0, 0);\n\n canvas.toBlob((blob) => {\n resolve(blob ?? undefined);\n }, 'image/png', 1);\n });\n}\n\nfunction handleLibWebpMessage(e: MessageEvent) {\n const { id } = e.data;\n switch (e.data.type) {\n case 'initialized': {\n worker.wasmReady = true;\n break;\n }\n\n case 'result': {\n if (worker.requests.has(id)) {\n const resolve = worker.requests.get(id)!;\n\n worker.requests.delete(id);\n resolve(e.data!);\n }\n break;\n }\n }\n}\n\nfunction getDecodePromise(url: string, blob: Blob): Promise<TEncodedImage> {\n return new Promise((resolve) => {\n if (!worker.requests) {\n worker.requests = new Map();\n }\n\n worker.requests.set(url, resolve);\n worker.postMessage({ id: url, blob });\n });\n}\n","import { APP_VERSION, DEBUG, IS_MOCKED_CLIENT } from '../config';\nimport { getGlobal } from '../global';\nimport { hasStoredSession } from './sessions';\n\nconst WEBSYNC_URLS = [\n 't.me',\n 'telegram.me',\n].map((domain) => `//${domain}/_websync_?`);\nconst WEBSYNC_VERSION = `${APP_VERSION} Z`;\nconst WEBSYNC_KEY = 'tgme_sync';\nconst WEBSYNC_TIMEOUT = 86400;\n\nconst getTs = () => {\n return Math.floor(Number(new Date()) / 1000);\n};\n\nconst saveSync = (authed: boolean) => {\n const ts = getTs();\n localStorage.setItem(WEBSYNC_KEY, JSON.stringify({\n canRedirect: authed,\n ts,\n }));\n};\n\nlet lastTimeout: NodeJS.Timeout | undefined;\n\nexport const forceWebsync = (authed: boolean) => {\n if (IS_MOCKED_CLIENT) return undefined;\n const currentTs = getTs();\n\n const { canRedirect, ts } = JSON.parse(localStorage.getItem(WEBSYNC_KEY) || '{}');\n\n if (canRedirect !== authed || ts + WEBSYNC_TIMEOUT <= currentTs) {\n return Promise.all(WEBSYNC_URLS.map((url) => {\n return new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n\n const removeElement = () => Boolean(document.body.removeChild(script));\n\n script.src = url + new URLSearchParams({\n authed: Number(authed).toString(),\n version: WEBSYNC_VERSION,\n });\n\n document.body.appendChild(script);\n\n script.onload = () => {\n saveSync(authed);\n removeElement();\n if (lastTimeout) {\n clearTimeout(lastTimeout);\n lastTimeout = undefined;\n }\n startWebsync();\n resolve();\n };\n\n script.onerror = () => {\n removeElement();\n reject();\n };\n });\n }));\n } else {\n return Promise.resolve();\n }\n};\n\nexport function startWebsync() {\n if (DEBUG) {\n return;\n }\n\n if (lastTimeout !== undefined) return;\n const currentTs = getTs();\n\n const { ts } = JSON.parse(localStorage.getItem(WEBSYNC_KEY) || '{}');\n\n const timeout = WEBSYNC_TIMEOUT - (currentTs - ts);\n\n lastTimeout = setTimeout(() => {\n const { authState } = getGlobal();\n\n const authed = authState === 'authorizationStateReady' || hasStoredSession(true);\n forceWebsync(authed);\n }, Math.max(0, timeout * 1000));\n}\n\nexport function clearWebsync() {\n localStorage.removeItem(WEBSYNC_KEY);\n}\n","import { throttle } from './schedulers';\nimport {\n MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT,\n MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH,\n MOBILE_SCREEN_MAX_WIDTH,\n} from '../config';\nimport { IS_IOS, IS_SINGLE_COLUMN_LAYOUT } from './environment';\n\ntype IDimensions = {\n width: number;\n height: number;\n};\n\nconst IS_LANDSCAPE = IS_SINGLE_COLUMN_LAYOUT && isLandscape();\n\nconst initialHeight = window.innerHeight;\nlet currentWindowSize = updateSizes();\nlet isRefreshDisabled = false;\n\nfunction disableRefresh() {\n isRefreshDisabled = true;\n}\n\nfunction enableRefresh() {\n isRefreshDisabled = false;\n}\n\nconst handleResize = throttle(() => {\n currentWindowSize = updateSizes();\n\n if (!isRefreshDisabled && (\n isMobileScreen() !== IS_SINGLE_COLUMN_LAYOUT\n || (IS_SINGLE_COLUMN_LAYOUT && IS_LANDSCAPE !== isLandscape())\n )) {\n window.location.reload();\n }\n}, 250, true);\n\nwindow.addEventListener('orientationchange', handleResize);\nif (IS_IOS) {\n window.visualViewport.addEventListener('resize', handleResize);\n} else {\n window.addEventListener('resize', handleResize);\n}\n\nexport function updateSizes(): IDimensions {\n let height: number;\n if (IS_IOS) {\n height = window.visualViewport.height + window.visualViewport.pageTop;\n } else {\n height = window.innerHeight;\n }\n const vh = height * 0.01;\n\n document.documentElement.style.setProperty('--vh', `${vh}px`);\n\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n}\n\nfunction isMobileScreen() {\n return currentWindowSize.width <= MOBILE_SCREEN_MAX_WIDTH || (\n currentWindowSize.width <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH\n && currentWindowSize.height <= MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT\n );\n}\n\nfunction isLandscape() {\n if (IS_IOS) {\n return window.matchMedia('(orientation: landscape)').matches;\n }\n\n // eslint-disable-next-line max-len\n // Source: https://web.archive.org/web/20160509220835/http://blog.abouthalf.com/development/orientation-media-query-challenges-in-android-browsers/\n // Feature is marked as deprecated now, but it is still supported\n // https://developer.mozilla.org/en-US/docs/Web/CSS/@media/device-aspect-ratio#browser_compatibility\n return window.matchMedia('screen and (min-device-aspect-ratio: 1/1) and (orientation: landscape)').matches;\n}\n\nconst windowSize = {\n get: () => currentWindowSize,\n getIsKeyboardVisible: () => initialHeight > currentWindowSize.height,\n disableRefresh,\n enableRefresh,\n};\n\nexport default windowSize;\n","const cache = new WeakMap<AnyFunction, Map<string, any>>();\n\nexport default function withCache<T extends AnyFunction>(fn: T) {\n return (...args: Parameters<T>): ReturnType<T> => {\n let fnCache = cache.get(fn);\n const cacheKey = args.map(String).join('_');\n\n if (fnCache) {\n const cached = fnCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n } else {\n fnCache = new Map();\n cache.set(fn, fnCache);\n }\n\n const newValue = fn(...args);\n\n fnCache.set(cacheKey, newValue);\n\n return newValue;\n };\n}\n","!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.QRCodeStyling=e():t.QRCodeStyling=e()}(self,(function(){return(()=>{var t={192:(t,e)=>{var r,i,n=function(){var t=function(t,e){var r=t,i=s[e],n=null,o=0,h=null,v=[],w={},_=function(t,e){n=function(t){for(var e=new Array(t),r=0;r<t;r+=1){e[r]=new Array(t);for(var i=0;i<t;i+=1)e[r][i]=null}return e}(o=4*r+17),y(0,0),y(o-7,0),y(0,o-7),x(),b(),M(t,e),r>=7&&S(t),null==h&&(h=A(r,i,v)),C(h,e)},y=function(t,e){for(var r=-1;r<=7;r+=1)if(!(t+r<=-1||o<=t+r))for(var i=-1;i<=7;i+=1)e+i<=-1||o<=e+i||(n[t+r][e+i]=0<=r&&r<=6&&(0==i||6==i)||0<=i&&i<=6&&(0==r||6==r)||2<=r&&r<=4&&2<=i&&i<=4)},b=function(){for(var t=8;t<o-8;t+=1)null==n[t][6]&&(n[t][6]=t%2==0);for(var e=8;e<o-8;e+=1)null==n[6][e]&&(n[6][e]=e%2==0)},x=function(){for(var t=a.getPatternPosition(r),e=0;e<t.length;e+=1)for(var i=0;i<t.length;i+=1){var o=t[e],s=t[i];if(null==n[o][s])for(var h=-2;h<=2;h+=1)for(var u=-2;u<=2;u+=1)n[o+h][s+u]=-2==h||2==h||-2==u||2==u||0==h&&0==u}},S=function(t){for(var e=a.getBCHTypeNumber(r),i=0;i<18;i+=1){var s=!t&&1==(e>>i&1);n[Math.floor(i/3)][i%3+o-8-3]=s}for(i=0;i<18;i+=1)s=!t&&1==(e>>i&1),n[i%3+o-8-3][Math.floor(i/3)]=s},M=function(t,e){for(var r=i<<3|e,s=a.getBCHTypeInfo(r),h=0;h<15;h+=1){var u=!t&&1==(s>>h&1);h<6?n[h][8]=u:h<8?n[h+1][8]=u:n[o-15+h][8]=u}for(h=0;h<15;h+=1)u=!t&&1==(s>>h&1),h<8?n[8][o-h-1]=u:h<9?n[8][15-h-1+1]=u:n[8][15-h-1]=u;n[o-8][8]=!t},C=function(t,e){for(var r=-1,i=o-1,s=7,h=0,u=a.getMaskFunction(e),c=o-1;c>0;c-=2)for(6==c&&(c-=1);;){for(var d=0;d<2;d+=1)if(null==n[i][c-d]){var l=!1;h<t.length&&(l=1==(t[h]>>>s&1)),u(i,c-d)&&(l=!l),n[i][c-d]=l,-1==(s-=1)&&(h+=1,s=7)}if((i+=r)<0||o<=i){i-=r,r=-r;break}}},A=function(t,e,r){for(var i=c.getRSBlocks(t,e),n=d(),o=0;o<r.length;o+=1){var s=r[o];n.put(s.getMode(),4),n.put(s.getLength(),a.getLengthInBits(s.getMode(),t)),s.write(n)}var h=0;for(o=0;o<i.length;o+=1)h+=i[o].dataCount;if(n.getLengthInBits()>8*h)throw\"code length overflow. (\"+n.getLengthInBits()+\">\"+8*h+\")\";for(n.getLengthInBits()+4<=8*h&&n.put(0,4);n.getLengthInBits()%8!=0;)n.putBit(!1);for(;!(n.getLengthInBits()>=8*h||(n.put(236,8),n.getLengthInBits()>=8*h));)n.put(17,8);return function(t,e){for(var r=0,i=0,n=0,o=new Array(e.length),s=new Array(e.length),h=0;h<e.length;h+=1){var c=e[h].dataCount,d=e[h].totalCount-c;i=Math.max(i,c),n=Math.max(n,d),o[h]=new Array(c);for(var l=0;l<o[h].length;l+=1)o[h][l]=255&t.getBuffer()[l+r];r+=c;var g=a.getErrorCorrectPolynomial(d),f=u(o[h],g.getLength()-1).mod(g);for(s[h]=new Array(g.getLength()-1),l=0;l<s[h].length;l+=1){var p=l+f.getLength()-s[h].length;s[h][l]=p>=0?f.getAt(p):0}}var v=0;for(l=0;l<e.length;l+=1)v+=e[l].totalCount;var w=new Array(v),m=0;for(l=0;l<i;l+=1)for(h=0;h<e.length;h+=1)l<o[h].length&&(w[m]=o[h][l],m+=1);for(l=0;l<n;l+=1)for(h=0;h<e.length;h+=1)l<s[h].length&&(w[m]=s[h][l],m+=1);return w}(n,i)};w.addData=function(t,e){var r=null;switch(e=e||\"Byte\"){case\"Numeric\":r=l(t);break;case\"Alphanumeric\":r=g(t);break;case\"Byte\":r=f(t);break;case\"Kanji\":r=p(t);break;default:throw\"mode:\"+e}v.push(r),h=null},w.isDark=function(t,e){if(t<0||o<=t||e<0||o<=e)throw t+\",\"+e;return n[t][e]},w.getModuleCount=function(){return o},w.make=function(){if(r<1){for(var t=1;t<40;t++){for(var e=c.getRSBlocks(t,i),n=d(),o=0;o<v.length;o++){var s=v[o];n.put(s.getMode(),4),n.put(s.getLength(),a.getLengthInBits(s.getMode(),t)),s.write(n)}var h=0;for(o=0;o<e.length;o++)h+=e[o].dataCount;if(n.getLengthInBits()<=8*h)break}r=t}_(!1,function(){for(var t=0,e=0,r=0;r<8;r+=1){_(!0,r);var i=a.getLostPoint(w);(0==r||t>i)&&(t=i,e=r)}return e}())},w.createTableTag=function(t,e){t=t||2;var r=\"\";r+='<table style=\"',r+=\" border-width: 0px; border-style: none;\",r+=\" border-collapse: collapse;\",r+=\" padding: 0px; margin: \"+(e=void 0===e?4*t:e)+\"px;\",r+='\">',r+=\"<tbody>\";for(var i=0;i<w.getModuleCount();i+=1){r+=\"<tr>\";for(var n=0;n<w.getModuleCount();n+=1)r+='<td style=\"',r+=\" border-width: 0px; border-style: none;\",r+=\" border-collapse: collapse;\",r+=\" padding: 0px; margin: 0px;\",r+=\" width: \"+t+\"px;\",r+=\" height: \"+t+\"px;\",r+=\" background-color: \",r+=w.isDark(i,n)?\"#000000\":\"#ffffff\",r+=\";\",r+='\"/>';r+=\"</tr>\"}return(r+=\"</tbody>\")+\"</table>\"},w.createSvgTag=function(t,e,r,i){var n={};\"object\"==typeof arguments[0]&&(t=(n=arguments[0]).cellSize,e=n.margin,r=n.alt,i=n.title),t=t||2,e=void 0===e?4*t:e,(r=\"string\"==typeof r?{text:r}:r||{}).text=r.text||null,r.id=r.text?r.id||\"qrcode-description\":null,(i=\"string\"==typeof i?{text:i}:i||{}).text=i.text||null,i.id=i.text?i.id||\"qrcode-title\":null;var o,s,a,h,u=w.getModuleCount()*t+2*e,c=\"\";for(h=\"l\"+t+\",0 0,\"+t+\" -\"+t+\",0 0,-\"+t+\"z \",c+='<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"',c+=n.scalable?\"\":' width=\"'+u+'px\" height=\"'+u+'px\"',c+=' viewBox=\"0 0 '+u+\" \"+u+'\" ',c+=' preserveAspectRatio=\"xMinYMin meet\"',c+=i.text||r.text?' role=\"img\" aria-labelledby=\"'+O([i.id,r.id].join(\" \").trim())+'\"':\"\",c+=\">\",c+=i.text?'<title id=\"'+O(i.id)+'\">'+O(i.text)+\"</title>\":\"\",c+=r.text?'<description id=\"'+O(r.id)+'\">'+O(r.text)+\"</description>\":\"\",c+='<rect width=\"100%\" height=\"100%\" fill=\"white\" cx=\"0\" cy=\"0\"/>',c+='<path d=\"',s=0;s<w.getModuleCount();s+=1)for(a=s*t+e,o=0;o<w.getModuleCount();o+=1)w.isDark(s,o)&&(c+=\"M\"+(o*t+e)+\",\"+a+h);return(c+='\" stroke=\"transparent\" fill=\"black\"/>')+\"</svg>\"},w.createDataURL=function(t,e){t=t||2,e=void 0===e?4*t:e;var r=w.getModuleCount()*t+2*e,i=e,n=r-e;return m(r,r,(function(e,r){if(i<=e&&e<n&&i<=r&&r<n){var o=Math.floor((e-i)/t),s=Math.floor((r-i)/t);return w.isDark(s,o)?0:1}return 1}))},w.createImgTag=function(t,e,r){t=t||2,e=void 0===e?4*t:e;var i=w.getModuleCount()*t+2*e,n=\"\";return n+=\"<img\",n+=' src=\"',n+=w.createDataURL(t,e),n+='\"',n+=' width=\"',n+=i,n+='\"',n+=' height=\"',n+=i,n+='\"',r&&(n+=' alt=\"',n+=O(r),n+='\"'),n+\"/>\"};var O=function(t){for(var e=\"\",r=0;r<t.length;r+=1){var i=t.charAt(r);switch(i){case\"<\":e+=\"<\";break;case\">\":e+=\">\";break;case\"&\":e+=\"&\";break;case'\"':e+=\""\";break;default:e+=i}}return e};return w.createASCII=function(t,e){if((t=t||1)<2)return function(t){t=void 0===t?2:t;var e,r,i,n,o,s=1*w.getModuleCount()+2*t,a=t,h=s-t,u={\"██\":\"█\",\"█ \":\"▀\",\" █\":\"▄\",\" \":\" \"},c={\"██\":\"▀\",\"█ \":\"▀\",\" █\":\" \",\" \":\" \"},d=\"\";for(e=0;e<s;e+=2){for(i=Math.floor((e-a)/1),n=Math.floor((e+1-a)/1),r=0;r<s;r+=1)o=\"█\",a<=r&&r<h&&a<=e&&e<h&&w.isDark(i,Math.floor((r-a)/1))&&(o=\" \"),a<=r&&r<h&&a<=e+1&&e+1<h&&w.isDark(n,Math.floor((r-a)/1))?o+=\" \":o+=\"█\",d+=t<1&&e+1>=h?c[o]:u[o];d+=\"\\n\"}return s%2&&t>0?d.substring(0,d.length-s-1)+Array(s+1).join(\"▀\"):d.substring(0,d.length-1)}(e);t-=1,e=void 0===e?2*t:e;var r,i,n,o,s=w.getModuleCount()*t+2*e,a=e,h=s-e,u=Array(t+1).join(\"██\"),c=Array(t+1).join(\" \"),d=\"\",l=\"\";for(r=0;r<s;r+=1){for(n=Math.floor((r-a)/t),l=\"\",i=0;i<s;i+=1)o=1,a<=i&&i<h&&a<=r&&r<h&&w.isDark(n,Math.floor((i-a)/t))&&(o=0),l+=o?u:c;for(n=0;n<t;n+=1)d+=l+\"\\n\"}return d.substring(0,d.length-1)},w.renderTo2dContext=function(t,e){e=e||2;for(var r=w.getModuleCount(),i=0;i<r;i++)for(var n=0;n<r;n++)t.fillStyle=w.isDark(i,n)?\"black\":\"white\",t.fillRect(i*e,n*e,e,e)},w};t.stringToBytes=(t.stringToBytesFuncs={default:function(t){for(var e=[],r=0;r<t.length;r+=1){var i=t.charCodeAt(r);e.push(255&i)}return e}}).default,t.createStringToBytes=function(t,e){var r=function(){for(var r=w(t),i=function(){var t=r.read();if(-1==t)throw\"eof\";return t},n=0,o={};;){var s=r.read();if(-1==s)break;var a=i(),h=i()<<8|i();o[String.fromCharCode(s<<8|a)]=h,n+=1}if(n!=e)throw n+\" != \"+e;return o}(),i=\"?\".charCodeAt(0);return function(t){for(var e=[],n=0;n<t.length;n+=1){var o=t.charCodeAt(n);if(o<128)e.push(o);else{var s=r[t.charAt(n)];\"number\"==typeof s?(255&s)==s?e.push(s):(e.push(s>>>8),e.push(255&s)):e.push(i)}}return e}};var e,r,i,n,o,s={L:1,M:0,Q:3,H:2},a=(e=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],r=1335,i=7973,o=function(t){for(var e=0;0!=t;)e+=1,t>>>=1;return e},(n={}).getBCHTypeInfo=function(t){for(var e=t<<10;o(e)-o(r)>=0;)e^=r<<o(e)-o(r);return 21522^(t<<10|e)},n.getBCHTypeNumber=function(t){for(var e=t<<12;o(e)-o(i)>=0;)e^=i<<o(e)-o(i);return t<<12|e},n.getPatternPosition=function(t){return e[t-1]},n.getMaskFunction=function(t){switch(t){case 0:return function(t,e){return(t+e)%2==0};case 1:return function(t,e){return t%2==0};case 2:return function(t,e){return e%3==0};case 3:return function(t,e){return(t+e)%3==0};case 4:return function(t,e){return(Math.floor(t/2)+Math.floor(e/3))%2==0};case 5:return function(t,e){return t*e%2+t*e%3==0};case 6:return function(t,e){return(t*e%2+t*e%3)%2==0};case 7:return function(t,e){return(t*e%3+(t+e)%2)%2==0};default:throw\"bad maskPattern:\"+t}},n.getErrorCorrectPolynomial=function(t){for(var e=u([1],0),r=0;r<t;r+=1)e=e.multiply(u([1,h.gexp(r)],0));return e},n.getLengthInBits=function(t,e){if(1<=e&&e<10)switch(t){case 1:return 10;case 2:return 9;case 4:case 8:return 8;default:throw\"mode:\"+t}else if(e<27)switch(t){case 1:return 12;case 2:return 11;case 4:return 16;case 8:return 10;default:throw\"mode:\"+t}else{if(!(e<41))throw\"type:\"+e;switch(t){case 1:return 14;case 2:return 13;case 4:return 16;case 8:return 12;default:throw\"mode:\"+t}}},n.getLostPoint=function(t){for(var e=t.getModuleCount(),r=0,i=0;i<e;i+=1)for(var n=0;n<e;n+=1){for(var o=0,s=t.isDark(i,n),a=-1;a<=1;a+=1)if(!(i+a<0||e<=i+a))for(var h=-1;h<=1;h+=1)n+h<0||e<=n+h||0==a&&0==h||s==t.isDark(i+a,n+h)&&(o+=1);o>5&&(r+=3+o-5)}for(i=0;i<e-1;i+=1)for(n=0;n<e-1;n+=1){var u=0;t.isDark(i,n)&&(u+=1),t.isDark(i+1,n)&&(u+=1),t.isDark(i,n+1)&&(u+=1),t.isDark(i+1,n+1)&&(u+=1),0!=u&&4!=u||(r+=3)}for(i=0;i<e;i+=1)for(n=0;n<e-6;n+=1)t.isDark(i,n)&&!t.isDark(i,n+1)&&t.isDark(i,n+2)&&t.isDark(i,n+3)&&t.isDark(i,n+4)&&!t.isDark(i,n+5)&&t.isDark(i,n+6)&&(r+=40);for(n=0;n<e;n+=1)for(i=0;i<e-6;i+=1)t.isDark(i,n)&&!t.isDark(i+1,n)&&t.isDark(i+2,n)&&t.isDark(i+3,n)&&t.isDark(i+4,n)&&!t.isDark(i+5,n)&&t.isDark(i+6,n)&&(r+=40);var c=0;for(n=0;n<e;n+=1)for(i=0;i<e;i+=1)t.isDark(i,n)&&(c+=1);return r+Math.abs(100*c/e/e-50)/5*10},n),h=function(){for(var t=new Array(256),e=new Array(256),r=0;r<8;r+=1)t[r]=1<<r;for(r=8;r<256;r+=1)t[r]=t[r-4]^t[r-5]^t[r-6]^t[r-8];for(r=0;r<255;r+=1)e[t[r]]=r;return{glog:function(t){if(t<1)throw\"glog(\"+t+\")\";return e[t]},gexp:function(e){for(;e<0;)e+=255;for(;e>=256;)e-=255;return t[e]}}}();function u(t,e){if(void 0===t.length)throw t.length+\"/\"+e;var r=function(){for(var r=0;r<t.length&&0==t[r];)r+=1;for(var i=new Array(t.length-r+e),n=0;n<t.length-r;n+=1)i[n]=t[n+r];return i}(),i={getAt:function(t){return r[t]},getLength:function(){return r.length},multiply:function(t){for(var e=new Array(i.getLength()+t.getLength()-1),r=0;r<i.getLength();r+=1)for(var n=0;n<t.getLength();n+=1)e[r+n]^=h.gexp(h.glog(i.getAt(r))+h.glog(t.getAt(n)));return u(e,0)},mod:function(t){if(i.getLength()-t.getLength()<0)return i;for(var e=h.glog(i.getAt(0))-h.glog(t.getAt(0)),r=new Array(i.getLength()),n=0;n<i.getLength();n+=1)r[n]=i.getAt(n);for(n=0;n<t.getLength();n+=1)r[n]^=h.gexp(h.glog(t.getAt(n))+e);return u(r,0).mod(t)}};return i}var c=function(){var t=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],e=function(t,e){var r={};return r.totalCount=t,r.dataCount=e,r},r={getRSBlocks:function(r,i){var n=function(e,r){switch(r){case s.L:return t[4*(e-1)+0];case s.M:return t[4*(e-1)+1];case s.Q:return t[4*(e-1)+2];case s.H:return t[4*(e-1)+3];default:return}}(r,i);if(void 0===n)throw\"bad rs block @ typeNumber:\"+r+\"/errorCorrectionLevel:\"+i;for(var o=n.length/3,a=[],h=0;h<o;h+=1)for(var u=n[3*h+0],c=n[3*h+1],d=n[3*h+2],l=0;l<u;l+=1)a.push(e(c,d));return a}};return r}(),d=function(){var t=[],e=0,r={getBuffer:function(){return t},getAt:function(e){var r=Math.floor(e/8);return 1==(t[r]>>>7-e%8&1)},put:function(t,e){for(var i=0;i<e;i+=1)r.putBit(1==(t>>>e-i-1&1))},getLengthInBits:function(){return e},putBit:function(r){var i=Math.floor(e/8);t.length<=i&&t.push(0),r&&(t[i]|=128>>>e%8),e+=1}};return r},l=function(t){var e=t,r={getMode:function(){return 1},getLength:function(t){return e.length},write:function(t){for(var r=e,n=0;n+2<r.length;)t.put(i(r.substring(n,n+3)),10),n+=3;n<r.length&&(r.length-n==1?t.put(i(r.substring(n,n+1)),4):r.length-n==2&&t.put(i(r.substring(n,n+2)),7))}},i=function(t){for(var e=0,r=0;r<t.length;r+=1)e=10*e+n(t.charAt(r));return e},n=function(t){if(\"0\"<=t&&t<=\"9\")return t.charCodeAt(0)-\"0\".charCodeAt(0);throw\"illegal char :\"+t};return r},g=function(t){var e=t,r={getMode:function(){return 2},getLength:function(t){return e.length},write:function(t){for(var r=e,n=0;n+1<r.length;)t.put(45*i(r.charAt(n))+i(r.charAt(n+1)),11),n+=2;n<r.length&&t.put(i(r.charAt(n)),6)}},i=function(t){if(\"0\"<=t&&t<=\"9\")return t.charCodeAt(0)-\"0\".charCodeAt(0);if(\"A\"<=t&&t<=\"Z\")return t.charCodeAt(0)-\"A\".charCodeAt(0)+10;switch(t){case\" \":return 36;case\"$\":return 37;case\"%\":return 38;case\"*\":return 39;case\"+\":return 40;case\"-\":return 41;case\".\":return 42;case\"/\":return 43;case\":\":return 44;default:throw\"illegal char :\"+t}};return r},f=function(e){var r=t.stringToBytes(e);return{getMode:function(){return 4},getLength:function(t){return r.length},write:function(t){for(var e=0;e<r.length;e+=1)t.put(r[e],8)}}},p=function(e){var r=t.stringToBytesFuncs.SJIS;if(!r)throw\"sjis not supported.\";!function(t,e){var i=r(\"友\");if(2!=i.length||38726!=(i[0]<<8|i[1]))throw\"sjis not supported.\"}();var i=r(e),n={getMode:function(){return 8},getLength:function(t){return~~(i.length/2)},write:function(t){for(var e=i,r=0;r+1<e.length;){var n=(255&e[r])<<8|255&e[r+1];if(33088<=n&&n<=40956)n-=33088;else{if(!(57408<=n&&n<=60351))throw\"illegal char at \"+(r+1)+\"/\"+n;n-=49472}n=192*(n>>>8&255)+(255&n),t.put(n,13),r+=2}if(r<e.length)throw\"illegal char at \"+(r+1)}};return n},v=function(){var t=[],e={writeByte:function(e){t.push(255&e)},writeShort:function(t){e.writeByte(t),e.writeByte(t>>>8)},writeBytes:function(t,r,i){r=r||0,i=i||t.length;for(var n=0;n<i;n+=1)e.writeByte(t[n+r])},writeString:function(t){for(var r=0;r<t.length;r+=1)e.writeByte(t.charCodeAt(r))},toByteArray:function(){return t},toString:function(){var e=\"\";e+=\"[\";for(var r=0;r<t.length;r+=1)r>0&&(e+=\",\"),e+=t[r];return e+\"]\"}};return e},w=function(t){var e=t,r=0,i=0,n=0,o={read:function(){for(;n<8;){if(r>=e.length){if(0==n)return-1;throw\"unexpected end of file./\"+n}var t=e.charAt(r);if(r+=1,\"=\"==t)return n=0,-1;t.match(/^\\s$/)||(i=i<<6|s(t.charCodeAt(0)),n+=6)}var o=i>>>n-8&255;return n-=8,o}},s=function(t){if(65<=t&&t<=90)return t-65;if(97<=t&&t<=122)return t-97+26;if(48<=t&&t<=57)return t-48+52;if(43==t)return 62;if(47==t)return 63;throw\"c:\"+t};return o},m=function(t,e,r){for(var i=function(t,e){var r=t,i=e,n=new Array(t*e),o={setPixel:function(t,e,i){n[e*r+t]=i},write:function(t){t.writeString(\"GIF87a\"),t.writeShort(r),t.writeShort(i),t.writeByte(128),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(0),t.writeByte(255),t.writeByte(255),t.writeByte(255),t.writeString(\",\"),t.writeShort(0),t.writeShort(0),t.writeShort(r),t.writeShort(i),t.writeByte(0);var e=s(2);t.writeByte(2);for(var n=0;e.length-n>255;)t.writeByte(255),t.writeBytes(e,n,255),n+=255;t.writeByte(e.length-n),t.writeBytes(e,n,e.length-n),t.writeByte(0),t.writeString(\";\")}},s=function(t){for(var e=1<<t,r=1+(1<<t),i=t+1,o=a(),s=0;s<e;s+=1)o.add(String.fromCharCode(s));o.add(String.fromCharCode(e)),o.add(String.fromCharCode(r));var h,u,c,d=v(),l=(h=d,u=0,c=0,{write:function(t,e){if(t>>>e!=0)throw\"length over\";for(;u+e>=8;)h.writeByte(255&(t<<u|c)),e-=8-u,t>>>=8-u,c=0,u=0;c|=t<<u,u+=e},flush:function(){u>0&&h.writeByte(c)}});l.write(e,i);var g=0,f=String.fromCharCode(n[g]);for(g+=1;g<n.length;){var p=String.fromCharCode(n[g]);g+=1,o.contains(f+p)?f+=p:(l.write(o.indexOf(f),i),o.size()<4095&&(o.size()==1<<i&&(i+=1),o.add(f+p)),f=p)}return l.write(o.indexOf(f),i),l.write(r,i),l.flush(),d.toByteArray()},a=function(){var t={},e=0,r={add:function(i){if(r.contains(i))throw\"dup key:\"+i;t[i]=e,e+=1},size:function(){return e},indexOf:function(e){return t[e]},contains:function(e){return void 0!==t[e]}};return r};return o}(t,e),n=0;n<e;n+=1)for(var o=0;o<t;o+=1)i.setPixel(o,n,r(o,n));var s=v();i.write(s);for(var a=function(){var t=0,e=0,r=0,i=\"\",n={},o=function(t){i+=String.fromCharCode(s(63&t))},s=function(t){if(t<0);else{if(t<26)return 65+t;if(t<52)return t-26+97;if(t<62)return t-52+48;if(62==t)return 43;if(63==t)return 47}throw\"n:\"+t};return n.writeByte=function(i){for(t=t<<8|255&i,e+=8,r+=1;e>=6;)o(t>>>e-6),e-=6},n.flush=function(){if(e>0&&(o(t<<6-e),t=0,e=0),r%3!=0)for(var n=3-r%3,s=0;s<n;s+=1)i+=\"=\"},n.toString=function(){return i},n}(),h=s.toByteArray(),u=0;u<h.length;u+=1)a.writeByte(h[u]);return a.flush(),\"data:image/gif;base64,\"+a};return t}();n.stringToBytesFuncs[\"UTF-8\"]=function(t){return function(t){for(var e=[],r=0;r<t.length;r++){var i=t.charCodeAt(r);i<128?e.push(i):i<2048?e.push(192|i>>6,128|63&i):i<55296||i>=57344?e.push(224|i>>12,128|i>>6&63,128|63&i):(r++,i=65536+((1023&i)<<10|1023&t.charCodeAt(r)),e.push(240|i>>18,128|i>>12&63,128|i>>6&63,128|63&i))}return e}(t)},void 0===(i=\"function\"==typeof(r=function(){return n})?r.apply(e,[]):r)||(t.exports=i)}},e={};function r(i){var n=e[i];if(void 0!==n)return n.exports;var o=e[i]={exports:{}};return t[i](o,o.exports,r),o.exports}r.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return r.d(e,{a:e}),e},r.d=(t,e)=>{for(var i in e)r.o(e,i)&&!r.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:e[i]})},r.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var i={};return(()=>{\"use strict\";r.d(i,{default:()=>M});const t=t=>!!t&&\"object\"==typeof t&&!Array.isArray(t);function e(r,...i){if(!i.length)return r;const n=i.shift();return void 0!==n&&t(r)&&t(n)?(r=Object.assign({},r),Object.keys(n).forEach((i=>{const o=r[i],s=n[i];Array.isArray(o)&&Array.isArray(s)?r[i]=s:t(o)&&t(s)?r[i]=e(Object.assign({},o),s):r[i]=s})),e(r,...i)):r}function n(t,e){const r=document.createElement(\"a\");r.download=e,r.href=t,document.body.appendChild(r),r.click(),document.body.removeChild(r)}function o(t){return new Promise((e=>{const r=new FileReader;r.onloadend=()=>e(r.result),r.readAsDataURL(t)}))}const s={L:.07,M:.15,Q:.25,H:.3};class a{constructor({svg:t,type:e}){this._svg=t,this._type=e}draw(t,e,r,i){let n;switch(this._type){case\"dots\":n=this._drawDot;break;case\"classy\":n=this._drawClassy;break;case\"classy-rounded\":n=this._drawClassyRounded;break;case\"rounded\":n=this._drawRounded;break;case\"extra-rounded\":n=this._drawExtraRounded;break;default:n=this._drawSquare}n.call(this,{x:t,y:e,size:r,getNeighbor:i})}_rotateFigure({x:t,y:e,size:r,rotation:i=0,draw:n}){var o;const s=t+r/2,a=e+r/2;n(),null===(o=this._element)||void 0===o||o.setAttribute(\"transform\",`rotate(${180*i/Math.PI},${s},${a})`)}_basicDot(t){const{size:e,x:r,y:i}=t;this._rotateFigure(Object.assign(Object.assign({},t),{draw:()=>{this._element=document.createElementNS(\"http://www.w3.org/2000/svg\",\"circle\"),this._element.setAttribute(\"cx\",String(r+e/2)),this._element.setAttribute(\"cy\",String(i+e/2)),this._element.setAttribute(\"r\",String(e/2))}}))}_basicSquare(t){const{size:e,x:r,y:i}=t;this._rotateFigure(Object.assign(Object.assign({},t),{draw:()=>{this._element=document.createElementNS(\"http://www.w3.org/2000/svg\",\"rect\"),this._element.setAttribute(\"x\",String(r)),this._element.setAttribute(\"y\",String(i)),this._element.setAttribute(\"width\",String(e)),this._element.setAttribute(\"height\",String(e))}}))}_basicSideRounded(t){const{size:e,x:r,y:i}=t;this._rotateFigure(Object.assign(Object.assign({},t),{draw:()=>{this._element=document.createElementNS(\"http://www.w3.org/2000/svg\",\"path\"),this._element.setAttribute(\"d\",`M ${r} ${i}v ${e}h `+e/2+`a ${e/2} ${e/2}, 0, 0, 0, 0 ${-e}`)}}))}_basicCornerRounded(t){const{size:e,x:r,y:i}=t;this._rotateFigure(Object.assign(Object.assign({},t),{draw:()=>{this._element=document.createElementNS(\"http://www.w3.org/2000/svg\",\"path\"),this._element.setAttribute(\"d\",`M ${r} ${i}v ${e}h ${e}v `+-e/2+`a ${e/2} ${e/2}, 0, 0, 0, ${-e/2} ${-e/2}`)}}))}_basicCornerExtraRounded(t){const{size:e,x:r,y:i}=t;this._rotateFigure(Object.assign(Object.assign({},t),{draw:()=>{this._element=document.createElementNS(\"http://www.w3.org/2000/svg\",\"path\"),this._element.setAttribute(\"d\",`M ${r} ${i}v ${e}h ${e}a ${e} ${e}, 0, 0, 0, ${-e} ${-e}`)}}))}_basicCornersRounded(t){const{size:e,x:r,y:i}=t;this._rotateFigure(Object.assign(Object.assign({},t),{draw:()=>{this._element=document.createElementNS(\"http://www.w3.org/2000/svg\",\"path\"),this._element.setAttribute(\"d\",`M ${r} ${i}v `+e/2+`a ${e/2} ${e/2}, 0, 0, 0, ${e/2} ${e/2}h `+e/2+\"v \"+-e/2+`a ${e/2} ${e/2}, 0, 0, 0, ${-e/2} ${-e/2}`)}}))}_drawDot({x:t,y:e,size:r}){this._basicDot({x:t,y:e,size:r,rotation:0})}_drawSquare({x:t,y:e,size:r}){this._basicSquare({x:t,y:e,size:r,rotation:0})}_drawRounded({x:t,y:e,size:r,getNeighbor:i}){const n=i?+i(-1,0):0,o=i?+i(1,0):0,s=i?+i(0,-1):0,a=i?+i(0,1):0,h=n+o+s+a;if(0!==h)if(h>2||n&&o||s&&a)this._basicSquare({x:t,y:e,size:r,rotation:0});else{if(2===h){let i=0;return n&&s?i=Math.PI/2:s&&o?i=Math.PI:o&&a&&(i=-Math.PI/2),void this._basicCornerRounded({x:t,y:e,size:r,rotation:i})}if(1===h){let i=0;return s?i=Math.PI/2:o?i=Math.PI:a&&(i=-Math.PI/2),void this._basicSideRounded({x:t,y:e,size:r,rotation:i})}}else this._basicDot({x:t,y:e,size:r,rotation:0})}_drawExtraRounded({x:t,y:e,size:r,getNeighbor:i}){const n=i?+i(-1,0):0,o=i?+i(1,0):0,s=i?+i(0,-1):0,a=i?+i(0,1):0,h=n+o+s+a;if(0!==h)if(h>2||n&&o||s&&a)this._basicSquare({x:t,y:e,size:r,rotation:0});else{if(2===h){let i=0;return n&&s?i=Math.PI/2:s&&o?i=Math.PI:o&&a&&(i=-Math.PI/2),void this._basicCornerExtraRounded({x:t,y:e,size:r,rotation:i})}if(1===h){let i=0;return s?i=Math.PI/2:o?i=Math.PI:a&&(i=-Math.PI/2),void this._basicSideRounded({x:t,y:e,size:r,rotation:i})}}else this._basicDot({x:t,y:e,size:r,rotation:0})}_drawClassy({x:t,y:e,size:r,getNeighbor:i}){const n=i?+i(-1,0):0,o=i?+i(1,0):0,s=i?+i(0,-1):0,a=i?+i(0,1):0;0!==n+o+s+a?n||s?o||a?this._basicSquare({x:t,y:e,size:r,rotation:0}):this._basicCornerRounded({x:t,y:e,size:r,rotation:Math.PI/2}):this._basicCornerRounded({x:t,y:e,size:r,rotation:-Math.PI/2}):this._basicCornersRounded({x:t,y:e,size:r,rotation:Math.PI/2})}_drawClassyRounded({x:t,y:e,size:r,getNeighbor:i}){const n=i?+i(-1,0):0,o=i?+i(1,0):0,s=i?+i(0,-1):0,a=i?+i(0,1):0;0!==n+o+s+a?n||s?o||a?this._basicSquare({x:t,y:e,size:r,rotation:0}):this._basicCornerExtraRounded({x:t,y:e,size:r,rotation:Math.PI/2}):this._basicCornerExtraRounded({x:t,y:e,size:r,rotation:-Math.PI/2}):this._basicCornersRounded({x:t,y:e,size:r,rotation:Math.PI/2})}}class h{constructor({svg:t,type:e}){this._svg=t,this._type=e}draw(t,e,r,i){let n;switch(this._type){case\"square\":n=this._drawSquare;break;case\"extra-rounded\":n=this._drawExtraRounded;break;default:n=this._drawDot}n.call(this,{x:t,y:e,size:r,rotation:i})}_rotateFigure({x:t,y:e,size:r,rotation:i=0,draw:n}){var o;const s=t+r/2,a=e+r/2;n(),null===(o=this._element)||void 0===o||o.setAttribute(\"transform\",`rotate(${180*i/Math.PI},${s},${a})`)}_basicDot(t){const{size:e,x:r,y:i}=t,n=e/7;this._rotateFigure(Object.assign(Object.assign({},t),{draw:()=>{this._element=document.createElementNS(\"http://www.w3.org/2000/svg\",\"path\"),this._element.setAttribute(\"clip-rule\",\"evenodd\"),this._element.setAttribute(\"d\",`M ${r+e/2} ${i}a ${e/2} ${e/2} 0 1 0 0.1 0zm 0 ${n}a ${e/2-n} ${e/2-n} 0 1 1 -0.1 0Z`)}}))}_basicSquare(t){const{size:e,x:r,y:i}=t,n=e/7;this._rotateFigure(Object.assign(Object.assign({},t),{draw:()=>{this._element=document.createElementNS(\"http://www.w3.org/2000/svg\",\"path\"),this._element.setAttribute(\"clip-rule\",\"evenodd\"),this._element.setAttribute(\"d\",`M ${r} ${i}v ${e}h ${e}v `+-e+\"z\"+`M ${r+n} ${i+n}h `+(e-2*n)+\"v \"+(e-2*n)+\"h \"+(2*n-e)+\"z\")}}))}_basicExtraRounded(t){const{size:e,x:r,y:i}=t,n=e/7;this._rotateFigure(Object.assign(Object.assign({},t),{draw:()=>{this._element=document.createElementNS(\"http://www.w3.org/2000/svg\",\"path\"),this._element.setAttribute(\"clip-rule\",\"evenodd\"),this._element.setAttribute(\"d\",`M ${r} ${i+2.5*n}v `+2*n+`a ${2.5*n} ${2.5*n}, 0, 0, 0, ${2.5*n} ${2.5*n}h `+2*n+`a ${2.5*n} ${2.5*n}, 0, 0, 0, ${2.5*n} ${2.5*-n}v `+-2*n+`a ${2.5*n} ${2.5*n}, 0, 0, 0, ${2.5*-n} ${2.5*-n}h `+-2*n+`a ${2.5*n} ${2.5*n}, 0, 0, 0, ${2.5*-n} ${2.5*n}`+`M ${r+2.5*n} ${i+n}h `+2*n+`a ${1.5*n} ${1.5*n}, 0, 0, 1, ${1.5*n} ${1.5*n}v `+2*n+`a ${1.5*n} ${1.5*n}, 0, 0, 1, ${1.5*-n} ${1.5*n}h `+-2*n+`a ${1.5*n} ${1.5*n}, 0, 0, 1, ${1.5*-n} ${1.5*-n}v `+-2*n+`a ${1.5*n} ${1.5*n}, 0, 0, 1, ${1.5*n} ${1.5*-n}`)}}))}_drawDot({x:t,y:e,size:r,rotation:i}){this._basicDot({x:t,y:e,size:r,rotation:i})}_drawSquare({x:t,y:e,size:r,rotation:i}){this._basicSquare({x:t,y:e,size:r,rotation:i})}_drawExtraRounded({x:t,y:e,size:r,rotation:i}){this._basicExtraRounded({x:t,y:e,size:r,rotation:i})}}class u{constructor({svg:t,type:e}){this._svg=t,this._type=e}draw(t,e,r,i){let n;n=\"square\"===this._type?this._drawSquare:this._drawDot,n.call(this,{x:t,y:e,size:r,rotation:i})}_rotateFigure({x:t,y:e,size:r,rotation:i=0,draw:n}){var o;const s=t+r/2,a=e+r/2;n(),null===(o=this._element)||void 0===o||o.setAttribute(\"transform\",`rotate(${180*i/Math.PI},${s},${a})`)}_basicDot(t){const{size:e,x:r,y:i}=t;this._rotateFigure(Object.assign(Object.assign({},t),{draw:()=>{this._element=document.createElementNS(\"http://www.w3.org/2000/svg\",\"circle\"),this._element.setAttribute(\"cx\",String(r+e/2)),this._element.setAttribute(\"cy\",String(i+e/2)),this._element.setAttribute(\"r\",String(e/2))}}))}_basicSquare(t){const{size:e,x:r,y:i}=t;this._rotateFigure(Object.assign(Object.assign({},t),{draw:()=>{this._element=document.createElementNS(\"http://www.w3.org/2000/svg\",\"rect\"),this._element.setAttribute(\"x\",String(r)),this._element.setAttribute(\"y\",String(i)),this._element.setAttribute(\"width\",String(e)),this._element.setAttribute(\"height\",String(e))}}))}_drawDot({x:t,y:e,size:r,rotation:i}){this._basicDot({x:t,y:e,size:r,rotation:i})}_drawSquare({x:t,y:e,size:r,rotation:i}){this._basicSquare({x:t,y:e,size:r,rotation:i})}}const c=\"circle\";var d=function(t,e,r,i){return new(r||(r=Promise))((function(n,o){function s(t){try{h(i.next(t))}catch(t){o(t)}}function a(t){try{h(i.throw(t))}catch(t){o(t)}}function h(t){var e;t.done?n(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(s,a)}h((i=i.apply(t,e||[])).next())}))};const l=[[1,1,1,1,1,1,1],[1,0,0,0,0,0,1],[1,0,0,0,0,0,1],[1,0,0,0,0,0,1],[1,0,0,0,0,0,1],[1,0,0,0,0,0,1],[1,1,1,1,1,1,1]],g=[[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,1,1,1,0,0],[0,0,1,1,1,0,0],[0,0,1,1,1,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0]];class f{constructor(t){this._element=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\"),this._element.setAttribute(\"width\",String(t.width)),this._element.setAttribute(\"height\",String(t.height)),this._defs=document.createElementNS(\"http://www.w3.org/2000/svg\",\"defs\"),this._element.appendChild(this._defs),this._options=t}get width(){return this._options.width}get height(){return this._options.height}getElement(){return this._element}drawQR(t){return d(this,void 0,void 0,(function*(){const e=t.getModuleCount(),r=Math.min(this._options.width,this._options.height)-2*this._options.margin,i=this._options.shape===c?r/Math.sqrt(2):r,n=Math.floor(i/e);let o={hideXDots:0,hideYDots:0,width:0,height:0};if(this._qr=t,this._options.image){if(yield this.loadImage(),!this._image)return;const{imageOptions:t,qrOptions:r}=this._options,i=t.imageSize*s[r.errorCorrectionLevel],a=Math.floor(i*e*e),h=this._image instanceof SVGImageElement?this._image.width.baseVal.value:this._image.naturalWidth,u=this._image instanceof SVGImageElement?this._image.height.baseVal.value:this._image.naturalHeight;o=function({originalHeight:t,originalWidth:e,maxHiddenDots:r,maxHiddenAxisDots:i,dotSize:n}){const o={x:0,y:0},s={x:0,y:0};if(t<0||e<0||r<=0||n<=0)return{height:0,width:0,hideYDots:0,hideXDots:0};const a=t&&e?t/e:1;return o.x=Math.floor(Math.sqrt(r/a)),o.x<=0&&(o.x=1),i&&i<o.x&&(o.x=i),o.x%2==0&&o.x--,s.x=o.x*n,o.y=1+2*Math.ceil((o.x*a-1)/2),s.y=Math.round(s.x*a),(o.y*o.x>r||i&&i<o.y)&&(i&&i<o.y?(o.y=i,o.y%2==0&&o.x--):o.y-=2,s.y=o.y*n,o.x=1+2*Math.ceil((o.y/a-1)/2),s.x=Math.round(s.y/a)),{height:s.y,width:s.x,hideYDots:o.y,hideXDots:o.x}}({originalWidth:h,originalHeight:u,maxHiddenDots:a,maxHiddenAxisDots:e-14,dotSize:n})}this.drawBackground(),this.drawDots(((t,r)=>{var i,n,s,a,h,u;return!(this._options.imageOptions.hideBackgroundDots&&t>=(e-o.hideXDots)/2&&t<(e+o.hideXDots)/2&&r>=(e-o.hideYDots)/2&&r<(e+o.hideYDots)/2||(null===(i=l[t])||void 0===i?void 0:i[r])||(null===(n=l[t-e+7])||void 0===n?void 0:n[r])||(null===(s=l[t])||void 0===s?void 0:s[r-e+7])||(null===(a=g[t])||void 0===a?void 0:a[r])||(null===(h=g[t-e+7])||void 0===h?void 0:h[r])||(null===(u=g[t])||void 0===u?void 0:u[r-e+7]))})),this.drawCorners(),this._options.image&&(yield this.drawImage({width:o.width,height:o.height,count:e,dotSize:n}))}))}drawBackground(){var t,e,r;const i=this._element,n=this._options;if(i){const i=null===(t=n.backgroundOptions)||void 0===t?void 0:t.gradient,o=null===(e=n.backgroundOptions)||void 0===e?void 0:e.color;if((i||o)&&this._createColor({options:i,color:o,additionalRotation:0,x:0,y:0,height:n.height,width:n.width,name:\"background-color\"}),null===(r=n.backgroundOptions)||void 0===r?void 0:r.round){const t=Math.min(n.width,n.height),e=document.createElementNS(\"http://www.w3.org/2000/svg\",\"rect\");this._backgroundClipPath=document.createElementNS(\"http://www.w3.org/2000/svg\",\"clipPath\"),this._backgroundClipPath.setAttribute(\"id\",\"clip-path-background-color\"),this._defs.appendChild(this._backgroundClipPath),e.setAttribute(\"x\",String((n.width-t)/2)),e.setAttribute(\"y\",String((n.height-t)/2)),e.setAttribute(\"width\",String(t)),e.setAttribute(\"height\",String(t)),e.setAttribute(\"rx\",String(t/2*n.backgroundOptions.round)),this._backgroundClipPath.appendChild(e)}}}drawDots(t){var e,r;if(!this._qr)throw\"QR code is not defined\";const i=this._options,n=this._qr.getModuleCount();if(n>i.width||n>i.height)throw\"The canvas is too small.\";const o=Math.min(i.width,i.height)-2*i.margin,s=i.shape===c?o/Math.sqrt(2):o,h=Math.floor(s/n),u=Math.floor((i.width-n*h)/2),d=Math.floor((i.height-n*h)/2),l=new a({svg:this._element,type:i.dotsOptions.type});this._dotsClipPath=document.createElementNS(\"http://www.w3.org/2000/svg\",\"clipPath\"),this._dotsClipPath.setAttribute(\"id\",\"clip-path-dot-color\"),this._dotsClipPath.style.transformOrigin=\"center\",this._dotsClipPath.style.transform=\"rotate(90deg) scale(1, -1)\",this._defs.appendChild(this._dotsClipPath),this._createColor({options:null===(e=i.dotsOptions)||void 0===e?void 0:e.gradient,color:i.dotsOptions.color,additionalRotation:0,x:0,y:0,height:i.height,width:i.width,name:\"dot-color\"});for(let e=0;e<n;e++)for(let i=0;i<n;i++)t&&!t(e,i)||(null===(r=this._qr)||void 0===r?void 0:r.isDark(e,i))&&(l.draw(u+e*h,d+i*h,h,((r,o)=>!(e+r<0||i+o<0||e+r>=n||i+o>=n)&&!(t&&!t(e+r,i+o))&&!!this._qr&&this._qr.isDark(e+r,i+o))),l._element&&this._dotsClipPath&&this._dotsClipPath.appendChild(l._element));if(i.shape===c){const t=Math.floor((o/h-n)/2),e=n+2*t,r=u-t*h,i=d-t*h,s=[],a=Math.floor(e/2);for(let r=0;r<e;r++){s[r]=[];for(let i=0;i<e;i++)r>=t-1&&r<=e-t&&i>=t-1&&i<=e-t||Math.sqrt((r-a)*(r-a)+(i-a)*(i-a))>a?s[r][i]=0:s[r][i]=this._qr.isDark(i-2*t<0?i:i>=n?i-2*t:i-t,r-2*t<0?r:r>=n?r-2*t:r-t)?1:0}for(let t=0;t<e;t++)for(let n=0;n<e;n++)s[t][n]&&(l.draw(r+t*h,i+n*h,h,((e,r)=>{var i;return!!(null===(i=s[t+e])||void 0===i?void 0:i[n+r])})),l._element&&this._dotsClipPath&&this._dotsClipPath.appendChild(l._element))}}drawCorners(){if(!this._qr)throw\"QR code is not defined\";const t=this._element,e=this._options;if(!t)throw\"Element code is not defined\";const r=this._qr.getModuleCount(),i=Math.min(e.width,e.height)-2*e.margin,n=e.shape===c?i/Math.sqrt(2):i,o=Math.floor(n/r),s=7*o,d=3*o,f=Math.floor((e.width-r*o)/2),p=Math.floor((e.height-r*o)/2);[[0,0,0],[1,0,Math.PI/2],[0,1,-Math.PI/2]].forEach((([t,i,n])=>{var c,v,w,m,_,y,b,x,S,M,C,A;const O=f+t*o*(r-7),$=p+i*o*(r-7);let D=this._dotsClipPath,k=this._dotsClipPath;if(((null===(c=e.cornersSquareOptions)||void 0===c?void 0:c.gradient)||(null===(v=e.cornersSquareOptions)||void 0===v?void 0:v.color))&&(D=document.createElementNS(\"http://www.w3.org/2000/svg\",\"clipPath\"),D.setAttribute(\"id\",`clip-path-corners-square-color-${t}-${i}`),this._defs.appendChild(D),this._cornersSquareClipPath=this._cornersDotClipPath=k=D,this._createColor({options:null===(w=e.cornersSquareOptions)||void 0===w?void 0:w.gradient,color:null===(m=e.cornersSquareOptions)||void 0===m?void 0:m.color,additionalRotation:n,x:O,y:$,height:s,width:s,name:`corners-square-color-${t}-${i}`})),null===(_=e.cornersSquareOptions)||void 0===_?void 0:_.type){const t=new h({svg:this._element,type:e.cornersSquareOptions.type});t.draw(O,$,s,n),t._element&&D&&D.appendChild(t._element)}else{const t=new a({svg:this._element,type:e.dotsOptions.type});for(let e=0;e<l.length;e++)for(let r=0;r<l[e].length;r++)(null===(y=l[e])||void 0===y?void 0:y[r])&&(t.draw(O+e*o,$+r*o,o,((t,i)=>{var n;return!!(null===(n=l[e+t])||void 0===n?void 0:n[r+i])})),t._element&&D&&D.appendChild(t._element))}if(((null===(b=e.cornersDotOptions)||void 0===b?void 0:b.gradient)||(null===(x=e.cornersDotOptions)||void 0===x?void 0:x.color))&&(k=document.createElementNS(\"http://www.w3.org/2000/svg\",\"clipPath\"),k.setAttribute(\"id\",`clip-path-corners-dot-color-${t}-${i}`),this._defs.appendChild(k),this._cornersDotClipPath=k,this._createColor({options:null===(S=e.cornersDotOptions)||void 0===S?void 0:S.gradient,color:null===(M=e.cornersDotOptions)||void 0===M?void 0:M.color,additionalRotation:n,x:O+2*o,y:$+2*o,height:d,width:d,name:`corners-dot-color-${t}-${i}`})),null===(C=e.cornersDotOptions)||void 0===C?void 0:C.type){const t=new u({svg:this._element,type:e.cornersDotOptions.type});t.draw(O+2*o,$+2*o,d,n),t._element&&k&&k.appendChild(t._element)}else{const t=new a({svg:this._element,type:e.dotsOptions.type});for(let e=0;e<g.length;e++)for(let r=0;r<g[e].length;r++)(null===(A=g[e])||void 0===A?void 0:A[r])&&(t.draw(O+e*o,$+r*o,o,((t,i)=>{var n;return!!(null===(n=g[e+t])||void 0===n?void 0:n[r+i])})),t._element&&k&&k.appendChild(t._element))}}))}loadImage(){return new Promise(((t,e)=>{const r=this._options,i=new Image;if(!r.image)return e(\"Image is not defined\");\"string\"==typeof r.imageOptions.crossOrigin&&(i.crossOrigin=r.imageOptions.crossOrigin),this._image=i,i.onload=()=>{t()},i.src=r.image}))}drawImage({width:t,height:e,count:r,dotSize:i}){return d(this,void 0,void 0,(function*(){const n=this._options,s=Math.floor((n.width-r*i)/2),a=Math.floor((n.height-r*i)/2),h=s+n.imageOptions.margin+(r*i-t)/2,u=a+n.imageOptions.margin+(r*i-e)/2,c=t-2*n.imageOptions.margin,d=e-2*n.imageOptions.margin,l=document.createElementNS(\"http://www.w3.org/2000/svg\",\"image\");l.setAttribute(\"x\",String(h)),l.setAttribute(\"y\",String(u)),l.setAttribute(\"width\",`${c}px`),l.setAttribute(\"height\",`${d}px`);const g=yield function(t){return e=this,r=void 0,n=function*(){return fetch(t).then((t=>t.blob())).then(o)},new((i=void 0)||(i=Promise))((function(t,o){function s(t){try{h(n.next(t))}catch(t){o(t)}}function a(t){try{h(n.throw(t))}catch(t){o(t)}}function h(e){var r;e.done?t(e.value):(r=e.value,r instanceof i?r:new i((function(t){t(r)}))).then(s,a)}h((n=n.apply(e,r||[])).next())}));var e,r,i,n}(n.image||\"\");l.setAttribute(\"href\",g||\"\"),this._element.appendChild(l)}))}_createColor({options:t,color:e,additionalRotation:r,x:i,y:n,height:o,width:s,name:a}){const h=s>o?s:o,u=document.createElementNS(\"http://www.w3.org/2000/svg\",\"rect\");if(u.setAttribute(\"x\",String(i)),u.setAttribute(\"y\",String(n)),u.setAttribute(\"height\",String(o)),u.setAttribute(\"width\",String(s)),u.setAttribute(\"clip-path\",`url('#clip-path-${a}')`),t){let e;if(\"radial\"===t.type)e=document.createElementNS(\"http://www.w3.org/2000/svg\",\"radialGradient\"),e.setAttribute(\"id\",a),e.setAttribute(\"gradientUnits\",\"userSpaceOnUse\"),e.setAttribute(\"fx\",String(i+s/2)),e.setAttribute(\"fy\",String(n+o/2)),e.setAttribute(\"cx\",String(i+s/2)),e.setAttribute(\"cy\",String(n+o/2)),e.setAttribute(\"r\",String(h/2));else{const h=((t.rotation||0)+r)%(2*Math.PI),u=(h+2*Math.PI)%(2*Math.PI);let c=i+s/2,d=n+o/2,l=i+s/2,g=n+o/2;u>=0&&u<=.25*Math.PI||u>1.75*Math.PI&&u<=2*Math.PI?(c-=s/2,d-=o/2*Math.tan(h),l+=s/2,g+=o/2*Math.tan(h)):u>.25*Math.PI&&u<=.75*Math.PI?(d-=o/2,c-=s/2/Math.tan(h),g+=o/2,l+=s/2/Math.tan(h)):u>.75*Math.PI&&u<=1.25*Math.PI?(c+=s/2,d+=o/2*Math.tan(h),l-=s/2,g-=o/2*Math.tan(h)):u>1.25*Math.PI&&u<=1.75*Math.PI&&(d+=o/2,c+=s/2/Math.tan(h),g-=o/2,l-=s/2/Math.tan(h)),e=document.createElementNS(\"http://www.w3.org/2000/svg\",\"linearGradient\"),e.setAttribute(\"id\",a),e.setAttribute(\"gradientUnits\",\"userSpaceOnUse\"),e.setAttribute(\"x1\",String(Math.round(c))),e.setAttribute(\"y1\",String(Math.round(d))),e.setAttribute(\"x2\",String(Math.round(l))),e.setAttribute(\"y2\",String(Math.round(g)))}t.colorStops.forEach((({offset:t,color:r})=>{const i=document.createElementNS(\"http://www.w3.org/2000/svg\",\"stop\");i.setAttribute(\"offset\",100*t+\"%\"),i.setAttribute(\"stop-color\",r),e.appendChild(i)})),u.setAttribute(\"fill\",`url('#${a}')`),this._defs.appendChild(e)}else e&&u.setAttribute(\"fill\",e);this._element.appendChild(u)}}const p=\"canvas\",v={};for(let t=0;t<=40;t++)v[t]=t;const w={type:p,shape:\"square\",width:300,height:300,data:\"\",margin:0,qrOptions:{typeNumber:v[0],mode:void 0,errorCorrectionLevel:\"Q\"},imageOptions:{hideBackgroundDots:!0,imageSize:.4,crossOrigin:void 0,margin:0},dotsOptions:{type:\"square\",color:\"#000\"},backgroundOptions:{round:0,color:\"#fff\"}};function m(t){const e=Object.assign({},t);if(!e.colorStops||!e.colorStops.length)throw\"Field 'colorStops' is required in gradient\";return e.rotation?e.rotation=Number(e.rotation):e.rotation=0,e.colorStops=e.colorStops.map((t=>Object.assign(Object.assign({},t),{offset:Number(t.offset)}))),e}function _(t){const e=Object.assign({},t);return e.width=Number(e.width),e.height=Number(e.height),e.margin=Number(e.margin),e.imageOptions=Object.assign(Object.assign({},e.imageOptions),{hideBackgroundDots:Boolean(e.imageOptions.hideBackgroundDots),imageSize:Number(e.imageOptions.imageSize),margin:Number(e.imageOptions.margin)}),e.margin>Math.min(e.width,e.height)&&(e.margin=Math.min(e.width,e.height)),e.dotsOptions=Object.assign({},e.dotsOptions),e.dotsOptions.gradient&&(e.dotsOptions.gradient=m(e.dotsOptions.gradient)),e.cornersSquareOptions&&(e.cornersSquareOptions=Object.assign({},e.cornersSquareOptions),e.cornersSquareOptions.gradient&&(e.cornersSquareOptions.gradient=m(e.cornersSquareOptions.gradient))),e.cornersDotOptions&&(e.cornersDotOptions=Object.assign({},e.cornersDotOptions),e.cornersDotOptions.gradient&&(e.cornersDotOptions.gradient=m(e.cornersDotOptions.gradient))),e.backgroundOptions&&(e.backgroundOptions=Object.assign({},e.backgroundOptions),e.backgroundOptions.gradient&&(e.backgroundOptions.gradient=m(e.backgroundOptions.gradient))),e}var y=r(192),b=r.n(y),x=function(t,e,r,i){return new(r||(r=Promise))((function(n,o){function s(t){try{h(i.next(t))}catch(t){o(t)}}function a(t){try{h(i.throw(t))}catch(t){o(t)}}function h(t){var e;t.done?n(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(s,a)}h((i=i.apply(t,e||[])).next())}))};class S{constructor(t){this._options=t?_(e(w,t)):w,this.update()}static _clearContainer(t){t&&(t.innerHTML=\"\")}_setupSvg(){if(!this._qr)return;const t=new f(this._options);this._svg=t.getElement(),this._svgDrawingPromise=t.drawQR(this._qr).then((()=>{var e;this._svg&&(null===(e=this._extension)||void 0===e||e.call(this,t.getElement(),this._options))}))}_setupCanvas(){var t;this._qr&&(this._canvas=document.createElement(\"canvas\"),this._canvas.width=this._options.width,this._canvas.height=this._options.height,this._setupSvg(),this._canvasDrawingPromise=null===(t=this._svgDrawingPromise)||void 0===t?void 0:t.then((()=>{if(!this._svg)return;const t=this._svg,e=(new XMLSerializer).serializeToString(t),r=\"data:image/svg+xml;base64,\"+btoa(e),i=new Image;return new Promise((t=>{i.onload=()=>{var e,r;null===(r=null===(e=this._canvas)||void 0===e?void 0:e.getContext(\"2d\"))||void 0===r||r.drawImage(i,0,0),t()},i.src=r}))})))}_getElement(t=\"png\"){return x(this,void 0,void 0,(function*(){if(!this._qr)throw\"QR code is empty\";return\"svg\"===t.toLowerCase()?(this._svg&&this._svgDrawingPromise||this._setupSvg(),yield this._svgDrawingPromise,this._svg):(this._canvas&&this._canvasDrawingPromise||this._setupCanvas(),yield this._canvasDrawingPromise,this._canvas)}))}update(t){S._clearContainer(this._container),this._options=t?_(e(this._options,t)):this._options,this._options.data&&(this._qr=b()(this._options.qrOptions.typeNumber,this._options.qrOptions.errorCorrectionLevel),this._qr.addData(this._options.data,this._options.qrOptions.mode||function(t){switch(!0){case/^[0-9]*$/.test(t):return\"Numeric\";case/^[0-9A-Z $%*+\\-./:]*$/.test(t):return\"Alphanumeric\";default:return\"Byte\"}}(this._options.data)),this._qr.make(),this._options.type===p?this._setupCanvas():this._setupSvg(),this.append(this._container))}append(t){if(t){if(\"function\"!=typeof t.appendChild)throw\"Container should be a single DOM node\";this._options.type===p?this._canvas&&t.appendChild(this._canvas):this._svg&&t.appendChild(this._svg),this._container=t}}applyExtension(t){if(!t)throw\"Extension function should be defined.\";this._extension=t,this.update()}deleteExtension(){this._extension=void 0,this.update()}getRawData(t=\"png\"){return x(this,void 0,void 0,(function*(){if(!this._qr)throw\"QR code is empty\";const e=yield this._getElement(t);if(!e)return null;if(\"svg\"===t.toLowerCase()){const t=(new XMLSerializer).serializeToString(e);return new Blob(['<?xml version=\"1.0\" standalone=\"no\"?>\\r\\n'+t],{type:\"image/svg+xml\"})}return new Promise((r=>e.toBlob(r,`image/${t}`,1)))}))}download(t){return x(this,void 0,void 0,(function*(){if(!this._qr)throw\"QR code is empty\";let e=\"png\",r=\"qr\";\"string\"==typeof t?(e=t,console.warn(\"Extension is deprecated as argument for 'download' method, please pass object { name: '...', extension: '...' } as argument\")):\"object\"==typeof t&&null!==t&&(t.name&&(r=t.name),t.extension&&(e=t.extension));const i=yield this._getElement(e);if(i)if(\"svg\"===e.toLowerCase()){let t=(new XMLSerializer).serializeToString(i);t='<?xml version=\"1.0\" standalone=\"no\"?>\\r\\n'+t,n(\"data:image/svg+xml;charset=utf-8,\"+encodeURIComponent(t),`${r}.svg`)}else n(i.toDataURL(`image/${e}`),`${r}.${e}`)}))}}const M=S})(),i.default})()}));\n//# sourceMappingURL=qr-code-styling.js.map","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + {\"67\":\"b87adfdac989dff54cd1\",\"143\":\"e2c1115f073082dddbdf\",\"154\":\"8c2ff697b6d4cafdb776\",\"191\":\"1fa0f260d53e7abfe9ed\",\"209\":\"ca4daa9ff624b3bf5614\",\"212\":\"e663b8258cc54ba69359\",\"244\":\"ae966e72f128eda340fc\",\"256\":\"ff0f01bea01003a78a3c\",\"370\":\"5addeb3fc94386c23602\",\"483\":\"35b0f80df29ece6559a6\",\"625\":\"c4bfccd5c44b3331f5a7\",\"713\":\"894ffda65a82196537e1\",\"730\":\"2e172af489ed6ff0e496\",\"831\":\"f5c222cee9c1b1b68852\",\"905\":\"60ca606f19ffdd6d94a4\",\"958\":\"c56f02be3f4f5db2aedf\",\"1098\":\"4a6d3970af492938a672\",\"1142\":\"59a69270adc0978a6156\",\"1161\":\"9bcab8bec6aedc27da89\",\"1276\":\"07f8a81b011d56580ad6\",\"1360\":\"1a681d99506a88d29942\",\"1402\":\"35efd1623401c0a6ada2\",\"1418\":\"a8ffdf6d23ac65ebfa95\",\"1437\":\"53e04fe5063aee60d350\",\"1514\":\"64267b1f36585be79543\",\"1516\":\"d83a077417e05bb5cc04\",\"1627\":\"c1c005ef2bed8d1b9561\",\"1641\":\"d99075923e2b8c9e5f72\",\"1699\":\"258d1e759822ec152b75\",\"1752\":\"272d78459ec80c5b3dba\",\"1879\":\"60ac065c7d88c4f46b54\",\"1915\":\"c5b3f01035517153521f\",\"1917\":\"2928ac2003a7061dc059\",\"1933\":\"b2033cfa79d272a8fe62\",\"1954\":\"d569fdd7ba86d9776a5c\",\"1967\":\"3cec93c3a4dcd79e0488\",\"1989\":\"f3ae588c2fcab851759e\",\"2001\":\"8c68420c13854bbc24fe\",\"2002\":\"8481843cd3d445486865\",\"2054\":\"9c1890f62ccae40eeec2\",\"2098\":\"890557cbbc0c46a9f08f\",\"2137\":\"3af5405dff8273180346\",\"2138\":\"fbfb10a62455b7b043b7\",\"2243\":\"f82c54d3a849d4a487b4\",\"2251\":\"2bf10b1f578543d75e54\",\"2342\":\"f8d4331788cc89a2b694\",\"2369\":\"d952921438994721f7d0\",\"2390\":\"d7ecc2f228aef9b009e4\",\"2537\":\"94c17bfafc8acf1a9cd2\",\"2690\":\"4d73e3084ae3a2a6f64c\",\"2741\":\"9f3aba6b2cd0b453f9a5\",\"2767\":\"2121cd909c7aa572c7fd\",\"2853\":\"c4ae910d407f42b72912\",\"2892\":\"b8b8cd5c2b1df51e3492\",\"2993\":\"f49c72117c7ee16ecaaf\",\"3041\":\"3563c5d1fe542d54a9eb\",\"3075\":\"9c2f4f4a3c19eb56b751\",\"3076\":\"a7f6caf93b4b88180a6f\",\"3098\":\"448b2ceaf9f37e849d7e\",\"3108\":\"8f30bf9e3324a376f4ee\",\"3124\":\"076a04e3a1b8d27db111\",\"3147\":\"5a6cc01866d92675c748\",\"3163\":\"6761cefaf572d1748946\",\"3268\":\"7cace4f58c3fac9c74da\",\"3280\":\"c61f120392215be6557a\",\"3288\":\"4a69264995d9f806de13\",\"3309\":\"620314c64d80c35257fc\",\"3311\":\"2ff5c61aa4212045c410\",\"3404\":\"70f366c6fa25f799e549\",\"3408\":\"25202d3ff038f4194bd9\",\"3411\":\"8f5d1095651d61b8f424\",\"3420\":\"3a5367f73895e3c3c1f4\",\"3472\":\"615d222fdc0dcfa591d8\",\"3488\":\"54332bf5929df0077432\",\"3505\":\"58e185c3b757b41576a2\",\"3539\":\"498df8847f9f9d5a0937\",\"3585\":\"3853a59a7d0336a03fde\",\"3588\":\"d6cc0e28e0d962d3157c\",\"3656\":\"279c48ec3d47a9000fa9\",\"3698\":\"3541c155e1b629af7d33\",\"3779\":\"762d06bf06658c0af2e5\",\"3800\":\"96da4150cdeeba708556\",\"3848\":\"ee699a3ab25cc6ca726d\",\"3863\":\"d5fde682a12d7aa54672\",\"3866\":\"df9f4de3c91bbda53861\",\"3881\":\"8521d06f92c7b8b273ce\",\"3894\":\"9ec589a8d0b8850ef326\",\"3936\":\"a3325e628347fac10d84\",\"3966\":\"097d0a2dd03e55cf7c46\",\"4037\":\"af37477886b6cfd1194e\",\"4039\":\"bcd470032085a33ee54b\",\"4231\":\"d59a6f0c70fb98d4bcf0\",\"4276\":\"9240959928e16f250f8f\",\"4303\":\"58ff7d91e35a9b3c2756\",\"4314\":\"0d8ed2badacc96e873cb\",\"4334\":\"e493d976600a04c160e4\",\"4408\":\"0fb28033cf23ddbc23a6\",\"4484\":\"ba496a0faf977e32f6ef\",\"4536\":\"acd06cb972eebae2e5e4\",\"4566\":\"5eb1a1b10803fa99c22d\",\"4569\":\"385b6cf4a46b7115c2db\",\"4646\":\"7ebe551cdd0f4b9c9e92\",\"4685\":\"88d39506fe34588ed78d\",\"4686\":\"125b32545c1a0a0d5d3e\",\"4710\":\"0a0b5e901cf0b5d6fd93\",\"4713\":\"4c9628f9719b8f99bdfc\",\"4723\":\"38c6e4a29e0fdfa7afa8\",\"4747\":\"a51da29105f71545b275\",\"4753\":\"17105da93bd7006f8573\",\"4835\":\"0964f1a24a6398e35c12\",\"4838\":\"71c5c5739a3ed2bad3ee\",\"4850\":\"bc9242dc125cb10484bc\",\"4933\":\"c0f777add150aed6dd31\",\"4973\":\"9e1f1935e024e1bf929d\",\"4986\":\"962334f1a027906974fd\",\"5040\":\"99ef443d75bf87559776\",\"5060\":\"7cd173e6b1393947bb3b\",\"5066\":\"d9d0cb326f6f7d743f3a\",\"5099\":\"655521533cb48ebec54c\",\"5119\":\"090f02fee771b8f5e65c\",\"5204\":\"55dc1f02973adc8b29ab\",\"5239\":\"73400cf76a319169f599\",\"5246\":\"32626d81771d640604dd\",\"5281\":\"0b7b900d2540db49ae8f\",\"5297\":\"01b37c1c033b4b7c5732\",\"5309\":\"ba1a5dde297758458683\",\"5344\":\"5c9eaedbce0a63ae3e63\",\"5368\":\"892f890338957f00fc23\",\"5386\":\"9f0180dc5c168ff288bf\",\"5434\":\"249f262bbc62d09db4f0\",\"5474\":\"aedf972792d2c11b7940\",\"5588\":\"56e673e74137435b5023\",\"5603\":\"0302646e1ffabe87d525\",\"5699\":\"78a750acf4e0fff43bde\",\"5745\":\"53fc0ce876a7dce21370\",\"5769\":\"973c75af2293759db7ec\",\"5855\":\"c34458d02e95d2ec3d71\",\"5930\":\"9dcde09591068799ffc3\",\"5993\":\"7a57e87ff9a577929387\",\"5999\":\"3b1c15d4285915dddc03\",\"6052\":\"ca3c1bee89e20d16318d\",\"6146\":\"e892062054e79d879e6b\",\"6220\":\"4626eab605f1f3f5fae7\",\"6284\":\"412fe22eb5e792b8236b\",\"6297\":\"a40c32123d663a5d397e\",\"6346\":\"3a08cef57225b5dd0723\",\"6401\":\"65204bd5a1f1d34e1fdc\",\"6483\":\"49cb2949d98e5010ceff\",\"6548\":\"6abe878180ff54087f58\",\"6642\":\"765cb88c978f7f6366d8\",\"6688\":\"a5a6ef9c1044e440d8aa\",\"6770\":\"260c086c5e5b2e226e40\",\"6798\":\"a48f1b663374c1fcdf24\",\"6889\":\"94df7712273c4f61ab30\",\"6892\":\"1bf37b40183987140fc9\",\"6931\":\"5d8b023307c7a880a8f1\",\"6941\":\"7a0e1012e31f72681952\",\"6969\":\"d2b2e882f924d7d5e877\",\"6972\":\"45d9b899b7178fdb92c1\",\"7049\":\"6f2636c871a83f167b6e\",\"7052\":\"d8a4a1431f93b64b9a87\",\"7119\":\"03b2ee63b97712464a63\",\"7125\":\"57c858da5d4ff67e8141\",\"7316\":\"2a3dfa1eba460895cf64\",\"7388\":\"7bec01a290d868ba2d42\",\"7501\":\"9f45796679951ac21293\",\"7551\":\"6e574d5a75cf073215df\",\"7556\":\"701477404ee235a07786\",\"7794\":\"5d3eabab5ee771b3e859\",\"7799\":\"690560cf65f3d985dde5\",\"7897\":\"01558917b3d0fc1d388f\",\"7916\":\"0316c9805db8e80b41b5\",\"7941\":\"77c1fdd28946c8a30daa\",\"7963\":\"8b010994867f46020df9\",\"8063\":\"627d5ae10e2e502e9e38\",\"8090\":\"5f080bf7b973d3b10cde\",\"8138\":\"9b29a768a035996247bd\",\"8208\":\"9a2d0eeec5f8bb07cdd3\",\"8294\":\"12b38bd567e102c27c8e\",\"8369\":\"c6ae120b122d07384b7d\",\"8401\":\"a8ba266b7a79ef7dfe1d\",\"8435\":\"5f667e46d196564970b9\",\"8505\":\"f588195fa145445de93b\",\"8530\":\"a4d7f28c015d01eaf776\",\"8663\":\"3215036b0069a8dcc16e\",\"8709\":\"51c7b7103b230d767ea7\",\"8812\":\"a39ba81372544f20ba3f\",\"8815\":\"fd39d74554c793313d5b\",\"8822\":\"3e199b60162d8b8314aa\",\"8878\":\"a7b117d54d54258e5f26\",\"8913\":\"1773658335e9a4527e40\",\"9071\":\"c587e7d4b0df5f41a587\",\"9125\":\"221d966328061801dce3\",\"9223\":\"b65193470f36938b0d9b\",\"9227\":\"c34f2b1661736507d402\",\"9285\":\"3aedc94598376aee9274\",\"9328\":\"545adb935b7615fd8d16\",\"9338\":\"cf9b08f5551ab6096a70\",\"9375\":\"40298b58e46ff66877d6\",\"9379\":\"5f47d04a09f26df77d30\",\"9400\":\"9f2f9a821c3a64e5473d\",\"9486\":\"66f6169ec02590019bbf\",\"9535\":\"35b32969dfafdbc17a45\",\"9536\":\"52b3efcf5de741667a33\",\"9565\":\"05a813d6f1c60da0196b\",\"9606\":\"f9fa653821fc0f019fad\",\"9623\":\"a319f64448a91c662f4d\",\"9635\":\"01582125f331f7f89adb\",\"9641\":\"8b340949ffd52cb38c60\",\"9657\":\"376f100fba6d94cfca1b\",\"9682\":\"730455c56a4729444e9d\",\"9783\":\"6fb3455cb9b01926cb10\",\"9822\":\"ec3817f08021427f5550\",\"9954\":\"2f4e700b1c117bc4f463\",\"9970\":\"3bee91fb23bf1762eee4\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"3041\":\"BundleAuth\",\"3779\":\"BundleExtra\",\"5769\":\"BundleMain\",\"9954\":\"BundleCalls\"}[chunkId] || chunkId) + \".\" + {\"3041\":\"3563c5d1fe542d54a9eb\",\"3472\":\"615d222fdc0dcfa591d8\",\"3779\":\"762d06bf06658c0af2e5\",\"5769\":\"973c75af2293759db7ec\",\"7916\":\"0316c9805db8e80b41b5\",\"8878\":\"a7b117d54d54258e5f26\",\"9954\":\"2f4e700b1c117bc4f463\"}[chunkId] + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t179: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\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\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunktelegram_t\"] = self[\"webpackChunktelegram_t\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","import { DEBUG, DEBUG_MORE, IS_TEST } from '../config';\nimport { getActions } from '../global';\nimport { IS_ANDROID, IS_IOS, IS_SERVICE_WORKER_SUPPORTED } from './environment';\nimport { notifyClientReady, playNotifySoundDebounced } from './notifications';\n\ntype WorkerAction = {\n type: string;\n payload: Record<string, any>;\n};\n\nfunction handleWorkerMessage(e: MessageEvent) {\n const action: WorkerAction = e.data;\n if (DEBUG_MORE) {\n // eslint-disable-next-line no-console\n console.log('[SW] Message from worker', action);\n }\n if (!action.type) return;\n const dispatch = getActions();\n const payload = action.payload;\n switch (action.type) {\n case 'focusMessage':\n if (dispatch.focusMessage) {\n dispatch.focusMessage(payload);\n }\n break;\n case 'playNotificationSound':\n playNotifySoundDebounced(action.payload.id);\n break;\n }\n}\n\nfunction subscribeToWorker() {\n navigator.serviceWorker.removeEventListener('message', handleWorkerMessage);\n navigator.serviceWorker.addEventListener('message', handleWorkerMessage);\n // Notify web worker that client is ready to receive messages\n notifyClientReady();\n}\n\nif (IS_SERVICE_WORKER_SUPPORTED) {\n window.addEventListener('load', async () => {\n try {\n if (!navigator.serviceWorker.controller) {\n const registrations = await navigator.serviceWorker.getRegistrations();\n if (registrations.length) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] Hard reload detected, re-enabling Service Worker');\n }\n await Promise.all(registrations.map((r) => r.unregister()));\n }\n }\n\n await navigator.serviceWorker.register(new URL('../serviceWorker.ts', import.meta.url));\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] ServiceWorker registered');\n }\n\n await navigator.serviceWorker.ready;\n\n if (navigator.serviceWorker.controller) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] ServiceWorker ready');\n }\n subscribeToWorker();\n } else {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('[SW] ServiceWorker not available');\n }\n\n if (!IS_IOS && !IS_ANDROID && !IS_TEST) {\n getActions().showDialog({ data: { message: 'SERVICE_WORKER_DISABLED', hasErrorKey: true } });\n }\n }\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('[SW] ServiceWorker registration failed: ', err);\n }\n }\n });\n window.addEventListener('focus', async () => {\n await navigator.serviceWorker.ready;\n subscribeToWorker();\n });\n}\n","import { addActionHandler } from './index';\n\nimport { INITIAL_STATE } from './initialState';\nimport { IS_MOCKED_CLIENT } from '../config';\nimport { initCache, loadCache } from './cache';\nimport { cloneDeep } from '../util/iteratees';\nimport { updatePasscodeSettings } from './reducers';\nimport { clearStoredSession } from '../util/sessions';\n\ninitCache();\n\naddActionHandler('init', () => {\n const initial = cloneDeep(INITIAL_STATE);\n let global = loadCache(initial) || initial;\n if (IS_MOCKED_CLIENT) global.authState = 'authorizationStateReady';\n\n const { hasPasscode, isScreenLocked } = global.passcode;\n if (hasPasscode && !isScreenLocked) {\n global = updatePasscodeSettings(global, {\n isScreenLocked: true,\n });\n\n clearStoredSession();\n }\n\n return global;\n});\n","const STORAGE_KEY = 'tt-active-tab';\nconst INTERVAL = 2000;\n\nconst tabKey = String(Date.now() + Math.random());\n\nlocalStorage.setItem(STORAGE_KEY, tabKey);\n\nlet callback: NoneToVoidFunction;\n\nconst interval = window.setInterval(() => {\n if (callback && localStorage.getItem(STORAGE_KEY) !== tabKey) {\n callback();\n clearInterval(interval);\n }\n}, INTERVAL);\n\nexport function addActiveTabChangeListener(_callback: NoneToVoidFunction) {\n callback = _callback;\n}\n","const SITE_FONTS = ['400 1em Roboto', '500 1em Roboto'];\n\nexport default function preloadFonts() {\n if ('fonts' in document) {\n return Promise.all(SITE_FONTS.map((font) => document.fonts.load(font)));\n }\n\n return undefined;\n}\n","import * as langProvider from '../util/langProvider';\nimport { useState } from '../lib/teact/teact';\n\nconst useLangString = (langCode: string | undefined, key: string): string | undefined => {\n const [translation, setTranslation] = useState<string>();\n\n if (langCode) {\n langProvider\n .getTranslationForLangString(langCode, key)\n .then(setTranslation);\n }\n\n return translation;\n};\n\nexport default useLangString;\n","import type { LangCode } from '../../../types';\n\nexport function getSuggestedLanguage() {\n let suggestedLanguage = navigator.language;\n\n if (suggestedLanguage && suggestedLanguage !== 'pt-br') {\n suggestedLanguage = suggestedLanguage.substr(0, 2);\n }\n\n return suggestedLanguage as LangCode;\n}\n","import type { FC } from '../../lib/teact/teact';\nimport React, {\n useState, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../global';\n\nimport type { ApiCountryCode } from '../../api/types';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport { prepareSearchWordsForNeedle } from '../../util/searchWords';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport { isoToEmoji } from '../../util/emoji';\nimport useOnChange from '../../hooks/useOnChange';\n\nimport DropdownMenu from '../ui/DropdownMenu';\nimport MenuItem from '../ui/MenuItem';\nimport Spinner from '../ui/Spinner';\n\nimport './CountryCodeInput.scss';\n\ntype StateProps = {\n phoneCodeList: ApiCountryCode[];\n};\n\ntype OwnProps = {\n id: string;\n value?: ApiCountryCode;\n isLoading?: boolean;\n onChange: (value: ApiCountryCode) => void;\n};\n\nconst MENU_HIDING_DURATION = 200 + ANIMATION_END_DELAY;\nconst SELECT_TIMEOUT = 50;\n\nconst CountryCodeInput: FC<OwnProps & StateProps> = ({\n id,\n value,\n isLoading,\n onChange,\n phoneCodeList,\n}) => {\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef<HTMLInputElement>(null);\n\n const [filter, setFilter] = useState<string | undefined>();\n const [filteredList, setFilteredList] = useState<ApiCountryCode[]>([]);\n\n const updateFilter = useCallback((filterValue?: string) => {\n setFilter(filterValue);\n setFilteredList(getFilteredList(phoneCodeList, filterValue));\n }, [phoneCodeList]);\n\n useOnChange(([prevPhoneCodeList]) => {\n if (prevPhoneCodeList?.length === 0 && phoneCodeList.length > 0) {\n updateFilter(filter);\n }\n }, [phoneCodeList, updateFilter]);\n\n const handleChange = useCallback((country: ApiCountryCode) => {\n onChange(country);\n\n setTimeout(() => updateFilter(undefined), MENU_HIDING_DURATION);\n }, [onChange, updateFilter]);\n\n const handleInput = useCallback((e: React.FormEvent<HTMLInputElement>) => {\n updateFilter(e.currentTarget.value);\n }, [updateFilter]);\n\n const handleInputKeyDown = useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.keyCode !== 8) {\n return;\n }\n\n const target = e.currentTarget;\n if (value && filter === undefined) {\n target.value = '';\n }\n\n updateFilter(target.value);\n }, [filter, updateFilter, value]);\n\n const CodeInput: FC<{ onTrigger: () => void; isOpen?: boolean }> = useCallback(({ 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 handleCodeInput = (e: React.FormEvent<HTMLInputElement>) => {\n handleInput(e);\n handleTrigger();\n };\n\n const inputValue = filter ?? (value?.name || value?.defaultName || '');\n\n return (\n <div className={buildClassName('input-group', value && 'touched')}>\n <input\n ref={inputRef}\n className={buildClassName('form-control', isOpen && 'focus')}\n type=\"text\"\n id={id}\n value={inputValue}\n autoComplete=\"off\"\n onClick={handleTrigger}\n onFocus={handleTrigger}\n onInput={handleCodeInput}\n onKeyDown={handleInputKeyDown}\n />\n <label>{lang('Login.SelectCountry.Title')}</label>\n {isLoading ? (\n <Spinner color=\"black\" />\n ) : (\n <i onClick={handleTrigger} className={buildClassName('css-icon-down', isOpen && 'open')} />\n )}\n </div>\n );\n }, [filter, handleInput, handleInputKeyDown, id, isLoading, lang, value]);\n\n return (\n <DropdownMenu\n className=\"CountryCodeInput\"\n trigger={CodeInput}\n >\n {filteredList\n .map((country: ApiCountryCode) => (\n <MenuItem\n key={`${country.iso2}-${country.countryCode}`}\n className={value && country.iso2 === value.iso2 ? 'selected' : ''}\n // eslint-disable-next-line react/jsx-no-bind\n onClick={() => handleChange(country)}\n >\n <span className=\"country-flag\">{renderText(isoToEmoji(country.iso2), ['hq_emoji'])}</span>\n <span className=\"country-name\">{country.name || country.defaultName}</span>\n <span className=\"country-code\">+{country.countryCode}</span>\n </MenuItem>\n ))}\n {!filteredList.length && (\n <MenuItem\n key=\"no-results\"\n className=\"no-results\"\n disabled\n >\n <span>{lang('lng_country_none')}</span>\n </MenuItem>\n )}\n </DropdownMenu>\n );\n};\n\nfunction getFilteredList(countryList: ApiCountryCode[], filter = ''): ApiCountryCode[] {\n if (!filter.length) {\n return countryList;\n }\n\n const searchWords = prepareSearchWordsForNeedle(filter);\n\n return countryList.filter((country) => (\n searchWords(country.defaultName) || (country.name && searchWords(country.name))\n ));\n}\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n const { countryList: { phoneCodes: phoneCodeList } } = global;\n return {\n phoneCodeList,\n };\n },\n)(CountryCodeInput));\n","import type { ChangeEvent } from 'react';\n\nimport monkeyPath from '../../assets/monkey.svg';\n\nimport type { FC } from '../../lib/teact/teact';\nimport React, {\n memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { getActions, withGlobal } from '../../global';\n\nimport type { GlobalState } from '../../global/types';\nimport type { LangCode } from '../../types';\nimport type { ApiCountryCode } from '../../api/types';\n\nimport { IS_SAFARI, IS_TOUCH_ENV } from '../../util/environment';\nimport { preloadImage } from '../../util/files';\nimport preloadFonts from '../../util/fonts';\nimport { pick } from '../../util/iteratees';\nimport { formatPhoneNumber, getCountryCodesByIso, getCountryFromPhoneNumber } from '../../util/phoneNumber';\nimport { setLanguage } from '../../util/langProvider';\nimport useLang from '../../hooks/useLang';\nimport useFlag from '../../hooks/useFlag';\nimport useLangString from '../../hooks/useLangString';\nimport { getSuggestedLanguage } from './helpers/getSuggestedLanguage';\n\nimport Button from '../ui/Button';\nimport Checkbox from '../ui/Checkbox';\nimport InputText from '../ui/InputText';\nimport Loading from '../ui/Loading';\nimport CountryCodeInput from './CountryCodeInput';\n\ntype StateProps = Pick<GlobalState, (\n 'connectionState' | 'authState' |\n 'authPhoneNumber' | 'authIsLoading' |\n 'authIsLoadingQrCode' | 'authError' |\n 'authRememberMe' | 'authNearestCountry'\n)> & {\n language?: LangCode;\n phoneCodeList: ApiCountryCode[];\n};\n\nconst MIN_NUMBER_LENGTH = 7;\n\nlet isPreloadInitiated = false;\n\nconst AuthPhoneNumber: FC<StateProps> = ({\n connectionState,\n authState,\n authPhoneNumber,\n authIsLoading,\n authIsLoadingQrCode,\n authError,\n authRememberMe,\n authNearestCountry,\n phoneCodeList,\n language,\n}) => {\n const {\n setAuthPhoneNumber,\n setAuthRememberMe,\n loadNearestCountry,\n loadCountryList,\n clearAuthError,\n goToAuthQrCode,\n setSettingOption,\n } = getActions();\n\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef<HTMLInputElement>(null);\n const suggestedLanguage = getSuggestedLanguage();\n\n const continueText = useLangString(suggestedLanguage, 'ContinueOnThisLanguage');\n const [country, setCountry] = useState<ApiCountryCode | undefined>();\n const [phoneNumber, setPhoneNumber] = useState<string | undefined>();\n const [isTouched, setIsTouched] = useState(false);\n const [lastSelection, setLastSelection] = useState<[number, number] | undefined>();\n const [isLoading, markIsLoading, unmarkIsLoading] = useFlag();\n\n const fullNumber = country ? `+${country.countryCode} ${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 (connectionState === 'connectionStateReady') {\n loadCountryList({ langCode: language });\n }\n }, [connectionState, language, loadCountryList]);\n\n useEffect(() => {\n if (authNearestCountry && phoneCodeList && !country && !isTouched) {\n setCountry(getCountryCodesByIso(phoneCodeList, authNearestCountry)[0]);\n }\n }, [country, authNearestCountry, isTouched, phoneCodeList]);\n\n const parseFullNumber = useCallback((newFullNumber: string) => {\n if (!newFullNumber.length) {\n setPhoneNumber('');\n }\n\n const suggestedCountry = phoneCodeList && getCountryFromPhoneNumber(phoneCodeList, newFullNumber);\n\n // Any phone numbers should be allowed, in some cases ignoring formatting\n const selectedCountry = !country\n || (suggestedCountry && suggestedCountry.iso2 !== country.iso2)\n || (!suggestedCountry && newFullNumber.length)\n ? suggestedCountry\n : country;\n\n if (!country || !selectedCountry || (selectedCountry && selectedCountry.iso2 !== country.iso2)) {\n setCountry(selectedCountry);\n }\n setPhoneNumber(formatPhoneNumber(newFullNumber, selectedCountry));\n }, [phoneCodeList, country]);\n\n const handleLangChange = useCallback(() => {\n markIsLoading();\n\n void setLanguage(suggestedLanguage, () => {\n unmarkIsLoading();\n\n setSettingOption({ language: suggestedLanguage });\n });\n }, [markIsLoading, setSettingOption, suggestedLanguage, unmarkIsLoading]);\n\n useEffect(() => {\n if (phoneNumber === undefined && authPhoneNumber) {\n parseFullNumber(authPhoneNumber);\n }\n }, [authPhoneNumber, phoneNumber, parseFullNumber]);\n\n useLayoutEffect(() => {\n if (inputRef.current && lastSelection) {\n inputRef.current.setSelectionRange(...lastSelection);\n }\n }, [lastSelection]);\n\n const isJustPastedRef = useRef(false);\n const handlePaste = useCallback(() => {\n isJustPastedRef.current = true;\n requestAnimationFrame(() => {\n isJustPastedRef.current = false;\n });\n }, []);\n\n const handleCountryChange = useCallback((value: ApiCountryCode) => {\n setCountry(value);\n setPhoneNumber('');\n }, []);\n\n const handlePhoneNumberChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n if (authError) {\n clearAuthError();\n }\n\n // This is for further screens. We delay it until user input to speed up the initial loading.\n if (!isPreloadInitiated) {\n isPreloadInitiated = true;\n preloadFonts();\n void preloadImage(monkeyPath);\n }\n\n const { value, selectionStart, selectionEnd } = e.target;\n setLastSelection(\n selectionStart && selectionEnd && selectionEnd < value.length\n ? [selectionStart, selectionEnd]\n : undefined,\n );\n\n setIsTouched(true);\n\n const shouldFixSafariAutoComplete = (\n IS_SAFARI && country && fullNumber !== undefined\n && value.length - fullNumber.length > 1 && !isJustPastedRef.current\n );\n parseFullNumber(shouldFixSafariAutoComplete ? `${country!.countryCode} ${value}` : value);\n }, [authError, clearAuthError, country, fullNumber, parseFullNumber]);\n\n const handleKeepSessionChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setAuthRememberMe(e.target.checked);\n }, [setAuthRememberMe]);\n\n function handleSubmit(event: React.FormEvent<HTMLFormElement>) {\n event.preventDefault();\n\n if (authIsLoading) {\n return;\n }\n\n if (canSubmit) {\n setAuthPhoneNumber({ phoneNumber: fullNumber });\n }\n }\n\n const isAuthReady = authState === 'authorizationStateWaitPhoneNumber';\n\n return (\n <div id=\"auth-phone-number-form\" className=\"custom-scroll\">\n <div className=\"auth-form\">\n <div id=\"logo\" />\n <h1>Telegram</h1>\n <p className=\"note\">{lang('StartText')}</p>\n <form action=\"\" onSubmit={handleSubmit}>\n <CountryCodeInput\n id=\"sign-in-phone-code\"\n value={country}\n isLoading={!authNearestCountry && !country}\n onChange={handleCountryChange}\n />\n <InputText\n ref={inputRef}\n id=\"sign-in-phone-number\"\n label={lang('Login.PhonePlaceholder')}\n value={fullNumber}\n error={authError && lang(authError)}\n inputMode=\"tel\"\n onChange={handlePhoneNumberChange}\n onPaste={IS_SAFARI ? handlePaste : undefined}\n />\n <Checkbox\n id=\"sign-in-keep-session\"\n label=\"Keep me signed in\"\n checked={Boolean(authRememberMe)}\n onChange={handleKeepSessionChange}\n />\n {canSubmit && (\n isAuthReady ? (\n <Button type=\"submit\" ripple isLoading={authIsLoading}>{lang('Login.Next')}</Button>\n ) : (\n <Loading />\n )\n )}\n {isAuthReady && (\n <Button isText ripple isLoading={authIsLoadingQrCode} onClick={goToAuthQrCode}>\n {lang('Login.QR.Login')}\n </Button>\n )}\n {suggestedLanguage && suggestedLanguage !== language && continueText && (\n <Button isText isLoading={isLoading} onClick={handleLangChange}>{continueText}</Button>\n )}\n </form>\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n settings: { byKey: { language } },\n countryList: { phoneCodes: phoneCodeList },\n } = global;\n\n return {\n ...pick(global, [\n 'connectionState',\n 'authState',\n 'authPhoneNumber',\n 'authIsLoading',\n 'authIsLoadingQrCode',\n 'authError',\n 'authRememberMe',\n 'authNearestCountry',\n ]),\n language,\n phoneCodeList,\n };\n },\n)(AuthPhoneNumber));\n","import type { FC } from '../../lib/teact/teact';\nimport React, { memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthCodeAsync: FC = () => {\n const AuthCode = useModuleLoader(Bundles.Auth, 'AuthCode');\n\n return AuthCode ? <AuthCode /> : <Loading />;\n};\n\nexport default memo(AuthCodeAsync);\n","import type { FC } from '../../lib/teact/teact';\nimport React, { memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthPasswordAsync: FC = () => {\n const AuthPassword = useModuleLoader(Bundles.Auth, 'AuthPassword');\n\n return AuthPassword ? <AuthPassword /> : <Loading />;\n};\n\nexport default memo(AuthPasswordAsync);\n","import type { FC } from '../../lib/teact/teact';\nimport React, { memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthRegisterAsync: FC = () => {\n const AuthRegister = useModuleLoader(Bundles.Auth, 'AuthRegister');\n\n return AuthRegister ? <AuthRegister /> : <Loading />;\n};\n\nexport default memo(AuthRegisterAsync);\n","import QrCodeStyling from 'qr-code-styling';\nimport type { FC } from '../../lib/teact/teact';\nimport React, {\n useEffect, useRef, memo, useCallback,\n} from '../../lib/teact/teact';\nimport { getActions, withGlobal } from '../../global';\n\nimport type { GlobalState } from '../../global/types';\nimport type { LangCode } from '../../types';\n\nimport { DEFAULT_LANG_CODE } from '../../config';\nimport { LOCAL_TGS_URLS } from '../common/helpers/animatedAssets';\nimport { setLanguage } from '../../util/langProvider';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from '../common/helpers/renderText';\nimport { getSuggestedLanguage } from './helpers/getSuggestedLanguage';\n\nimport useLangString from '../../hooks/useLangString';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\nimport useMediaTransition from '../../hooks/useMediaTransition';\n\nimport Loading from '../ui/Loading';\nimport Button from '../ui/Button';\nimport blankUrl from '../../assets/blank.png';\nimport AnimatedIcon from '../common/AnimatedIcon';\n\ntype StateProps =\n Pick<GlobalState, 'connectionState' | 'authState' | 'authQrCode'>\n & { language?: LangCode };\n\nconst DATA_PREFIX = 'tg://login?token=';\nconst QR_SIZE = 280;\nconst QR_PLANE_SIZE = 54;\n\nconst QR_CODE = new QrCodeStyling({\n width: QR_SIZE,\n height: QR_SIZE,\n image: blankUrl,\n margin: 10,\n type: 'svg',\n dotsOptions: {\n type: 'rounded',\n },\n cornersSquareOptions: {\n type: 'extra-rounded',\n },\n imageOptions: {\n imageSize: 0.4,\n margin: 8,\n },\n qrOptions: {\n errorCorrectionLevel: 'M',\n },\n});\n\nconst AuthCode: FC<StateProps> = ({\n connectionState,\n authState,\n authQrCode,\n language,\n}) => {\n const {\n returnToAuthPhoneNumber,\n setSettingOption,\n } = getActions();\n\n const suggestedLanguage = getSuggestedLanguage();\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const qrCodeRef = useRef<HTMLDivElement>(null);\n const continueText = useLangString(suggestedLanguage, 'ContinueOnThisLanguage');\n const [isLoading, markIsLoading, unmarkIsLoading] = useFlag();\n const [isQrMounted, markQrMounted, unmarkQrMounted] = useFlag();\n\n const transitionClassNames = useMediaTransition(isQrMounted);\n\n useEffect(() => {\n if (!authQrCode) {\n return () => {\n unmarkQrMounted();\n };\n }\n\n if (connectionState !== 'connectionStateReady') {\n return undefined;\n }\n\n const container = qrCodeRef.current!;\n const data = `${DATA_PREFIX}${authQrCode.token}`;\n\n QR_CODE.update({\n data,\n });\n\n if (!isQrMounted) {\n QR_CODE.append(container);\n markQrMounted();\n }\n return undefined;\n }, [connectionState, authQrCode, isQrMounted, markQrMounted, unmarkQrMounted]);\n\n useEffect(() => {\n if (connectionState === 'connectionStateReady') {\n void setLanguage(DEFAULT_LANG_CODE);\n }\n }, [connectionState]);\n\n const handleLangChange = useCallback(() => {\n markIsLoading();\n\n void setLanguage(suggestedLanguage, () => {\n unmarkIsLoading();\n\n setSettingOption({ language: suggestedLanguage });\n });\n }, [markIsLoading, setSettingOption, suggestedLanguage, unmarkIsLoading]);\n\n const isAuthReady = authState === 'authorizationStateWaitQrCode';\n\n return (\n <div id=\"auth-qr-form\" className=\"custom-scroll\">\n <div className=\"auth-form qr\">\n <div className=\"qr-outer\">\n <div\n className={buildClassName('qr-inner', transitionClassNames)}\n key=\"qr-inner\"\n >\n <div\n key=\"qr-container\"\n className=\"qr-container\"\n ref={qrCodeRef}\n style={`width: ${QR_SIZE}px; height: ${QR_SIZE}px`}\n />\n <AnimatedIcon\n tgsUrl={LOCAL_TGS_URLS.QrPlane}\n size={QR_PLANE_SIZE}\n className=\"qr-plane\"\n nonInteractive\n noLoop={false}\n />\n </div>\n {!isQrMounted && <div className=\"qr-loading\"><Loading /></div>}\n </div>\n <h1>{lang('Login.QR.Title')}</h1>\n <ol>\n <li><span>{lang('Login.QR.Help1')}</span></li>\n <li><span>{renderText(lang('Login.QR2.Help2'), ['simple_markdown'])}</span></li>\n <li><span>{lang('Login.QR.Help3')}</span></li>\n </ol>\n {isAuthReady && (\n <Button isText onClick={returnToAuthPhoneNumber}>{lang('Login.QR.Cancel')}</Button>\n )}\n {suggestedLanguage && suggestedLanguage !== language && continueText && (\n <Button isText isLoading={isLoading} onClick={handleLangChange}>{continueText}</Button>\n )}\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n connectionState, authState, authQrCode, settings: { byKey: { language } },\n } = global;\n\n return {\n connectionState,\n authState,\n authQrCode,\n language,\n };\n },\n)(AuthCode));\n","import type { FC } from '../../lib/teact/teact';\nimport React, { useEffect, memo } from '../../lib/teact/teact';\nimport { getActions, withGlobal } from '../../global';\n\nimport type { GlobalState } from '../../global/types';\n\nimport '../../global/actions/initial';\nimport { pick } from '../../util/iteratees';\nimport { PLATFORM_ENV } from '../../util/environment';\nimport windowSize from '../../util/windowSize';\nimport useHistoryBack from '../../hooks/useHistoryBack';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\n\nimport AuthPhoneNumber from './AuthPhoneNumber';\nimport AuthCode from './AuthCode.async';\nimport AuthPassword from './AuthPassword.async';\nimport AuthRegister from './AuthRegister.async';\nimport AuthQrCode from './AuthQrCode';\n\nimport './Auth.scss';\n\ntype OwnProps = {\n isActive: boolean;\n};\n\ntype StateProps = Pick<GlobalState, 'authState'>;\n\nconst Auth: FC<OwnProps & StateProps> = ({\n isActive, authState,\n}) => {\n const {\n reset, initApi, returnToAuthPhoneNumber, goToAuthQrCode,\n } = getActions();\n\n useEffect(() => {\n if (isActive) {\n reset();\n initApi();\n }\n }, [isActive, reset, initApi]);\n\n const isMobile = PLATFORM_ENV === 'iOS' || PLATFORM_ENV === 'Android';\n\n const handleChangeAuthorizationMethod = () => {\n if (!isMobile) {\n goToAuthQrCode();\n } else {\n returnToAuthPhoneNumber();\n }\n };\n\n useHistoryBack({\n isActive: (!isMobile && authState === 'authorizationStateWaitPhoneNumber')\n || (isMobile && authState === 'authorizationStateWaitQrCode'),\n onBack: handleChangeAuthorizationMethod,\n });\n\n // Prevent refresh when rotating device\n useEffect(() => {\n windowSize.disableRefresh();\n\n return () => {\n windowSize.enableRefresh();\n };\n }, []);\n\n // For animation purposes\n const renderingAuthState = useCurrentOrPrev(\n authState !== 'authorizationStateReady' ? authState : undefined,\n true,\n );\n\n switch (renderingAuthState) {\n case 'authorizationStateWaitCode':\n return <AuthCode />;\n case 'authorizationStateWaitPassword':\n return <AuthPassword />;\n case 'authorizationStateWaitRegistration':\n return <AuthRegister />;\n case 'authorizationStateWaitPhoneNumber':\n return <AuthPhoneNumber />;\n case 'authorizationStateWaitQrCode':\n return <AuthQrCode />;\n default:\n return isMobile ? <AuthPhoneNumber /> : <AuthQrCode />;\n }\n};\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => pick(global, ['authState']),\n)(Auth));\n","import type { FC } from '../../lib/teact/teact';\nimport React, { memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst MainAsync: FC = () => {\n const Main = useModuleLoader(Bundles.Main, 'Main');\n\n return Main ? <Main /> : undefined;\n};\n\nexport default memo(MainAsync);\n","import type { FC } from '../../lib/teact/teact';\nimport React, { memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport type { OwnProps } from './LockScreen';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst LockScreenAsync: FC<OwnProps> = (props) => {\n const { isLocked } = props;\n const LockScreen = useModuleLoader(Bundles.Main, 'LockScreen', !isLocked);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return LockScreen ? <LockScreen {...props} /> : undefined;\n};\n\nexport default memo(LockScreenAsync);\n","import type { FC } from '../../lib/teact/teact';\nimport React, { useCallback } from '../../lib/teact/teact';\n\nimport Button from '../ui/Button';\n\nimport appInactivePath from '../../assets/app-inactive.png';\nimport './AppInactive.scss';\n\nconst AppInactive: FC = () => {\n const handleReload = useCallback(() => {\n window.location.reload();\n }, []);\n\n return (\n <div id=\"AppInactive\">\n <div className=\"content\">\n <img src={appInactivePath} alt=\"\" />\n <h3 className=\"title\">Such error, many tabs</h3>\n <div className=\"description\">\n Telegram supports only one active tab with the app.\n <br />\n Please reload this page to continue using this tab or close it.\n </div>\n <div className=\"actions\">\n <Button isText ripple onClick={handleReload}>\n Reload app\n </Button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default AppInactive;\n","// extracted by mini-css-extract-plugin\nexport default {\"root\":\"aKlI8dMOx5QqHb2eTwiM\",\"mask\":\"dDIGwEoHlINzvf7LzGwy\",\"left\":\"s_eiw3FJDNGVyMHHEr_w\",\"middle\":\"v5WSHYkqrlK9GvmSI1zN\",\"right\":\"BlQSOI0qSg9HDzgQGwdw\",\"blank\":\"J5QD898gcautir6pK9xA\"};","import React, { useEffect } from '../../lib/teact/teact';\nimport { getActions, getGlobal, withGlobal } from '../../global';\n\nimport { ApiMediaFormat } from '../../api/types';\nimport type { GlobalState } from '../../global/types';\nimport type { ThemeKey } from '../../types';\nimport type { FC } from '../../lib/teact/teact';\n\nimport { getChatAvatarHash } from '../../global/helpers/chats'; // Direct import for better module splitting\nimport { selectIsRightColumnShown, selectTheme, selectIsCurrentUserPremium } from '../../global/selectors';\nimport { DARK_THEME_BG_COLOR, LIGHT_THEME_BG_COLOR } from '../../config';\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 buildClassName from '../../util/buildClassName';\n\nimport styles from './UiLoader.module.scss';\n\nimport telegramLogoPath from '../../assets/telegram-logo.svg';\nimport reactionThumbsPath from '../../assets/reaction-thumbs.png';\nimport premiumReactionThumbsPath from '../../assets/reaction-thumbs-premium.png';\nimport lockPreviewPath from '../../assets/lock.png';\nimport monkeyPath from '../../assets/monkey.svg';\n\nexport type UiLoaderPage =\n 'main'\n | 'lock'\n | 'authCode'\n | 'authPassword'\n | 'authPhoneNumber'\n | 'authQrCode';\n\ntype OwnProps = {\n page?: UiLoaderPage;\n children: React.ReactNode;\n};\n\ntype StateProps = Pick<GlobalState, 'uiReadyState' | 'shouldSkipHistoryAnimations'> & {\n isRightColumnShown?: boolean;\n leftColumnWidth?: number;\n theme: ThemeKey;\n isCurrentUserPremium?: boolean;\n};\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.BlobUrl);\n }));\n}\n\nconst preloadTasks = {\n main: (isCurrentUserPremium: boolean) => Promise.all([\n loadModule(Bundles.Main, 'Main')\n .then(preloadFonts),\n preloadAvatars(),\n preloadImage(isCurrentUserPremium ? premiumReactionThumbsPath : reactionThumbsPath),\n ]),\n authPhoneNumber: () => Promise.all([\n preloadFonts(),\n preloadImage(telegramLogoPath),\n ]),\n authCode: () => preloadImage(monkeyPath),\n authPassword: () => preloadImage(monkeyPath),\n authQrCode: preloadFonts,\n lock: () => Promise.all([\n preloadFonts(),\n preloadImage(lockPreviewPath),\n ]),\n};\n\nconst UiLoader: FC<OwnProps & StateProps> = ({\n page,\n children,\n isRightColumnShown,\n shouldSkipHistoryAnimations,\n leftColumnWidth,\n theme,\n isCurrentUserPremium,\n}) => {\n const { setIsUiReady } = getActions();\n\n const [isReady, markReady] = useFlag();\n const {\n shouldRender: shouldRenderMask, transitionClassNames,\n } = useShowTransition(!isReady, undefined, true);\n\n useEffect(() => {\n let timeout: number | undefined;\n\n const safePreload = async () => {\n try {\n await preloadTasks[page!](isCurrentUserPremium!);\n } catch (err) {\n // Do nothing\n }\n };\n\n Promise.race([\n pause(MAX_PRELOAD_DELAY),\n page ? safePreload() : Promise.resolve(),\n ]).then(() => {\n markReady();\n setIsUiReady({ uiReadyState: 1 });\n\n timeout = window.setTimeout(() => {\n setIsUiReady({ uiReadyState: 2 });\n }, SECOND_STATE_DELAY);\n });\n\n return () => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n setIsUiReady({ uiReadyState: 0 });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <div\n id=\"UiLoader\"\n className={styles.root}\n style={`--theme-background-color: ${theme === 'dark' ? DARK_THEME_BG_COLOR : LIGHT_THEME_BG_COLOR}`}\n >\n {children}\n {shouldRenderMask && !shouldSkipHistoryAnimations && Boolean(page) && (\n <div className={buildClassName(styles.mask, transitionClassNames)}>\n {page === 'main' ? (\n <>\n <div\n className={styles.left}\n style={leftColumnWidth ? `width: ${leftColumnWidth}px` : undefined}\n />\n <div className={buildClassName(styles.middle, transitionClassNames)} />\n {isRightColumnShown && <div className={styles.right} />}\n </>\n ) : (\n <div className={styles.blank} />\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport default withGlobal<OwnProps>(\n (global): StateProps => {\n const theme = selectTheme(global);\n\n return {\n shouldSkipHistoryAnimations: global.shouldSkipHistoryAnimations,\n uiReadyState: global.uiReadyState,\n isRightColumnShown: selectIsRightColumnShown(global),\n leftColumnWidth: global.leftColumnWidth,\n theme,\n isCurrentUserPremium: selectIsCurrentUserPremium(global),\n };\n },\n)(UiLoader);\n","import type { FC } from './lib/teact/teact';\nimport React, { useEffect } from './lib/teact/teact';\nimport { getActions, withGlobal } from './global';\n\nimport type { GlobalState } from './global/types';\nimport type { UiLoaderPage } from './components/common/UiLoader';\n\nimport { INACTIVE_MARKER, PAGE_TITLE } from './config';\nimport { PLATFORM_ENV } from './util/environment';\nimport { updateSizes } from './util/windowSize';\nimport { addActiveTabChangeListener } from './util/activeTabMonitor';\nimport { hasStoredSession } from './util/sessions';\nimport buildClassName from './util/buildClassName';\nimport useFlag from './hooks/useFlag';\nimport usePrevious from './hooks/usePrevious';\n\nimport Auth from './components/auth/Auth';\nimport Main from './components/main/Main.async';\nimport LockScreen from './components/main/LockScreen.async';\nimport AppInactive from './components/main/AppInactive';\nimport Transition from './components/ui/Transition';\nimport UiLoader from './components/common/UiLoader';\n// import Test from './components/test/TestNoRedundancy';\n\ntype StateProps = {\n authState: GlobalState['authState'];\n isScreenLocked?: boolean;\n hasPasscode?: boolean;\n};\n\nenum AppScreens {\n auth,\n lock,\n main,\n inactive,\n}\n\nconst App: FC<StateProps> = ({\n authState,\n isScreenLocked,\n hasPasscode,\n}) => {\n const { disconnect } = getActions();\n\n const [isInactive, markInactive] = useFlag(false);\n const isMobile = PLATFORM_ENV === 'iOS' || PLATFORM_ENV === 'Android';\n\n useEffect(() => {\n updateSizes();\n addActiveTabChangeListener(() => {\n disconnect();\n document.title = `${PAGE_TITLE}${INACTIVE_MARKER}`;\n\n markInactive();\n });\n }, [disconnect, markInactive]);\n\n // Prevent drop on elements that do not accept it\n useEffect(() => {\n const body = document.body;\n const handleDrag = (e: DragEvent) => {\n e.preventDefault();\n if (!e.dataTransfer) return;\n if (!(e.target as HTMLElement).dataset.dropzone) {\n e.dataTransfer.dropEffect = 'none';\n } else {\n e.dataTransfer.dropEffect = 'copy';\n }\n };\n const handleDrop = (e: DragEvent) => {\n e.preventDefault();\n };\n body.addEventListener('drop', handleDrop);\n body.addEventListener('dragover', handleDrag);\n body.addEventListener('dragenter', handleDrag);\n\n return () => {\n body.removeEventListener('drop', handleDrop);\n body.removeEventListener('dragover', handleDrag);\n body.removeEventListener('dragenter', handleDrag);\n };\n }, []);\n\n // return <Test />;\n\n let activeKey: number;\n let page: UiLoaderPage | undefined;\n\n if (isInactive) {\n activeKey = AppScreens.inactive;\n } else if (isScreenLocked) {\n page = 'lock';\n activeKey = AppScreens.lock;\n } else if (authState) {\n switch (authState) {\n case 'authorizationStateWaitPhoneNumber':\n page = 'authPhoneNumber';\n activeKey = AppScreens.auth;\n break;\n case 'authorizationStateWaitCode':\n page = 'authCode';\n activeKey = AppScreens.auth;\n break;\n case 'authorizationStateWaitPassword':\n page = 'authPassword';\n activeKey = AppScreens.auth;\n break;\n case 'authorizationStateWaitRegistration':\n activeKey = AppScreens.auth;\n break;\n case 'authorizationStateWaitQrCode':\n page = 'authQrCode';\n activeKey = AppScreens.auth;\n break;\n case 'authorizationStateClosed':\n case 'authorizationStateClosing':\n case 'authorizationStateLoggingOut':\n case 'authorizationStateReady':\n page = 'main';\n activeKey = AppScreens.main;\n break;\n }\n } else if (hasStoredSession(true)) {\n page = 'main';\n activeKey = AppScreens.main;\n } else if (hasPasscode) {\n activeKey = AppScreens.lock;\n } else {\n page = isMobile ? 'authPhoneNumber' : 'authQrCode';\n activeKey = AppScreens.auth;\n }\n\n const prevActiveKey = usePrevious(activeKey);\n\n // eslint-disable-next-line consistent-return\n function renderContent(isActive: boolean) {\n switch (activeKey) {\n case AppScreens.auth:\n return <Auth isActive={isActive} />;\n case AppScreens.main:\n return <Main />;\n case AppScreens.lock:\n return <LockScreen isLocked={isScreenLocked} />;\n case AppScreens.inactive:\n return <AppInactive />;\n }\n }\n\n return (\n <UiLoader key=\"Loader\" page={page}>\n <Transition\n name=\"fade\"\n activeKey={activeKey}\n shouldCleanup\n className={buildClassName(\n 'full-height',\n (activeKey === AppScreens.auth || prevActiveKey === AppScreens.auth) && 'is-auth',\n )}\n >\n {renderContent}\n </Transition>\n </UiLoader>\n );\n};\n\nexport default withGlobal(\n (global): StateProps => {\n return {\n authState: global.authState,\n isScreenLocked: global.passcode?.isScreenLocked,\n hasPasscode: global.passcode?.hasPasscode,\n };\n },\n)(App);\n","import './util/handleError';\nimport './util/setupServiceWorker';\n\nimport React from './lib/teact/teact';\nimport TeactDOM from './lib/teact/teact-dom';\n\nimport { getActions, getGlobal } from './global';\nimport updateWebmanifest from './util/updateWebmanifest';\nimport { setupBeforeInstallPrompt } from './util/installPrompt';\nimport { IS_INSTALL_PROMPT_SUPPORTED } from './util/environment';\nimport './global/init';\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\nif (IS_INSTALL_PROMPT_SUPPORTED) {\n setupBeforeInstallPrompt();\n}\ngetActions().init();\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START INITIAL RENDER');\n}\n\nupdateWebmanifest();\n\nTeactDOM.render(\n <App />,\n document.getElementById('root')!,\n);\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH INITIAL RENDER');\n}\n\nif (DEBUG) {\n document.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.warn('GLOBAL STATE', getGlobal());\n });\n}\n","// Original idea was found here\n// https://medium.com/@alshakero/how-to-setup-your-web-app-manifest-dynamically-using-javascript-f7fbee899a61\n\nimport { DEBUG } from '../config';\nimport { IS_MAC_OS } from './environment';\n\nexport default function updateWebmanifest() {\n const manifest = document.getElementById('the-manifest-placeholder');\n if (!manifest) {\n return;\n }\n\n const url = `site${IS_MAC_OS ? '_apple' : ''}${DEBUG ? '_dev' : ''}.webmanifest`;\n manifest.setAttribute('href', url);\n}\n"],"names":["leafPrototypes","getProto","inProgress","dataWebpackPrefix","loadStylesheet","installedCssChunks","worker","requestStates","Map","requestStatesByCallback","initApi","onUpdate","initialArgs","DEBUG","console","log","Worker","URL","addEventListener","data","type","update","requestState","get","messageId","error","reject","resolve","response","callback","callbackArgs","Error","message","subscribeToWorker","platform","window","ensureWorkerPing","setTimeout","makeRequest","args","callApi","fnName","warn","promise","name","err","cancelApiProgress","progressCallback","isCanceled","postMessage","generateIdFor","payload","Promise","Object","assign","pop","set","catch","finally","delete","startedAt","Date","now","async","isResolved","race","pause","then","undefined","location","reload","ApiMediaFormat","ApiMessageEntityTypes","MAIN_THREAD_ID","MESSAGE_DELETED","DEFAULT_SIZE","loadedAnimationUrls","Set","memo","props","size","play","noLoop","className","noTransition","nonInteractive","onLoad","onClick","otherProps","tgsUrl","key","isAnimationLoaded","markAnimationLoaded","useFlag","has","transitionClassNames","useMediaTransition","handleLoad","useCallback","add","playKey","setPlayKey","useState","String","Math","random","handleClick","buildClassName","lottiePromise","RLottie","ensureLottie","default","ref","style","playSegment","speed","quality","isLowPriority","color","forceOnHeavyAnimation","onEnded","containerRef","useRef","animation","setAnimation","wasPlaying","isFrozen","isFirstRender","playRef","current","playSegmentRef","useEffect","exec","newAnimation","setSpeed","fastRaf","setColor","destroy","playAnimation","shouldRestart","pauseAnimation","freezeAnimation","isPlaying","unfreezeAnimation","unfreezeAnimationOnRaf","changeData","useHeavyAnimationCheck","useBackgroundMode","buildStyle","base","maxint","adapt","delta","numpoints","firsttime","k","floor","decode","input","preserveCase","output","case_flags","input_length","length","n","out","i","bias","basic","j","ic","oldi","w","digit","t","len","lastIndexOf","charCodeAt","RangeError","push","cp","splice","fromCharCode","toUpperCase","value","join","utf16","getDomain","url","href","ensureProtocol","decodedHref","decodeURI","replace","match","domain","domain_array","split","s","slice","convertPunycode","text","children","isRtl","openUrl","getActions","content","isSafe","e","preventDefault","shouldSkipModal","classNames","title","target","rel","dir","LOCAL_TGS_URLS","MonkeyIdle","MonkeyTracking","MonkeyClose","MonkeyPeek","FoldersAll","FoldersNew","DiscussionGroups","Lock","CameraFlip","HandFilled","HandOutline","Speaker","VoiceAllowTalk","VoiceMini","VoiceMuted","VoiceOutlined","Peach","Eggplant","Cumshot","JoinRequest","Invite","QrPlane","Congratulations","Experimental","getFileSizeString","bytes","ONE_GIGABYTE","toFixed","ONE_MEGABYTE","getDocumentExtension","document","fileName","mimeType","getFileExtension","indexOf","getColorFromExtension","extension","getDocumentHasPreview","Boolean","previewBlobUrl","thumbnail","RE_EMOJI_ONLY","RegExp","twemojiRegex","DETECT_UP_TO","emojiCount","sender","openChat","id","Link","focusMessage","handleMessageClick","chatId","groupCall","joinGroupCall","accessHash","MAX_LENGTH","NBSP","renderActionMessageText","lang","actionOriginUser","actionOriginChat","targetUsers","targetMessage","targetChatId","options","action","translationValues","amount","currency","call","score","noLinks","asPlainText","asTextWithSpoilers","translationKey","processed","unprocessed","includes","processPlaceholder","formatCurrency","code","renderUserContent","renderChatContent","toString","map","user","filter","renderMessageContent","renderProductContent","renderMigratedContent","trim","renderGroupCallContent","invoice","getMessageSummaryText","messageSummary","renderMessageSummary","trimText","getUserFullName","renderText","chat","getChatTitle","placeholder","replaceValue","placeholderPosition","substring","Array","isArray","forEach","index","renderMessageText","highlight","shouldRenderHqEmoji","isSimple","truncateLength","isProtected","entities","contentNotSupportedText","getMessageText","renderTextWithEntities","noEmoji","TRUNCATED_SUMMARY_LENGTH","hasSpoilers","some","emoji","getMessageSummaryEmoji","emojiWithSpace","description","getMessageSummaryDescription","RE_LETTER_OR_DIGIT","SIMPLE_MARKDOWN_REGEX","part","filters","params","compact","reduce","escapeHtml","EMOJI_REGEX","replaceEmojis","addLineBreaks","addHighlight","addLinks","replaceSimpleMarkdown","textParts","divEl","createElement","result","innerText","innerHTML","IS_EMOJI_SUPPORTED","parts","fixNonStandardEmoji","emojis","emojiResult","nativeToUnifiedExtendedWithCache","src","isLoaded","LOADED_EMOJIS","alt","handleEmojiLoad","splittenParts","line","source","trimmedLine","trimLeft","indentLength","repeat","lowerCaseText","toLowerCase","queryPosition","nextSymbol","newParts","RE_LINK","RE_LINK_TEMPLATE","RE_MENTION_TEMPLATE","links","nextLink","shift","lastIndex","startsWith","username","endsWith","entityResult","entity","areLinesWrapping","element","lines","lineHeight","getComputedStyle","lineHeightParsed","parseFloat","clientHeight","actionsByMessageId","createClassNameBuilder","contentRef","isRevealed","reveal","conceal","stopPropagation","actions","contentLength","readingMs","round","timeoutMs","max","min","noCopy","onWordWrapToggle","showNotification","windowSize","useWindowSize","useLang","isWordWrap","setIsWordWrap","withWordWrapButton","setWithWordWrapButton","checkWordWrap","isWrap","parentElement","handleCopy","copyTextToClipboard","handleWordWrapClick","contentClass","overlayClass","wrapClass","setWordWrap","handleWordWrapToggle","wrap","blockClass","language","highlighted","useAsync","lib","shouldRenderAsHtml","renderMessagePart","deleteLineBreakAfterPre","organizedEntities","organizedEntityIndexes","organizedEntity","organizeEntity","organizedIndexes","organizedIndex","organizeEntities","renderEntity","textPartStart","textPartEnd","isLastEntity","renderResult","nestedEntities","offset","textBefore","textBeforeLength","substr","entityStartIndex","entityEndIndex","entityContent","nestedEntityContent","nestedIndex","nestedEntity","nestedEntityIndex","nestedResult","nestedEntityEndIndex","newEntity","rawEntityText","trimEnd","renderedContent","userId","getLinkUrl","processEntityAsHtml","entityText","renderNestedMessagePart","handleBotCommandClick","handleHashtagClick","handleCodeClick","role","tabIndex","MentionLink","SafeLink","processEntity","textAfter","arrayIndex","getTextWithEntitiesAsHtml","formattedText","c","concat","parsedEntity","isChanged","sendBotCommand","command","currentTarget","setLocalTextSearchQuery","query","searchTextMessagesLocal","getTranslation","preventMessageInputBlur","withBubbling","IS_IOS","activeElement","EDITABLE_INPUT_ID","preventMessageInputBlurWithBubbling","withGlobal","global","userOrChat","selectUser","openChatByUsername","onContextMenu","onMouseDown","onMouseEnter","onMouseLeave","onFocus","backgroundImage","pill","fluid","isText","isLoading","isShiny","ariaLabel","ariaControls","hasPopup","download","disabled","ripple","faded","noPreventDefault","shouldStopPropagation","elementRef","isClicked","setIsClicked","fullClassName","handleMouseDown","label","subLabel","checked","blocking","onChange","onCheck","handleChange","event","labelClassName","trigger","positionX","positionY","footer","forceOpen","onOpen","onClose","menuRef","dropdownRef","isOpen","setIsOpen","handleClose","onKeyDown","menu","keyCode","focusedElement","elementChildren","from","focus","onTrigger","autoClose","shouldSkipTransition","success","readOnly","autoComplete","inputMode","maxLength","teactExperimentControlled","onInput","onKeyPress","onBlur","onPaste","labelText","htmlFor","backgroundColor","bubbleStyle","ariaLabelledBy","transformOriginX","transformOriginY","noCloseOnBackdrop","noCompact","onCloseAnimationEnd","backdropContainerRef","useShowTransition","captureEscKeyListener","useHistoryBack","isActive","onBack","shouldBeReplaced","useEffectWithPrevDeps","prevIsOpen","dispatchHeavyAnimationEvent","handleKeyDown","useKeyboardListNavigation","useVirtualBackdrop","bubbleClassName","transformOriginYStyle","transformOriginXStyle","IS_COMPACT_MENU","IS_BACKDROP_BLUR_SUPPORTED","icon","customIcon","destructive","origin","IS_TEST","ripples","setRipples","cleanUpDebounced","useMemo","debounce","button","container","position","getBoundingClientRect","rippleSize","offsetWidth","x","clientX","y","clientY","requestAnimationFrame","activeKey","direction","renderCount","shouldRestoreHeight","shouldCleanup","cleanupExceptionKey","onStart","onStop","animationLevel","getGlobal","settings","byKey","currentKeyRef","rendersRef","prevActiveKey","usePrevious","forceUpdate","useForceUpdate","activeKeyChanged","useLayoutEffect","cleanup","preservedRender","childElements","transition","transform","classList","childNodes","isBackwards","keys","Number","prevActiveIndex","activeIndex","toSlide","fromSlide","ANIMATION_LEVEL_MIN","remove","dispatchHeavyAnimationStop","forceReflow","waitForTransitionEnd","height","performSlideOptimized","toggle","node","HTMLElement","onAnimationEnd","querySelector","watchedNode","firstChild","waitForAnimationEnd","flexBasis","renders","contents","fill","render","teactOrderKey","teactFastList","APP_NAME","APP_VERSION","process","PRODUCTION_HOSTNAME","DEBUG_MORE","IS_MOCKED_CLIENT","IS_BETA","BETA_CHANGELOG_URL","DEBUG_ALERT_MSG","PAGE_TITLE","INACTIVE_MARKER","DEBUG_PAYMENT_SMART_GLOCAL","SESSION_USER_KEY","LEGACY_SESSION_KEY","PASSCODE_CACHE_NAME","GLOBAL_STATE_CACHE_DISABLED","GLOBAL_STATE_CACHE_KEY","GLOBAL_STATE_CACHE_USER_LIST_LIMIT","GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT","GLOBAL_STATE_CACHE_CHATS_WITH_MESSAGES_LIMIT","MEDIA_CACHE_DISABLED","MEDIA_CACHE_NAME","MEDIA_CACHE_NAME_AVATARS","MEDIA_PROGRESSIVE_CACHE_NAME","CUSTOM_BG_CACHE_NAME","LANG_CACHE_NAME","AUTODOWNLOAD_FILESIZE_MB_LIMITS","isBigScreen","innerHeight","MIN_PASSWORD_LENGTH","MESSAGE_LIST_SLICE","MESSAGE_LIST_VIEWPORT_LIMIT","CHAT_HEIGHT_PX","CHAT_LIST_SLICE","CHAT_LIST_LOAD_SLICE","SHARED_MEDIA_SLICE","MESSAGE_SEARCH_SLICE","GLOBAL_SEARCH_SLICE","MEMBERS_SLICE","MEMBERS_LOAD_SLICE","PROFILE_SENSITIVE_AREA","TOP_CHAT_MESSAGES_PRELOAD_LIMIT","DEFAULT_VOLUME","DEFAULT_PLAYBACK_RATE","PLAYBACK_RATE_FOR_AUDIO_MIN_DURATION","ANIMATION_LEVEL_MAX","ANIMATION_LEVEL_DEFAULT","DEFAULT_MESSAGE_TEXT_SIZE_PX","IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX","MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX","DRAFT_DEBOUNCE","SEND_MESSAGE_ACTION_INTERVAL","EDITABLE_INPUT_MODAL_ID","EDITABLE_INPUT_CSS_SELECTOR","CUSTOM_APPENDIX_ATTRIBUTE","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","MAX_SCREEN_WIDTH_FOR_EXPAND_PINNED_MESSAGES","MOBILE_SCREEN_MAX_WIDTH","MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH","MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT","LOCAL_MESSAGE_MIN_ID","TMP_CHAT_ID","ANIMATION_END_DELAY","FAST_SMOOTH_MAX_DISTANCE","FAST_SMOOTH_MIN_DURATION","FAST_SMOOTH_MAX_DURATION","FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE","LOCK_SCREEN_ANIMATION_DURATION_MS","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_PASSCODE","STICKER_SIZE_DISCUSSION_GROUPS","STICKER_SIZE_FOLDER_SETTINGS","STICKER_SIZE_INLINE_BOT_RESULT","STICKER_SIZE_JOIN_REQUESTS","STICKER_SIZE_INVITES","NO_STICKER_SET_ID","RECENT_SYMBOL_SET_ID","FAVORITE_SYMBOL_SET_ID","CHAT_STICKER_SET_ID","PREMIUM_STICKER_SET_ID","BASE_EMOJI_KEYWORD_LANG","MENU_TRANSITION_DURATION","SLIDE_TRANSITION_DURATION","VIDEO_MOV_TYPE","SUPPORTED_IMAGE_CONTENT_TYPES","SUPPORTED_VIDEO_CONTENT_TYPES","SUPPORTED_AUDIO_CONTENT_TYPES","CONTENT_TYPES_WITH_PREVIEW","CONTENT_NOT_SUPPORTED","RE_TG_LINK","RE_TME_LINK","RE_TELEGRAM_LINK","TME_LINK_PREFIX","COUNTRIES_WITH_12H_TIME_FORMAT","SERVICE_NOTIFICATIONS_USER_ID","REPLIES_USER_ID","ALL_FOLDER_ID","ARCHIVED_FOLDER_ID","MAX_MEDIA_FILES_FOR_ALBUM","MAX_ACTIVE_PINNED_CHATS","SCHEDULED_WHEN_ONLINE","DEFAULT_LANG_CODE","DEFAULT_LANG_PACK","LANG_PACKS","FEEDBACK_URL","LIGHT_THEME_BG_COLOR","DARK_THEME_BG_COLOR","DEFAULT_PATTERN_COLOR","DARK_THEME_PATTERN_COLOR","MAX_UPLOAD_FILEPART_SIZE","GROUP_CALL_VOLUME_MULTIPLIER","GROUP_CALL_DEFAULT_VOLUME","ENABLE_THUMBNAIL_VIDEO","DEFAULT_LIMITS","uploadMaxFileparts","stickersFaved","savedGifs","dialogFiltersChats","dialogFilters","dialogFolderPinned","captionLength","channels","channelsPublic","aboutLength","addActionHandler","importLegacySession","clearLegacySessions","apiUpdate","userAgent","navigator","PLATFORM_ENV","sessionData","loadStoredSession","isTest","search","isMovSupported","IS_MOV_SUPPORTED","isWebmSupported","IS_WEBM_SUPPORTED","maxBufferSize","MAX_BUFFER_SIZE","phoneNumber","authIsLoading","authError","password","file","firstName","lastName","authIsLoadingQrCode","passcode","isScreenLocked","storeSession","currentUserId","clearStoredSession","_global","hangUp","leaveGroupCall","unsubscribe","forceWebsync","reset","forceInitApi","clearEncryptedSession","cacheApi","langCachePrefix","langCacheVersion","updateAppBadge","init","connectionState","authNearestCountry","setGlobal","deviceToken","subscribedAt","sessionJson","JSON","stringify","globalJson","serializeGlobal","encryptSession","forgetPasscode","updatePasscodeSettings","invalidAttemptsCount","clearGlobalForLockScreen","buildInputPrivacyRules","visibility","allowedIds","deniedIds","users","byId","usersById","chats","chatsById","rules","collectUsers","isUserId","collectChats","allowedUsers","allowedChats","blockedUsers","blockedChats","photo","bio","about","profileEdit","progress","ProfileEditProgress","currentUser","updateUser","fullInfo","isUsernameAvailable","loadedWallpapers","wallpapers","createObjectURL","slug","UPLOADING_WALLPAPER_SLUG","wallpaper","firstWallpaper","withLocalMedia","addUsers","buildCollectionByKey","updateChats","blocked","ids","blockedIds","totalCount","contactId","addBlockedContact","removeBlockedContact","serverTimeOffset","addNotifyExceptions","replaceSettings","peerType","isSilent","shouldShowPreviews","updateNotifySettings","hasPushNotifications","hasWebNotifications","subscribe","hasContactJoinedNotifications","languages","phoneNumberSettings","lastSeenSettings","profilePhotoSettings","forwardsSettings","chatInviteSettings","phoneCallSettings","phoneP2PSettings","all","privacy","lastSeen","profilePhoto","forwards","chatInvite","phoneCall","phoneP2P","privacyKey","allowUserIds","allowChatIds","blockUserIds","blockChatIds","isAllowList","contactsIds","isSensitiveEnabled","langCode","countryList","timeFormat","setSettingOption","setTimeFormat","wasTimeFormatSetManually","nearestCountryCode","appConfig","globalSettings","shouldArchiveAndMuteNewNonContact","selectNotifySettings","setLanguage","onUpdateApiReady","wasAuthReady","authState","authorizationState","isLoggingOut","authIsCodeViaApp","isCodeViaApp","authHint","hint","authQrCode","qrCode","onUpdateAuthorizationState","onUpdateAuthorizationError","isOnAuth","signOut","onUpdateConnectionState","authRememberMe","isEmpty","mainDcId","saveSession","onUpdateSession","onUpdateServerTimeOffset","sessionUserAuth","localStorage","getItem","userAuth","parse","setItem","updateSessionUserId","onUpdateCurrentUser","paymentShippingError","getShippingError","addPaymentError","shouldClosePaymentModal","closePaymentModal","showDialog","handleSystemThemeChange","currentThemeMatch","documentElement","currentTheme","nextTheme","selectTheme","switchTheme","mql","matchMedia","addListener","subscribeToSystemThemeChange","messageTextSize","theme","setProperty","setAttribute","body","IS_TOUCH_ENV","startWebsync","IS_ANDROID","IS_MAC_OS","IS_SAFARI","canInstall","uiReadyState","authPhoneNumber","shouldSkipHistoryAnimations","forceSyncOnIOs","replaceThemeSettings","nextScreen","updateCacheThrottled","throttle","onIdle","updateCache","unsubscribeFromBeforeUnload","isCaching","initCache","setupCaching","removeItem","clearCaching","loadCache","initialState","cache","time","json","cached","timeEnd","migrateCache","newState","parsedMessageList","IS_SINGLE_COLUMN_LAYOUT","parseLocationHash","messages","messageLists","readCache","hasPasscode","hasStoredSession","onBeforeUnload","addCallback","removeCallback","removeEventListener","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","shouldAutoPlayVideos","shouldAutoPlayGifs","rest","canAutoLoadPhotoFromContacts","canAutoLoadVideoFromContacts","canAutoLoadPhotoInPrivateChats","canAutoLoadVideoInPrivateChats","canAutoLoadPhotoInGroups","canAutoLoadVideoInGroups","canAutoLoadPhotoInChannels","canAutoLoadVideoInChannels","canAutoPlayVideos","canAutoPlayGifs","themes","chatFolders","stickers","greeting","premium","activeDownloads","byChatId","serviceNotifications","audioPlayer","volume","playbackRate","mediaViewer","groupCalls","statusesById","sponsoredByChatId","activeReactions","pollModal","attachMenu","bots","trustedBotIds","activeSessions","byHash","orderedHashes","activeWebSessions","transcriptions","limits","isHeavyAnimating","forceUpdateCache","noEncrypt","serializedGlobal","serializedGlobalClean","reducedGlobal","INITIAL_STATE","pick","isMuted","isChatInfoShown","reduceShowChatInfo","reduceUsers","reduceChats","reduceMessages","globalSearch","recentlyFoundChatIds","reduceSettings","reduceChatFolders","reduceGroupCalls","availableReactions","reduceAvailableReactions","isCallPanelVisible","innerWidth","currentChatId","selectCurrentMessageList","visibleUserIds","selectVisibleUsers","idsToSave","unique","topPeers","userIds","getOrderedIds","contactList","currentChat","selectCurrentChat","isFullyLoaded","threadId","mainThread","threadsById","viewportIds","notifyExceptions","activeChatFolder","activeGroupCallId","r","FOREVER_BANNED_DATE","VERIFIED_PRIORITY_BASE","PINNED_PRIORITY_BASE","entityId","isChatGroup","isChatBasicGroup","isChatSuperGroup","isChatChannel","isCommonBoxChat","isChatWithRepliesBot","getChatTypeString","getPrivateChatUserId","isSelf","getChatDescription","getChatLink","inviteLink","getChatAvatarHash","owner","avatarHash","isVideo","getVideoAvatarMediaHash","isChatSummaryOnly","lastMessage","isChatAdmin","adminRights","getHasAdminRight","isUserRightBanned","currentUserBannedRights","defaultBannedRights","getCanPostInChat","isRestricted","isForbidden","migratedTo","isNotJoined","isCreator","getAllowedAttachmentOptions","isChatWithBot","canAttachMedia","canAttachPolls","canSendStickers","canSendGifs","canAttachEmbedLinks","isAdmin","getMessageSendingRestrictionReason","sendMessages","untilDate","formatDateToString","formatTime","getChatSlowModeOptions","slowMode","isChatArchived","folderId","selectIsChatMuted","notifySettings","hasPrivateChatsNotifications","hasBroadcastNotifications","hasGroupNotifications","selectShouldShowMessagePreview","hasPrivateChatsMessagePreview","hasBroadcastMessagePreview","hasGroupMessagePreview","getCanDeleteChat","getFolderDescriptionText","folder","chatsCount","emoticon","pinnedChatIds","excludedChatIds","includedChatIds","excludeArchived","excludeMuted","excludeRead","values","groups","contacts","nonContacts","getMessageSenderName","getUserFirstOrLastName","sortChatIds","chatIds","shouldPrioritizeVerified","priorityIds","orderBy","priority","date","isVerified","filterChatsByName","searchWords","prepareSearchWordsForNeedle","getMessageHtmlId","getMessageKey","previousLocalId","msgId","buildMessageKey","isServiceNotificationMessage","parseMessageKey","getMessageOriginalId","sticker","video","audio","voice","poll","webPage","contact","game","getMessageCustomShape","isRound","parseEmojiOnlyString","getMessageSingleEmoji","getFirstLinkInMessage","link","find","isOwnMessage","isOutgoing","isReplyMessage","replyToMessageId","isForwardedMessage","forwardInfo","isActionMessage","isAnonymousOwnMessage","senderId","getSenderTitle","getSendingState","sendingState","isMessageLocal","isHistoryClearMessage","getMessageContentFilename","isLottie","isWebpSupported","baseFilename","IS_OPUS_SUPPORTED","areReactionsEmpty","reactions","results","l","count","isGeoLiveExpired","timestamp","period","getMessageSingleInlineButton","inlineButtons","getMessageRecentReaction","recentReactions","checkIfHasUnreadReactions","isUnread","SPOILER_CHARS","noReactions","isExtended","getMessageTextWithSpoilers","transcription","transcriptionId","getMessageTranscription","textWithoutTranscription","accText","spoiler","generateBrailleSpoiler","groupedId","reaction","truncatedText","summary","isGif","getMessageAudioCaption","question","performer","getMessageContent","hasMessageMedia","getMessagePhoto","getMessageVideo","getMessageDocument","getMessageSticker","getMessageContact","getMessagePoll","getMessageAction","getMessageAudio","getMessageVoice","getMessageRoundVideo","isMessageDocumentPhoto","mediaType","isMessageDocumentVideo","getMessageInvoice","getMessageLocation","getMessageWebPage","getMessageWebPagePhoto","getMessageWebPageVideo","getMessageMediaThumbDataUri","media","getMessageMediaThumbnail","dataUri","getDocumentMediaHash","buildStaticMapHash","geo","width","zoom","scale","long","lat","accuracyRadius","getMessageMediaHash","webPagePhoto","webPageVideo","messageVideo","messagePhoto","mediaId","hasMessageLocalBlobUrl","getVideoOrAudioBaseHash","getAudioHasCover","getWebDocumentHash","webDocument","getGamePreviewPhotoHash","getGamePreviewVideoHash","IS_PROGRESSIVE_SUPPORTED","thumbnailSizes","getMessageMediaFormat","fullVideo","IS_OPFS_SUPPORTED","getMessageFileName","getMessageFileSize","blobUrl","getChatMediaMessageIds","listedIds","isFromSharedMedia","getMessageContentIds","getPhotoFullDimensions","sizes","getPhotoInlineDimensions","getVideoDimensions","getMediaTransferState","isLoadNeeded","isUploading","isTransferring","transferProgress","messageIds","contentType","validator","matchLinkInMessageText","getMediaDuration","duration","buildChatThreadKey","STRIPE_ERRORS","missing_payment_information","field","invalid_number","number","exp_year","exp_month","invalid_expiry_year","invalid_expiry_month","cvc","invalid_cvc","getStripeError","param","getBotCoverMediaHash","USER_COLOR_KEYS","isDeletedUser","formatPhoneNumber","getUserStatus","userStatus","wasOnline","getTime","wasOnlineDate","diff","today","setHours","yesterday","setDate","getDate","formatFullDate","isUserOnline","noStatus","isUserBot","getCanAddContact","isContact","sortUserIds","userStatusesById","getServerTime","expires","filterUsersByName","savedMessagesLang","getUserIdDividend","abs","getUserColorKey","peer","typed","typify","isLeftColumnShown","newChatMembersProgress","NewChatMembersProgress","phoneCodes","general","listIds","orderedPinnedIds","scheduledMessages","fileUploads","byMessageLocalId","recentEmojis","setsById","added","recent","favorite","featured","setIds","forEmoji","emojiKeywords","gifs","saved","inlineBots","byUsername","userSearch","localTextSearch","byChatThreadKey","localMediaSearch","management","topInlineBots","forwardMessages","pollResults","payment","notifications","dialogs","shouldUseSystemTheme","messageSendKeyCombo","canAutoLoadFileFromContacts","canAutoLoadFileInPrivateChats","canAutoLoadFileInGroups","canAutoLoadFileInChannels","autoLoadFileMaxSizeMb","notificationSoundVolume","shouldSuggestStickers","shouldLoopStickers","isConnectionStatusMinimized","light","isBlurred","patternColor","dark","twoFaSettings","shouldShowContextMenuHint","statistics","replaceChatListIds","newIds","updateChatListIds","idsUpdate","replaceChats","newById","updateChat","chatUpdate","noOmitUnreadReactionCount","updatedChat","getUpdatedChat","updatedById","acc","addChats","isUpdated","addedById","isMin","shouldOmitMinInfo","omit","photos","updateChatListType","listType","currentListIds","listTypeKey","currentFolderList","updateChatListSecondaryInfo","info","totalCountKey","totalChatCount","leaveChat","leftChatId","selectChatListType","listId","addChatMembers","membersToAdd","currentMembers","members","newMemberIds","m","updatedMembers","currentIds","updatedIds","areSortedArraysEqual","updateStickerSets","category","hash","sets","resultIds","updatedSets","stickerSet","existing","updateStickerSet","stickerSetId","currentStickerSet","addedSets","installedDate","updateGifSearch","isNew","nextOffset","currentResults","newResults","gif","replaceAnimatedEmojis","animatedEmojis","updateStickersForEmoji","remoteStickers","allStickers","selectStickersForEmoji","uniqueIds","rebuildStickersForEmoji","replaceUsers","updateContactList","updatedUsers","contactUserIds","newContactUserIds","userUpdate","updatedUser","getUpdatedUser","updateUsers","deleteContact","MEMO_EMPTY_ARRAY","updateUserSearch","searchStatePartial","updateUserSearchFetchingStatus","fetchingStatus","updateUserBlockedState","isBlocked","replaceUserStatuses","addUserStatuses","newKeys","closeNewContactDialog","newContact","getComplexKey","updateGlobalSearch","updateGlobalSearchContent","currentContent","updateGlobalSearchResults","newFoundMessages","nextRate","resultsByType","newFoundMessagesById","foundIdsForType","foundIds","every","newId","updateGlobalSearchFetchingStatus","prevFoundIds","newFoundIds","prototype","foundOrPrevFoundIds","nextOffsetId","replaceLocalTextSearch","chatThreadKey","searchParams","updateLocalTextSearch","replaceLocalTextSearchResults","updateLocalTextSearchResults","orderFoundIds","replaceLocalMediaSearch","updateLocalMediaSearchType","currentType","updateLocalMediaSearchResults","replaceLocalMediaSearchResults","sort","a","b","updateManagementProgress","updateManagement","newSettings","notifyException","exceptionData","addNotifyException","updateTwoFaSettings","clearPasscodeSettings","updateShippingOptions","shippingOptions","setRequestInfoId","requestId","setPaymentStep","step","setInvoiceInfo","isRecurring","recurringTermsUrl","invoiceContent","setStripeCardInfo","cardInfo","stripeCredentials","setSmartGlocalCardInfo","smartGlocalCredentials","setPaymentForm","form","setConfirmPaymentUrl","confirmPaymentUrl","setReceipt","receipt","messageInvoice","clearPayment","closeInvoice","isPaymentModalOpen","updateStatistics","updateMessageStatistics","currentMessage","updateStatisticsGraph","updateCurrentMessageList","shouldReplaceHistory","newMessageLists","last","replaceChatMessages","updateMessageStore","updateThread","threadUpdate","replaceThreadParam","paramName","newValue","addMessages","addedByChatId","messagesByChatId","addChatMessagesById","selectChatMessages","updateChatMessage","messageUpdate","updatedMessage","updateScheduledMessage","selectScheduledMessages","replaceScheduledMessages","deleteChatMessages","deletedForwardedPosts","pickTruthy","isLinkedChannelPost","threadInfo","selectThreadInfo","selectListedIds","outlyingIds","selectOutlyingIds","selectViewportIds","pinnedIds","selectPinnedIds","newMessageCount","messagesCount","currentMessageList","canDeleteCurrentThread","currentThreadId","fromChatId","fromMessageId","originalPost","selectChatMessage","deleteChatScheduledMessages","scheduledIds","selectScheduledIds","updateListedIds","orderHistoryIds","updateOutlyingIds","addViewportId","safeReplaceViewportIds","newViewportIds","updateThreadInfo","newThreadInfo","updateThreadInfos","updates","updateScheduledMessages","updateFocusedMessage","noHighlight","isResizingContainer","focusedMessage","updateSponsoredMessage","updateFocusDirection","enterMessageSelectMode","selectedMessages","toggleMessageSelection","messageListType","childMessageIds","withShift","oldSelectedMessages","selectMessageIdsByGroupId","selectedMessageIds","newMessageIds","newSelectedMessageIds","selectCurrentMessageIds","prevIndex","currentIndex","to","exitMessageSelectMode","updateThreadUnreadFromForwardedMessage","originMessage","lastMessageId","isDeleting","channelPostId","threadInfoOld","selectChat","selectChatUser","selectIsChatWithSelf","selectIsChatWithBot","selectSupportChat","isSupport","selectChatOnlineCount","onlineCount","selectChatBot","selectIsTrustedBot","botId","bot","selectAttachMenuPeerType","selectBot","selectIsChatBotNotStarted","messageInfo","selectAreActiveChatsLoaded","active","selectIsChatListed","targetList","list","selectChatFolder","selectIsChatPinned","archived","chatFoldersById","selectChatByUsername","usernameLowered","selectIsServiceChatReady","selectSendAs","sendAsId","selectRequestedText","openChatWithText","selectCurrentStickerSearch","selectCurrentGifSearch","selectStickerSet","selectStickerSetByShortName","shortName","stickerSets","stickersForEmoji","packs","cleanEmoji","selectAnimatedEmoji","cleanedEmoji","selectAnimatedEmojiEffect","animatedEmojiEffects","selectAnimatedEmojiSound","emojiSounds","selectLocalAnimatedEmoji","selectLocalAnimatedEmojiEffect","selectLocalAnimatedEmojiEffectByName","selectThreadParam","thread","selectScrollOffset","selectReplyingToId","selectEditingId","selectEditingDraft","selectEditingScheduledId","selectEditingScheduledDraft","selectDraft","selectNoWebPage","selectFirstMessageId","selectReplyStack","selectThreadOriginChat","originChannelId","selectThreadTopMessageId","topMessageId","selectThreadByMessage","replyToTopMessageId","selectIsMessageInCurrentMessageList","selectIsViewportNewest","chatMessages","selectScheduledMessage","selectEditingMessage","selectChatMessageByPollId","pollId","messageWithPoll","selectFocusedMessageId","focusedChatId","selectIsMessageFocused","focusedId","selectIsMessageUnread","lastReadOutboxMessageId","selectOutgoingStatus","isScheduledList","selectSender","selectReplySender","isForwarded","senderUserId","hiddenUserName","selectForwardedSender","isChannelPost","selectAllowedMessageActions","isPrivate","isChatWithSelf","isBasicGroup","isSuperGroup","isChannel","isLocal","isServiceNotification","isOwn","isAction","isMessageEditable","viaBotId","canReply","hasPinPermission","canPin","canUnpin","pinnedMessageIds","canDelete","canReport","canDeleteForAll","canEdit","canForward","hasSticker","hasFavoriteSticker","selectIsStickerFavorite","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","canDownload","canSaveGif","canRevote","closed","quiz","isChosen","canClosePoll","noOptions","ability","selectCanDeleteSelectedMessages","messageActions","selectCanReportSelectedMessages","selectCanDownloadSelectedMessages","selectIsDownloading","activeInChat","selectActiveDownloadIds","selectUploadProgress","selectRealLastReadId","lastReadInboxMessageId","Infinity","selectFirstUnreadId","lastReadId","lastReadServiceNotificationId","notification","findAfterLastReadId","isFromScheduled","found","selectIsForwardModalOpen","switchBotInline","isModalShown","selectCommonBoxChatId","fromLastMessage","selectIsInSelectMode","selectIsMessageSelected","selectForwardedMessageIdsByGroupId","selectIsDocumentGroupSelected","selectedIds","groupIds","selectSelectedMessagesCount","selectNewestMessageWithBotKeyboardButtons","findLast","keyboardButtons","replyHideMessageId","shouldHideKeyboardButtons","selectCanAutoLoadMedia","isPhoto","isFile","canAutoLoadMedia","canAutoLoadMediaFromContacts","canAutoLoadMediaInPrivateChats","canAutoLoadMediaInGroups","canAutoLoadMediaInChannels","isMediaFromContact","selectIsUserOrChatContact","selectCanAutoPlayMedia","asGif","selectShouldLoopStickers","selectLastServiceNotification","maxId","isHidden","selectIsMessageProtected","selectHasProtectedMessage","selectSponsoredMessage","expiresAt","selectDefaultReaction","defaultReaction","isInactive","enabledReactions","selectShouldSchedule","selectCanScheduleUntilOnline","chatBot","selectUserStatus","selectCurrentTextSearch","currentSearch","selectCurrentMediaSearch","selectStatistics","selectManagement","selectCurrentManagementType","selectIsMediaViewerOpen","avatarOwnerId","selectRightColumnContentKey","selectIsPollResultsOpen","RightColumnContent","currentManagement","selectCurrentManagement","isStatisticsShown","currentMessageId","selectIsMessageStatisticsShown","canViewStatistics","selectIsStatisticsShown","selectIsRightColumnShown","getSystemTheme","selectCurrentGlobalSearchQuery","selectPaymentInputInvoice","inputInvoice","selectPaymentFormId","formId","selectPaymentRequestId","selectProviderPublishableKey","nativeParams","publishableKey","selectProviderPublicToken","publicToken","selectStripeCredentials","selectSmartGlocalCredentials","selectNotifyExceptions","selectIsUserBlocked","selectIsCurrentUserPremium","isPremium","selectIsPremiumPurchaseBlocked","isPremiumPurchaseBlocked","selectUserByPhoneNumber","phoneNumberCleaned","fn","deps","defaultValue","setIsLoading","setError","setResult","wasCancelled","res","hasFocus","useCurrentOrPrev","shouldSkipUndefined","shouldForceCurrent","prev","useDebouncedCallback","ms","noFirst","noLast","fnMemo","cb","dependencies","debugKey","prevDeps","initial","setValue","setTrue","setFalse","setTrigger","ANIMATION_START_EVENT","ANIMATION_END_EVENT","timeout","isAnimating","onEnd","clearTimeout","dispatchEvent","Event","handleAnimationStart","handleAnimationEnd","isDisabled","LOCATION_HASH","PATH_BASE","pathname","historyUniqueSessionId","historyState","historyCursor","isAlteringHistory","deferredHistoryOperations","deferredPopstateOperations","isSafariGestureAnimation","handleTouchEnd","applyDeferredHistoryOperations","goOperations","op","stateOperations","goCount","history","go","processStateOperations","deferHistoryOperation","historyOperation","resetHistory","back","replaceState","cleanupClosed","alreadyClosedCount","countClosed","isClosed","cleanupTrashedState","disableHistoryAnimations","indexRef","wasReplaced","processBack","useOnChange","shouldReplace","previousRecord","markReplaced","pushState","TEST_getHistoryState","TEST_getHistoryCursor","touches","pageX","state","previousUniqueSessionId","onSelectWithEnter","itemSelector","noCaptureFocus","focusedIndex","setFocusedIndex","querySelectorAll","newIndex","item","langProvider","mediaData","isMediaReady","bundleName","moduleName","noLoad","autoUpdate","module","getModuleFromMemory","addLoadListener","loadModule","d","next","onCloseTransitionEnd","noOpenTransition","noCloseTransition","setIsClosed","closeTimeoutRef","hasOpenClassName","setHasOpenClassName","shouldHaveOpenClassName","isClosing","shouldRender","hasShownClass","hasOpenClass","handleEvent","contains","setSize","isResizing","setIsResizing","setIsResizingDebounced","throttledSetIsResizing","throttledSetSize","handleResize","NON_BUBBLEABLE_EVENTS","documentEventCounters","delegationRegistryByEventType","delegatedEventTypesByElement","resolveEventType","propName","eventType","tagName","canUseEventDelegation","realEventType","asCapture","addDelegatedListener","handler","resolveDelegationRegistry","newSet","resolveDelegatedEventTypes","removeDelegatedListener","realEvent","events","furtherCallsPrevented","Proxy","p","Reflect","parentNode","documentListenersCount","delegatedHandlersCount1","counter","delegationRegistriesCount","delegatedHandlersCount2","delegationRegistry","delegationElementsCount","delegatedEventTypesCount","eventTypes","FILTERED_ATTRIBUTES","HTML_ATTRIBUTES","CONTROLLABLE_TAGS","MAPPED_ATTRIBUTES","autoPlay","headsByElement","renderWithVirtual","parentEl","$current","$new","$parent","skipComponentUpdate","fragment","nextSibling","isCurrentComponent","isComponentElement","isNewComponent","$newAsReal","hasElementChanged","updateComponent","componentInstance","isMounted","setupComponentUpdateListener","newTarget","mountComponentChildren","initComponent","createNode","insertBefore","remount","getNextSibling","renderChildren","$currentAsReal","isTagElement","$newAsTag","updateAttributes","$element","mountComponent","$firstChild","renderComponent","$child","isEmptyElement","createTextNode","isTextElement","tag","processControlled","entries","defaultChecked","processUncontrolledOnMount","componentNextSibling","unmountComponent","unmountComponentChildren","replaceChild","removeChild","unmountRealTree","removeAllDelegatedListeners","isParentElement","appendChild","currentEl","child","DEBUG_checkKeyUniqueness","$newChild","currentRemainingIndex","remainingByKey","$currentChild","isKeyPresent","newChildKey","orderKey","fragmentElements","fragmentIndex","newChildren","currentPreservedIndex","currentChildInfo","renderFragment","newOrderKey","shouldMoveNode","isMovingDown","renderFastListChildren","currentChildrenLength","newChildrenLength","createDocumentFragment","lastCurrentChild","fragmentNextSibling","elements","isValueControlled","isCheckedControlled","currentEntries","newEntries","currentValue","cssText","removeAttribute","__html","headId","getAttribute","$head","$newElement","VirtualElementTypesEnum","Fragment","Symbol","DEBUG_SILENT_RENDERS_FOR","renderingInstance","Empty","Text","Tag","Component","flat","createComponentInstance","buildTagElement","parsedChildren","hooks","cursor","byCursor","effects","memos","refs","buildComponentElement","builtChildren","dropEmptyTail","buildChildElement","buildEmptyElement","isEmptyPlaceholder","DEBUG_components","newRenderedValue","DEBUG_startAt","componentName","renderTimes","performance","handleError","renderedValue","$old","effect","hook","nextValue","setter","helpGc","prepareComponentForFrame","prepareForFrame","throttleWithPrimaryRaf","throttleWithRaf","forceUpdateComponent","currentElement","DEBUG_contentComponentName","useLayoutEffectBase","schedulerFn","primarySchedulerFn","execCleanup","dependency","causedBy","prevValue","fastRafPrimary","onTickEnd","onTickEndPrimary","resolver","getUnequalProps","newCallback","DEBUG_currentCapturedId","currentGlobal","DEBUG_releaseCapturedIdThrottled","throttleWithTickEnd","actionHandlers","callbacks","containers","mapStateToProps","ownProps","mappedProps","newMappedProps","isNaN","DEBUG_componentName","arePropsShallowEqual","areMappedPropsChanged","DEBUG_updates","updateTime","runCallbacksThrottled","runCallbacks","newGlobal","DEBUG_capturedId","actionQueue","handleAction","TeactNContainer","vs16RegExp","zeroWidthJoiner","removeVS16s","rawEmoji","LoadMoreDirection","FocusDirection","SettingsScreens","LeftColumnContent","GlobalSearchContent","MediaViewerOrigin","AudioOrigin","ChatCreationProgress","ManagementProgress","ProfileState","PaymentStep","ManagementScreens","currentInstance","animateSingle","tick","instance","isCancelled","animate","timingFunctions","linear","easeIn","easeOut","easeInOut","sin","PI","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","animateNumber","timing","t0","canceled","f","unreadCount","setAppBadge","currentProps","newProps","currentKeys","currentKeysLength","prop","elementName","baseName","modifiers","modifier","self","caches","Type","fetch","cacheName","isHtmlAllowed","request","Request","open","headers","Blob","blob","shouldRecreate","resolvedType","Json","ArrayBuffer","arrayBuffer","save","cacheData","Response","put","clear","createCallbackManager","hasCallbacks","captureKeyboardListener","onEsc","keyToHandlerName","Enter","Backspace","Delete","Esc","Escape","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Tab","handlers","onEnter","onDelete","onBackspace","onUp","onDown","onLeft","onRight","onTab","captureKeyboardListeners","hasActiveHandlers","handlerName","currentEventHandlers","findIndex","releaseKeyboardListener","keyHandlers","CLIPBOARD_ITEM_SUPPORTED","clipboard","ClipboardItem","textCopyEl","str","selection","getSelection","rangeToRestore","rangeCount","getRangeAt","select","execCommand","removeAllRanges","addRange","copyImageToClipboard","imageUrl","canvas","ctx","getContext","imageEl","Image","onload","img","drawImage","toBlob","copyBlobToClipboard","pngBlob","write","propertyName","waitForEndEvent","animationName","detailedName","isHandled","TransitionEvent","AnimationEvent","WEEKDAYS_FULL","MONTHS_FULL_LOWERCASE","month","MILLISECONDS_IN_DAY","isToday","getDayStartAt","getDayStart","datetime","toYearMonth","getFullYear","getMonth","toIsoString","hours","getHours","marker","padStart","getMinutes","formatPastTimeShort","weekAgo","getDay","noYear","formatMonthAndYear","isShort","formatCountdown","msLeft","days","formatMediaDuration","formatCountdownShort","ceil","formatLastUpdated","currentTime","lastUpdated","seconds","formatTimeDuration","showLast","durationRecords","labels","multiplier","idx","modulus","reverse","formatHumanDate","noWeekdays","isUpperFirst","upperFirst","lowerFirst","weekAhead","weekDay","formattedDate","formatMediaDateTime","maxValue","minutes","maxHours","maxMinutes","string","formatVoiceRecordDuration","durationInMs","milliseconds","formatDayToStringWithCache","withCache","dayStartAt","locale","monthFormat","noDay","toLocaleString","year","day","formatDateTimeToString","hour","minute","second","isValidDate","MAX_MONTH_IN_YEAR","parseDateString","matchStringDate","matchEuropeStringDate","matchNumberDate","dateParts","monthIndex","timestampPlusDay","EXCLUDE_EMOJIS","EMOJI_EXCEPTIONS","unifiedToNative","unified","codePoints","parseInt","fromCodePoint","dataset","path","regex","replacement","pairs","nativeToUnified","uncompressEmoji","emojiData","categories","emojiRaw","names","native","image","isoToEmoji","iso","test","codePointAt","isWebpSupportedCache","webp","handleLoadOrError","onerror","hasWebp","systemThemeCache","matches","IS_PRODUCTION_HOST","host","os","getPlatform","IS_PWA","standalone","referrer","IS_TABLET_COLUMN_LAYOUT","IS_VOICE_RECORDING_SUPPORTED","mediaDevices","AudioContext","webkitAudioContext","inlineEl","newEmojiWidth","legacyEmojiWidth","isLastEmojiVersionSupported","IS_SERVICE_WORKER_SUPPORTED","Audio","canPlayType","IS_CANVAS_FILTER_SUPPORTED","IS_REQUEST_FULLSCREEN_SUPPORTED","ARE_CALLS_SUPPORTED","LAYERS_ANIMATION_NAME","TEST_VIDEO","DPR","devicePixelRatio","MASK_IMAGE_DISABLED","storage","getDirectory","directory","removeEntry","recursive","CSS","supports","IS_SCROLL_PATCH_NEEDED","IS_INSTALL_PROMPT_SUPPORTED","MESSAGE_LIST_SENSITIVE_AREA","dataUriToBlob","arr","mime","bstr","atob","u8arr","Uint8Array","blobToDataUri","reader","FileReader","readAsDataURL","blobToFile","File","lastModified","preloadImage","preloadVideo","onloadedmetadata","createPosterForVideo","onseeked","videoWidth","videoHeight","toDataURL","fetchBlob","imgToCanvas","constructor","fileBits","super","this","initials","buildInitials","prevGlobal","prepared","updateFolderManagerThrottled","updateFolderManager","inited","orderedIdsByFolderId","getPinnedChatsCount","pinnedCountByFolderId","getChatsCount","chatsCountByFolderId","getUnreadCounters","unreadCountersByFolderId","getAllNotificationsCount","notificationsCount","getOrderKey","chatSummariesById","order","addOrderedIdsCallback","addChatsCountCallback","addUnreadCountersCallback","DEBUG_startedAt","isAllFolderChanged","isMainFolderChanged","isArchivedFolderChanged","isAllFullyLoadedChanged","isAllFolderFullyLoaded","isArchivedFullyLoadedChanged","isArchivedFolderFullyLoaded","areFoldersChanged","foldersById","areChatsChanged","areUsersChanged","areNotifySettingsChanged","areNotifyExceptionsChanged","affectedFolderIds","emptyFolderIds","folderSummariesById","updateFullyLoaded","updateResults","prevAllFolderListIds","allFolderListIds","prevArchivedFolderListIds","archivedFolderListIds","changedFolders","newListIds","newPinnedIds","buildFolderSummaryFromMainList","allFolderPinnedIds","archivedFolderPinnedIds","newFoldersById","buildFolderSummary","updateFolders","newChatsById","newUsersById","newNotifySettings","newNotifyExceptions","folderSummaries","newAllFolderListIds","newArchivedFolderListIds","allIds","newFolderIds","currentSummary","newSummary","unreadMentionsCount","hasUnreadMark","joinDate","draftDate","userInfo","isListed","isArchived","isUserContact","buildChatSummary","chatSummary","folderSummary","isChatInFolder","buildChatFolderIds","currentFolderIds","folderIdsByChatId","deletedFolderIds","currentFolderIdsSet","newFolderIdsSet","currentFolderOrderedIds","chatIdsByFolderId","isOrderedListJustPatched","updateListsForChat","currentPinnedIds","wasUnreadCountersChanged","wasChatsCountChanged","pinnedCount","newPinnedCount","orderedIds","newOrderedIds","prevOrderedIds","sortedPinnedIds","allListIds","sortedNotPinnedIds","chatId1","chatId2","buildFolderOrderedIds","currentOrderedIds","currentPinnedCount","currentChatsCount","newChatsCount","currentUnreadCounters","newUnreadCounters","buildFolderUnreadCounters","newInitials","totalPrice","Intl","NumberFormat","format","getCurrencyExp","store","hasOwnProperty","READABLE_ERROR_MESSAGES","CHAT_RESTRICTED","CHAT_SEND_POLL_FORBIDDEN","CHAT_SEND_STICKERS_FORBIDDEN","CHAT_SEND_GIFS_FORBIDDEN","CHAT_SEND_MEDIA_FORBIDDEN","CHAT_LINK_EXISTS","SLOWMODE_WAIT_X","USER_BANNED_IN_CHANNEL","USER_IS_BLOCKED","YOU_BLOCKED_USER","IMAGE_PROCESS_FAILED","MEDIA_EMPTY","MEDIA_INVALID","PHOTO_EXT_INVALID","PHOTO_INVALID_DIMENSIONS","PHOTO_SAVE_FILE_INVALID","MESSAGE_DELETE_FORBIDDEN","MESSAGE_POLL_CLOSED","MESSAGE_EDIT_TIME_EXPIRED","PINNED_DIALOGS_TOO_MUCH","CHANNEL_PRIVATE","MEDIA_CAPTION_TOO_LONG","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","LINK_NOT_MODIFIED","MESSAGE_TOO_LONG","SERVICE_WORKER_DISABLED","MESSAGE_TOO_LONG_PLEASE_REMOVE_CHARACTERS","FRESH_RESET_AUTHORISATION_FORBIDDEN","BOTS_TOO_MUCH","BOT_GROUPS_BLOCKED","USERS_TOO_MUCH","USER_CHANNELS_TOO_MUCH","USER_KICKED","USER_NOT_MUTUAL_CONTACT","USER_PRIVACY_RESTRICTED","INVITE_HASH_EMPTY","INVITE_HASH_EXPIRED","INVITE_HASH_INVALID","CHANNELS_TOO_MUCH","USER_ALREADY_PARTICIPANT","SCHEDULE_DATE_INVALID","WALLPAPER_DIMENSIONS_INVALID","ADMINS_TOO_MUCH","ADMIN_RANK_EMOJI_NOT_ALLOWED","ADMIN_RANK_INVALID","FRESH_CHANGE_ADMINS_FORBIDDEN","INPUT_USER_DEACTIVATED","BOT_PRECHECKOUT_TIMEOUT","CHAT_WRITE_FORBIDDEN","CHAT_ADMIN_REQUIRED","SHIPPING_ERRORS","FINAL_PAYMENT_ERRORS","getReadableErrorText","isSlowMode","textParams","extraPartIndex","errorMessage","handleErrorEvent","ErrorEvent","reason","alert","promptInstall","setupBeforeInstallPrompt","prompt","userChoice","outcome","setInstallPrompt","getPromptInstall","collection","member","mapValues","newByKey","object","stringKeys","orderRule","mode","compareValues","currentOrderRule","isAsc","aValue","bValue","mode1","mode2","orderRule1","orderRule2","isAsc1","isAsc2","array","array1","array2","areSortedArraysIntersecting","findIntersectionWithSet","chunkSize","cloneDeep","predicate","SUBSTITUTION_REGEX","PLURAL_OPTIONS","PLURAL_RULES","en","ar","ca","de","es","fa","fr","it","ko","nl","pl","pt_BR","ru","tr","uk","uz","langPack","fallbackLangPack","currentLangCode","currentTimeFormat","cacheValue","langString","processTranslation","importFallbackLangPack","getTranslationForLangString","translateString","remoteLangPack","remote","fetchRemoteString","withFallback","newLangPack","fetchRemote","langInfo","rtl","langName","nativeName","sourceLangPacks","preferedPluralOption","optionIndex","getPluralOption","template","otherValue","translationSlices","initialValue","processTemplate","formatInteger","clamp","num","isBetween","decimals","lerp","start","end","interpolationRatio","SAMPLE_RATE","oggToWav","opusData","typedArray","decoderWorker","wavWorker","onmessage","buffers","buffer","page","terminate","wavBitDepth","wavSampleRate","decoderSampleRate","outputBufferSampleRate","pages","asCacheApiType","memoryCache","fetchPromises","progressCallbacks","cancellableCallbacks","mediaFormat","onProgress","callbackUniqueId","getProgressive","getDownloadUrl","fetchFromCacheOrRemote","activeCallbacks","getFromMemory","cancelProgress","parentCallback","progressiveUrl","mediaPng","webpToPng","prepareMedia","mediaSource","MediaSource","streamUrl","sourceBuffer","addSourceBuffer","makeOnProgress","revokeObjectURL","endOfStream","appendBuffer","serviceWorker","fullSize","controller","Bundles","LOAD_PROMISES","MEMORY_CACHE","Auth","Main","Extra","Calls","bundle","getDeviceToken","subscription","toJSON","endpoint","checkIfPushSupported","ServiceWorkerRegistration","Notification","permission","checkIfNotificationsSupported","soundPlayedIds","playNotifySound","currentVolume","once","playNotifySoundDebounced","requestPermission","unsubscribeFromPush","dispatch","deleteDeviceToken","serviceWorkerRegistration","ready","pushManager","getSubscription","areSettingsLoaded","loadNotificationSettings","resultSettings","resultExceptions","checkIfShouldResubscribe","userVisibleOnly","setDeviceToken","DOMException","ABORT_ERR","getAvatar","imageHash","mediaLoader","notifyAboutCall","badge","vibrate","onclick","close","notifyAboutMessage","isReaction","checkIfShouldNotify","areNotificationsSupported","activeReaction","messageSender","messageAction","actionTargetMessage","targetUserIds","actionTargetUserIds","actionTargetChatId","actionTargetUsers","privateChatUserId","privateChatUser","isChat","senderName","getNotificationContent","onshow","closeMessageNotifications","notifyClientReady","currentPasscodeHash","setupPasscode","sha256","sessionEncrypted","aesEncrypt","globalEncrypted","decryptSession","passcodeHash","load","aesDecrypt","plaintext","crypto","subtle","digest","TextEncoder","encode","pwHash","iv","getRandomValues","alg","importKey","ptUint8","ctBuffer","encrypt","ct","dataArray","plainBuffer","decrypt","TextDecoder","PATTERN_PLACEHOLDER","DEFAULT_PATTERN","getCountryCodesByIso","phoneCodeList","country","iso2","getCountryFromPhoneNumber","possibleCountries","countryCode","codesWithPrefix","prefixes","prefix","bestMatches","pattern","numberWithoutCode","patterns","defaultPattern","stripped","getBestPattern","formatPhoneNumberWithCode","numberWithPlus","createMessageHash","typeOrThreadId","isType","waitingTimeout","shouldRunFirst","shouldRunLast","interval","isPending","_args","setInterval","clearInterval","throttleWith","waiting","requestIdleCallback","rafPromise","fastRafCallbacks","fastRafPrimaryCallbacks","onTickEndCallbacks","onTickEndPrimaryCallbacks","beforeUnloadCallbacks","isPrimary","currentCallbacks","currentPrimaryCallbacks","isLast","unshift","RE_NOT_LETTER","haystack","needle","needleWords","haystackLower","haystackWords","needleWord","haystackWord","promisifyRequest","oncomplete","onsuccess","onabort","defaultGetStoreFunc","defaultGetStore","dbName","storeName","dbp","userAgentData","indexedDB","databases","tryIdb","intervalId","onupgradeneeded","createObjectStore","txMode","db","transaction","objectStore","createStore","DC_IDS","withLegacy","checkSessionLocked","userAuthJson","dcID","hashes","dcId","sessionId","customStore","idb","idbKeys","getAllKeys","items","openCursor","continue","eachCursor","stateFromCache","isInitialized","HEX_COLOR_REGEX","RGB_VARIABLES","colors","themeColors","property","hexToRgb","hex","g","applyColorAnimationStep","startIndex","endIndex","propertyColors","withAnimation","themeClassName","isDarkTheme","shouldAnimate","startAt","themeColorTag","formatFixedNumber","formatIntegerCompact","views","getFirstLetters","phrase","word","FILE_SIZE_UNITS","formatFileSize","EMPTY_IMAGE_DATA_URI","initWebpWorker","wasmReady","requests","getDecodePromise","ImageData","putImageData","createPng","webpToPngBase64","handleLibWebpMessage","WEBSYNC_URLS","WEBSYNC_VERSION","WEBSYNC_KEY","getTs","lastTimeout","authed","currentTs","canRedirect","ts","script","removeElement","URLSearchParams","version","saveSync","clearWebsync","IS_LANDSCAPE","isLandscape","initialHeight","currentWindowSize","updateSizes","isRefreshDisabled","visualViewport","pageTop","vh","getIsKeyboardVisible","disableRefresh","enableRefresh","WeakMap","fnCache","cacheKey","exports","o","h","v","_","M","S","A","C","getPatternPosition","u","getBCHTypeNumber","getBCHTypeInfo","getMaskFunction","getRSBlocks","getMode","getLength","getLengthInBits","dataCount","putBit","getBuffer","getErrorCorrectPolynomial","mod","getAt","addData","isDark","getModuleCount","make","getLostPoint","createTableTag","createSvgTag","arguments","cellSize","margin","scalable","O","createDataURL","createImgTag","charAt","createASCII","renderTo2dContext","fillStyle","fillRect","stringToBytes","stringToBytesFuncs","createStringToBytes","read","L","Q","H","multiply","gexp","glog","SJIS","writeByte","writeShort","writeBytes","writeString","toByteArray","setPixel","flush","apply","__esModule","defineProperty","enumerable","click","onloadend","svg","_svg","_type","draw","_drawDot","_drawClassy","_drawClassyRounded","_drawRounded","_drawExtraRounded","_drawSquare","getNeighbor","_rotateFigure","rotation","_element","_basicDot","createElementNS","_basicSquare","_basicSideRounded","_basicCornerRounded","_basicCornerExtraRounded","_basicCornersRounded","_basicExtraRounded","throw","done","_defs","_options","getElement","drawQR","shape","sqrt","hideXDots","hideYDots","_qr","loadImage","_image","imageOptions","qrOptions","imageSize","errorCorrectionLevel","SVGImageElement","baseVal","naturalWidth","naturalHeight","originalHeight","originalWidth","maxHiddenDots","maxHiddenAxisDots","dotSize","drawBackground","drawDots","hideBackgroundDots","drawCorners","backgroundOptions","gradient","_createColor","additionalRotation","_backgroundClipPath","dotsOptions","_dotsClipPath","transformOrigin","$","D","cornersSquareOptions","_cornersSquareClipPath","_cornersDotClipPath","cornersDotOptions","crossOrigin","tan","colorStops","typeNumber","static","_setupSvg","_svgDrawingPromise","_extension","_setupCanvas","_canvas","_canvasDrawingPromise","XMLSerializer","serializeToString","btoa","_getElement","_clearContainer","_container","append","applyExtension","deleteExtension","getRawData","encodeURIComponent","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","getPrototypeOf","obj","ns","create","def","getOwnPropertyNames","definition","chunkId","promises","miniCssF","globalThis","Function","needAttach","scripts","getElementsByTagName","charset","nc","onScriptComplete","doneFns","bind","head","toStringTag","scriptUrl","importScripts","currentScript","fullhref","existingLinkTags","dataHref","existingStyleTags","findStylesheet","linkTag","errorType","realHref","createStylesheet","miniCss","baseURI","installedChunks","installedChunkData","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","chunkLoadingGlobal","handleWorkerMessage","registrations","getRegistrations","unregister","register","hasErrorKey","STORAGE_KEY","tabKey","SITE_FONTS","preloadFonts","font","fonts","translation","setTranslation","getSuggestedLanguage","suggestedLanguage","MENU_HIDING_DURATION","inputRef","setFilter","filteredList","setFilteredList","updateFilter","filterValue","defaultName","getFilteredList","prevPhoneCodeList","handleInput","handleInputKeyDown","CodeInput","handleTrigger","formEl","getElementById","scrollTo","top","scrollHeight","behavior","inputValue","Spinner","DropdownMenu","MenuItem","isPreloadInitiated","setAuthPhoneNumber","setAuthRememberMe","loadNearestCountry","loadCountryList","clearAuthError","goToAuthQrCode","continueText","useLangString","setCountry","setPhoneNumber","isTouched","setIsTouched","lastSelection","setLastSelection","markIsLoading","unmarkIsLoading","fullNumber","canSubmit","parseFullNumber","newFullNumber","suggestedCountry","selectedCountry","handleLangChange","setSelectionRange","isJustPastedRef","handlePaste","handleCountryChange","handlePhoneNumberChange","monkeyPath","selectionStart","selectionEnd","shouldFixSafariAutoComplete","handleKeepSessionChange","isAuthReady","onSubmit","InputText","Checkbox","Button","Loading","AuthCode","useModuleLoader","AuthPassword","AuthRegister","QR_CODE","QrCodeStyling","blankUrl","returnToAuthPhoneNumber","qrCodeRef","isQrMounted","markQrMounted","unmarkQrMounted","token","AnimatedIcon","isMobile","AuthQrCode","isLocked","LockScreen","handleReload","appInactivePath","preloadAvatars","preloadTasks","main","isCurrentUserPremium","premiumReactionThumbsPath","reactionThumbsPath","telegramLogoPath","authCode","authPassword","lock","lockPreviewPath","isRightColumnShown","leftColumnWidth","setIsUiReady","isReady","markReady","shouldRenderMask","safePreload","AppScreens","disconnect","markInactive","handleDrag","dataTransfer","dropzone","dropEffect","handleDrop","inactive","auth","renderContent","Transition","manifest","updateWebmanifest","TeactDOM"],"sourceRoot":""} |