{"version":3,"sources":["webpack:///./src/components/mediaViewer/helpers/ghostAnimation.ts","webpack:///./src/components/mediaViewer/SenderInfo.tsx","webpack:///./src/components/mediaViewer/MediaViewerActions.tsx","webpack:///./src/components/mediaViewer/MediaViewerFooter.tsx","webpack:///./src/hooks/useFullscreen.ts","webpack:///./src/components/mediaViewer/helpers/formatFileSize.ts","webpack:///./src/components/mediaViewer/VideoPlayerControls.tsx","webpack:///./src/components/mediaViewer/VideoPlayer.tsx","webpack:///./src/components/mediaViewer/ZoomControls.tsx","webpack:///./src/components/mediaViewer/PanZoom.tsx","webpack:///./src/components/mediaViewer/MediaViewer.tsx","webpack:///./src/components/main/ForwardPicker.tsx","webpack:///./src/components/main/Dialogs.tsx","webpack:///./src/components/main/Notifications.tsx","webpack:///./src/components/main/SafeLinkModal.tsx","webpack:///./src/components/common/CalendarModal.tsx","webpack:///./src/components/main/HistoryCalendar.tsx","webpack:///./src/components/common/DeleteMessageModal.tsx","webpack:///./src/components/common/PinMessageModal.tsx","webpack:///./src/components/common/UnpinAllMessagesModal.tsx","webpack:///./src/components/middle/DeleteSelectedMessageModal.tsx","webpack:///./src/components/common/ReportMessageModal.tsx","webpack:///./src/components/middle/MessageSelectToolbar.tsx","webpack:///./src/hooks/useSelectWithEnter.ts","webpack:///./src/components/left/search/LeftSearchResultChat.tsx","webpack:///./src/components/left/search/RecentContacts.tsx","webpack:///./src/components/left/search/ChatMessage.tsx","webpack:///./src/components/left/search/DateSuggest.tsx","webpack:///./src/components/left/search/ChatResults.tsx","webpack:///./src/components/left/search/ChatMessageResults.tsx","webpack:///./src/components/left/search/helpers/createMapStateToProps.ts","webpack:///./src/components/left/search/MediaResults.tsx","webpack:///./src/components/left/search/helpers/getSenderName.ts","webpack:///./src/components/left/search/LinkResults.tsx","webpack:///./src/components/left/search/FileResults.tsx","webpack:///./src/components/left/search/AudioResults.tsx","webpack:///./src/components/left/search/LeftSearch.tsx","webpack:///./src/hooks/useReducer.ts","webpack:///./src/hooks/reducers/useFoldersReducer.ts","webpack:///./src/hooks/reducers/useTwoFaReducer.ts","webpack:///./src/components/left/settings/SettingsHeader.tsx","webpack:///./src/components/left/settings/SettingsMain.tsx","webpack:///./src/components/ui/FloatingActionButton.tsx","webpack:///./src/components/common/UsernameInput.tsx","webpack:///./src/components/left/settings/SettingsEditProfile.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersMain.tsx","webpack:///./src/components/ui/ShowMoreButton.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersEdit.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersChatsPicker.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersChatFilters.tsx","webpack:///./src/components/left/settings/folders/SettingsFolders.tsx","webpack:///./src/components/ui/RangeSlider.tsx","webpack:///./src/components/middle/composer/StickerSetCoverAnimated.tsx","webpack:///./src/components/middle/composer/StickerSetCover.tsx","webpack:///./src/components/common/StickerButton.tsx","webpack:///./src/components/left/settings/SettingsStickerSet.tsx","webpack:///./src/components/left/settings/SettingsGeneral.tsx","webpack:///./src/util/systemFilesDialog.ts","webpack:///./src/util/colors.ts","webpack:///./src/components/left/settings/WallpaperTile.tsx","webpack:///./src/components/left/settings/SettingsGeneralBackground.tsx","webpack:///./src/components/left/settings/SettingsGeneralBackgroundColor.tsx","webpack:///./src/components/left/settings/SettingsNotifications.tsx","webpack:///./src/components/left/settings/SettingsPrivacy.tsx","webpack:///./src/components/left/settings/SettingsLanguage.tsx","webpack:///./src/components/left/settings/helper/privacy.ts","webpack:///./src/components/left/settings/SettingsPrivacyVisibility.tsx","webpack:///./src/components/left/settings/SettingsPrivacyActiveSessions.tsx","webpack:///./src/components/left/settings/SettingsPrivacyBlockedUsers.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaEnabled.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaPassword.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaStart.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaSkippableForm.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaCongratulations.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaEmailCode.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFa.tsx","webpack:///./src/components/common/Picker.tsx","webpack:///./src/components/left/settings/SettingsPrivacyVisibilityExceptionList.tsx","webpack:///./src/components/left/settings/Settings.tsx","webpack:///./src/components/left/main/ContactList.tsx","webpack:///./src/components/left/newChat/NewChatStep1.tsx","webpack:///./src/components/left/newChat/NewChatStep2.tsx","webpack:///./src/components/left/newChat/NewChat.tsx","webpack:///./src/components/left/ArchivedChats.tsx","webpack:///./src/util/scrollLock.ts","webpack:///./src/components/middle/message/helpers/copyOptions.ts","webpack:///./src/components/middle/message/MessageContextMenu.tsx","webpack:///./src/components/middle/message/ContextMenuContainer.tsx","webpack:///./src/components/common/StickerSetModal.tsx","webpack:///./src/components/middle/HeaderMenuContainer.tsx","webpack:///./src/components/middle/MobileSearch.tsx","webpack:///./src/util/findInViewport.ts","webpack:///./src/util/isFullyVisible.ts","webpack:///./src/components/middle/composer/MentionTooltip.tsx","webpack:///./src/components/middle/composer/AttachmentModal.tsx","webpack:///./src/components/middle/composer/PollModal.tsx","webpack:///./src/hooks/useMouseInside.ts","webpack:///./src/components/middle/composer/EmojiButton.tsx","webpack:///./src/components/middle/composer/EmojiCategory.tsx","webpack:///./src/components/middle/composer/EmojiPicker.tsx","webpack:///./src/components/middle/composer/StickerSet.tsx","webpack:///./src/components/middle/composer/StickerPicker.tsx","webpack:///./src/components/common/GifButton.tsx","webpack:///./src/components/middle/composer/GifPicker.tsx","webpack:///./src/components/middle/composer/SymbolMenuFooter.tsx","webpack:///./src/components/middle/composer/SymbolMenu.tsx","webpack:///./src/components/middle/composer/AttachMenu.tsx","webpack:///./src/components/middle/composer/StickerTooltip.tsx","webpack:///./src/components/middle/composer/BotKeyboardMenu.tsx","webpack:///./src/components/middle/composer/CustomSendMenu.tsx","webpack:///./src/components/middle/composer/EmojiTooltip.tsx","webpack:///./src/components/right/RightSearch.tsx","webpack:///./src/components/right/StickerSetResult.tsx","webpack:///./src/components/right/StickerSearch.tsx","webpack:///./src/components/right/GifSearch.tsx","webpack:///./src/components/right/PollAnswerResults.tsx","webpack:///./src/components/right/PollResults.tsx","webpack:///./src/components/right/management/ManageUser.tsx","webpack:///./src/components/right/management/ManageGroup.tsx","webpack:///./src/components/right/management/ManageGroupPermissions.tsx","webpack:///./src/components/right/management/ManageGroupRemovedUsers.tsx","webpack:///./src/components/right/management/ManageChannel.tsx","webpack:///./src/components/right/management/ManageChatPrivacyType.tsx","webpack:///./src/components/right/management/ManageDiscussion.tsx","webpack:///./src/components/right/management/ManageGroupUserPermissions.tsx","webpack:///./src/components/right/management/ManageChatAdministrators.tsx","webpack:///./src/components/right/management/ManageGroupRecentActions.tsx","webpack:///./src/components/right/management/ManageGroupAdminRights.tsx","webpack:///./src/components/right/management/ManageGroupMembers.tsx","webpack:///./src/components/right/management/ManageGroupUserPermissionsCreate.tsx","webpack:///./src/components/right/management/Management.tsx","webpack:///./src/components/middle/helpers/getCurrencySign.ts","webpack:///./src/components/common/helpers/detectCardType.ts","webpack:///./src/hooks/reducers/usePaymentReducer.ts","webpack:///./src/hooks/useFocusAfterAnimation.tsx","webpack:///./src/components/ui/Select.tsx","webpack:///./src/components/payment/ShippingInfo.tsx","webpack:///./src/components/payment/Shipping.tsx","webpack:///./src/components/payment/Checkout.tsx","webpack:///./src/components/payment/ExpiryInput.tsx","webpack:///./src/components/middle/helpers/inputFormatters.ts","webpack:///./src/assets/mastercard.svg","webpack:///./src/assets/visa.svg","webpack:///./src/components/payment/CardInput.tsx","webpack:///./src/components/payment/PaymentInfo.tsx","webpack:///./src/components/payment/PaymentModal.tsx","webpack:///./src/components/payment/ReceiptModal.tsx","webpack:///./src/components/common/helpers/animatedAssets.ts","webpack:///./src/assets/TwoFactorSetupMonkeyIdle.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyTracking.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyClose.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyPeek.tgs","webpack:///./src/assets/FoldersAll.tgs","webpack:///./src/assets/FoldersNew.tgs","webpack:///./src/assets/DiscussionGroupsDucks.tgs","webpack:///./src/components/ui/CropModal.tsx","webpack:///./src/components/ui/AvatarEditable.tsx","webpack:///./src/components/common/PasswordMonkey.tsx","webpack:///./src/components/common/PasswordForm.tsx"],"names":["animateOpening","hasFooter","origin","bestImageData","dimensions","isVideo","message","mediaEl","fromImage","getNodes","width","windowWidth","windowSize","get","availableWidth","height","availableHeight","getMediaViewerAvailableDimensions","toWidth","toHeight","calculateDimensions","toLeft","toTop","mql","window","matchMedia","MEDIA_VIEWER_MEDIA_QUERY","topOffsetRem","matches","REM","getTopOffset","top","fromTop","left","fromLeft","fromWidth","fromHeight","getBoundingClientRect","MediaViewerOrigin","SharedMedia","Album","ScheduledAlbum","SearchResult","includes","uncovered","realWidth","realHeight","size","Math","max","srcWidth","srcHeight","uncover","fromTranslateX","fromTranslateY","fromScaleX","fromScaleY","ghost","createGhost","applyStyles","transform","applyShape","document","body","classList","add","requestAnimationFrame","appendChild","style","firstChild","objectFit","remove","clearShape","setTimeout","contains","removeChild","ANIMATION_END_DELAY","animateClosing","container","toImage","getElementById","querySelector","targetTop","el","display","rect","windowHeight","isElementInViewport","shouldFadeOut","Inline","ScheduledInline","isMessageImageFullyVisible","existingGhost","getElementsByClassName","ProfileAvatar","transition","transformOrigin","opacity","source","shouldAppendProfileInfo","createElement","img","Image","src","HTMLVideoElement","poster","profileInfo","cloneNode","imageEl","messageListElement","imgOffsetTop","offsetTop","closest","id","parentElement","scrollTop","offsetHeight","element","styles","Object","assign","containerSelector","mediaSelector","MiddleHeaderAvatar","mediaEls","querySelectorAll","length","withGlobal","global","chatId","messageId","isAvatar","sender","isChatPrivate","selectUser","selectChat","selectChatMessage","selectSender","setGlobal","actions","pick","closeMediaViewer","focusMessage","handleFocusMessage","useCallback","lang","useLang","isFromChat","senderTitle","getSenderTitle","className","onClick","Avatar","key","chat","user","dir","renderText","formatMediaDateTime","date","MediaViewerActions","mediaData","isZoomed","fileName","onCloseMediaViewer","onForward","onZoomToggle","isDownloadStarted","downloadProgress","handleDownloadClick","useMediaDownload","getMessageMediaHash","undefined","MenuButton","useMemo","onTrigger","isOpen","Button","round","color","ariaLabel","IS_SINGLE_COLUMN_LAYOUT","DropdownMenu","trigger","positionX","MenuItem","icon","href","download","ProgressSpinner","progress","noCross","MediaViewerFooter","text","isHidden","isForVideo","isMultiline","setIsMultiline","useState","useEffect","footerContent","checkIsMultiline","clientHeight","handleResize","throttle","addEventListener","removeEventListener","classNames","buildClassName","e","stopPropagation","prop","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","getBrowserFullscreenElementProp","units","bytes","number","floor","log","toFixed","stopEvent","VideoPlayerControls","bufferedProgress","currentTime","duration","fileSize","isForceVisible","isForceMobileVersion","isPlayed","isFullscreenSupported","isFullscreen","onChangeFullscreen","onPlayPause","onSeek","isVisible","setVisibility","timeout","clearTimeout","downloadedPercent","totalSize","percentagePlayed","percentageBuffered","min","step","type","onInput","value","renderSeekLine","ripple","formatMediaDuration","renderTime","formatFileSize","memo","url","isGif","posterData","posterSize","isMediaViewerOpen","noPlay","onClose","videoRef","useRef","setIsPlayed","IS_TOUCH_ENV","IS_IOS","setCurrentTime","isControlsVisible","setIsControlsVisible","setFullscreen","exitFullscreen","elRef","setIsFullscreen","Boolean","useLayoutEffect","listener","listenerEnter","listenerExit","video","current","PLATFORM_ENV","requestFullscreen","webkitRequestFullscreen","webkitEnterFullscreen","mozRequestFullScreen","mozCancelFullScreen","webkitCancelFullScreen","webkitExitFullscreen","useFullscreenStatus","isBuffered","bufferingHandlers","useBuffering","shouldRender","shouldRenderSpinner","transitionClassNames","spinnerClassNames","useShowTransition","pause","safePlay","togglePlayState","play","useVideoCleanup","handleMouseOver","handleMouseOut","handleTimeUpdate","currentTarget","handleEnded","handleFullscreenChange","handleSeek","Number","target","toggleControls","togglePayingStateBySpace","preventDefault","wrapperStyle","videoStyle","onMouseOver","onMouseOut","ref","autoPlay","playsInline","loop","muted","onEnded","onDoubleClick","onTimeUpdate","join","square","isShown","onChangeZoom","prevIsShown","usePrevious","inputRef","zoomLevel","setZoomLevel","isSeeking","handleStartSeek","handleStopSeek","disabled","onChange","onMouseDown","onMouseUp","INITIAL_MATRIX","SCALE_VALUES","1","1.5","2","2.5","3","children","noWrap","canPan","panDeltaX","panDeltaY","onPan","tunedZoomLevel","isDragging","setIsDragging","dragData","setDragData","dx","dy","x","y","matrixData","setMatrixData","panWrapperRef","panContainerRef","newZoomLevel","newPandx","newPandy","newMatrixData","areSortedArraysEqual","oldScale","wrapper","image","wrapperRect","imageRect","newImgWidth","newImgHeight","newImgX","newImgY","calculateSafeZoneOnZoom","toString","newDragData","pageX","pageY","onMouseMove","deltaX","deltaY","getNewMatrixData","renderPhoto","blobUrl","imageSize","canDrag","alt","draggable","Spinner","threadId","avatarOwnerId","profilePhotoIndex","mediaViewer","animationLevel","settings","byKey","senderId","avatarOwner","chatMessages","collectionIds","selectScheduledMessage","selectScheduledMessages","selectChatMessages","selectOutlyingIds","selectListedIds","currentSearch","selectCurrentMediaSearch","foundIds","resultsByType","media","openMediaViewer","openForwardMenu","isFromSharedMedia","isFromSearch","photo","getMessagePhoto","getMessageVideo","webPagePhoto","getMessageWebPagePhoto","webPageVideo","getMessageWebPageVideo","isDocumentPhoto","isMessageDocumentPhoto","isDocumentVideo","isMessageDocumentVideo","isPhoto","isSingleSlide","messageIds","getChatMediaMessageIds","selectedMediaMessageIndex","indexOf","isFirst","isLast","animationKey","prevSenderId","slideAnimation","headerAnimation","isGhostAnimation","isFooterHidden","setIsFooterHidden","canPanZoomWrap","setCanPanZoomWrap","setIsZoomed","panDelta","setPanDelta","getMediaHash","isFull","photos","getChatAvatarHash","blobUrlPictogram","useMedia","ApiMediaFormat","BlobUrl","previewMediaHash","blobUrlPreview","startsWith","DataUri","fullMediaData","useMediaWithDownloadProgress","getMessageMediaFormat","localBlobUrl","thumbDataUri","useBlurSync","getMessageMediaThumbDataUri","videoSize","getMessageFileSize","getMessageFileName","getMessageDocument","mediaSize","getPhotoFullDimensions","getVideoDimensions","AVATAR_FULL_DIMENSIONS","toggle","forceUpdate","useForceUpdate","addListener","removeListener","prevMessage","prevOrigin","prevAvatarOwner","prevBestImageData","dispatchHeavyAnimationEvent","textParts","renderMessageText","timer","closeZoom","handleZoomToggle","handleZoomValue","level","canCloseZoom","close","handleFooterClick","handleForward","fromChatId","captureEscKeyListener","stopCurrentAudio","disableRefresh","enableRefresh","getMessageId","fromId","direction","index","selectPreviousMedia","selectNextMedia","handleKeyDown","shouldCloseOnVideo","captureEvents","excludedClosestSelector","onSwipe","SwipeDirection","Right","Left","handlePan","handleToggleFooterVisibility","renderSlide","isActive","calculateMediaViewerDimensions","renderSenderInfo","useHistoryBack","ShowTransition","isRtl","Transition","activeKey","name","aria-label","chats","byId","chatsById","listIds","orderedPinnedIds","currentUserId","pinnedIds","active","activeListIds","archivedListIds","archived","setForwardChatId","exitForwardMode","loadMoreChats","filter","setFilter","focus","blur","chatIds","priorityIds","unique","sortChatIds","getCanPostInChat","MAIN_THREAD_ID","searchWords","getChatTitle","viewportIds","getMore","useInfiniteScroll","handleFilterChange","containerRef","useKeyboardListNavigation","modalHeader","InputText","onKeyDown","placeholder","Modal","header","InfiniteScroll","items","onLoadMore","noScrollRestore","map","ListItem","PrivateChatInfo","status","userId","GroupChatInfo","Loading","getErrorHeader","error","isSlowMode","hasErrorKey","dialogs","dismissDialog","acceptInviteConfirmation","dialog","invite","hash","title","participantsCount","isChannel","participantsText","joinText","isText","renderInvite","getReadableErrorText","notifications","dismissNotification","Notification","onDismiss","toggleSafeLinkModal","handleOpen","open","handleDismiss","renderingUrl","useCurrentOrPrev","ConfirmDialog","confirmLabel","confirmHandler","WEEKDAY_LETTERS","isDisabledDay","year","month","day","minDate","maxDate","selectedDay","Date","fixedMinDate","getFullYear","getMonth","getDate","fixedMaxDate","formatInputTime","String","padStart","selectedAt","maxAt","isFutureMode","isPastMode","withTimePicker","submitButtonLabel","secondButtonLabel","onSubmit","onSecondButtonClick","now","defaultSelectedDate","selectedDate","setSelectedDate","selectedHours","setSelectedHours","getHours","selectedMinutes","setSelectedMinutes","getMinutes","currentYear","currentMonth","currentDate","shouldDisableNextMonth","shouldDisablePrevMonth","calendarGrid","grid","setFullYear","setMonth","setDate","monthStartDay","getDay","i","push","gridDate","buildCalendarGrid","handleChangeHours","replace","hours","getTime","setHours","hoursStr","handleChangeMinutes","minutes","setMinutes","minutesStr","formatMonthAndYear","d","dateCopy","letter","role","tabIndex","handleDateSelect","inputMode","formatHumanDate","formatTime","formatSubmitLabel","historyCalendarSelectedAt","searchMessagesByDate","closeHistoryCalendar","handleJumpToDate","timestamp","valueOf","isSchedule","selectCurrentMessageList","canDeleteForAll","selectAllowedMessageActions","contactName","getUserFirstOrLastName","getPrivateChatUserId","willDeleteForCurrentUserOnly","isChatBasicGroup","willDeleteForAll","isChatSuperGroup","album","deleteMessages","deleteScheduledMessages","handleDeleteMessageForAll","messages","shouldDeleteForAll","handleDeleteMessageForSelf","onEnter","isPrivateChat","isChatWithSelf","selectIsChatWithSelf","isChatChannel","isGroup","isSuperGroup","canPinForAll","pinMessage","handlePinMessageForAll","isUnpin","handlePinMessage","isOneSide","isSilent","pinnedMessagesCount","onUnpin","selectedMessageIds","selectedMessages","selectCanDeleteSelectedMessages","selectCurrentChat","exitMessageSelectMode","reportMessages","selectedReason","setSelectedReason","description","setDescription","handleReport","reason","handleSelectReason","handleDescriptionChange","REPORT_OPTIONS","label","RadioGroup","options","selected","messageListType","canDelete","canReport","selectCanReportSelectedMessages","selectedMessagesCount","selectSelectedMessagesCount","canDeleteMessages","canReportMessages","canPost","openForwardMenuForSelectedMessages","isDeleteModalOpen","openDeleteModal","closeDeleteModal","useFlag","isReportModalOpen","openReportModal","closeReportModal","captureKeyboardListeners","onBackspace","onDelete","onEsc","prevSelectedMessagesCount","renderingSelectedMessagesCount","formattedMessagesCount","destructive","onSelect","buttonRef","activeElement","privateChatUserId","privateChatUser","isPinned","selectIsChatPinned","isMuted","selectIsChatMuted","selectNotifySettings","selectNotifyExceptions","withUsername","contextActions","useChatContextActions","handleDelete","handleClick","useSelectWithEnter","avatarSize","DeleteChatModal","runThrottled","cb","userIds","topUserIds","topPeers","usersById","users","recentlyFoundChatIds","globalSearch","onReset","loadTopUsers","loadContactList","openChat","addRecentlyFoundChatId","clearRecentlyFoundChats","topUsersRef","useHorizontalScroll","lastSyncTime","searchQuery","mediaThumbnail","mediaBlobUrl","isRoundVideo","getMessageRoundVideo","withOnlineStatus","isSavedMessages","isSelf","isVerified","VerifiedIcon","Link","formatPastTimeShort","getMessageSummaryText","highlight","renderMessageSummary","searchDate","suggestions","match","formatDateToString","suggestion","latestYear","getSuggestionsFromDate","localContactIds","contactList","fetchingStatus","globalResults","localResults","globalChatIds","globalUserIds","localChatIds","localUserIds","byChatId","globalMessagesByChatId","dateSearchQuery","onSearchDateSelect","searchMessagesGlobal","setGlobalSearchChatId","shouldShowMoreLocal","setShouldShowMoreLocal","shouldShowMoreGlobal","setShouldShowMoreGlobal","handleLoadMore","LoadMoreDirection","Backwards","query","handleChatClick","handlePickerItemClick","MEMO_EMPTY_ARRAY","foundContactIds","fullName","getUserFullName","username","foundMessages","split","sort","a","b","handleClickShowMoreLocal","handleClickShowMoreGlobal","nothingFound","noScrollRestoreOnTop","noFastList","NothingFound","PickerSelectedItem","chatOrUserId","clickArg","createMapStateToProps","props","currentType","isVoice","theme","selectTheme","isLoading","searchChatId","handleSelectMedia","canRenderContents","useAsyncRendering","SLIDE_TRANSITION_DURATION","isMediaGrid","isMessageList","itemSelector","Media","idPrefix","getSenderName","senderName","isChatGroup","handleMessageFocus","shouldDrawDateDivider","toYearMonth","WebLink","onMessageClick","Document","withDate","datetime","smaller","onDateClick","openAudioPlayer","handlePlayAudio","Audio","onPlay","TABS","GlobalSearchContent","ChatList","Links","Files","Music","Voice","CHAT_TABS","slice","TRANSITION_RENDER_COUNT","keys","currentContent","setGlobalSearchContent","setGlobalSearchDate","activeTab","setActiveTab","parseDateString","handleSwitchTab","tab","content","handleSearchDateSelect","TabList","tabs","onSwitchTab","renderCount","useReducer","reducer","initialState","reducerRef","state","setState","action","currentState","INCLUDED_CHAT_TYPES","EXCLUDED_CHAT_TYPES","INCLUDE_FILTER_FIELDS","EXCLUDE_FILTER_FIELDS","selectChatFilters","mode","selectTemp","selectedChatIds","selectedChatTypes","includedChatIds","includeFilters","folder","excludedChatIds","excludeFilters","getSuggestedFolderName","filters","values","bots","groups","channels","contacts","nonContacts","INITIAL_STATE","chatFilter","foldersReducer","payload","isTouched","omit","folderId","currentPassword","password","hint","email","twoFaReducer","currentScreen","editedFolderId","onSaveFilter","signOut","deleteChatFolder","isSignOutDialogOpen","setIsSignOutDialogOpen","isDeleteFolderDialogOpen","setIsDeleteFolderDialogOpen","openSignOutConfirmation","closeSignOutConfirmation","openDeleteFolderConfirmation","closeDeleteFolderConfirmation","handleSignOutMessage","handleDeleteFolderMessage","SettingsMenuButton","SettingsScreens","EditProfile","General","Notifications","Privacy","Language","GeneralChatBackground","GeneralChatBackgroundColor","PrivacyPhoneNumber","PrivacyLastSeen","PrivacyProfilePhoto","PrivacyForwarding","PrivacyGroupChats","PrivacyPhoneNumberAllowedContacts","PrivacyLastSeenAllowedContacts","PrivacyProfilePhotoAllowedContacts","PrivacyForwardingAllowedContacts","PrivacyGroupChatsAllowedContacts","PrivacyPhoneNumberDeniedContacts","PrivacyLastSeenDeniedContacts","PrivacyProfilePhotoDeniedContacts","PrivacyForwardingDeniedContacts","PrivacyGroupChatsDeniedContacts","PrivacyActiveSessions","PrivacyBlockedUsers","TwoFaDisabled","TwoFaEnabled","TwoFaNewPassword","TwoFaChangePasswordNew","TwoFaChangePasswordConfirm","TwoFaNewPasswordConfirm","TwoFaNewPasswordHint","TwoFaChangePasswordHint","TwoFaNewPasswordEmail","TwoFaRecoveryEmail","TwoFaNewPasswordEmailCode","TwoFaRecoveryEmailCode","TwoFaCongratulations","TwoFaChangePasswordCurrent","TwoFaTurnOff","TwoFaRecoveryEmailCurrentPassword","Folders","FoldersCreateFolder","FoldersEditFolder","FoldersIncludedChats","FoldersExcludedChats","renderHeaderContent","confirmIsDestructive","currentUser","onScreenSelect","Main","formatPhoneNumberWithCode","phoneNumber","FloatingActionButton","buttonClassName","LINK_PREFIX_REGEX","USERNAME_REGEX","runDebouncedForCheckUsername","debounce","currentUsername","asLink","isUsernameAvailable","checkUsername","setUsername","langPrefix","usernameSuccess","usernameError","test","handleUsernameChange","newUsername","trim","isValid","isUsernameValid","success","readOnly","profileEdit","firstName","currentFirstName","lastName","currentLastName","fullInfo","bio","currentBio","currentAvatarHash","loadCurrentUser","updateProfile","isUsernameTouched","setIsUsernameTouched","isProfileFieldsTouched","setIsProfileFieldsTouched","setError","setPhoto","setFirstName","setLastName","setBio","currentAvatarBlobUrl","ProfileEditProgress","InProgress","isUsernameError","isSaveButtonShown","Complete","handlePhotoChange","newPhoto","handleFirstNameChange","handleLastNameChange","handleBioChange","handleProfileSave","trimmedFirstName","trimmedLastName","trimmedBio","AvatarEditable","UsernameInput","runThrottledForLoadRecommended","orderedIds","orderedFolderIds","foldersById","recommended","recommendedChatFolders","chatFolders","notifySettings","notifyExceptions","onCreateFolder","onEditFolder","loadRecommendedChatFolders","addChatFolder","showDialog","animationData","setAnimationData","isAnimationLoaded","setIsAnimationLoaded","handleAnimationLoad","getAnimationData","then","handleCreateFolder","data","userFolders","subtitle","getFolderDescriptionText","handleCreateFolderFromRecommended","AnimatedSticker","STICKER_SIZE_FOLDER_SETTINGS","noLoop","onLoad","pill","fluid","narrow","multiline","ShowMoreButton","count","itemName","itemPluralName","ERROR_NO_TITLE","ERROR_NO_CHATS","loadedActiveChatIds","loadedArchivedChatIds","dispatch","onAddIncludedChats","onAddExcludedChats","onBack","editChatFolder","isIncludedChatsListExpanded","setIsIncludedChatsListExpanded","isExcludedChatsListExpanded","setIsExcludedChatsListExpanded","includedChatTypes","excludedChatTypes","visibleIncludedChatIds","visibleExcludedChatIds","allLoadedChatsSet","Set","loadedIncludedChatIds","findIntersectionWithSet","loadedExcludedChatIds","listType","renderChats","visibleChatIds","isExpanded","leftChatsCount","clickHandler","chatType","find","typeKey","inactive","renderChatType","event","folderUpdate","selectedIds","filterValue","onSelectedIdsChange","onSelectedChatTypesChange","onFilterChange","chatTypes","shouldMinimize","hasMaxChats","handleItemClick","newSelectedIds","splice","handleChatTypeClick","newSelectedChatTypes","selectedType","isMinimized","canClose","Checkbox","checked","isSelected","withChatType","archivedPinnedIds","activeChatArrays","prepareChatList","archivedChatArrays","pinnedChats","otherChats","displayedIds","newFilter","handleSelectedIdsChange","ids","handleSelectedChatTypesChange","newFilters","forEach","shownScreen","handleReset","handleEditFolder","handleAddIncludedChats","handleAddExcludedChats","range","handleChange","trackWidth","possibleValuesLength","option","STICKER_SIZE_PICKER_HEADER","stickerSet","observeIntersection","isIntersecting","useIsIntersecting","mediaHash","lottieData","Lottie","shouldRenderFullMedia","useTransitionForMedia","getFirstLetters","hasThumbnail","sticker","noAnimate","onUnfaveClick","localMediaHash","stickerSelector","thumbnail","dataUri","previewBlobUrl","shouldPlay","isAnimated","markLoaded","unmarkLoaded","canAnimatedPlay","shouldRenderThumb","shouldRenderPreview","previewTransitionClassNames","fullClassName","emoji","data-sticker-id","isLowPriority","stickers","firstSticker","STICKER_SIZE_GENERAL_SETTINGS","ANIMATION_LEVEL_OPTIONS","stickerSetIds","added","setIds","stickerSetsById","setsById","messageTextSize","messageSendKeyCombo","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","shouldAutoPlayGifs","shouldAutoPlayVideos","shouldSuggestStickers","shouldLoopStickers","setSettingOption","loadStickerSets","loadAddedStickers","stickerSettingsRef","observe","observeIntersectionForCovers","useIntersectionObserver","rootRef","isModalOpen","openModal","closeModal","setSticker","KEYBOARD_SEND_OPTIONS","subLabel","IS_MAC_OS","handleAnimationLevelChange","newLevel","_","handleMessageTextSizeChange","newSize","documentElement","setProperty","handleStickerSetClick","stickerSets","installedDate","onCheck","isChecked","fromSticker","fileSelector","openSystemFilesDialog","accept","callback","noMultiple","setAttribute","removeAttribute","onchange","click","hex2rgb","param","parseInt","substring","rgb2hex","p0","p1","p2","rgb2hsb","r","g","h","s","v","hsb2rgb","f","p","q","t","getPatternColor","rgbColor","hue","saturation","wallpaper","slug","thumbRef","useCanvasBlur","isDownloadAllowed","setIsDownloadAllowed","fullMedia","wasDownloadDisabled","UPLOADING_WALLPAPER_SLUG","cacheKeyRef","handleSelect","blob","fetchBlob","cacheApi","CUSTOM_BG_CACHE_NAME","isAllowed","background","isBlurred","themes","loadedWallpapers","loadWallpapers","uploadWallpaper","setThemeSettings","themeRef","handleFileSelect","files","handleUploadWallpaper","handleSetColor","handleResetToDefault","backgroundColor","patternColor","DARK_THEME_PATTERN_COLOR","DEFAULT_PATTERN_COLOR","handleWallPaperSelect","currentWallpaper","async","defaultRGB","rgb","canvas","context","getContext","preloadImage","naturalHeight","naturalWidth","offsetWidth","drawImage","getImageData","blockSize","getAverageColor","handleWallPaperBlurChange","isUploading","DEFAULT_HSB","PREDEFINED_COLORS","hsb2positions","hsb","rects","colorPosition","colorRect","huePosition","hueRect","positions2hsb","colorPickerRef","huePickerRef","isFirstRunRef","setHsb","getInitialHsb","hsbRef","markIsDragging","unmarkIsDragging","rgbInput","setRgbInput","hexInput","setHexInput","rectsRef","colorCtxRef","offsetLeft","handleColorDrag","handleHueDrag","onCapture","onDrag","onRelease","withCursor","hex","hueHex","w","ctx","imgData","createImageData","pixels","col","perY","st","ed","perX","putImageData","drawColor","drawHue","handleRgbChange","rgbValue","channel","handleHexChange","hexValue","handlePredefinedColorClick","dataset","data-color","hasPrivateChatsNotifications","hasPrivateChatsMessagePreview","hasGroupNotifications","hasGroupMessagePreview","hasBroadcastNotifications","hasBroadcastMessagePreview","hasContactJoinedNotifications","loadNotificationSettings","updateContactSignUpNotification","updateNotificationSettings","handleSettingsChange","peerType","setting","currentIsSilent","currentShouldShowPreviews","shouldShowPreviews","handleContactNotificationChange","hasPassword","isSensitiveEnabled","canChangeSensitive","privacy","blocked","activeSessions","blockedCount","totalCount","sessionsCount","visibilityPrivacyPhoneNumber","visibility","visibilityPrivacyLastSeen","lastSeen","visibilityPrivacyProfilePhoto","profilePhoto","visibilityPrivacyForwarding","forwards","visibilityPrivacyGroupChats","chatInvite","loadPrivacySettings","loadBlockedContacts","loadAuthorizations","loadContentSettings","updateContentSettings","getVisibilityValue","languages","language","loadLanguages","selectedLanguage","setSelectedLanguage","markIsLoading","unmarkIsLoading","langCode","setLanguage","currentLangCode","navigator","toLowerCase","shortLangCode","substr","nativeName","buildOptions","loadingOption","getPrivacyKey","screen","privacySettings","allowUserIds","allowChatIds","blockUserIds","blockChatIds","setPrivacyVisibility","visibilityOptions","exceptionLists","shouldShowDenied","shouldShowAllowed","privacyKey","headerText","descriptionText","allowedContactsScreen","deniedContactsScreen","allowedCount","reduce","result","membersCount","blockCount","handleVisibilityChange","getLocation","session","region","country","getDeviceEnvironment","deviceModel","platform","systemVersion","terminateAuthorization","terminateAllAuthorizations","isConfirmTerminateAllDialogOpen","openConfirmTerminateAllDialog","closeConfirmTerminateAllDialog","handleTerminateSessionClick","handleTerminateAllSessions","currentSession","isCurrent","otherSessions","renderSession","handler","dateActive","appName","ip","sessions","chatsByIds","usersByIds","blockedIds","unblockContact","handleUnblockClick","contactId","viewportOffset","isPrivate","CHAT_HEIGHT_PX","renderContact","animatedEmoji","selectAnimatedEmoji","AnimatedEmoji","expectedPassword","submitLabel","clearError","validationError","setValidationError","shouldShowPassword","setShouldShowPassword","handleSubmit","newPassword","handleClearError","PasswordMonkey","isBig","isPasswordVisible","PasswordForm","onChangePasswordVisibility","onStart","FOCUS_DELAY_TIMEOUT_MS","shouldConfirm","setValue","isConfirmShown","markIsConfirmShown","unmarkIsConfirmShown","codeLength","twoFaSettings","waitingEmailCodeLength","newValue","updatePassword","checkPassword","clearTwoFaError","updateRecoveryEmail","provideTwoFaEmailCode","clearPassword","handleStartWizard","handleNewPassword","handleNewPasswordConfirm","handleNewPasswordHint","handleNewPasswordEmail","onSuccess","handleChangePasswordCurrent","handleChangePasswordNew","handleChangePasswordConfirm","handleChangePasswordHint","handleTurnOff","handleRecoveryEmailCurrentPassword","handleRecoveryEmail","handleEmailCode","code","itemIds","filterPlaceholder","notFoundText","searchInputId","getCurrentPrivacySettings","isAllowList","setPrivacySettings","selectedContactIds","setSearchQuery","isSubmitShown","setIsSubmitShown","newSelectedContactIds","setNewSelectedContactIds","handleSelectedContactIdsChange","contactsIds","TWO_FA_SCREENS","FOLDERS_SCREENS","PRIVACY_SCREENS","PRIVACY_PHONE_NUMBER_SCREENS","PRIVACY_LAST_SEEN_PHONE_SCREENS","PRIVACY_PROFILE_PHOTO_SCREENS","PRIVACY_FORWARDING_SCREENS","PRIVACY_GROUP_CHATS_SCREENS","shouldSkipTransition","foldersState","foldersDispatch","twoFaState","twoFaDispatch","handleSaveFilter","renderCurrentSection","isScreenActive","isFrom","currentKey","privacyAllowScreens","isTwoFaScreen","isFoldersScreen","isPrivacyScreen","renderCurrentSectionContent","LAYERS_ANIMATION_NAME","contactIds","serverTimeOffset","resultIds","sortUserIds","forceShowSelf","isSearching","selectedMemberIds","onSelectedMemberIdsChange","onNextStep","setGlobalSearchQuery","handleNextStep","creationProgress","creationError","chatCreation","memberIds","createGroupChat","createChannel","setTitle","about","setAbout","ChatCreationProgress","handleTitleChange","handleCreateGroup","handleCreateChannel","renderedError","RENDER_COUNT","LeftColumnContent","onContentChange","newChatMemberIds","setNewChatMemberIds","NewChannelStep2","NewGroupStep2","isStepActive","NewChannelStep1","NewGroupStep1","Archived","folderType","noChatsText","IGNORED_KEYS","Down","ArrowDown","Up","ArrowUp","ArrowLeft","ArrowRight","PageUp","PageDown","End","Home","Tab","preventDefaultForScrollKeys","HTMLElement","tagName","getAttribute","isTextBox","disableScrolling","passive","ontouchmove","onkeydown","enableScrolling","getCopyLabel","hasSelection","MessageContextMenu","anchor","canSendNow","canReschedule","canReply","canEdit","canPin","canUnpin","canForward","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","onReply","onEdit","onPin","onReport","onFaveSticker","onUnfaveSticker","onSend","onReschedule","onCloseAnimationEnd","onCopyLink","copyOptions","afterEffect","getMessageText","canImageBeCopied","CLIPBOARD_ITEM_SUPPORTED","selection","getSelection","mediaLoader","copyImageToClipboard","anchorNode","parentNode","clipboardText","copyTextToClipboard","getMessageCopyOptions","getTriggerElement","getRootElement","getMenuElement","positionY","useContextMenuPosition","Menu","noOptions","isScheduled","setReplyingToId","setEditingId","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","loadMessageLink","isMenuOpen","setIsMenuOpen","setIsDeleteModalOpen","setIsReportModalOpen","isPinModalOpen","setIsPinModalOpen","isCalendarOpen","openCalendar","closeCalendar","closeMenu","closePinModal","handleCloseCalendar","handleReply","handleEdit","handlePin","handleUnpin","handleFaveSticker","handleUnfaveSticker","handleSelectMessage","params","childMessageIds","withShift","handleScheduledMessageSend","handleOpenCalendar","handleRescheduleMessage","scheduledAt","handleCopyLink","reportMessageIds","scheduledMaxDate","getDayStartAt","selectStickerSet","stickerSetId","loadStickers","toggleStickerSet","sendMessage","throttleMs","isDisabled","stickerSetAccessHash","isPreloadedGlobally","handleButtonClick","hasCloseButton","STICKER_SIZE_MODAL","isRestricted","canDeleteChat","getCanDeleteChat","canSubscribe","canSearch","canMute","canLeave","onSubscribeChannel","onSearchClick","updateChatMutedState","enterMessageSelectMode","handleToggleMuteClick","handleSubscribe","handleSearch","handleSelectMessages","Portal","runDebouncedForSearch","results","selectCurrentTextSearch","isHistoryCalendarOpen","setLocalTextSearchQuery","searchTextMessagesLocal","closeLocalTextSearch","openHistoryCalendar","focusedIndex","setFocusedIndex","visualViewport","mainEl","pageTop","Array","from","input","div","contentEditable","handleMessageSearchQueryChange","newQuery","handleUp","newFocusIndex","handleDown","SearchInput","findInViewport","selectorOrElements","margin","isDense","shouldContainBottom","isHorizontal","viewportY1","viewportY2","allElements","visibleIndexes","isFound","y1","y2","isFullyVisible","onInsertUserName","filteredChatMembers","getSelectedIndex","newIndex","cycleRestrict","selectedMentionIndex","setSelectedMentionIndex","handleArrowKey","handleUserSelect","forceFocus","handleSelectMention","member","onUp","onDown","onTab","first","position","fastSmoothScroll","setItemVisible","prevChatMembers","renderedChatMembers","attachments","caption","canSuggestMembers","groupChatMembers","recentEmojis","emojiKeywords","onCaptionUpdate","addRecentEmoji","loadEmojiKeywords","onFileAppend","onClear","hideTimeoutRef","prevAttachments","renderingAttachments","isHovered","markHovered","unmarkHovered","isQuick","every","quick","isMentionTooltipOpen","mentionFilter","closeMentionTooltip","insertMention","mentionFilteredMembers","useMentionTooltip","EDITABLE_INPUT_MODAL_ID","isEmojiTooltipOpen","closeEmojiTooltip","filteredEmojis","insertEmoji","useEmojiTooltip","sendAttachments","handleFilesDrop","dataTransfer","newFiles","file","CONTENT_TYPES_FOR_QUICK_UPLOAD","areAllPhotos","mimeType","areAllVideos","renderHeader","onDragEnter","onDrop","onDragOver","onDragLeave","relatedTarget","toTarget","fromTarget","data-attach-description","attachment","File","filename","extension","getFileExtension","previewData","emojis","onEmojiSelect","MessageInput","isAttachmentModalInput","html","editableInputId","onUpdate","shouldSetFocus","questionInputRef","optionsListRef","solutionRef","question","setQuestion","setOptions","isAnonymous","setIsAnonymous","isMultipleAnswers","setIsMultipleAnswers","isQuizMode","setIsQuizMode","solution","setSolution","correctOption","setCorrectOption","hasErrors","setHasErrors","focusInput","solutionEl","innerHTML","addNewOption","newOptions","list","scrollHeight","scrollTo","behavior","handleCreate","questionTrimmed","optionsTrimmed","o","summary","answers","correct","isPublic","multipleChoice","quiz","entities","parseMessageInput","correctAnswers","solutionEntities","updateOption","removeOption","handleCorrectOptionChange","handleIsAnonymousChange","handleMultipleAnswersChange","handleQuizModeChange","handleKeyPress","keyCode","getQuestionError","getOptionsError","renderOptions","onKeyPress","renderQuizNoOptionError","hidden","closeTimeout","useMouseInside","menuCloseTimeout","isMouseInside","native","names","IS_EMOJI_SUPPORTED","loading","category","allEmojis","useOnIntersect","emojisPerRow","ceil","displayedEmoji","ICONS_BY_CATEGORY","recent","people","nature","foods","activity","places","objects","symbols","flags","categoryIntersections","emojiDataPromise","emojiRawData","emojiData","headerRef","categories","setCategories","setEmojis","activeCategoryIndex","setActiveCategoryIndex","entries","entry","intersectingWithIndexes","newLeft","HEADER_BUTTON_WIDTH","fastSmoothScrollHorizontal","allCategories","themeCategories","unshift","exec","default","uncompressEmoji","ensureEmojiData","selectCategory","categoryEl","handleEmojiSelect","MENU_TRANSITION_DURATION","containerClassName","faded","STICKER_MARGIN","loadAndPlay","onStickerSelect","onStickerUnfave","stickersPerRow","STICKER_SIZE_PICKER","stickerSetIntersections","favorite","recentStickers","favoriteStickers","addedSetIds","canSendStickers","loadRecentStickers","loadFavoriteStickers","addRecentSticker","activeSetIndex","setActiveSetIndex","areAddedLoaded","allSets","noPopulatedSets","set","stickerSetEl","handleStickerSelect","handleStickerUnfave","gif","videoData","shouldRenderVideo","preload","savedGifs","gifs","saved","canSendGifs","onGifSelect","loadSavedGifs","debounceMs","SymbolMenuTabs","SYMBOL_MENU_TAB_TITLES","SYMBOL_MENU_TAB_ICONS","Emoji","Stickers","GIFs","onRemoveSymbol","onSearchOpen","renderTabButton","handleSearchOpen","isActivated","isLeftColumnShown","allowedAttachmentOptions","setRecentEmojis","handleMouseEnter","handleMouseLeave","fastRaf","recentEmojisRef","renderContent","onMouseEnter","onMouseLeave","noCloseOnBackdrop","onFileSelect","onPollCreate","handleQuickSelect","handleDocumentSelect","canAttachMedia","canAttachPolls","autoClose","forEmoji","clearStickersForEmoji","prevStickers","displayedStickers","clickInlineButton","keyboardButtons","row","button","onSilentSend","onScheduleSend","listEmojis","usePrevDuringAnimation","selectedIndex","setSelectedIndex","emojisCount","handleSelectEmoji","onLeft","onRight","messagesById","foundResults","senderUser","getGlobal","senderChat","forwardInfo","isChannelPost","orderBy","preloadBackwards","LastMessageMeta","selectShouldLoopStickers","isSomeModalOpen","onModalToggle","isAdded","areStickersLoaded","useOnChange","coverStickerIds","covers","otherStickers","handleAddClick","canRenderStickers","STICKER_SIZE_SEARCH","selectCurrentStickerSearch","featured","featuredIds","loadFeaturedStickers","setIsModalOpen","selectCurrentGifSearch","isChatWithBot","selectIsChatWithBot","searchMoreGifs","setGifSearchQuery","getAllowedAttachmentOptions","handleGifClick","hasResults","answer","voters","offsets","pollResults","offset","answerVote","totalVoters","loadPollOptionResults","closePollResults","prevVotersCount","votersCount","setIsLoading","areVotersLoaded","limit","shouldResetVoters","handleViewMoreClick","handleMemberClick","noStatusOrTyping","leftVotersCount","renderViewMoreButton","total","getMessagePoll","resultsByOption","buildCollectionByKey","management","updateContact","deleteUser","deleteHistory","closeManagement","isDeleteDialogOpen","openDeleteDialog","closeDeleteDialog","isNotificationsEnabled","setIsNotificationsEnabled","ManagementProgress","handleNotificationChange","handleDeleteContact","withFullInfo","hasLinkedChannel","linkedChatId","isBasicGroup","canChangeInfo","getHasAdminRight","canBanUsers","togglePreHistoryHidden","updateChat","deleteChat","leaveChannel","deleteChannel","currentTitle","currentAbout","imageHash","handleClickEditType","ManagementScreens","ChatPrivacyType","handleClickDiscussion","Discussion","handleClickPermissions","GroupPermissions","handleClickAdministrators","ChatAdministrators","handleSetPhoto","handleAboutChange","handleUpdateGroup","trimmedTitle","trimmedAbout","handleClickMembers","GroupMembers","handleTogglePreHistory","isPreHistoryHidden","isEnabled","enabledPermissionsCount","defaultBannedRights","sendStickers","sendGifs","adminsCount","adminMembers","handleDeleteGroup","isCreator","formatInteger","onChatMemberSelect","updateChatDefaultBannedRights","permissions","setPermissions","havePermissionChanged","setHavePermissionChanged","handleRemovedUsersClick","GroupRemovedUsers","handleAddExceptionClick","GroupUserPermissionsCreate","handleExceptionMemberClick","promotedByUserId","GroupUserPermissions","handlePermissionChange","getUpdatedPermissionValue","handleSavePermissions","bannedRights","removedUsersCount","kickedMembers","exceptionMembers","members","getMemberExceptions","langKey","getLangKeyForBannedRightKey","translatedString","sendMessages","blocking","sendMedia","sendPolls","embedLinks","inviteUsers","pinMessages","changeInfo","updateChatMemberBannedRights","removedMembers","getRemovedBy","kickedByUserId","kickedByUser","getContextActions","isSignaturesShown","toggleSignatures","hasLinkedChat","handleUpdateChannel","handleToggleSignatures","handleClickSubscribers","ChannelSubscribers","handleDeleteChannel","selectManagement","checkPublicLink","updatePublicLink","updatePrivateLink","privateLink","inviteLink","privacyType","setPrivacyType","isRevokeConfirmDialogOpen","openRevokeConfirmDialog","closeRevokeConfirmDialog","canUpdate","handleOptionChange","handleSave","handleRevokePrivateLink","langPrefix1","langPrefix2","SafeLink","forDiscussionIds","linkedChat","loadGroupsForDiscussion","linkDiscussionGroup","unlinkDiscussionGroup","linkedGroupId","setLinkedGroupId","isConfirmUnlinkGroupDialogOpen","openConfirmUnlinkGroupDialog","closeConfirmUnlinkGroupDialog","isConfirmLinkGroupDialogOpen","openConfirmLinkGroupDialog","closeConfirmLinkGroupDialog","handleUnlinkGroupSessions","channelId","Initial","handleLinkGroupSessions","renderLinkGroupHeader","linkedGroup","renderLinkGroupConfirmText","hasPrivateLink","STICKER_SIZE_DISCUSSION_GROUPS","teactFastList","teactOrderKey","isButtonsInOneRow","isPromotedByCurrentUser","isFormFullyDisabled","selectedChatMemberId","isBanConfirmationDialogOpen","openBanConfirmationDialog","closeBanConfirmationDialog","selectedChatMember","handleBanFromGroup","viewMessages","getControlIsDisabled","isOwner","handleAdminMemberClick","ChatAdminRights","getMemberStatus","promotedByUser","GroupRecentActions","updateChatAdmin","setIsTouched","isDismissConfirmationDialogOpen","openDismissConfirmationDialog","closeDismissConfirmationDialog","customTitle","setCustomTitle","adminRights","handleDismissAdmin","memberStatus","handleCustomTitleChange","postMessages","editMessages","banUsers","addAdmins","anonymous","maxLength","openUserInfo","memberId","managementType","selectCurrentManagementType","CURRENCIES","USD","EUR","GBP","JPY","RUB","UAH","INR","AED","getCurrencySign","currency","VISA","MASTERCARD1","MASTERCARD2","CardType","cards","Default","Visa","Mastercard","detectCardType","cardNumber","streetLine1","streetLine2","city","countryIso2","postCode","phone","shipping","cardholder","expiry","cvv","billingCountry","billingZip","saveInfo","saveCredentials","formErrors","getBillingCountry","countryCode","countryList","useFocusAfterAnimation","animationDuration","hasArrow","labelText","htmlFor","needEmail","needPhone","needName","needAddress","phoneRef","selectCountryRef","handleAddress1Change","handleAddress2Change","handleCityChange","handleStateChange","handleCountryChange","handlePostCodeChange","handleFullNameChange","handleEmailChange","handlePhoneChange","handleSaveInfoChange","shippingOptions","handleShippingSelect","amount","renderPaymentItem","main","renderCheckoutItem","invoiceContent","prices","shippingPrices","checkoutInfo","totalPrice","photoUrl","paymentMethod","paymentProvider","shippingAddress","shippingMethod","item","expiryInputRef","charAt","parts","formatCardExpiry","cardNumberRef","cardType","setCardType","newCardType","formatCardNumber","cardIcon","mastercardIconPath","visaIconPath","getCardIcon","canSaveCredentials","needCardholderName","needCountry","needZip","handleCardNumberChange","handleCardholderChange","toUpperCase","handleExpiryChange","handleCvvChange","handleBillingPostCodeChange","handleChangeSaveCredentials","savedInfo","invoice","nativeProvider","nativeParams","passwordMissing","payment","isProviderError","nameRequested","phoneRequested","emailRequested","shippingAddressRequested","flexible","phoneToProvider","emailToProvider","globalDialogs","validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError","paymentState","paymentDispatch","currencySign","field","fieldError","errors","getShippingErrors","handleErrorModalClose","PaymentStep","Checkout","shippingOption","getShippingPrices","totalPrices","concat","acc","cur","getTotalPrice","detectCardTypeText","findShippingOption","getCheckoutInfo","validateRequest","requestInfo","getRequestInfo","sendCredentials","credentials","expiryMonth","expiryYear","zip","getCredentials","sendForm","shippingOptionId","setStep","nextStep","ShippingInfo","Shipping","PaymentInfo","buttonText","cuurentStep","renderModalContent","renderError","optionId","receipt","mapedPrices","info","totalAmount","credentialsTitle","fullAddress","ANIMATED_STICKERS_PATHS","MonkeyIdle","MonkeyTracking","MonkeyClose","MonkeyPeek","FoldersAll","FoldersNew","DiscussionGroups","path","location","cropperResultOptions","quality","format","circle","Croppie","croppiePromise","cropper","isCroppieReady","setIsCroppieReady","imgFile","cropContainer","enableZoom","boundary","viewport","blobToDataUri","bind","err","DEBUG","console","initCropper","ensureCroppie","croppedImg","blobToFile","selectedFile","setSelectedFile","croppedBlobUrl","setCroppedBlobUrl","labelClassName","URL","revokeObjectURL","createObjectURL","SEGMENT_COVER_EYES","SEGMENT_UNCOVER_EYE","SEGMENT_COVER_EYE","STICKER_SIZE","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_AUTH","closeMonkeyData","setCloseMonkeyData","peekMonkeyData","setPeekMonkeyData","isFirstMonkeyLoaded","setIsFirstMonkeyLoaded","isPeekShown","setIsPeekShown","handleFirstMonkeyLoad","STICKER_SIZE_TWO_FA","playSegment","onInputChange","setPassword","canSubmit","setCanSubmit","select","autoComplete","MIN_PASSWORD_LENGTH"],"mappings":"4mEAeO,SAASA,EACdC,EACAC,EACAC,EACAC,EACAC,EACAC,GAEA,MAAQC,QAASC,GAAcC,EAASP,EAAQI,GAChD,IAAKE,EACH,OAGF,MAAQE,MAAOC,GAAgBC,IAAWC,OAExCH,MAAOI,EAAgBC,OAAQC,GAC7BC,YAAkChB,EAAWI,IACzCK,MAAOQ,EAASH,OAAQI,GAAaC,YAC3CN,EAAgBE,EAAiBZ,EAAWM,MAAON,EAAWW,QAE1DM,GAAUV,EAAcO,GAAW,EACnCI,EAgPR,SAAsBrB,GACpB,MAAMsB,EAAMC,OAAOC,WAAWC,KAC9B,IAAIC,EAAe,MACf1B,IACF0B,GAAgBJ,EAAIK,QAAU,KAAQ,OAGxC,OAAOD,EAAeE,IAvPRC,CAAa7B,IAAce,EAAkBG,GAAY,EAEvE,IACEY,IAAKC,EAASC,KAAMC,EAAUxB,MAAOyB,EAAWpB,OAAQqB,GACtD5B,EAAU6B,wBAEd,GAAI,CACFC,IAAkBC,YAClBD,IAAkBE,MAClBF,IAAkBG,eAClBH,IAAkBI,cAClBC,SAASzC,GAAS,CAClB,MAAM0C,EAwLV,SAAiBC,EAAmBC,EAAoBf,EAAaE,EAAcvB,EAAeK,GAChG,GAAI8B,IAAcC,EAAY,CAC5B,MAAMC,EAAOC,KAAKC,IAAIvC,EAAOK,IAAW8B,EAAYC,GACpDb,IAASc,EAAOrC,GAAS,EACzBqB,IAAQgB,EAAOhC,GAAU,EACzBL,EAAQqC,EACRhC,EAASgC,OACJ,GAAIF,EAAYC,EAAY,CACjC,MAAMI,EAAWxC,EAEjBuB,KADAvB,EAAQK,GAAU8B,EAAYC,IACbI,GAAY,OACxB,GAAIJ,EAAaD,EAAW,CACjC,MAAMM,EAAYpC,EAElBgB,KADAhB,EAASL,GAASoC,EAAaD,IACdM,GAAa,EAGhC,MAAO,CACLpB,MAAKE,OAAMvB,QAAOK,UA1MAqC,CAAQlC,EAASC,EAAUa,EAASE,EAAUC,EAAWC,GAC3EJ,EAAUY,EAAUb,IACpBG,EAAWU,EAAUX,KACrBE,EAAYS,EAAUlC,MACtB0B,EAAaQ,EAAU7B,OAGzB,MAAMsC,EAAkBnB,EAAWC,EAAY,GAAMd,EAASH,EAAU,GAClEoC,EAAkBtB,EAAUI,EAAa,GAAMd,EAAQH,EAAW,GAClEoC,EAAapB,EAAYjB,EACzBsC,EAAapB,EAAajB,EAE1BsC,EAAQC,EAAYvD,GAAiBK,GAC3CmD,EAAYF,EAAO,CACjB1B,IAAQT,EAAF,KACNW,KAASZ,EAAF,KACPX,MAAUQ,EAAF,KACRH,OAAWI,EAAF,KACTyC,UAAY,eAAcP,QAAqBC,iBAA8BC,MAAeC,OAE9FK,EAAWJ,EAAOvD,GAElB4D,SAASC,KAAKC,UAAUC,IAAI,mBAE5BC,sBAAsB,KACpBJ,SAASC,KAAKI,YAAYV,GAE1BS,sBAAsB,KACpBT,EAAMW,MAAMR,UAAY,GA0R9B,SAAoBH,GACjBA,EAAMY,WAA2BD,MAAME,UAAY,UACpDb,EAAMO,UAAUO,OAAO,kBAAmB,UA3RtCC,CAAWf,GAEXgB,WAAW,KACTP,sBAAsB,KAChBJ,SAASC,KAAKW,SAASjB,IACzBK,SAASC,KAAKY,YAAYlB,GAE5BK,SAASC,KAAKC,UAAUO,OAAO,sBAvEd,IAyEGK,SAKvB,SAASC,EAAe3E,EAA2BC,EAAuBG,GAC/E,MAAM,UAAEwE,EAAWvE,QAASwE,GAAYtE,EAASP,EAAQI,GACzD,IAAKyE,EACH,OAGF,MAAMvE,EAAYsD,SAASkB,eAAe,eAAgBC,cACxD,0EAEF,IAAKzE,IAAcuE,EACjB,OAGF,MACEhD,IAAKC,EAASC,KAAMC,EAAUxB,MAAOyB,EAAWpB,OAAQqB,GACtD5B,EAAU6B,yBAEZN,IAAKmD,EAAWjD,KAAMZ,EAAQX,MAAOQ,EAASH,OAAQI,GACpD4D,EAAQ1C,wBAEZ,IAAIf,EAAQ4D,EACZ,IA8IF,SAA6BC,GAC3B,GAAyB,SAArBA,EAAGf,MAAMgB,QACX,OAAO,EAGT,MAAMC,EAAOF,EAAG9C,yBACRtB,OAAQuE,GAAiB1E,IAAWC,MAE5C,OAAQwE,EAAKtD,KAAOuD,GAAmBD,EAAKtD,IAAMsD,EAAKtE,QAAW,EAtJ7DwE,CAAoBT,GAAY,CACnC,MAAQ/D,OAAQuE,GAAiB1E,IAAWC,MAC5CS,EAAQ4D,EAAYlD,GAAWb,EAAWmE,EAG5C,MAAMjC,EAAkBnB,EAAWC,EAAY,GAAMd,EAASH,EAAU,GAClEoC,EAAkBtB,EAAUI,EAAa,GAAMd,EAAQH,EAAW,GACxE,IAAIoC,EAAapB,EAAYjB,EACzBsC,EAAapB,EAAajB,EAE9B,MAAMqE,EACJ,CAAClD,IAAkBmD,OAAQnD,IAAkBoD,iBAAiB/C,SAASzC,KACnEyF,EAA2Bb,EAAWC,IAE1C,CAACzC,IAAkBE,MAAOF,IAAkBG,gBAAgBE,SAASzC,KACjEyF,EAA2Bb,EAAWC,GAGxC,CACFzC,IAAkBC,YAClBD,IAAkBE,MAClBF,IAAkBG,eAClBH,IAAkBI,cAClBC,SAASzC,KACLqD,EAAaC,EACfD,EAAaC,EACJA,EAAaD,IACtBC,EAAaD,IAIjB,MAAMqC,EAAgB9B,SAAS+B,uBAAuB,SAAS,GAEzDpC,EAAQmC,GAAiBlC,EAAYvD,GAAiB4E,EAAS7E,IAAWoC,IAAkBwD,eAC7FF,GACHjC,EAAYF,EAAO,CACjB1B,IAAQT,EAAF,KACNW,KAASZ,EAAF,KACPX,MAAUQ,EAAF,KACRH,OAAWI,EAAF,KACTyC,UAAY,eAAcP,QAAqBC,iBAA8BC,MAAeC,OAIhGU,sBAAsB,KACpB,GAAI0B,EAAe,CACjB,MAAM,IACJ7D,EADI,KAEJE,EAFI,MAGJvB,EAHI,OAIJK,GACE6E,EAAcvD,wBAIlBsB,EAAYF,EAAO,CACjBsC,WAAY,OACZhE,IAAQT,EAAF,KACNW,KAASZ,EAAF,KACP2E,gBAAiB,WACjBpC,UAAY,eAAc3B,EAAOZ,QAAaU,EAAMT,iBARvCZ,EAAQQ,MACRH,EAASI,KAQtBT,MAAUQ,EAAF,KACRH,OAAWI,EAAF,OAGb2C,SAASC,KAAKC,UAAUC,IAAI,mBACvB2B,GAAe9B,SAASC,KAAKI,YAAYV,GAE9CS,sBAAsB,KAChB0B,IACFA,EAAcxB,MAAM2B,WAAa,IAGnCtC,EAAMW,MAAMR,UAAY,GAEpB4B,IACF/B,EAAMW,MAAM6B,QAAU,KAGxBpC,EAAWJ,EAAOvD,GAElBuE,WAAW,KACTP,sBAAsB,KAChBJ,SAASC,KAAKW,SAASjB,IACzBK,SAASC,KAAKY,YAAYlB,GAE5BK,SAASC,KAAKC,UAAUO,OAAO,sBAzLd,IA2LGK,SAK9B,SAASlB,EAAYwC,EAAsDC,GAA0B,GACnG,MAAM1C,EAAQK,SAASsC,cAAc,OACrC3C,EAAMO,UAAUC,IAAI,SAEpB,MAAMoC,EAAM,IAAIC,MAYhB,GAVsB,iBAAXJ,EACTG,EAAIE,IAAML,EACDA,aAAkBM,iBAC3BH,EAAIE,IAAML,EAAOO,OAEjBJ,EAAIE,IAAML,EAAOK,IAGnB9C,EAAMU,YAAYkC,GAEdF,EAAyB,CAC3B1C,EAAMO,UAAUC,IAAI,eACpB,MAAMyC,EAAc5C,SAASmB,cAAc,mCACvCyB,GACFjD,EAAMU,YAAYuC,EAAYC,WAAU,IAI5C,OAAOlD,EAoCT,SAASkC,EAA2Bb,EAAwB8B,GAC1D,MAAMC,EAAqB/C,SAASmB,cAA8B,0BAClE,IAAI6B,EAAehC,EAAUiC,UAAYH,EAAQI,QAAwB,4BAA6BD,UAKtG,OAJIjC,EAAUmC,GAAGtE,SAAS,kBACxBmE,GAAgBhC,EAAUoC,cAAeH,UAAYjC,EAAUkC,QAAwB,YAAaD,WAG/FD,EAAeD,EAAmBM,WACpCL,EAAeF,EAAQQ,aAAeP,EAAmBM,UAAYN,EAAmBO,aAa/F,SAASzD,EAAY0D,EAAsBC,GACzCC,OAAOC,OAAOH,EAAQjD,MAAOkD,GAG/B,SAAS7G,EAASP,EAA2BI,GAC3C,IAAImH,EACAC,EAEJ,OAAQxH,GACN,KAAKoC,IAAkBE,MACvB,KAAKF,IAAkBG,eACrBgF,EAAqB,uCAAsCnH,EAAS2G,GACpES,EAAgB,cAChB,MAEF,KAAKpF,IAAkBC,YACrBkF,EAAqB,gBAAenH,EAAS2G,GAC7CS,EAAgB,MAChB,MAEF,KAAKpF,IAAkBI,aACrB+E,EAAqB,gBAAenH,EAAS2G,GAC7CS,EAAgB,MAChB,MAEF,KAAKpF,IAAkBqF,mBACrBF,EAAoB,kCACpBC,EAAgB,mBAChB,MAEF,KAAKpF,IAAkBwD,cACrB2B,EAAoB,kDACpBC,EAAgB,mBAChB,MAEF,KAAKpF,IAAkBoD,gBACvB,KAAKpD,IAAkBmD,OACvB,QACEgC,EAAqB,kCAAiCnH,EAAS2G,GAC/DS,EAAgB,4DAGpB,MAAM5C,EAAYhB,SAASmB,cAA2BwC,GAChDG,EAAW9C,GAAaA,EAAU+C,iBAAsDH,GAE9F,MAAO,CACL5C,YACAvE,QAASqH,GAAYA,EAASA,EAASE,OAAS,IAIpD,SAASjE,EAAWJ,EAAuBvD,GACzC,OAAQA,GACN,KAAKoC,IAAkBE,MACvB,KAAKF,IAAkBG,eACvB,KAAKH,IAAkBmD,OACvB,KAAKnD,IAAkBoD,gBACrBjC,EAAMO,UAAUC,IAAI,mBACpB,MAEF,KAAK3B,IAAkBC,YACvB,KAAKD,IAAkBwD,cACvB,KAAKxD,IAAkBI,aACpBe,EAAMY,WAA2BD,MAAME,UAAY,QACpD,MAEF,KAAKhC,IAAkBqF,mBACrBlE,EAAMO,UAAUC,IAAI,W,sFC1RX8D,kBACb,CAACC,GAAUC,SAAQC,YAAWC,eAC5B,GAAIA,GAAYF,EACd,MAAO,CACLG,OAAQC,aAAcJ,GAAUK,aAAWN,EAAQC,GAAUM,YAAWP,EAAQC,IAIpF,IAAKC,IAAcD,EACjB,MAAO,GAGT,MAAM3H,EAAUkI,YAAkBR,EAAQC,EAAQC,GAElD,MAAO,CACL5H,UACA8H,OAAQ9H,GAAWmI,aAAaT,EAAQ1H,KAG5C,CAACoI,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,mBAAoB,iBAnB7DZ,CApC+C,EAC5DE,SAAQC,YAAWE,SAAQD,WAAU7H,UAASuI,mBAAkBC,mBAEhE,MAAMC,EAAqBC,YAAY,KACrCH,IACAC,EAAa,CAAEb,SAAQC,eACtB,CAACD,EAAQa,EAAcZ,EAAWW,IAE/BI,EAAOC,cAEb,IAAKd,IAAY9H,IAAY6H,EAC3B,OAGF,MAAMgB,EAAaf,EAAOnB,GAAK,EACzBmC,EAAcC,YAAeJ,EAAMb,GAEzC,OACE,yBAAKkB,UAAU,aAAaC,QAASR,GAClCI,EACC,kBAACK,EAAA,EAAD,CAAQC,IAAKrB,EAAOnB,GAAIlE,KAAK,SAAS2G,KAAMtB,IAE5C,kBAACoB,EAAA,EAAD,CAAQC,IAAKrB,EAAOnB,GAAIlE,KAAK,SAAS4G,KAAMvB,IAE9C,yBAAKkB,UAAU,QACb,yBAAKA,UAAU,QAAQM,IAAI,QACxBR,GAAeS,YAAWT,IAE7B,yBAAKE,UAAU,OAAOM,IAAI,QACvBzB,EAAWc,EAAK,+BAAiCa,YAAoBb,EAAsB,IAAhB3I,EAASyJ,W,yCCqGhFC,MAzI0B,EACvCC,YACA5J,UACA6J,WACA5J,UACA6J,WACAhC,WACAiC,qBACAC,YACAC,mBAEA,MAAM,kBACJC,EADI,iBAEJC,EAFI,oBAGJC,GACEC,YACFpK,GAAWD,EAAUsK,YAAoBrK,EAAS,iBAAcsK,EAChET,GAGIlB,EAAOC,cAEP2B,EAA8DC,YAAQ,IACnE,EAAGC,YAAWC,YACnB,kBAACC,EAAA,EAAD,CACEC,OAAK,EACLnI,KAAK,UACLoI,MAAM,cACN7B,UAAW0B,EAAS,cAAWJ,EAC/BrB,QAASwB,EACTK,UAAU,gBAEV,uBAAG9B,UAAU,eAGhB,IAEH,OAAI+B,IAEA,yBAAK/B,UAAU,6BACb,kBAACgC,EAAA,EAAD,CACEC,QAASV,EACTW,UAAU,UAERrD,GACA,kBAACsD,EAAA,EAAD,CACEC,KAAK,UACLnC,QAASc,GAERpB,EAAK,YAGT5I,EACC,kBAACoL,EAAA,EAAD,CACEC,KAAMnB,EAAoB,QAAU,WACpChB,QAASkB,GAERF,EAAuBvH,KAAKkI,MAAyB,IAAnBV,GAAb,mBAAyD,YAGjF,kBAACiB,EAAA,EAAD,CACEC,KAAK,WACLC,KAAM1B,EACN2B,SAAUzB,GAETlB,EAAK,uBAIXsB,GAAqB,kBAACsB,EAAA,EAAD,CAAiBC,SAAUtB,EAAkBzH,KAAK,IAAIgJ,SAAO,KAMvF,yBAAKzC,UAAU,uBACXnB,GACA,oCACE,kBAAC8C,EAAA,EAAD,CACEC,OAAK,EACLnI,KAAK,UACLoI,MAAM,oBACNC,UAAWnC,EAAK,WAChBM,QAASc,GAET,uBAAGf,UAAU,mBAIlBjJ,EACC,kBAAC4K,EAAA,EAAD,CACEC,OAAK,EACLnI,KAAK,UACLoI,MAAM,oBACNC,UAAWnC,EAAK,qBAChBM,QAASkB,GAERF,EACC,kBAACsB,EAAA,EAAD,CAAiBC,SAAUtB,EAAkBzH,KAAK,IAAIwG,QAASkB,IAE/D,uBAAGnB,UAAU,mBAIjB,kBAAC2B,EAAA,EAAD,CACEU,KAAM1B,EACN2B,SAAUzB,EACVe,OAAK,EACLnI,KAAK,UACLoI,MAAM,oBACNC,UAAWnC,EAAK,sBAEhB,uBAAGK,UAAU,mBAGjB,kBAAC2B,EAAA,EAAD,CACEC,OAAK,EACLnI,KAAK,UACLoI,MAAM,oBACNC,UAAWlB,EAAW,WAAa,UACnCX,QAASe,GAET,uBAAGhB,UAAWY,EAAW,gBAAkB,kBAE7C,kBAACe,EAAA,EAAD,CACEC,OAAK,EACLnI,KAAK,UACLoI,MAAM,oBACNC,UAAWnC,EAAK,SAChBM,QAASa,GAET,uBAAGd,UAAU,kB,qBC5FN0C,MAhDyB,EACtCC,OAAO,GAAIC,WAAUC,aAAY5C,cAEjC,MAAO6C,EAAaC,GAAkBC,aAAS,GAC/CC,YAAU,KACR,MAAMC,EAAgB1I,SAASmB,cAAc,kCAEvCwH,EAAmB,KACvB,MAAM1L,EAASyL,EAAgBA,EAAcE,aAAe,EAE5DL,EAAetL,EAAe,EAANc,MAI1B4K,IAEA,MAAME,EAAeC,YAASH,EAzBP,KAyB6C,GAIpE,OAFAjL,OAAOqL,iBAAiB,SAAUF,GAAc,GAEzC,KACLnL,OAAOsL,oBAAoB,SAAUH,GAAc,KAEpD,IAQH,MAAMI,EAAaC,YACjB,oBACAb,GAAc,eACdD,GAAY,aAGd,OACE,yBAAK5C,UAAWyD,EAAYxD,QAb9B,SAAmB0D,GACbhB,GACFgB,EAAEC,oBAYDjB,GACC,yBAAK3C,UAAU,8BAA8BC,QAAU8B,SAAoCT,EAAVrB,GAC/E,uBAAGD,UAAY,6BAA2B8C,EAAc,YAAc,IAAMxC,IAAI,QAAQqC,M,iBClDlG,MAAMkB,EA8EN,WACE,QAA0C,IAA/BrJ,SAASsJ,kBAClB,MAAO,oBACF,QAA6C,IAAlCtJ,SAASuJ,qBACzB,MAAO,uBACF,QAAgD,IAArCvJ,SAASwJ,wBACzB,MAAO,0BAGT,MAAO,GAvFIC,G,sBCVb,MAAMC,GAAQ,CAAC,QAAS,KAAM,KAAM,KAAM,KAAM,MAEhCC,WACd,MAAMC,EAAmB,IAAVD,EAAc,EAAIzK,KAAK2K,MAAM3K,KAAK4K,IAAIH,GAASzK,KAAK4K,IAAI,OAEvE,MAAQ,IAAGH,EAAQ,MAAQzK,KAAK2K,MAAMD,IAASG,QAAQ,MAAML,GAAME,M,OCuBrE,MAAMI,GAAab,IACjBA,EAAEC,mBA4IWa,OAvIyB,EACtCC,mBACAC,cACAC,WACAC,WACAC,iBACAC,uBACAC,WACAC,wBACAC,eACAC,qBACAC,cACAC,aAEA,MAAOC,EAAWC,GAAiBvC,aAAS,GAE5CC,YAAU,KACJ6B,GACFS,EAAcT,IAEf,CAACA,IAEJ7B,YAAU,KACR,IAAIuC,EAYJ,OAVKV,IACC/C,IACFwD,GAAc,GAEdC,EAAUtN,OAAOiD,WAAW,KAC1BoK,GAAc,IAhCS,MAqCtB,KACDC,GACFtN,OAAOuN,aAAaD,KAGvB,CAACV,IAEJ7B,YAAU,MACJqC,GAAaR,IACftK,SAASC,KAAKC,UAAUC,IAAI,0BAGvB,KACLH,SAASC,KAAKC,UAAUO,OAAO,4BAEhC,CAAC6J,EAAgBQ,IAEpB,MAAM3F,EAAOC,cA4Cf,IAAwB8F,EAA2BC,EA1CjD,GAAKL,GAAcR,EAInB,OACE,yBAAK9E,UAAY,wBAAsB+E,EAAuB,SAAW,IAAM9E,QAASuE,IA6C5F,SAAwBG,EAAqBC,EAAkBF,EAA0BW,GACvF,MAAMO,EAAoBjB,EAAcC,EAAY,IAC9CiB,EAAwC,IAAnBnB,EAE3B,OACE,yBAAK1E,UAAU,mBACb,yBAAKA,UAAU,yBACb,yBACEA,UAAU,2BAEVlF,MAAQ,UAAS+K,GAAsB,OAEzC,yBACE7F,UAAU,yBAEVlF,MAAQ,UAAS8K,GAAoB,OAEvC,2BACEE,IAAI,IACJnM,IAAI,MACJoM,KAAM,IACNC,KAAK,QACLC,QAASZ,EACTrF,UAAU,wBACVkG,MAAON,GAAoB,MApE9BO,CAAexB,EAAaC,EAAUF,EAAkBW,GACzD,kBAAC1D,EAAA,EAAD,CACEG,UAAWnC,EAAK,iBAChBlG,KAAK,OACL2M,QAASrE,IACTF,MAAM,oBACN7B,UAAU,OACVC,QAASmF,GAET,uBAAGpF,UAAWgF,EAAW,aAAe,eAmBhD,SAAoBL,EAAqBC,GACvC,OACE,yBAAK5E,UAAU,eACX,GAAEqG,YAAoB1B,QAAkB0B,YAAoBzB,MApB7D0B,CAAW3B,EAAaC,GACxBF,EAAmB,IAwBFgB,EAxBsBhB,EAwBKiB,EAxBad,EA0B5D,yBAAK7E,UAAU,oBACX,GAAEuG,GAAeZ,EAAYD,QAAwBa,GAAeZ,OA1BrEV,GACC,kBAACtD,EAAA,EAAD,CACEG,UAAU,aACVrI,KAAK,OACLoI,MAAM,oBACN7B,UAAU,aACVC,QAASkF,GAET,uBAAGnF,UAAY,IAAEkF,EAAe,mBAAqB,wB,wNC2FhDsB,mBA/KmB,EAChCC,MACAC,QACAC,aACAC,aACA1F,mBACA2D,WACAgC,oBACAC,SACAC,cAGA,MAAMC,EAAWC,YAAyB,OACnCjC,EAAUkC,GAAelE,aAAUmE,MAAiBC,MACpDzC,EAAa0C,GAAkBrE,YAAS,IACxCsE,EAAmBC,GAAwBvE,aAAS,IAEpDkC,EAAcsC,EAAeC,GHpCvB,SAA6BC,EAAgBR,GAC1D,MAAOhC,EAAcyC,GAAmB3E,YAAS4E,QAAQ/D,GAAQrJ,SAASqJ,KAoE1E,OA9BAgE,YAAgB,KACd,MAAMC,EAAW,KAAQH,EAAgBC,QAAQ/D,GAAQrJ,SAASqJ,MAC5DkE,EAAgB,KAAQJ,GAAgB,IACxCK,EAAe,KACnBL,GAAgB,GAChBT,GAAY,IAERe,EAAQP,EAAMQ,QAWpB,OATA1N,SAAS+I,iBAAiB,mBAAoBuE,GAAU,GACxDtN,SAAS+I,iBAAiB,yBAA0BuE,GAAU,GAC9DtN,SAAS+I,iBAAiB,sBAAuBuE,GAAU,GAEvDG,IACFA,EAAM1E,iBAAiB,wBAAyBwE,GAAe,GAC/DE,EAAM1E,iBAAiB,sBAAuByE,GAAc,IAGvD,KACLxN,SAASgJ,oBAAoB,mBAAoBsE,GAAU,GAC3DtN,SAASgJ,oBAAoB,yBAA0BsE,GAAU,GACjEtN,SAASgJ,oBAAoB,sBAAuBsE,GAAU,GAC1DG,IACFA,EAAMzE,oBAAoB,wBAAyBuE,GAAe,GAClEE,EAAMzE,oBAAoB,sBAAuBwE,GAAc,MAIlE,IAEEnE,GAAyB,QAAjBsE,IAIN,CAACjD,EAtEc,KACfwC,EAAMQ,UAAarE,GAAyB,QAAjBsE,OAI5BT,EAAMQ,QAAQE,kBAChBV,EAAMQ,QAAQE,oBACLV,EAAMQ,QAAQG,wBACvBX,EAAMQ,QAAQG,0BACLX,EAAMQ,QAAQI,sBACvBZ,EAAMQ,QAAQI,wBACLZ,EAAMQ,QAAQK,sBACvBb,EAAMQ,QAAQK,uBAGhBZ,GAAgB,KAGK,KAChBD,EAAMQ,UAIP1N,SAASiN,eACXjN,SAASiN,iBACAjN,SAASgO,oBAClBhO,SAASgO,sBACAhO,SAASiO,uBAClBjO,SAASiO,yBACAjO,SAASkO,sBAClBlO,SAASkO,uBAGXf,GAAgB,MAkCT,EAAC,GGlC4CgB,CAAoB3B,EAAUE,IAE9E,WAAE0B,EAAF,iBAAclE,EAAd,kBAAgCmE,GAAsBC,eAE1DC,aAAcC,EACdC,qBAAsBC,GACpBC,aAAmBP,OAAYtH,OAAWA,EAAW,QAEzD2B,YAAU,KACJ6D,IAAWD,EACbG,EAASkB,QAASkB,QACT3C,IAAQU,KAIjBkC,YAASrC,EAASkB,UAEnB,CAACpB,EAAQD,EAAmBJ,IAE/BxD,YAAU,KACJ+D,EAASkB,QAASvD,cAAgBqC,EAASkB,QAAStD,UACtDyC,EAAe,GACfH,GAAY,IAEZG,EAAeL,EAASkB,QAASvD,cAElC,CAACA,IAEJ,MAAM2E,EAAkB5J,YAAaiE,IACnCA,EAAEC,kBACEoB,GACFgC,EAASkB,QAASkB,QAClBlC,GAAY,KAEZF,EAASkB,QAASqB,OAClBrC,GAAY,KAEb,CAAClC,IAEJwE,YAAgBxC,EAAU,IAE1B,MAAMyC,EAAkB/J,YAAY,KAClC6H,GAAqB,IACpB,IAEGmC,EAAiBhK,YAAY,KACjC6H,GAAqB,IACpB,IAEGoC,EAAmBjK,YAAaiE,IACpC0D,EAAe1D,EAAEiG,cAAcjF,cAC9B,IAEGkF,EAAcnK,YAAY,KAC9B2H,EAAe,GACfH,GAAY,IACX,IAEG4C,EAAyBpK,YAAY,KACrCwF,GAAgBuC,EAClBA,KACUvC,GAAgBsC,GAC1BA,KAED,CAACC,EAAgBvC,EAAcsC,IAE5BuC,EAAarK,YAAaiE,IAC9BA,EAAEC,kBAEFoD,EAASkB,QAASvD,YAAeqF,OAAOrG,EAAEsG,OAAO/D,OAASc,EAASkB,QAAStD,SAAY,KACvF,IAEGsF,EAAiBxK,YAAaiE,IAClCA,EAAEC,kBACF2D,GAAsBD,IACrB,CAACA,IAEJrE,YAAU,KACR,MAAMkH,EAA4BxG,IAClB,UAAVA,EAAExD,KAA6B,MAAVwD,EAAExD,MACzBwD,EAAEyG,iBACFd,EAAgB3F,KAMpB,OAFAnJ,SAAS+I,iBAAiB,UAAW4G,GAA0B,GAExD,KACL3P,SAASgJ,oBAAoB,UAAW2G,GAA0B,KAEnE,CAACb,IAEJ,MAAMe,EAAezD,GAAe,UAASA,EAAWxP,oBAAoBwP,EAAWnP,WACjF6S,EAAc,yBAAwB3D,KAE5C,OACE,yBACE3G,UAAU,cACVC,SAAUyG,GAAS3E,IAA0BmI,OAAiB5I,EAC9DiJ,YAAc7D,OAA0BpF,EAAlBmI,EACtBe,WAAa9D,OAAyBpF,EAAjBoI,GAErB,yBAEE5O,MAAOuP,GAGP,8BACEI,IAAKzD,EACL0D,SAAUvD,IACVwD,aAAW,EACXC,KAAMlE,EAENmE,MAAOnE,EACP/I,GAAG,qBAEH7C,MAAOwP,EACPQ,QAASjB,EACT5J,QAAU8B,SAA4CT,EAAlBgI,EACpCyB,cAAejB,GAEXjB,EAdN,CAeEmC,aAAcrB,IAEblD,GAAO,4BAAQxJ,IAAKwJ,MAGxBuC,GACC,yBAAKhJ,UAAW,CAAC,oBAAqBkJ,GAAmB+B,KAAK,OAC1DrC,GAAc,yBAAK5I,UAAU,aAAf,gBAChB,kBAACuC,EAAA,EAAD,CACE9I,KAAK,KACL+I,SAAUoG,EAAa,EAAI1H,EAC3BgK,QAAM,EACNjL,QAAS8G,MAIbL,IAAUsC,GACV,kBAAC,GAAD,CACEhE,SAAUA,EACVN,iBAAkBA,EAClBC,YAAaA,EACbM,sBAAuB2C,QAAQJ,GAC/BtC,aAAcA,EACdL,SAAUA,EACVD,SAAUoC,EAASkB,QAAUlB,EAASkB,QAAQtD,SAAW,EACzDE,gBAAiBE,GAAYsC,EAC7BvC,qBAAsB6B,GAAcA,EAAWxP,MAvKpB,IAwK3BiO,OAAQ0E,EACR5E,mBAAoB2E,EACpB1E,YAAakE,O,OC1ER9C,mBArGoB,EAAG2E,UAASC,mBAC7C,MAAM,qBAAEnC,GAAyBE,YAAkBgC,GAC7CE,EAAcC,YAAqBH,GAEnCI,EAAWtE,YAAyB,OACnCuE,EAAWC,GAAgBzI,YAAS,GACrC0I,EAAYzE,aAAgB,GAElChE,YAAU,KACJkI,IAAYE,GACdI,EAZmB,MAcpB,CAACN,EAASE,IAEb,MAYMM,EAAkBjM,YAAY,KAClCgM,EAAUxD,SAAU,GACnB,IAEG0D,EAAiBlM,YAAY,KACjCgM,EAAUxD,SAAU,EACF,IAAdsD,GACFJ,EAAaI,GAAYE,EAAUxD,UAEpC,CAACkD,EAAcI,IAMlBvI,YAAU,KACRmI,EAAaI,GAAYE,EAAUxD,UAClC,CAACsD,EAAWJ,IAEf,MAAMzL,EAAOC,cAEPI,EAAY0D,YAChB,eACAuF,GAGF,OACE,yBAAKjJ,UAAWA,GACd,kBAAC2B,EAAA,EAAD,CACEkK,SA3DsB,IA2DZL,EACV/R,KAAK,OACLoI,MAAM,oBACNC,UAAWnC,EAAK,WAChBK,UAAU,WACVoG,QAASrE,IACT9B,QA/CgB,KAChBsL,EAASrD,SACXuD,EAAa/R,KAAKC,IApBM,EAoBc6R,EAAY,OA+ChD,uBAAGxL,UAAU,mBAEf,kBAAC2B,EAAA,EAAD,CACEkK,SAvEsB,IAuEZL,EACV/R,KAAK,OACLoI,MAAM,oBACNC,UAAU,UACV9B,UAAU,UACVoG,QAASrE,IACT9B,QApDe,KACfsL,EAASrD,SACXuD,EAAa/R,KAAKoM,IA3BM,EA2Bc0F,EAAY,OAoDhD,uBAAGxL,UAAU,kBAEf,yBAAKA,UAAU,YACb,yBAAKA,UAAU,kBACb,yBACEA,UAAU,kBAEVlF,MAAQ,UApFK,IAoFK0Q,EAAY,QAEhC,2BACEf,IAAKc,EACLzF,IAzFkB,EA0FlBnM,IA3FkB,EA4FlBoM,KAAK,MACLG,MAAOsF,EACPxF,KAAK,QACLhG,UAAU,iBACV8L,SAtDoBnI,IAC5B8H,EAAa/R,KAAKoM,IA3CQ,EA2CYpM,KAAKC,IAAIqQ,OAAOrG,EAAEsG,OAAO/D,OA1CrC,MAgGlB6F,YAAaJ,EACbK,UAAWJ,S,OCrFvB,MAAMK,GAAiB,CACrB,EAAG,EAAG,EAAG,EAAG,EAAG,GAGXC,GAAe,CACnBC,EAAG,EACHC,IAAK,IACLC,EAAG,IACHC,IAAK,IACLC,EAAG,KAyKU/F,mBA1Ie,EAC5BgG,WACAxM,YACAyM,SACAC,SACAlB,YACAmB,YACAC,YACAC,YAEA,MAAMC,EAAiBZ,GAAaV,IAA2CA,GACxEuB,EAAYC,GAAiBhK,aAAkB,IAC/CiK,EAAUC,GAAelK,YAAoB,CAClDmK,GAAIR,EAAWS,GAAIR,EAAWS,EAAG,EAAGC,EAAG,KAGlCC,EAAYC,GAAiBxK,YAAmBiJ,IAGjDwB,EAAgBxG,YAAuB,MAGvCyG,EAAkBzG,YAAuB,MAE/ChE,YAAU,KACR,MAAM0K,EAAeb,GAAkBS,EAAW,GAC5CK,EAAWjB,GAAaY,EAAW,GACnCM,EAAWjB,GAAaW,EAAW,GAEnCO,EAAgB,IAAIP,GACtBA,EAAW,KAAOI,IACpBG,EAAc,GAAKH,GAAgBG,EAAc,GACjDA,EAAc,GAAKH,GAAgBG,EAAc,IAE/CP,EAAW,KAAOK,IACpBE,EAAc,GAAKF,GAEjBL,EAAW,KAAOM,IACpBC,EAAc,GAAKD,GAGhBE,YAAqBR,EAAYO,IACpCN,EApEN,SAAiCQ,EAAkBT,EAAsBU,GACvE,MAAMC,EAAQD,GAAWA,EAAQtS,cAAc,eAC/C,IAAKsS,IAAYC,EACf,OAAOX,EAET,MAAMY,EAAcF,EAAQlV,wBACtBqV,EAAYF,EAAMnV,wBAElBsV,EAAeD,EAAUhX,MAAQ4W,EAAYT,EAAW,GACxDe,EAAgBF,EAAU3W,OAASuW,EAAYT,EAAW,GAC1DgB,GAAWJ,EAAY/W,MAAQiX,GAAe,EAAId,EAAW,GAC7DiB,GAAWL,EAAY1W,OAAS6W,GAAgB,EAAIf,EAAW,GAYrE,OAXIY,EAAY/W,OAAS+W,EAAY/W,MAdhB,IAcyCmX,EAC5DhB,EAAW,IAAMgB,EAAUJ,EAAY/W,MAfpB,IAgBViX,GAAeA,EAAcE,EAhBnB,MAiBnBhB,EAAW,IAAMc,EAAcE,EAjBZ,KAmBjBJ,EAAY1W,QAAU0W,EAAY1W,OAnBjB,IAmB2C+W,EAC9DjB,EAAW,IAAMiB,EAAUL,EAAY1W,OApBpB,IAqBV6W,GAAgBA,EAAeE,EArBrB,MAsBnBjB,EAAW,IAAMe,EAAeE,EAtBb,KAyBdjB,EA6CWkB,CAAwBlB,EAAW,GAAIO,EAAeL,EAAcvF,WAGnF,CAACyE,EAAWC,EAAWE,IAE1B7J,YAAU,KACHyJ,GACHc,EAAcvB,KAEf,CAACS,IAEJzJ,YAAU,KACJyK,EAAgBxF,UAClBwF,EAAgBxF,QAAQpN,MAAMR,UAAa,UAASiT,EAAWmB,gBAEhE,CAACjC,EAAQc,IA2DZ,OAAId,EACKD,EAIP,yBACE/B,IAAKgD,EACLzN,UAAY,gBAAcA,GAAa,IACvC+L,YAjEqBpI,IACvB,IAAK+I,EACH,OAGF/I,EAAEC,kBACFD,EAAEyG,iBAEF,MAEMuE,EAAyB,CAC7BxB,GAHcI,EAAW,GAIzBH,GAHcG,EAAW,GAIzBF,EAAG1J,EAAEiL,MACLtB,EAAG3J,EAAEkL,OAEP3B,EAAYyB,GACZ3B,GAAc,GAEVS,EAAcvF,SAChBuF,EAAcvF,QAAQxN,UAAUC,IAAI,SA8CpCqR,UA1CkB,KACpBgB,GAAc,GAEVS,EAAcvF,SAChBuF,EAAcvF,QAAQxN,UAAUO,OAAO,QAGrC4R,GACFA,EAAMU,EAAW,GAAIA,EAAW,KAmChCuB,YArBqBnL,IACvB,GAAIoJ,EAAY,CACd,MAAMe,EAZV,SAA0BT,EAAWC,GACnC,MAAMQ,EAAgB,IAAIP,GACpBwB,EAAS9B,EAASI,EAAIA,EACtB2B,EAAS/B,EAASK,EAAIA,EAI5B,OAHAQ,EAAc,GAAKb,EAASE,GAAK4B,EACjCjB,EAAc,GAAKb,EAASG,GAAK4B,EAE1BlB,EAKiBmB,CAAiBtL,EAAEiL,MAAOjL,EAAEkL,OAClDrB,EAAcM,GAEVJ,EAAgBxF,UAClBwF,EAAgBxF,QAAQpN,MAAMR,UAAa,UAASiT,EAAWmB,kBAiBjE,yBACEjE,IAAKiD,EACL1N,UAAU,iBAETwM,M,OCiZT,SAAS0C,GAAYC,EAAkBC,EAA2BC,GAChE,OAAOF,EAEH,yBACElS,IAAKkS,EACLG,IAAI,GAEJxU,MAAOsU,EAAa,UAASA,EAAUhY,UAAY,GACnDmY,UAAW3H,QAAQyH,KAIrB,yBACErP,UAAU,kBAEVlF,MAAOsU,EAAa,UAASA,EAAUhY,UAAY,IAEnD,kBAACoY,EAAA,EAAD,CAAS3N,MAAM,WAKR2E,mBAAK/H,YACjBC,IACC,MAAM,OACJC,EADI,SACI8Q,EADJ,UACc7Q,EADd,cACyB8Q,EADzB,kBACwCC,EADxC,OAC2D/Y,GAC7D8H,EAAOkR,aACL,eACJC,GACEnR,EAAOoR,SAASC,MAEpB,GAAInZ,IAAWoC,IAAkBI,aAAc,CAC7C,IAAMuF,IAAUC,EACd,MAAO,CAAEiR,kBAGX,MAAM7Y,EAAUkI,YAAkBR,EAAQC,EAAQC,GAClD,OAAK5H,EAIE,CACL2H,SACAC,YACAoR,SAAUhZ,EAAQgZ,SAClBpZ,SACAI,UACA6Y,kBATO,CAAEA,kBAab,GAAIH,EAAe,CAGjB,MAAO,CACL9Q,WAAY,EACZoR,SAAUN,EACVO,YALajR,aAAWN,EAAQgR,IAAkBzQ,YAAWP,EAAQgR,GAMrEC,kBAAmBA,GAAqB,EACxCE,iBACAjZ,UAIJ,KAAM+H,GAAU8Q,GAAY7Q,GAC1B,MAAO,CAAEiR,kBAGX,IAAI7Y,EAWAkZ,EAOAC,EAXJ,GALEnZ,EADEJ,GAAU,CAACoC,IAAkBG,eAAgBH,IAAkBoD,iBAAiB/C,SAASzC,GACjFwZ,aAAuB1R,EAAQC,EAAQC,GAEvCM,YAAkBR,EAAQC,EAAQC,IAGzC5H,EACH,MAAO,CAAE6Y,kBAYX,GANEK,EADEtZ,GAAU,CAACoC,IAAkBG,eAAgBH,IAAkBoD,iBAAiB/C,SAASzC,GAC5EyZ,aAAwB3R,EAAQC,GAEhC2R,YAAmB5R,EAAQC,GAIxC/H,IAAWoC,IAAkBmD,QAAUvF,IAAWoC,IAAkBE,MACtEiX,EAAgBI,aAAkB7R,EAAQC,EAAQ8Q,IAAae,YAAgB9R,EAAQC,EAAQ8Q,QAC1F,GAAI7Y,IAAWoC,IAAkBC,YAAa,CACnD,MAAMwX,EAAgBC,YAAyBhS,IACzC,SAAEiS,GAAcF,GAAiBA,EAAcG,eAAiBH,EAAcG,cAAcC,OAAU,GAC5GV,EAAgBQ,EAGlB,MAAO,CACLhS,SACA8Q,WACA7Q,YACAoR,SAAUhZ,EAAQgZ,SAClBpZ,SACAI,UACAkZ,eACAC,gBACAN,mBAGJ,CAACzQ,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,kBAAmB,mBAAoB,kBAAmB,iBAvF1CZ,CAthBgC,EAClDE,SACA8Q,WACA7Q,YACAoR,WACApZ,SACAqZ,cACAN,oBACA3Y,UACAkZ,eACAC,gBACAW,kBACAvR,mBACAwR,kBACAvR,eACAqQ,qBAEA,MAAMnO,EAASkG,QAAQqI,GAAerR,GAEhCoS,EAAoBpa,IAAWoC,IAAkBC,YACjDgY,EAAera,IAAWoC,IAAkBI,aAG5C8X,EAAQla,EAAUma,YAAgBna,QAAWsK,EAC7C2G,EAAQjR,EAAUoa,YAAgBpa,QAAWsK,EAC7C+P,EAAera,EAAUsa,YAAuBta,QAAWsK,EAC3DiQ,EAAeva,EAAUwa,YAAuBxa,QAAWsK,EAC3DmQ,IAAkBza,GAAU0a,aAAuB1a,GACnD2a,IAAkB3a,GAAU4a,aAAuB5a,GACnDD,EAAU6Q,QAAQK,GAASsJ,GAAgBI,GAC3CE,EAAUjK,SAAS7Q,IAAYma,GAASG,GAAgBI,KACxD,MAAE/K,IAAUuB,GAASsJ,GAAgB,GACrC1S,GAAW+I,QAAQqI,GAGnB6B,GAAgBlK,QAAQyJ,GAAgBE,GACxCQ,GAAavQ,YAAQ,IAClBsQ,IAAiBlT,EACpB,CAACA,GACDoT,YAAuB9B,GAAgB,GAAIC,GAAiB,GAAIa,GACnE,CAACc,GAAelT,EAAWsR,EAAcC,EAAea,IAErDiB,GAA4BrT,EAAYmT,GAAWG,QAAQtT,IAAc,EACzEuT,GAAwC,IAA9BF,KAAkE,IAA/BA,GAC7CG,GAASH,KAA8BF,GAAWvT,OAAS,IAAoC,IAA/ByT,GAGhEI,GAAepL,cACfqL,GAAehH,YAAgC0E,IACjDtO,GAAY4Q,IAAgBA,KAAiBtC,GAAaqC,GAAanK,UACzEmK,GAAanK,QAAU+J,IAEzB,MAAMM,GAAiB1C,GAAkB,EAAI,WAAa,OACpD2C,GAAqC,IAAnB3C,EAAuB,aAAe,OACxD4C,GAAsC,IAAnB5C,GAGlB6C,GAAgBC,IAAqB3P,aAAkB,IACvD4P,GAAgBC,IAAqB7P,aAAS,IAC9CpC,GAAUkS,IAAe9P,aAAkB,IAC3CwI,GAAWC,IAAgBzI,YAAiB,IAC5C+P,GAAUC,IAAehQ,YAAS,CAAEqK,EAAG,EAAGC,EAAG,IAGpD,SAAS2F,GAAaC,GACpB,GAAIrU,SAAkCyC,IAAtBqO,EAAiC,CAC/C,MAAM,OAAEwD,GAAWlD,EACnB,OAAOkD,GAAUA,EAAOxD,GACnB,QAAOwD,EAAOxD,GAAmBhS,YAClCyV,YAAkBnD,EAAciD,EAAS,MAAQ,UAGvD,OAAOlc,GAAWqK,YAAoBrK,EAASkc,EAAS,aAAe,iBAGzE,MAAMG,GAAmBC,YACvBtc,IAAYga,GAAqBC,IAAiB5P,YAAoBrK,EAAS,kBAC/EsK,EACAiS,iBAAeC,aACflS,EACAmR,IAlFuB,KAoFnBgB,GAAmBR,KACnBS,GAAiBJ,YACrBG,QACAnS,EACAzC,IAAY4U,IAAoBA,GAAiBE,WAAW,gBACxDJ,iBAAeK,QACfL,iBAAeC,aACnBlS,EACAmR,IA5FuB,MA8FjB9R,UAAWkT,GAAb,iBAA4B3S,IAAqB4S,YACrDb,IAAa,QACb3R,EACAtK,GAAW+c,YAAsB/c,EAAS,mBAC1CsK,EACAmR,IAnGuB,KAsGnBuB,GAAgB9C,GAASjJ,GAAUiJ,GAASjJ,GAAQkH,aAAU7N,EACpE,IAAIzK,IAAkBE,IAAYid,IAAgBH,KAAmBH,IAAkBL,GACvF,MAAMY,GAAeC,aAAard,IAAiBG,GAAWmd,YAA4Bnd,IACrFH,IAAiBD,IAAWoC,IAAkBI,eACjDvC,GAAgBod,IAGlB,MAAMG,GAAYpd,EAAUqd,YAAmBrd,QAAWsK,EACpDT,GAAW7J,EACbsd,YAAmBtd,GACnB6H,GACG,SAAQoR,EAAatS,MAAMgS,aAC5BrO,EAEN,IAAIxK,GACAE,EACEya,GAAmBE,EACrB7a,GAAayd,YAAmBvd,GAAUwd,UACjCtD,GAASG,EAClBva,GAAa2d,YAAwBvD,GAASG,IACrCpJ,GAASsJ,KAClBza,GAAa4d,aAAoBzM,GAASsJ,IAG5Cza,GAAa6d,IAGf1R,YAAU,KACHlB,KAILvH,SAASC,KAAKC,UAAUka,OAAO,uBAAwBlT,IACtD,CAACA,IAEJ,MAAMmT,GAAcC,cACpB7R,YAAU,KACR,MAAMhL,EAAMC,OAAOC,WAAWC,KAO9B,MANoC,mBAAzBH,EAAIsL,iBACbtL,EAAIsL,iBAAiB,SAAUsR,IACK,mBAApB5c,EAAI8c,aACpB9c,EAAI8c,YAAYF,IAGX,KACkC,mBAA5B5c,EAAIuL,oBACbvL,EAAIuL,oBAAoB,SAAUqR,IACK,mBAAvB5c,EAAI+c,gBACpB/c,EAAI+c,eAAeH,MAGtB,CAACA,KAEJ,MAAMI,GAAc3J,YAAoCtU,GAClDke,GAAa5J,YAAY1U,GACzBue,GAAkB7J,YAA2C2E,GAC7DmF,GAAoB9J,YAAYzU,IACtCoM,YAAU,KACR,GAAIwP,IAAoB/Q,IAAWuT,KAAgBE,GAAiB,CAClEE,YAjKqB,IAiK4B/Z,KACjD,MAAMga,EAAYte,EAAUue,YAAkBve,QAAWsK,EAEzD5K,EADkBkR,QAAQ0N,GACA1e,EAASC,GAAgBC,GAAYC,EAASC,GAGtEyb,KAAqB/Q,IAAWuT,IAAeE,MACjDE,YAxKqB,IAwK4B/Z,KACjDC,EAAe2Z,GAAaE,GAAoBH,SAAe3T,KAEhE,CACDmR,GAAkB/Q,EAAQ9K,EAAQse,GAAYle,EAASie,GAAaE,GACpEte,GAAeue,GAAmBte,GAAYC,IAGhDkM,YAAU,KACR,IAAIuS,EAUJ,OARI5U,GACFiS,IAAkB,GAElB2C,EAAQtd,OAAOiD,WAAW,KACxB0X,IAAkB,IAvLC,KA2LhB,KACD2C,GACFtd,OAAOuN,aAAa+P,KAGvB,CAAC5U,KAEJ,MAAM6U,GAAY,KAChB3C,IAAY,GACZrH,GAAa,GACbuH,GAAY,CAAE3F,EAAG,EAAGC,EAAG,KAGnBoI,GAAmBhW,YAAY,KACnCoT,IAAalS,IACb6K,GAAc7K,GAAiB,EAAN,KACrBA,IACFoS,GAAY,CAAE3F,EAAG,EAAGC,EAAG,KAExB,CAAC1M,KAEE+U,GAAkBjW,YAAY,CAACkW,EAAeC,GAAe,KACjEpK,GAAamK,GACC,IAAVA,GAAeC,GACjBJ,MAED,IAEGK,GAAQpW,YAAY,KACxBH,IACAkW,MACC,CAAClW,IAEEwW,GAAoBrW,YAAY,KACpCoW,KACAtW,EAAa,CAAEb,SAAQ8Q,WAAU7Q,eAChC,CAACkX,GAAOnX,EAAQ8Q,EAAUjQ,EAAcZ,IAErCoX,GAAgBtW,YAAY,KAChCqR,EAAgB,CAAEkF,WAAYtX,EAAQoT,WAAY,CAACnT,KACnD6W,MACC,CAAC1E,EAAiBpS,EAAQC,IAE7BqE,YAAU,IAAOvB,EAASwU,YAAsB,KAC1CtV,GACF6U,KAEAK,YAECxU,EAAY,CAACwU,GAAOpU,EAAQd,KAEjCqC,YAAU,KACJlM,IAAY2P,IACdyP,eAED,CAACzP,GAAO3P,IAGXkM,YAAU,KACR,GAAKvB,EAML,OAFApK,IAAW8e,iBAEJ,KACL9e,IAAW+e,kBAEZ,CAAC3U,IAEJ,MAAM4U,GAAe5W,YAAY,CAAC6W,EAAgBC,KAChD,IAAIC,EAAQ1E,GAAWG,QAAQqE,GAK/B,QAJoB,IAAfC,GAAoBC,EAAQ,GAAqB,IAAdD,GAAmBC,EAAQ1E,GAAWvT,OAAS,KACrFiY,GAASD,GAGJzE,GAAW0E,IACjB,CAAC1E,KAEE2E,GAAsBhX,YAAY,KAClCyS,IAIJrB,EAAgB,CACdnS,SACA8Q,WACA7Q,UAAWA,EAAY0X,GAAa1X,GAAY,QAAK0C,EACrD1K,YAED,CAAC+H,EAAQ8Q,EAAU6G,GAAcnE,GAASvT,EAAWkS,EAAiBla,IAEnE+f,GAAkBjX,YAAY,KAC9B0S,IAIJtB,EAAgB,CACdnS,SACA8Q,WACA7Q,UAAWA,EAAY0X,GAAa1X,EAAW,QAAK0C,EACpD1K,YAED,CAAC+H,EAAQ8Q,EAAU6G,GAAclE,GAAQxT,EAAWkS,EAAiBla,IAExEqM,YAAU,KACR,MAAM2T,EAAiBjT,IACrB,OAAQA,EAAExD,KACR,IAAK,OACL,IAAK,YACHuW,KACA,MAEF,IAAK,QACL,IAAK,aACHC,OAON,OAFAnc,SAAS+I,iBAAiB,UAAWqT,GAAe,GAE7C,KACLpc,SAASgJ,oBAAoB,UAAWoT,GAAe,MAK3D3T,YAAU,KACR,MAAMlF,EAAUvD,SAASmB,cAA8B,sDACvD,IAAKoC,EACH,OAGF,MAAM8Y,EAAqBnQ,KAAUU,IAErC,OAAO0P,YAAc/Y,EAAS,CAE5BgZ,wBAA0B,oEAAmEF,EAAwC,GAAnB,kBAClH5W,QAAS,KACFW,IAAauG,KAChB2O,MAGJkB,QAAS7P,IAAe,CAACxD,EAAG6S,KACtBA,IAAcS,IAAeC,MAC/BR,KACSF,IAAcS,IAAeE,KACtCR,KACWhT,EAAEsG,QAAWtG,EAAEsG,OAAuBvM,QAAQ,uBACzDoY,WAEAxU,KAEL,CAACwU,GAAOpD,GAAgBhM,GAAOmL,EAASjR,GAAU+V,GAAiBD,KAEtE,MAAMU,GAAY1X,YAAY,CAAC2N,EAAWC,KACxC0F,GAAY,CAAE3F,IAAGC,OAChB,IAEG+J,GAA+B3X,YAAY,KAC3CyH,MAAiB0K,GAAWnL,KAC9BiM,IAAmBD,KAEpB,CAACA,GAAgBhM,GAAOmL,IAErBlS,GAAOC,cAUb,SAAS0X,GAAYC,GACnB,GAAI1Y,GACF,OACE,yBAAKsB,IAAKxB,EAAQqB,UAAU,wBACzBkP,GACC2E,IAAiBH,GACjB8D,YAA+B7C,KAAwB,IACtD5S,MAA4BnB,KAI9B,GAAI5J,EAAS,CAClB,MAAMse,EAAYC,YAAkBve,GAC9BL,EAAYiR,QAAQ0N,GAE1B,OACE,yBACEnV,IAAKvB,EACLoB,UAAY,yBAAuBrJ,EAAY,aAAe,IAC9DsJ,QAASoX,IAERxF,GAAW3C,GACV8E,IAAgBH,IAAiBH,IAAkBL,GACnDrc,GAAWwgB,YAA+B1gB,GAAaH,IACtDoL,MAA4BnB,IAE9B7J,GACC,kBAAC,GAAD,CACEoJ,IAAKvB,EACL6H,IAAKuN,IAAgBH,GACrBnN,MAAOA,GACPC,WAAY9P,GACZ+P,WAAY5P,GAAWwgB,YAA+B1gB,GAAaH,GAAW,GAC9EuK,iBAAkBA,GAClB2D,SAAUuP,GACVvN,kBAAmBnF,EACnBoF,QAASyQ,EACTxQ,QAAS+O,KAGZR,GACC,kBAAC,EAAD,CACE3S,KAAM2S,EACNrV,QAAS8V,GACTnT,SAAU8P,MAAoB3b,GAAW2P,IACzC7D,WAAY9L,IAAY2P,OAUpC,SAAS+Q,KACP,OAAO5Y,GACL,kBAAC,EAAD,CACEsB,IAAK8P,EAAatS,GAClBgB,OAAQsR,EAAatS,GACrBkB,UAAQ,IAGV,kBAAC,EAAD,CACEsB,IAAKvB,EACLD,OAAQA,EACRC,UAAWA,IAKjB,OA/EA8Y,YAAehW,EAAQnC,EAAkBuR,EAAiB,CACxDnS,SACA8Q,WACA7Q,YACAhI,SACA8Y,cAAeO,GAAeA,EAAYtS,KA2E1C,kBAACga,EAAA,EAAD,CACEha,GAAG,cACHqC,UAAWY,GAAW,SAAW,GACjCc,OAAQA,GAEP,IACC,oCACE,yBAAK1B,UAAU,oBAAoBM,IAAKX,GAAKiY,MAAQ,WAAQtW,GAC1DS,KACC,kBAACJ,EAAA,EAAD,CACE3B,UAAU,qBACV4B,OAAK,EACLnI,KAAK,UACLoI,MAAM,oBACNC,UAAWnC,GAAK,SAChBM,QAAS6V,IAET,uBAAG9V,UAAU,gBAGjB,kBAAC6X,EAAA,EAAD,CAAYC,UAAWzF,GAAanK,QAAU6P,KAAMvF,IACjDiF,IAEH,kBAAC,EAAD,CACE9W,UAAWkT,IAAiBH,GAC5B3c,QAASA,EACT6J,SAAUA,GACV5J,QAASA,EACT6J,SAAUA,GACVC,mBAAoBgV,GACpB/U,UAAWiV,GACXhV,aAAc0U,GACd7W,SAAUA,MAGd,kBAAC,GAAD,CACE4N,QAASmG,GACTlG,OAAQ9L,GACR+L,UAAWoG,GAAS1F,EACpBT,UAAWmG,GAASzF,EACpB9B,UAAWA,GACXqB,MAAOuK,IAEP,kBAACS,EAAA,EAAD,CACE7X,UAAU,kBACV8X,UAAW7F,GACX8F,KAAMxF,IAEL+E,MAGHnF,IACA,4BACEnM,KAAK,SACLhG,UAAY,oBAAkBjJ,IAAY2P,IAAS,UACnDsR,aAAYrY,GAAK,oBACjBW,IAAKX,GAAKiY,MAAQ,WAAQtW,EAC1BrB,QAASyW,MAGXtE,IACA,4BACEpM,KAAK,SACLhG,UAAY,oBAAkBjJ,IAAY2P,IAAS,UACnDsR,aAAYrY,GAAK,QACjBW,IAAKX,GAAKiY,MAAQ,WAAQtW,EAC1BrB,QAAS0W,KAGb,kBAAC,GAAD,CACExL,QAASvK,GACTwK,aAAcuK,U,uGCrZXnP,mBAAK/H,YACjBC,IACC,MACEuZ,OACEC,KAAMC,EADD,QAELC,EAFK,iBAGLC,GAJE,cAMJC,GACE5Z,EAEJ,MAAO,CACLyZ,YACAI,UAAWF,EAAiBG,OAC5BC,cAAeL,EAAQI,OACvBE,gBAAiBN,EAAQO,SACzBL,kBAGJ,CAAClZ,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,mBAAoB,kBAAmB,kBAnB3EZ,CAhJ6C,EAC/D0Z,YACAI,YACAE,gBACAC,kBACAJ,gBACA5W,SACAkX,mBACAC,kBACAC,oBAEA,MAAOC,EAAQC,GAAahW,YAAS,IAE/BuI,EAAWtE,YAAyB,MAEpCtH,EAAOC,cAEbqD,YAAU,KACJvB,EACGK,KACH5G,WAAW,KACTP,sBAAsB,KAChB2Q,EAASrD,SACXqD,EAASrD,QAAQ+Q,WA1BR,MAgCb1N,EAASrD,SACXqD,EAASrD,QAAQgR,OAGnB/d,WAAW,KACT6d,EAAU,KApCU,OAuCvB,CAACtX,IAEJ,MAAMyX,EAAU3X,YAAQ,KACtB,MAAM4W,EAAU,IACXK,GAAiB,MACjBC,GAAmB,IAGxB,IAAIU,EAAcb,GAAa,GAK/B,OAJID,IACFc,EAAcC,YAAO,CAACf,KAAkBc,KAGnCE,aAAY,IACdlB,EAAQW,OAAQpb,IACjB,MAAMyC,EAAO+X,EAAUxa,GACvB,OAAKyC,KAIAmZ,YAAiBnZ,EAAMoZ,qBAIvBT,GAIEU,aAAYC,YAAa/Z,EAAMwY,EAAUxa,QAAK2D,EAAW3D,IAAO2a,GAAgBS,OAExFZ,OAAW7W,EAAW8X,IACxB,CAACX,EAAeC,EAAiBP,EAAWG,EAAeS,EAAQpZ,EAAM4Y,KAErEoB,EAAaC,GAAWC,aAAkBf,EAAeK,EAASvR,QAAQmR,IAE3Ee,EAAqBpa,YAAaiE,IACtCqV,EAAUrV,EAAEiG,cAAc1D,QACzB,IAGG6T,EAAe9S,YAAuB,MACtC2P,EAAgBoD,aAA0BD,EAAcrY,EAAS+U,IACjEkD,GACFf,EAAiB,CAAEjb,GAAIgc,EAAYlD,MAEpC,oBAAoB,GAEjBwD,EACJ,yBAAKja,UAAU,eAAeM,IAAKX,EAAKiY,MAAQ,WAAQtW,GACtD,kBAACK,EAAA,EAAD,CACEC,OAAK,EACLC,MAAM,cACNpI,KAAK,UACLqI,UAAWnC,EAAK,SAChBM,QAAS4Y,GAET,uBAAG7Y,UAAU,gBAEf,kBAACka,GAAA,EAAD,CACEzP,IAAKc,EACLrF,MAAO6S,EACPjN,SAAUgO,EACVK,UAAWvD,EACXwD,YAAaza,EAAK,gBAKxB,OACE,kBAAC0a,GAAA,EAAD,CACE3Y,OAAQA,EACRqF,QAAS8R,EACT7Y,UAAU,gBACVsa,OAAQL,GAEPN,GAAeA,EAAYnb,OAC1B,kBAAC+b,GAAA,EAAD,CACEva,UAAU,4BACVwa,MAAOb,EACPc,WAAYb,EACZc,gBAAiB9S,QAAQmR,GACzBtO,IAAKsP,EACLI,UAAWvD,GAEV+C,EAAYgB,IAAKhd,GAChB,kBAACid,GAAA,EAAD,CACEza,IAAKxC,EACLqC,UAAU,4CACVC,QAAS,IAAM2Y,EAAiB,CAAEjb,QAEjCoB,aAAcpB,GACb,kBAACkd,GAAA,EAAD,CAAiBC,OAAQnd,IAAO2a,EAAgB3Y,EAAK,0BAAuB2B,EAAWyZ,OAAQpd,IAE/F,kBAACqd,GAAA,EAAD,CAAerc,OAAQhB,OAK7Bgc,IAAgBA,EAAYnb,OAC9B,uBAAGwB,UAAU,cAAb,yBAEA,kBAACib,GAAA,EAAD,U,iBC9FR,SAASC,GAAeC,GACtB,OAAIA,EAAMC,WACD,mBAGJD,EAAME,YAIJ,uBAHE,WAMI7U,mBAAK/H,YACjBC,GAAuBY,YAAKZ,EAAQ,CAAC,YACtC,CAACU,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,gBAAiB,6BAFrDZ,CAlF4B,EAAG6c,UAASC,gBAAeC,+BACzE,MAAM7b,EAAOC,cAEb,IAAK0b,EAAQ9c,OACX,OA2DF,OACE,yBAAKb,GAAG,WACL2d,EAAQX,IAVSc,IACpB,MAAI,SAAUA,EAjDMC,KACpB,MAAM,KACJC,EADI,MACEC,EADF,kBACSC,EADT,UAC4BC,GAC9BJ,EASEK,EACFpc,EADqBmc,EAChB,cACA,UADeD,EAAmB,KAGrCG,EAAuBrc,EAAZmc,EAAiB,cAAsB,aAExD,OACE,kBAACzB,GAAA,EAAD,CACE3Y,QAAM,EACNqF,QAASwU,EACTvb,UAAU,QACV4b,MAAOA,QAEgBta,IAAtBua,GAAmC,2BAAIE,GACxC,kBAACpa,EAAA,EAAD,CAAQsa,QAAM,EAACjc,UAAU,wBAAwBC,QArB7B,KACtBub,EAAyB,CACvBG,SAEFJ,MAiB8ES,GAC5E,kBAACra,EAAA,EAAD,CAAQsa,QAAM,EAACjc,UAAU,wBAAwBC,QAASsb,GAAgB5b,EAAK,aAuB1Euc,CAAaT,IAlBHN,EAqBAM,EAnBjB,kBAACpB,GAAA,EAAD,CACE3Y,QAAM,EACNqF,QAASwU,EACTvb,UAAU,QACV4b,MAAOV,GAAeC,IAErBA,EAAME,YAAcc,aAAqBhB,GAAS5a,YAAW4a,EAAMnkB,QAAU,CAAC,QAAS,OACxF,6BACE,kBAAC2K,EAAA,EAAD,CAAQsa,QAAM,EAAChc,QAASsb,GAAgB5b,EAAK,UAVhCwb,Y,UC3BR3U,mBAAK/H,YACjBC,GAAuBY,YAAKZ,EAAQ,CAAC,kBACtC,CAACU,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,wBAFpCZ,CAjBkC,EAAG2d,gBAAeC,0BACtE,GAAKD,EAAc5d,OAInB,OACE,yBAAKb,GAAG,iBACLye,EAAczB,IAAI,EAAG3jB,aACpB,kBAACslB,GAAA,EAAD,CACEtlB,QAASuJ,YAAWvJ,EAAS,CAAC,QAAS,KAAM,QAAS,oBACtDulB,UAAWF,S,oBCiBN7V,mBAAK/H,iBAClB6C,EACA,CAAClC,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,wBAFpCZ,CA1BgC,EAAGgI,MAAK+V,0BAC1D,MAAM7c,EAAOC,cAEP6c,EAAa/c,YAAY,KAC7BxH,OAAOwkB,KAAKjW,GACZ+V,EAAoB,CAAE/V,SAAKnF,KAC1B,CAACkb,EAAqB/V,IAEnBkW,EAAgBjd,YAAY,KAChC8c,EAAoB,CAAE/V,SAAKnF,KAC1B,CAACkb,IAEEI,EAAeC,aAAiBpW,GAEtC,OACE,kBAACqW,GAAA,EAAD,CACEpb,OAAQkG,QAAQnB,GAChBM,QAAS4V,EACTf,MAAOjc,EAAK,gBACZ2V,UAAW/U,YAAWZ,EAAK,gBAAiBid,GAAe,CAAC,UAC5DG,aAAcpd,EAAK,gBACnBqd,eAAgBP,O,OCTtB,MAAMQ,GAAkB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAyPvD,SAASC,GAAcC,EAAcC,EAAeC,EAAaC,EAAgBC,GAC/E,MAAMC,EAAc,IAAIC,KAAKN,EAAMC,EAAOC,EAAK,EAAG,EAAG,EAAG,GAClDK,EAAeJ,GAAW,IAAIG,KAAKH,EAAQK,cAAeL,EAAQM,WAAYN,EAAQO,UAAW,EAAG,EAAG,EAAG,GAC1GC,EAAeP,GAAW,IAAIE,KAAKF,EAAQI,cAAeJ,EAAQK,WAAYL,EAAQM,UAAW,EAAG,EAAG,EAAG,GAEhH,SAAIC,GAAgBN,EAAcM,OAEvBJ,GAAgBF,EAAcE,GAO3C,SAASK,GAAgB7X,GACvB,OAAO8X,OAAO9X,GAAO+X,SAAS,EAAG,KAapBzX,mBAnRqB,EAClC0X,aACAC,QACAC,eACAC,aACA3c,SACA4c,iBACAC,oBACAC,oBACAzX,UACA0X,WACAC,0BAEA,MAAM/e,EAAOC,cACP+e,EAAM,IAAIlB,KACVmB,EAAsBpd,YAAQ,IAAO0c,EAAa,IAAIT,KAAKS,GAAc,IAAIT,KAAS,CAACS,IACvFX,EAAUY,EAAQ,IAAIV,KAAKU,QAAS7c,GAEnCud,EAAcC,GAAmB9b,YAAe4b,IAChDG,EAAeC,GAAoBhc,YACxC+a,GAAgBa,EAAoBK,cAE/BC,EAAiBC,GAAsBnc,YAC5C+a,GAAgBa,EAAoBQ,eAGhCC,EAAcR,EAAalB,cAC3B2B,EAAeT,EAAajB,WAC5B2B,EAAcV,EAAahB,UAEjC5a,YAAU,KACJvB,GACFod,EAAgBF,IAEjB,CAACld,EAAQkd,IAEZ,MAAMY,EAA0BnB,GAAcgB,GAAeV,EAAIhB,eAAiB2B,GAAgBX,EAAIf,YAChGL,GAAW8B,GAAe9B,EAAQI,eAAiB2B,GAAgB/B,EAAQK,WAC3E6B,EAAyBrB,GAAgBiB,GAAeV,EAAIhB,eAAiB2B,GAAgBX,EAAIf,WAEjG8B,EAAele,YAAQ,IAwL/B,SAA2B2b,EAAcC,GACvC,MAAMuC,EAAiB,GAEjBlf,EAAO,IAAIgd,KACjBhd,EAAKmf,YAAYzC,GACjB1c,EAAKof,SAASzC,GACd3c,EAAKqf,QAAQ,GAEb,MAAMC,EAAgBtf,EAAKuf,SAE3B,IAAK,IAAIC,EAAI,EAAGA,EAAIF,EAAeE,IACjCN,EAAKO,KAAK,GAGZ,KAAOzf,EAAKmd,aAAeR,GAAO,CAChC,MAAM+C,EAAW1f,EAAKod,UACtB8B,EAAKO,KAAKC,GACV1f,EAAKqf,QAAQK,EAAW,GAG1B,OAAOR,EA3MLS,CAAkBf,EAAaC,GAC9B,CAACA,EAAcD,IAiClB,MAAMgB,EAAoB3gB,YAAaiE,IACrC,MAAMuC,EAAQvC,EAAEsG,OAAO/D,MAAMoa,QAAQ,UAAW,IAChD,IAAKpa,EAAM1H,OAGT,OAFAwgB,EAAiB,SACjBrb,EAAEsG,OAAO/D,MAAQ,IAInB,MAAMqa,EAAQ7mB,KAAKC,IAAI,EAAGD,KAAKoM,IAAIkE,OAAO9D,GAAQ,KAE5CzF,EAAO,IAAIgd,KAAKoB,EAAa2B,WACnC/f,EAAKggB,SAASF,GACdzB,EAAgBre,GAEhB,MAAMigB,EAAW3C,GAAgBwC,GACjCvB,EAAiB0B,GACjB/c,EAAEsG,OAAO/D,MAAQwa,GAChB,CAAC7B,IAEE8B,EAAsBjhB,YAAaiE,IACvC,MAAMuC,EAAQvC,EAAEsG,OAAO/D,MAAMoa,QAAQ,UAAW,IAChD,IAAKpa,EAAM1H,OAGT,OAFA2gB,EAAmB,SACnBxb,EAAEsG,OAAO/D,MAAQ,IAInB,MAAM0a,EAAUlnB,KAAKC,IAAI,EAAGD,KAAKoM,IAAIkE,OAAO9D,GAAQ,KAE9CzF,EAAO,IAAIgd,KAAKoB,EAAa2B,WACnC/f,EAAKogB,WAAWD,GAChB9B,EAAgBre,GAEhB,MAAMqgB,EAAa/C,GAAgB6C,GACnCzB,EAAmB2B,GACnBnd,EAAEsG,OAAO/D,MAAQ4a,GAChB,CAACjC,IAwBJ,OACE,kBAACxE,GAAA,EAAD,CACE3Y,OAAQA,EACRqF,QAASA,EACT/G,UAAU,iBAEV,yBAAKA,UAAU,aACb,yBAAKA,UAAU,kBACb,kBAAC2B,EAAA,EAAD,CACEC,OAAK,EACLnI,KAAK,UACLoI,MAAM,cACN5B,QAAS8G,GAET,uBAAG/G,UAAU,gBAGf,4BACG+gB,YAAmBphB,EAAMkf,EAAc9c,MAG1C,kBAACJ,EAAA,EAAD,CACEC,OAAK,EACLnI,KAAK,UACLoI,MAAM,cACNgK,SAAU4T,EACVxf,QAAUwf,OAA2Cne,EArH/D,WACEwd,EAAiBkC,IACf,MAAMC,EAAW,IAAIxD,KAAKuD,GAG1B,OAFAC,EAASpB,SAASoB,EAASrD,WAAa,GAEjCqD,MAkHD,uBAAGjhB,UAAU,mBAGf,kBAAC2B,EAAA,EAAD,CACEC,OAAK,EACLnI,KAAK,UACLoI,MAAM,cACNgK,SAAU2T,EACVvf,QAAUuf,OAA2Cle,EAtH/D,WACEwd,EAAiBkC,IACf,MAAMC,EAAW,IAAIxD,KAAKuD,GAG1B,OAFAC,EAASpB,SAASoB,EAASrD,WAAa,GAEjCqD,MAmHD,uBAAGjhB,UAAU,iBAKnB,yBAAKA,UAAU,oBACb,yBAAKA,UAAU,iBACZid,GAAgBtC,IAAKuG,GACpB,yBAAKlhB,UAAU,4BACb,8BAAOkhB,KAGVxB,EAAa/E,IAAKwF,GACjB,yBACEgB,KAAK,SACLC,SAAU,EACVnhB,QAAS,KAAMohB,OA/HD5gB,EA+HkB0f,OA9H1CrB,EAAiBkC,IACf,MAAMC,EAAW,IAAIxD,KAAKuD,GAG1B,OAFAC,EAASnB,QAAQrf,GAEVwgB,IALX,IAA0BxgB,GAgIdT,UAAW0D,YACT,aACAwZ,GACEmC,EAAaC,EAAca,EAAU/B,EAAeO,OAAMrd,EAAW+c,EAAaM,EAAMpB,GAEtF,WACC,IAAE4C,EAAW,YAAc,IAChCA,IAAaZ,GAAe,eAG3BY,GACD,8BAAOA,OAOhB7B,GA7FD,yBAAKte,UAAU,cACb,2BACEgG,KAAK,OACLhG,UAAU,eACVshB,UAAU,UACVpb,MAAO6Y,EACPjT,SAAUuU,IANd,IASE,2BACEra,KAAK,OACLhG,UAAU,eACVshB,UAAU,UACVpb,MAAOgZ,EACPpT,SAAU6U,KAiFd,yBAAK3gB,UAAU,UACb,kBAAC2B,EAAA,EAAD,CAAQ1B,QA5Id,WACEwe,EAASI,KA4IFP,EAqDX,SAA2B3e,EAAcc,GACvC,MAAM4c,EAAMkE,YAAgB5hB,EAAMc,GAAM,GAExC,GAAY,UAAR4c,EACF,OAAO1d,EAAK,yCAA0C6hB,YAAW/gB,IAGnE,OAAOd,EAAK,sCAAuC0d,GAAKiD,QAAQ,KAAMkB,YAAW/gB,IA5DvDghB,CAAkB9hB,EAAMkf,GAAgBN,GAE3DC,GACC,kBAAC7c,EAAA,EAAD,CAAQ1B,QAASye,EAAqBzC,QAAM,GACzCuC,OC9MEhY,mBAAK/H,YACjBC,IACQ,CACLwf,WAAYxf,EAAOgjB,4BAGvB,CAACtiB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,uBAAwB,yBAPRZ,CAtB+C,EACjEiD,SAAQwc,aAAYyD,uBAAsBC,2BAE1C,MAAMC,EAAmBniB,YAAae,IACpCkhB,EAAqB,CAAEG,UAAWrhB,EAAKshB,UAAY,MACnDH,KACC,CAACA,EAAsBD,IAEpBhiB,EAAOC,cAEb,OACE,kBAAC,GAAD,CACE8B,OAAQA,EACRwc,WAAYA,EACZG,YAAU,EACVE,kBAAmB5e,EAAK,cACxBoH,QAAS6a,EACTnD,SAAUoD,OC2EDrb,mBAAK/H,YAClB,CAACC,GAAU1H,UAASgrB,iBAClB,MAAM,SAAEvS,GAAawS,YAAyBvjB,IAAW,IACnD,gBAAEwjB,GAAqBzS,GAAY0S,YAA4BzjB,EAAQ1H,EAASyY,IAAc,GAC9FrP,EAAOnB,YAAWP,EAAQ1H,EAAQ2H,QAQxC,MAAO,CACLujB,iBAAkBF,GAAcE,EAChCE,YATkBhiB,GAAQrB,aAAcqB,EAAKzC,IAC3C0kB,aAAuBrjB,aAAWN,EAAQ4jB,YAAqBliB,UAC/DkB,EAQFihB,6BANmCniB,GAAQoiB,aAAiBpiB,KAAU8hB,EAOtEO,iBANuBriB,GAAQsiB,aAAiBtiB,KASpD,CAAChB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,iBAAkB,4BApBFZ,CAnEkD,EACpEiD,SACAsgB,aACAhrB,UACA2rB,QACAT,kBACAE,cACAG,+BACAE,mBACA1b,UACA6b,iBACAC,8BAEA,MAAMC,EAA4BpjB,YAAY,KAC5C,MAAMqS,EAAa4Q,GAASA,EAAMI,SAC9BJ,EAAMI,SAASpI,IAAI,EAAGhd,QAASA,GAC/B,CAAC3G,EAAQ2G,IACbilB,EAAe,CAAE7Q,aAAYiR,oBAAoB,IACjDjc,KACC,CAAC6b,EAAgB5rB,EAAQ2G,GAAIoJ,EAAS4b,IAEnCM,EAA6BvjB,YAAY,KAC7C,MAAMqS,EAAa4Q,GAASA,EAAMI,SAC9BJ,EAAMI,SAASpI,IAAI,EAAGhd,QAASA,GAC/B,CAAC3G,EAAQ2G,IACTqkB,EACFa,EAAwB,CAAE9Q,eAE1B6Q,EAAe,CACb7Q,aACAiR,oBAAoB,IAGxBjc,KACC,CAAC4b,EAAO3rB,EAAQ2G,GAAIqkB,EAAYjb,EAAS8b,EAAyBD,IAE/DjjB,EAAOC,cAEb,OACE,kBAACya,GAAA,EAAD,CACE3Y,OAAQA,EACRqF,QAASA,EACTmc,QAASxhB,IAAWwgB,EAAkBe,OAA6B3hB,EACnEtB,UAAU,SACV4b,MAAOjc,EAAK,8BAEZ,2BAAIA,EAAK,kCACR4iB,GACC,2BAAI5iB,EAAK,8BAA+B,EAAG,MAE5C8iB,GACC,2BAAI9iB,EAAK,+BAAgC,EAAG,MAE7CuiB,GACC,kBAACvgB,EAAA,EAAD,CAAQE,MAAM,SAAS7B,UAAU,wBAAwBic,QAAM,EAAChc,QAAS6iB,GACtEV,GAAeziB,EAAK,iCAAkCY,YAAW6hB,KAChEA,GAAeziB,EAAK,2CAG1B,kBAACgC,EAAA,EAAD,CAAQE,MAAM,SAAS7B,UAAU,wBAAwBic,QAAM,EAAChc,QAASgjB,GACtEtjB,EAAKuiB,EAAkB,gCAAkC,WAE5D,kBAACvgB,EAAA,EAAD,CAAQ3B,UAAU,wBAAwBic,QAAM,EAAChc,QAAS8G,GAAUpH,EAAK,eCLhE6G,mBAAK/H,YAClB,CAACC,GAAUC,aACT,MAAMwkB,EAAgBpkB,aAAcJ,GAC9BykB,EAAiBC,YAAqB3kB,EAAQC,GAC9CyB,EAAOnB,YAAWP,EAAQC,GAC1Bmd,IAAc1b,GAAQkjB,aAAcljB,GACpCmjB,IAAYnjB,GAAQoiB,aAAiBpiB,GACrCojB,IAAiBpjB,GAAQsiB,aAAiBtiB,GAMhD,MAAO,CACL+iB,gBACAC,iBACAtH,YACAyH,UACAC,eACAC,aAXoBN,IAAkBC,GAAmBI,GAAgBD,EAYzEnB,YAXkBhiB,GAAQrB,aAAcqB,EAAKzC,IAC3C0kB,aAAuBrjB,aAAWN,EAAQ4jB,YAAqBliB,UAC/DkB,IAYN,CAAClC,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,eAvBpCZ,CA/D+C,EACjEiD,SACA9C,YACAD,SACAmd,YACAyH,UACAC,eACAC,eACArB,cACArb,UACA2c,iBAEA,MAAMC,EAAyBjkB,YAAY,KACzCgkB,EAAW,CACT/kB,SAAQC,YAAWglB,SAAS,IAE9B7c,KACC,CAAC2c,EAAY/kB,EAAQC,EAAWmI,IAE7B8c,EAAmBnkB,YAAY,KACnCgkB,EAAW,CACT/kB,SAAQC,YAAWglB,SAAS,EAAOE,WAAW,EAAMC,UAAU,IAEhEhd,KACC,CAACpI,EAAQC,EAAWmI,EAAS2c,IAE1B/jB,EAAOC,cAcb,OACE,kBAACya,GAAA,EAAD,CACE3Y,OAAQA,EACRqF,QAASA,EACT/G,UAAU,MACV4b,MAAOjc,EAAK,yBAEZ,2BAjBOA,EADLmc,EACU,yBAGVyH,GAAWC,EACD,kBAGF,wBAWV,kBAAC7hB,EAAA,EAAD,CAAQ3B,UAAU,wBAAwBic,QAAM,EAAChc,QAAS4jB,GACvDlkB,EAAK,cAEP8jB,GACC,kBAAC9hB,EAAA,EAAD,CAAQ3B,UAAU,wBAAwBic,QAAM,EAAChc,QAAS0jB,GACvDvB,EACGziB,EAAK,8BAA+ByiB,GACpCziB,EAAK,qDAGb,kBAACgC,EAAA,EAAD,CAAQ3B,UAAU,wBAAwBic,QAAM,EAAChc,QAAS8G,GAAUpH,EAAK,eC1DhE6G,mBAxB6B,EAC1C9E,SACAsiB,sBAAsB,EACtBjd,UACAkd,cAEA,MAAMtkB,EAAOC,cAEb,OACE,kBAACya,GAAA,EAAD,CACE3Y,OAAQA,EACRqF,QAASA,EACT/G,UAAU,YACV4b,MAAOjc,EAAK,+BAEZ,2BAAIA,EAAK,oCAAqCqkB,EAAqB,MACnE,kBAACriB,EAAA,EAAD,CAAQ3B,UAAU,wBAAwBic,QAAM,EAAChc,QAASgkB,GACvDtkB,EAAK,gBAER,kBAACgC,EAAA,EAAD,CAAQ3B,UAAU,wBAAwBic,QAAM,EAAChc,QAAS8G,GAAUpH,EAAK,c,kBCsEhE6G,mBAAK/H,YAClB,CAACC,GAAUsjB,iBACT,MAAQjQ,WAAYmS,GAAuBxlB,EAAOylB,kBAAoB,IAChE,gBAAEjC,GAAoBkC,YAAgC1lB,GACtD0B,EAAOikB,YAAkB3lB,GAQ/B,MAAO,CACLwlB,qBACAhC,iBAAkBF,GAAcE,EAChCE,YAVkBhiB,GAAQrB,aAAcqB,EAAKzC,IAC3C0kB,aAAuBrjB,aAAWN,EAAQ4jB,YAAqBliB,UAC/DkB,EASFihB,6BAPmCniB,GAAQoiB,aAAiBpiB,KAAU8hB,EAQtEO,iBAPuBriB,GAAQsiB,aAAiBtiB,KAUpD,CAAChB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,iBACA,0BACA,0BAvBgBZ,CApE0D,EAC5EiD,SACAsgB,aACAkC,qBACAhC,kBACAE,cACAG,+BACAE,mBACA1b,UACA6b,iBACAC,0BACAyB,4BAEA,MAAMxB,EAA4BpjB,YAAY,KAC5CkjB,EAAe,CAAE7Q,WAAYmS,EAAoBlB,oBAAoB,IACrEsB,IACAvd,KACC,CAAC6b,EAAgB0B,EAAuBJ,EAAoBnd,IAEzDkc,EAA6BvjB,YAAY,KACzCsiB,EACFa,EAAwB,CAAE9Q,WAAYmS,IAEtCtB,EAAe,CAAE7Q,WAAYmS,EAAoBlB,oBAAoB,IAGvEsB,IACAvd,KACC,CACDib,EAAYsC,EAAuBvd,EAAS8b,EAAyBqB,EAAoBtB,IAGrFjjB,EAAOC,cAEb,GAAKskB,EAIL,OACE,kBAAC7J,GAAA,EAAD,CACE3Y,OAAQA,EACRqF,QAASA,EACTmc,QAAShB,OAAkB5gB,EAAY2hB,EACvCjjB,UAAU,SACV4b,MAAOjc,EAAK,oCAEZ,2BAAIA,EAAK,gCACR4iB,GACC,0GAEDE,GACC,+EAEDP,GACC,kBAACvgB,EAAA,EAAD,CAAQE,MAAM,SAAS7B,UAAU,wBAAwBic,QAAM,EAAChc,QAAS6iB,GACtEV,EACGziB,EAAK,6BAA8BY,YAAW6hB,IAC9CziB,EAAK,2CAGb,kBAACgC,EAAA,EAAD,CAAQE,MAAM,SAAS7B,UAAU,wBAAwBic,QAAM,EAAChc,QAASgjB,GACtEtjB,EAAKuiB,EAAkB,gCAAkC,WAE5D,kBAACvgB,EAAA,EAAD,CAAQ3B,UAAU,wBAAwBic,QAAM,EAAChc,QAAS8G,GAAUpH,EAAK,e,UCNhE6G,mBAAK/H,iBAClB6C,EAAW,CAAClC,EAAWC,IAA2BC,YAAKD,EAAS,CAC9D,iBAAkB,0BAFFZ,CAlEqC,EACvDiD,SACAqQ,aACAwS,iBACAD,wBACAvd,cAEA,MAAOyd,EAAgBC,GAAqBzhB,YAA0B,SAC/D0hB,EAAaC,GAAkB3hB,YAAS,IAEzC4hB,EAAe,KACnBL,EAAe,CAAExS,aAAY8S,OAAQL,EAAgBE,gBACrDJ,IACAvd,KAGI+d,EAAqBplB,YAAawG,IACtCue,EAAkBve,IACjB,IAEG6e,EAA0BrlB,YAAaiE,IAC3CghB,EAAehhB,EAAEsG,OAAO/D,QACvB,IAEGvG,EAAOC,cAEPolB,EAA4D,CAChE,CAAE9e,MAAO,OAAQ+e,MAAOtlB,EAAK,2BAC7B,CAAEuG,MAAO,WAAY+e,MAAOtlB,EAAK,+BACjC,CAAEuG,MAAO,cAAe+e,MAAOtlB,EAAK,kCACpC,CAAEuG,MAAO,aAAc+e,MAAOtlB,EAAK,kCACnC,CAAEuG,MAAO,YAAa+e,MAAOtlB,EAAK,+BAClC,CAAEuG,MAAO,QAAS+e,MAAOtlB,EAAK,6BAGhC,GAAKoS,EAIL,OACE,kBAACsI,GAAA,EAAD,CACE3Y,OAAQA,EACRqF,QAASA,EACTmc,QAASxhB,EAASkjB,OAAetjB,EACjCtB,UAAU,SACV4b,MAAOjc,EAAK,6BAEZ,kBAACulB,GAAA,EAAD,CACEnN,KAAK,iBACLoN,QAASH,EACTlZ,SAAUgZ,EACVM,SAAUZ,IAEZ,kBAACtK,GAAA,EAAD,CACE+K,MAAOtlB,EAAK,iCACZuG,MAAOwe,EACP5Y,SAAUiZ,IAEZ,kBAACpjB,EAAA,EAAD,CAAQE,MAAM,SAAS7B,UAAU,wBAAwBic,QAAM,EAAChc,QAAS2kB,GACtEjlB,EAAK,sBAER,kBAACgC,EAAA,EAAD,CAAQ3B,UAAU,wBAAwBic,QAAM,EAAChc,QAAS8G,GAAUpH,EAAK,e,OC4DhE6G,mBAAK/H,YACjBC,IACC,MAAQsH,KAAMqf,GAAoBpD,YAAyBvjB,IAAW,IAChE,UAAE4mB,GAAclB,YAAgC1lB,GAChD6mB,EAAYC,YAAgC9mB,IAC1CqT,WAAYmS,GAAuBxlB,EAAOylB,kBAAoB,GAEtE,MAAO,CACLnC,WAAgC,cAApBqD,EACZI,sBAAuBC,aAA4BhnB,GACnDinB,kBAAmBL,EACnBM,kBAAmBL,EACnBrB,uBAGJ,CAAC9kB,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,wBAAyB,uCAf7DZ,CA1GoD,EACtEonB,UACAtO,WACA8N,kBACArD,aACAyD,wBACAE,oBACAC,oBACA1B,qBACAI,wBACAwB,yCAEA,MAAOC,EAAmBC,EAAiBC,GAAoBC,gBACxDC,EAAmBC,EAAiBC,GAAoBH,eAE/DjjB,YAAU,KACDsU,GAAawO,GAAsBI,OAMtC7kB,EALAglB,aAAyB,CACzBC,YAAaP,EACbQ,SAAUR,EACVS,MAAOnC,IAGV,CAAC/M,EAAUwO,EAAmBI,EAAmBH,EAAiB1B,IAErE,MAAMoC,EAA4Bpb,YAAYma,QAAyBnkB,GAAW,GAC5EqlB,EAAiCpP,EAAWkO,EAAwBiB,EAEpE/mB,EAAOC,cAEPgnB,EAAyBjnB,EAAK,kCAAmCgnB,GAEjE3mB,EAAY0D,YAChB,uBACAmiB,GAAW,gBACXtO,GAAY,SAGd,OACE,yBAAKvX,UAAWA,GACd,yBAAKA,UAAU,8BACb,kBAAC2B,EAAA,EAAD,CACEE,MAAM,cACND,OAAK,EACL3B,QAASqkB,EACTxiB,UAAU,oBAEV,uBAAG9B,UAAU,gBAEf,0BAAMA,UAAU,6BAA6B4b,MAAOgL,GACjDA,KAGAnB,GACD,yBAAKzlB,UAAU,gCACQ,cAApBqlB,GACC,kBAACljB,EAAA,EAAD,CACEC,KAAK,UACLN,UAAU,mBACV7B,QAAS6lB,GAET,0BAAM9lB,UAAU,aACbL,EAAK,aAIXimB,GACC,kBAACzjB,EAAA,EAAD,CACEC,KAAK,OACLnC,QAASmmB,EACTva,UAAW+Z,EACX9jB,UAAWnC,EAAK,gCAEhB,0BAAMK,UAAU,aACbL,EAAK,YAIZ,kBAACwC,EAAA,EAAD,CACE0kB,aAAW,EACXzkB,KAAK,SACLnC,QAAS+lB,EACTna,UAAW8Z,EACX7jB,UAAWnC,EAAK,iCAEhB,0BAAMK,UAAU,aACbL,EAAK,cAMhB,kBAAC,GAAD,CACE+B,OAAQqkB,EACR/D,WAAYA,EACZjb,QAASkf,IAEX,kBAAC,GAAD,CACEvkB,OAAQykB,EACRpf,QAASsf,EACTtU,WAAYmS,Q,6BC3IlB4C,OAGA,MAAMC,EAAY9f,YAAuB,MAEnC2P,EAAgBlX,YAAaiE,IACjC,GAAc,UAAVA,EAAExD,IAAiB,OACL4mB,EAAU7e,UAAY1N,SAASwsB,eAG/CF,KAED,CAACA,IAQJ,OANA7jB,YAAU,KACR/K,OAAOqL,iBAAiB,UAAWqT,GAAe,GAE3C,IAAM1e,OAAOsL,oBAAoB,UAAWoT,IAClD,CAACA,IAEGmQ,G,UC4DMvgB,mBAAK/H,YAClB,CAACC,GAAUC,aACT,MAAMyB,EAAOnB,YAAWP,EAAQC,GAC1BsoB,EAAoB7mB,GAAQkiB,YAAqBliB,GAOvD,MAAO,CACLA,OACA8mB,gBARsBD,EAAoBjoB,aAAWN,EAAQuoB,QAAqB3lB,EASlF6lB,SAReC,YAAmB1oB,EAAQC,GAS1C0oB,QARcjnB,EACZknB,aAAkBlnB,EAAMmnB,aAAqB7oB,GAAS8oB,aAAuB9oB,SAC7E4C,IARY7C,CAlDoC,EACtDE,SACAyB,OACA8mB,kBACAC,WACAE,UACAI,eACAxnB,cAEA,MAAO8lB,EAAmBC,EAAiBC,GAAoBC,eAEzDwB,EAAiBC,aAAsB,CAC3CvnB,OACA8mB,kBACAC,WACAE,UACAO,aAAc5B,IAGV6B,EAAc,KAClB5nB,EAAQtB,IAGJooB,EAAYe,GAAmBD,GAErC,GAAKznB,EAIL,OACE,kBAACwa,GAAA,EAAD,CACE5a,UAAU,oCACVC,QAAS4nB,EACTH,eAAgBA,EAChBX,UAAWA,GAEVhoB,aAAcJ,GACb,kBAACkc,GAAA,EAAD,CAAiBE,OAAQpc,EAAQ8oB,aAAcA,EAAcM,WAAW,UAExE,kBAAC/M,GAAA,EAAD,CAAerc,OAAQA,EAAQ8oB,aAAcA,EAAcM,WAAW,UAExE,kBAACC,GAAA,EAAD,CACEtmB,OAAQqkB,EACRhf,QAASkf,EACT7lB,KAAMA,Q,iBC1Cd,MAGM6nB,GAAe3kB,YAAU4kB,GAAOA,IAAM,KAAO,GA6EpC1hB,mBAAK/H,YACjBC,IACC,MAAQypB,QAASC,GAAe1pB,EAAO2pB,SACjCC,EAAY5pB,EAAO6pB,MAAMrQ,MACzB,qBAAEsQ,GAAyB9pB,EAAO+pB,aAExC,MAAO,CACLL,aACAE,YACAE,yBAGJ,CAACppB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,eACA,kBACA,WACA,yBACA,4BAjBgBZ,CA3E8C,EAChE2pB,aAAYE,YAAWE,uBACvBE,UAASC,eAAcC,kBAAiBC,WACxCC,yBAAwBC,8BAGxB,MAAMC,EAAc/hB,YAAuB,MAI3ChE,YAAU,KACRglB,GAAa,KACXU,IAEAC,OAED,CAACD,EAAcC,IAElBK,aAAoBD,EAAY9gB,SAAUkgB,GAE1C,MAAMP,EAAcnoB,YACjB/B,IACCkrB,EAAS,CAAElrB,OACX+qB,IACAvtB,WAAW,KACT2tB,EAAuB,CAAEnrB,QA9BD,MAiC5B,CAACkrB,EAAUC,EAAwBJ,IAG/B/oB,EAAOC,cAEb,OACE,yBAAKI,UAAU,gCACZooB,GACC,yBAAKpoB,UAAU,oBAAoBM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAC3D,yBAAKmJ,IAAKue,EAAahpB,UAAU,0BAC9BooB,EAAWzN,IAAKI,GACf,yBAAK/a,UAAU,gBAAgBC,QAAS,IAAM4nB,EAAY9M,GAASza,IAAKX,EAAKiY,MAAQ,WAAQtW,GAC3F,kBAACpB,EAAA,EAAD,CAAQG,KAAMioB,EAAUvN,KACxB,yBAAK/a,UAAU,iBAAiBO,YAAW8hB,aAAuBiG,EAAUvN,KA7C/E,UAmDNyN,GACC,yBAAKxoB,UAAU,uBACb,wBAAIA,UAAU,2CAA2CM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAChF3B,EAAK,UAEN,kBAACgC,EAAA,EAAD,CACEC,OAAK,EACLnI,KAAK,UACLoI,MAAM,cACNC,UAAU,qBACV7B,QAAS8oB,EACTnR,MAAOjY,EAAKiY,OAEZ,uBAAG5X,UAAU,iBAGhBwoB,EAAqB7N,IAAKhd,GACzB,kBAAC,GAAD,CACEgB,OAAQhB,EACRsC,QAAS4nB,U,0BCsBRrhB,mBAAK/H,YAClB,CAACC,GAAUC,aACT,MAAMyB,EAAOnB,YAAWP,EAAQC,GAChC,IAAKyB,EACH,MAAO,GAGT,MAAM6mB,EAAoB3E,YAAqBliB,GAE/C,MAAO,CACLA,UACI6mB,GAAqB,CAAEC,gBAAiBloB,aAAWN,EAAQuoB,IAC/DiC,aAAcxqB,EAAOwqB,eAGzB,CAAC9pB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,iBAhBgBZ,CA9E2C,EAC7DzH,UACAmyB,cACAxqB,SACAyB,OACA8mB,kBACA1nB,eACA0pB,mBAEA,MAAME,EAAiBjV,YAA4Bnd,GAC7CqyB,EAAe/V,YAASjS,YAAoBrK,EAAS,UACrDsyB,EAAe1hB,QAAQ2hB,YAAqBvyB,IAE5C6wB,EAAcnoB,YAAY,KAC9BF,EAAa,CAAEb,SAAQC,UAAW5H,EAAQ2G,MACzC,CAACgB,EAAQa,EAAcxI,EAAQ2G,KAE5BgC,EAAOC,cAEPmnB,EAAYe,GAAmBD,GAErC,GAAKznB,EAIL,OACE,kBAACwa,GAAA,EAAD,CACE5a,UAAU,kCACVoG,QAASrE,IACT9B,QAAS4nB,EACTd,UAAWA,GAEX,kBAAC7mB,EAAA,EAAD,CACEE,KAAMA,EACNC,KAAM6mB,EACNsC,kBAAgB,EAChBC,gBAAiBvC,GAAmBA,EAAgBwC,OACpDR,aAAcA,IAEhB,yBAAKlpB,UAAU,QACb,yBAAKA,UAAU,YACb,yBAAKA,UAAU,SACb,wBAAIM,IAAI,QAAQC,YAAWmZ,YAAa/Z,EAAMS,EAAM8mB,KACnD9mB,EAAKupB,YAAc,kBAACC,GAAA,EAAD,OAEtB,yBAAK5pB,UAAU,gBACb,kBAAC6pB,GAAA,EAAD,CAAM7pB,UAAU,QACb8pB,YAAoBnqB,EAAqB,IAAf3I,EAAQyJ,SAKzC,yBAAKT,UAAU,YACb,yBAAKA,UAAU,UAAUM,IAAI,QASvC,SACEX,EAAc3I,EAAqBmY,EAAkBga,EAAsBG,GAE3E,IAAKna,EACH,OAAO5O,YAAWwpB,YAAsBpqB,EAAM3I,IAGhD,OACE,0BAAMgJ,UAAU,iBACd,yBAAK/C,IAAKkS,EAASG,IAAI,GAAGtP,UAAWspB,EAAe,aAAUhoB,IAC7D8P,YAAgBpa,IAAY,uBAAGgJ,UAAU,cACzCO,YAAWwpB,YAAsBpqB,EAAM3I,GAAS,GAAO,CAAC,QAAS,aAAc,CAAEgzB,UAAWb,KAnBtFc,CAAqBtqB,EAAM3I,EAASqyB,GAAgBD,EAAgBD,EAAaG,U,OChD/E9iB,mBA5CmB,EAChC0jB,aAAYpD,eAEZ,MAAMqD,EAAc3oB,YAAQ,IAmB9B,SAAgC0oB,GAE9B,GADgBA,EAAWE,MAAM,0BACpB,CACX,MAAM3pB,EAAO,IAAIgd,KAAKyM,GACtB,MAAO,CAAC,CAAEzpB,OAAMkC,KAAM0nB,YAAmB5pB,KAG3C,MAAM6pB,EAAa,GACb/K,EAAc,IAAI9B,KAClB4B,EAAcE,EAAY5B,cAC1B4M,EAAahL,EAAYiB,UAAa,IAAI/C,KAAM,GAAE4B,KAAe6K,KAAe1J,UAClFnB,EACAA,EAAc,EAElB,IAAK,IAAIY,EAAI,EAAGA,EA3CO,EA2CeA,IAAK,CACzC,MAAMxf,EAAO,IAAIgd,KAAM,GAAE8M,EAAatK,KAAKiK,KAC3CI,EAAWpK,KAAK,CAAEzf,OAAMkC,KAAM0nB,YAAmB5pB,KAGnD,OAAO6pB,EAtC2BE,CAAuBN,GAAa,CAACA,IACvE,OACE,6BAASlqB,UAAU,6CAChBmqB,EAAYxP,IAAI,EAAGla,OAAMkC,UAEtB,yBACE1C,QAAS,IAAM6mB,EAASrmB,GACxBT,UAAU,YACVG,IAAKwC,GAEL,uBAAG3C,UAAU,kBACb,8BAAO2C,Q,oBC2BnB,MAGMslB,GAAe3kB,YAAU4kB,GAAOA,IAAM,KAAK,GA+NlC1hB,mBAAK/H,YACjBC,IACC,MAAQwZ,KAAMC,GAAczZ,EAAOuZ,OAC3BC,KAAMoQ,GAAc5pB,EAAO6pB,OAE3BJ,QAASsC,GAAoB/rB,EAAOgsB,aAAe,GAE3D,IAAKD,EACH,MAAO,CACLtS,YACAmQ,aAIJ,MAAM,cACJhQ,EADI,SACWyK,EADX,aACqBmG,GACvBxqB,GACE,eACJisB,EADI,cACYC,EADZ,aAC2BC,EAD3B,cACyCja,GAC3ClS,EAAO+pB,cACHtP,QAAS2R,EAAe3C,QAAS4C,GAAkBH,GAAiB,IACpEzR,QAAS6R,EAAc7C,QAAS8C,GAAiBJ,GAAgB,IACjEK,SAAUC,GAA2BpI,GACvC,SAAEpS,GAAcC,GAAiBA,EAAcjO,MAAS,GAE9D,MAAO,CACL2V,gBACAmS,kBACAO,eACAC,eACAH,gBACAC,gBACApa,WACAwa,yBACAhT,YACAmQ,YACAqC,iBACAzB,iBAGJ,CAAC9pB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,WACA,yBACA,uBACA,0BA5CgBZ,CA7N2C,EAC7D0qB,cAAae,aAAYkB,kBAAiB9S,gBAC1CmS,kBAAiBO,eAAcC,eAAcH,gBAAeC,gBAC5Dpa,WAAUwa,yBAAwBhT,YAAWmQ,YAAWqC,iBAAgBzB,eACxER,UAAS2C,qBAAoBxC,WAAUC,yBAAwBwC,uBAAsBC,4BAErF,MAAM5rB,EAAOC,eAEN4rB,EAAqBC,GAA0BzoB,aAAkB,IACjE0oB,EAAsBC,GAA2B3oB,aAAkB,GAEpE4oB,EAAiBlsB,YAAY,EAAG8W,gBAChC0S,GAAgB1S,IAAcqV,IAAkBC,WAClD7D,GAAa,KACXqD,EAAqB,CACnBtlB,KAAM,OACN+lB,MAAO5C,OAIZ,CAACD,EAAcoC,EAAsBnC,IAElC6C,EAAkBtsB,YACrB/B,IACCkrB,EAAS,CAAElrB,OAEPA,IAAO2a,GACTwQ,EAAuB,CAAEnrB,OAGtBoE,KACH2mB,KAGJ,CAACpQ,EAAeuQ,EAAUC,EAAwBJ,IAG9CuD,EAAwBvsB,YAAa/B,IACzC4tB,EAAsB,CAAE5tB,QACvB,CAAC4tB,IAEEV,EAAerpB,YAAQ,KAC3B,IAAK2nB,GAAgBA,EAAYxV,WAAW,MAAQwV,EAAY3qB,OAAS,EACvE,OAAO0tB,KAGT,MAAMC,EAAkB1B,EACpBA,EAAgB1R,OAAQpb,IACxB,MAAM0C,EAAOioB,EAAU3qB,GACvB,IAAK0C,EACH,OAAO,EAGT,MAAM+rB,EAAWC,aAAgBhsB,GACjC,OAAQ+rB,GAAY3S,aAAY2S,EAAUjD,IAAiB1P,aAAYpZ,EAAKisB,SAAUnD,KAEtF,GAEJ,MAAO,IACD7Q,GAAiBmB,aAAY9Z,EAAK,iBAAkBwpB,GAAe,CAAC7Q,GAAiB,MACtFgB,aAAYD,YAAO,IACjB8S,KACCnB,GAAgB,MAChBC,GAAgB,KAClB9S,KAEL,CACDgR,EAAasB,EAAiBnS,EAAe3Y,EAAMqrB,EAAcC,EAAc9S,EAAWmQ,IAGtFsC,EAAgBppB,YAAQ,KACvB2nB,GAAeA,EAAY3qB,OA5EO,IA4EyCssB,IAAkBC,EACzFmB,KAGF5S,aAAYD,YAAO,IAAIyR,KAAkBC,IAC9C5S,GAAW,GACZ,CAACA,EAAW2S,EAAeC,EAAe5B,IAEvCoD,EAAgB/qB,YAAQ,KACtB2nB,GAAgBe,IAAgBvZ,GAAgC,IAApBA,EAASnS,OAIpDmS,EACJgK,IAAKhd,IACJ,MAAOgB,EAAQC,GAAajB,EAAG6uB,MAAM,KAAK7R,IAAI3Q,QAE9C,OACEmhB,GAA0BA,EAAuBxsB,IAAWwsB,EAAuBxsB,GAAQuZ,KAAKtZ,KAGnGma,OAAmBnR,SACnB6kB,KAAK,CAACC,EAAGC,IAAMA,EAAElsB,KAAOisB,EAAEjsB,MAZpByrB,KAaR,CAACvb,EAAUwa,EAAwBhC,EAAae,IAE7C0C,EAA2BltB,YAAY,KAC3C+rB,GAAwBD,IACvB,CAACA,IAEEqB,EAA4BntB,YAAY,KAC5CisB,GAAyBD,IACxB,CAACA,IAmBJ,MAAMoB,EAAenC,IAAmBA,EAAe1S,QAAU0S,EAAe5H,WAC1E8H,EAAarsB,SAAWosB,EAAcpsB,SAAW+tB,EAAc/tB,OAErE,OAAK2qB,GAAgBe,EAKnB,kBAAC3P,GAAA,EAAD,CACEva,UAAU,2BACVwa,MAAO+R,EACP9R,WAAYmR,EAEZmB,sBAAoB,EACpBC,YAAU,GAET5B,GACC,yBAAKprB,UAAU,4CACb,kBAAC,GAAD,CACEkqB,WAAYkB,EACZtE,SAAUuE,KAIfyB,GACC,kBAACG,GAAA,EAAD,CACEtqB,KAAMhD,EAAK,6BACX+kB,YAAa/kB,EAAK,4CAGnBkrB,EAAarsB,QACd,yBAAKwB,UAAU,2CAA2CM,IAAKX,EAAKiY,MAAQ,WAAQtW,GACjFupB,EAAalQ,IAAKhd,GACjB,kBAACuvB,GAAA,EAAD,CACEC,aAAcxvB,EACdsC,QAASgsB,EACTmB,SAAUzvB,QAKfktB,EAAarsB,QACd,yBAAKwB,UAAU,kBACb,wBAAIA,UAAU,kBAAkBM,IAAKX,EAAKiY,MAAQ,YAAStW,GACxDupB,EAAarsB,OAzKK,GA0KjB,kBAACqrB,GAAA,EAAD,CAAM5pB,QAAS2sB,GACZjtB,EAAK6rB,EAAsB,2BAA6B,6BAG5D7rB,EAAK,oCAEPkrB,EAAalQ,IAAI,CAAChd,EAAI8Y,KACrB,GAAK+U,KAAuB/U,GAjLT,GAqLnB,OACE,kBAAC,GAAD,CACE9X,OAAQhB,EACRsC,QAAS+rB,SAMhBpB,EAAcpsB,QACf,yBAAKwB,UAAU,kBACb,wBAAIA,UAAU,kBAAkBM,IAAKX,EAAKiY,MAAQ,YAAStW,GACxDspB,EAAcpsB,OAjMI,GAkMjB,kBAACqrB,GAAA,EAAD,CAAM5pB,QAAS4sB,GACZltB,EAAK+rB,EAAuB,2BAA6B,6BAG7D/rB,EAAK,mCAEPirB,EAAcjQ,IAAI,CAAChd,EAAI8Y,KACtB,GAAKiV,KAAwBjV,GAzMV,GA6MnB,OACE,kBAAC,GAAD,CACE9X,OAAQhB,EACR8pB,cAAY,EACZxnB,QAAS+rB,SAMhBO,EAAc/tB,QACf,yBAAKwB,UAAU,kBACb,wBAAIA,UAAU,kBAAkBM,IAAKX,EAAKiY,MAAQ,YAAStW,GAAY3B,EAAK,mBAC3E4sB,EAAc5R,KA9GvB,SAA4B3jB,GAC1B,MAAM2L,EAAOonB,YAAsBpqB,EAAM3I,GACnCoJ,EAAO+X,EAAUnhB,EAAQ2H,QAE/B,GAAKgE,GAASvC,EAId,OACE,kBAAC,GAAD,CACEzB,OAAQ3H,EAAQ2H,OAChB3H,QAASA,EACTmyB,YAAaA,SASV,kBAAC,GAAD,CAAgBT,QAASA,OCjJpC,MAAMT,GAAe3kB,YAAU4kB,GAAOA,IAAM,KAAK,GA2FlC1hB,mBAAK/H,YACjBC,IACC,MAAQwZ,KAAMC,GAAczZ,EAAOuZ,OAC7B,cAAEK,EAAeyK,UAAYmI,SAAUC,GAAvC,aAAiEjC,GAAiBxqB,GAClF,eAAEisB,EAAF,cAAkB/Z,GAAkBlS,EAAO+pB,cAE3C,SAAE9X,GAAcC,GAAiBA,EAAcjO,MAAS,GAE9D,MAAO,CACL2V,gBACA3H,WACAwa,yBACAhT,YACAwS,iBACAzB,iBAGJ,CAAC9pB,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,yBAjBpCZ,CAzFkD,EACpE0qB,cACA7Q,gBACA8S,kBACAza,WACAwa,yBACAhT,YACAwS,iBACAzB,eACAoC,uBACAD,yBAEA,MAAM1rB,EAAOC,cACPgsB,EAAiBlsB,YAAY,EAAG8W,gBAChC0S,GAAgB1S,IAAcqV,IAAkBC,WAClD7D,GAAa,KACXqD,EAAqB,CACnBtlB,KAAM,OACN+lB,MAAO5C,EACPxqB,OAAQ2Z,OAIb,CAACA,EAAe4Q,EAAcoC,EAAsBnC,IAEjDoD,EAAgB/qB,YAAQ,IACvBmP,GAAgC,IAApBA,EAASnS,OAInBmS,EACJgK,IAAKhd,IACJ,MAAOgB,EAAQC,GAAajB,EAAG6uB,MAAM,KAAK7R,IAAI3Q,QAE9C,OACEmhB,GAA0BA,EAAuBxsB,IAAWwsB,EAAuBxsB,GAAQuZ,KAAKtZ,KAGnGma,OAAmBnR,SACnB6kB,KAAK,CAACC,EAAGC,IAAMA,EAAElsB,KAAOisB,EAAEjsB,MAZpByrB,KAaR,CAACvb,EAAUwa,IAmBd,MAAM2B,EAAenC,IAAmBA,EAAe1S,QAAU0S,EAAe5H,WAAawJ,EAAc/tB,OAE3G,OACE,yBAAKwB,UAAU,cACb,kBAACua,GAAA,EAAD,CACEva,UAAU,yCACVwa,MAAO+R,EACP9R,WAAYmR,EACZoB,YAAU,GAET5B,GACC,yBAAKprB,UAAU,4CACb,kBAAC,GAAD,CACEkqB,WAAYkB,EACZtE,SAAUuE,KAIfyB,GACC,kBAACG,GAAA,EAAD,CACEtqB,KAAMhD,EAAK,6BACX+kB,YAAa/kB,EAAK,4CAGnB4sB,EAAc/tB,QAAU+tB,EAAc5R,KAzC/C,SAA4B3jB,GAC1B,MAAM2L,EAAOonB,YAAsBpqB,EAAM3I,GACnCoJ,EAAO+X,EAAUnhB,EAAQ2H,QAE/B,GAAKgE,GAASvC,EAId,OACE,kBAAC,GAAD,CACEzB,OAAQ3H,EAAQ2H,OAChB3H,QAASA,EACTmyB,YAAaA,YC3Ed,SAASkE,GAAsBrnB,GACpC,MAAO,CAACtH,EAAqB4uB,KAC3B,MAAQpV,KAAMC,GAAczZ,EAAOuZ,OAC3BC,KAAMoQ,GAAc5pB,EAAO6pB,OAC7B,eACJoC,EADI,cACY/Z,EADZ,OAC2BjS,GAC7BD,EAAO+pB,aAKL8E,EAAuB,UAATvnB,EAAmBA,EAAQsnB,GAASA,EAAME,QAAU,QAAU,SAE1EtC,SAAUC,GAA2BzsB,EAAOqkB,UAC9C,SAAEpS,GAAcC,GAAiBA,EAAc2c,IAAiB,GAEtE,MAAO,CACLE,MAAOC,aAAYhvB,GACnBivB,eAAwBrsB,IAAbqP,KACLga,GAAiB/iB,QAAQ+iB,EAAe1S,OAAS0S,EAAe5H,UACtE5K,YACAmQ,YACA6C,yBACAxa,WACAid,aAAcjvB,EACduqB,aAAcxqB,EAAOwqB,e,wBCf3B,MACMjB,GAAe3kB,YAAU4kB,GAAOA,IAAM,KAAK,GAuGlC1hB,mBAAK/H,YAClB4uB,GAzGmB,SA0GnB,CAACjuB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,uBACA,oBAJgBZ,CArG4C,EAC9D0qB,cACAyE,eACAD,YACAxC,yBACAxa,WACAuY,eACAoC,uBACAxa,sBAEA,MAAMnR,EAAOC,cAEPgsB,EAAiBlsB,YAAY,EAAG8W,gBAChC0S,GAAgB1S,IAAcqV,IAAkBC,WAClD7D,GAAa,KACXqD,EAAqB,CACnBtlB,KAnBW,QAoBX+lB,MAAO5C,EACPxqB,OAAQivB,OAIb,CAAC1E,EAAcoC,EAAsBnC,EAAayE,IAE/CrB,EAAgB/qB,YAAQ,IACvBmP,GAAawa,EAIXxa,EAASgK,IAAKhd,IACnB,MAAOgB,EAAQC,GAAajB,EAAG6uB,MAAM,KAAK7R,IAAI3Q,QAE9C,OAAOmhB,EAAuBxsB,IAAWwsB,EAAuBxsB,GAAQuZ,KAAKtZ,KAC5Ema,OAAOnR,SAPDskB,KAQR,CAACf,EAAwBxa,IAEtBkd,EAAoBnuB,YAAY,CAACd,EAAmBD,KACxDmS,EAAgB,CACdnS,SACAC,YACAhI,OAAQoC,IAAkBI,gBAE3B,CAAC0X,IA2BJ,MAAMgd,EAAoBC,aAAkB,CAAC5E,GAAc6E,QAA+BL,EACpFM,EAAcH,GAAqBnd,GAAYA,EAASnS,OAAS,IAAM2qB,EACvE+E,EAAgBJ,GAAqBnd,GAAYA,EAASnS,OAAS,GAAK2qB,EAExE1lB,EAAaC,YACjB,+BACAwqB,GAAiB,aAGnB,OACE,yBAAKluB,UAAU,cACb,kBAACua,GAAA,EAAD,CACEva,UAAWyD,EACX+W,MAAO+R,EACP4B,aAAehF,EAAyB,YAAX,SAC7B1O,WAAYmR,EACZoB,YAAU,IAERc,GAAqB,kBAAC7S,GAAA,EAAD,MACtB6S,KAAuBnd,GAAgC,IAApBA,EAASnS,SAC3C,kBAACyuB,GAAA,EAAD,CACEtqB,KAAMhD,EAAK,6BACX+kB,YAAa/kB,EAAK,0CAGrBsuB,GAhDH,yBAAKjuB,UAAU,aAAaM,IAAKX,EAAKiY,MAAQ,WAAQtW,GACnDirB,EAAc5R,IAAK3jB,GAClB,kBAACo3B,GAAA,EAAD,CACEjuB,IAAKnJ,EAAQ2G,GACb0wB,SAAS,eACTr3B,QAASA,EACTiJ,QAAS4tB,MA2CZK,GAnCE3B,EAAc5R,IAAK3jB,GACxB,kBAAC,GAAD,CACEmJ,IAAKnJ,EAAQ2G,GACbgB,OAAQ3H,EAAQ2H,OAChB3H,QAASA,UCvFV,SAASs3B,GACd3uB,EAAc3I,EAAqBmhB,EAAoCmQ,GAEvE,MAAM,SAAEtY,GAAahZ,EACrB,IAAKgZ,EACH,OAGF,MAAMlR,EAASC,aAAciR,GAAYsY,EAAUtY,GAAYmI,EAAUnI,GAEzE,IAAIue,EAAaxuB,YAAeJ,EAAMb,GAEtC,MAAMsB,EAAO+X,EAAUnhB,EAAQ2H,QAS/B,OARIyB,IACErB,aAAciR,IAAclR,EAAmB4qB,OACjD6E,EAAc,GAAE5uB,EAAK,gBAAgB+Z,YAAa/Z,EAAMS,KAC/CouB,aAAYpuB,KACrBmuB,GAAe,MAAK7U,YAAa/Z,EAAMS,KAIpCmuB,E,cCDT,MACMtG,GAAe3kB,YAAU4kB,GAAOA,IAAM,KAAK,GA4FlC1hB,mBAAK/H,YAClB4uB,GA9FmB,SA+FnB,CAACjuB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,uBACA,iBAJgBZ,CA1F2C,EAC7D0qB,cACAyE,eACAD,YACAxV,YACAmQ,YACA6C,yBACAxa,WACAuY,eACAoC,uBACA9rB,mBAEA,MAAMG,EAAOC,cACPgsB,EAAiBlsB,YAAY,EAAG8W,gBAChC0S,GAAgB1S,IAAcqV,IAAkBC,WAClD7D,GAAa,KACXqD,EAAqB,CACnBtlB,KApBW,QAqBX+lB,MAAO5C,EACPxqB,OAAQivB,OAIb,CAAC1E,EAAcoC,EAAsBnC,EAAayE,IAE/CrB,EAAgB/qB,YAAQ,IACvBmP,GAAawa,EAIXxa,EAASgK,IAAKhd,IACnB,MAAOgB,EAAQC,GAAajB,EAAG6uB,MAAM,KAAK7R,IAAI3Q,QAE9C,OAAOmhB,EAAuBxsB,IAAWwsB,EAAuBxsB,GAAQuZ,KAAKtZ,KAC5Ema,OAAOnR,SAPDskB,KAQR,CAACf,EAAwBxa,IAEtB8d,EAAqB/uB,YAAY,CAACd,EAAmBD,KACzDa,EAAa,CAAEb,SAAQC,eACtB,CAACY,IA4BJ,MAAMsuB,EAAoBC,aAAkB,CAAC5E,GAAc6E,QAA+BL,EAE1F,OACE,yBAAK3tB,UAAU,cACb,kBAACua,GAAA,EAAD,CACEva,UAAU,8CACVwa,MAAO+R,EACP9R,WAAYmR,EACZoB,YAAU,IAERc,GAAqB,kBAAC7S,GAAA,EAAD,MACtB6S,KAAuBnd,GAAgC,IAApBA,EAASnS,SAC3C,kBAACyuB,GAAA,EAAD,CACEtqB,KAAMhD,EAAK,6BACX+kB,YAAa/kB,EAAK,0CAGrBmuB,GAAqBnd,GAAYA,EAASnS,OAAS,GA1CjD+tB,EAAc5R,IAAI,CAAC3jB,EAASyf,KACjC,MAAMiY,EAAkC,IAAVjY,GACzBkY,YAAY33B,EAAQyJ,QAAUkuB,YAAYpC,EAAc9V,EAAQ,GAAGhW,MACxE,OACE,yBACET,UAAU,WACVM,IAAKX,EAAKiY,MAAQ,WAAQtW,EAC1BnB,IAAKnJ,EAAQ2G,IAEZ+wB,GACC,uBAAG1uB,UAAU,kBAAkBM,IAAKX,EAAKiY,MAAQ,WAAQtW,GACtDyf,YAAmBphB,EAAM,IAAI8d,KAAoB,IAAfzmB,EAAQyJ,QAG/C,kBAACmuB,GAAA,EAAD,CACEzuB,IAAKnJ,EAAQ2G,GACb3G,QAASA,EACT8I,YAAawuB,GAAc3uB,EAAM3I,EAASmhB,EAAWmQ,GACrDuG,eAAgBJ,Y,UC7D5B,MACMxG,GAAe3kB,YAAU4kB,GAAOA,IAAM,KAAK,GA6FlC1hB,mBAAK/H,YAClB4uB,GA/FmB,aAgGnB,CAACjuB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,uBACA,iBAJgBZ,CA3F2C,EAC7D0qB,cACAyE,eACAD,YACAxV,YACAmQ,YACA6C,yBACAxa,WACAuY,eACAoC,uBACA9rB,mBAEA,MAAMG,EAAOC,cACPgsB,EAAiBlsB,YAAY,EAAG8W,gBAChC0S,GAAgB1S,IAAcqV,IAAkBC,WAClD7D,GAAa,KACXqD,EAAqB,CACnBtlB,KApBW,YAqBX+lB,MAAO5C,EACPxqB,OAAQivB,OAIb,CAAC1E,EAAcoC,EAAsBnC,EAAayE,IAE/CrB,EAAgB/qB,YAAQ,IACvBmP,GAAawa,EAIXxa,EAASgK,IAAKhd,IACnB,MAAOgB,EAAQC,GAAajB,EAAG6uB,MAAM,KAAK7R,IAAI3Q,QACxChT,EAAUm0B,EAAuBxsB,IAAWwsB,EAAuBxsB,GAAQuZ,KAAKtZ,GAEtF,OAAO5H,GAAWud,YAAmBvd,GAAWA,OAAUsK,IACzDyX,OAAOnR,SARDskB,KASR,CAACf,EAAwBxa,IAEtB8d,EAAqB/uB,YAAY,CAACd,EAAmBD,KACzDa,EAAa,CAAEb,SAAQC,eACtB,CAACY,IA4BJ,MAAMsuB,EAAoBC,aAAkB,CAAC5E,GAAc6E,QAA+BL,EAE1F,OACE,yBAAK3tB,UAAU,cACb,kBAACua,GAAA,EAAD,CACEva,UAAU,8CACVwa,MAAO+R,EACP9R,WAAYmR,EACZoB,YAAU,IAERc,GAAqB,kBAAC7S,GAAA,EAAD,MACtB6S,KAAuBnd,GAAgC,IAApBA,EAASnS,SAC3C,kBAACyuB,GAAA,EAAD,CACEtqB,KAAMhD,EAAK,6BACX+kB,YAAa/kB,EAAK,0CAGrBmuB,GAAqBnd,GAAYA,EAASnS,OAAS,GA1CjD+tB,EAAc5R,IAAI,CAAC3jB,EAASyf,KACjC,MAAMiY,EAAkC,IAAVjY,GACzBkY,YAAY33B,EAAQyJ,QAAUkuB,YAAYpC,EAAc9V,EAAQ,GAAGhW,MACxE,OACE,yBACET,UAAU,WACVG,IAAKnJ,EAAQ2G,IAEZ+wB,GACC,uBAAG1uB,UAAU,mBAAmB+gB,YAAmBphB,EAAM,IAAI8d,KAAoB,IAAfzmB,EAAQyJ,QAE5E,kBAACquB,GAAA,EAAD,CACE93B,QAASA,EACT+3B,UAAQ,EACRC,SAAUh4B,EAAQyJ,KAClBwuB,SAAO,EACPnwB,OAAQwvB,GAAc3uB,EAAM3I,EAASmhB,EAAWmQ,GAChDtoB,UAAU,cACVkvB,YAAaT,Y,UCjEzB,MAAMxG,GAAe3kB,YAAU4kB,GAAOA,IAAM,KAAK,GAyGlC1hB,mBAAK/H,YAClB4uB,GAAsB,SACtB,CAACjuB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,uBACA,eACA,oBALgBZ,CAvG4C,EAC9DgvB,QACAD,UACArE,cACAyE,eACAD,YACAxV,YACAmQ,YACA6C,yBACAxa,WACAuY,eACAoC,uBACA9rB,eACA2vB,sBAEA,MAAMxvB,EAAOC,cACP2tB,EAAcC,EAAU,QAAU,QAClC5B,EAAiBlsB,YAAY,EAAG8W,gBAChC0S,GAAgB1S,IAAcqV,IAAkBC,WAClD7D,GAAa,KACXqD,EAAqB,CACnBtlB,KAAMunB,EACNxB,MAAO5C,EACPxqB,OAAQivB,OAIb,CAACL,EAAarE,EAAcoC,EAAsBnC,EAAayE,IAE5DrB,EAAgB/qB,YAAQ,IACvBmP,GAAawa,EAIXxa,EAASgK,IAAKhd,IACnB,MAAOgB,EAAQC,GAAajB,EAAG6uB,MAAM,KAAK7R,IAAI3Q,QAE9C,OAAOmhB,EAAuBxsB,IAAWwsB,EAAuBxsB,GAAQuZ,KAAKtZ,KAC5Ema,OAAOnR,SAPDskB,KAQR,CAACf,EAAwBxa,IAEtB8d,EAAqB/uB,YAAY,CAACd,EAAmBD,KACzDa,EAAa,CAAEb,SAAQC,eACtB,CAACY,IAEE4vB,EAAkB1vB,YAAY,CAACd,EAAmBD,KACtDwwB,EAAgB,CAAExwB,SAAQC,eACzB,CAACuwB,IAiCJ,MAAMrB,EAAoBC,aAAkB,CAAC5E,GAAc6E,QAA+BL,EAE1F,OACE,yBAAK3tB,UAAU,cACb,kBAACua,GAAA,EAAD,CACEva,UAAU,8CACVwa,MAAO+R,EACP9R,WAAYmR,EACZoB,YAAU,IAERc,GAAqB,kBAAC7S,GAAA,EAAD,MACtB6S,KAAuBnd,GAAgC,IAApBA,EAASnS,SAC3C,kBAACyuB,GAAA,EAAD,CACEtqB,KAAMhD,EAAK,6BACX+kB,YAAa/kB,EAAK,0CAGrBmuB,GAAqBnd,GAAYA,EAASnS,OAAS,GA/CjD+tB,EAAc5R,IAAI,CAAC3jB,EAASyf,KACjC,MAAMiY,EAAkC,IAAVjY,GACzBkY,YAAY33B,EAAQyJ,QAAUkuB,YAAYpC,EAAc9V,EAAQ,GAAGhW,MACxE,OACE,yBACET,UAAU,WACVG,IAAKnJ,EAAQ2G,IAEZ+wB,GACC,uBAAG1uB,UAAU,kBAAkBM,IAAKX,EAAKiY,MAAQ,WAAQtW,GACtDyf,YAAmBphB,EAAM,IAAI8d,KAAoB,IAAfzmB,EAAQyJ,QAG/C,kBAAC4uB,GAAA,EAAD,CACElvB,IAAKnJ,EAAQ2G,GACb8vB,MAAOA,EACPz2B,QAASA,EACTiT,OAAO,eACPnK,YAAawuB,GAAc3uB,EAAM3I,EAASmhB,EAAWmQ,GACrD7nB,KAAMzJ,EAAQyJ,KACdyoB,aAAcA,EACdlpB,UAAU,cACVsvB,OAAQF,EACRF,YAAaT,Y,OClEzB,MAAMc,GAAO,CACX,CAAEvpB,KAAMwpB,IAAoBC,SAAU7T,MAAO,uBAC7C,CAAE5V,KAAMwpB,IAAoBpB,MAAOxS,MAAO,mBAC1C,CAAE5V,KAAMwpB,IAAoBE,MAAO9T,MAAO,mBAC1C,CAAE5V,KAAMwpB,IAAoBG,MAAO/T,MAAO,mBAC1C,CAAE5V,KAAMwpB,IAAoBI,MAAOhU,MAAO,mBAC1C,CAAE5V,KAAMwpB,IAAoBK,MAAOjU,MAAO,oBAGtCkU,GAAY,CAChB,CAAE9pB,KAAMwpB,IAAoBC,SAAU7T,MAAO,mBAC1C2T,GAAKQ,MAAM,IAGVC,GAA0B/xB,OAAOgyB,KAAKT,KAAqBhxB,OAAS,EA4F3DgI,mBAAK/H,YACjBC,IACC,MAAM,eAAEwxB,EAAF,OAAkBvxB,GAAWD,EAAO+pB,aAE1C,MAAO,CAAEyH,iBAAgBvxB,WAE3B,CAACS,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,yBAA0B,wBAN9DZ,CA1F0C,EAC5D0qB,cACAe,aACA3S,WACA2Y,iBAAiBV,IAAoBC,SACrC9wB,SACAwxB,yBACAC,sBACA1H,cAEA,MAAM/oB,EAAOC,eACNywB,EAAWC,GAAgBttB,YAASktB,GACrC9E,EAAkB5pB,YAAQ,IAAM+uB,YAAgBpH,GAAc,CAACA,IAE/DqH,EAAkB9wB,YAAa+W,IACnC,MAAMga,EAAMlB,GAAK9Y,GACjB0Z,EAAuB,CAAEO,QAASD,EAAIzqB,OACtCsqB,EAAa7Z,IACZ,CAAC0Z,IAEEQ,EAAyBjxB,YAAawG,IAC1CkqB,EAAoB,CAAE3vB,KAAMyF,EAAMsa,UAAY,OAC7C,CAAC4P,IAEJ1Y,YAAeH,EAAUmR,OAASpnB,OAAWA,GAAW,GAGxD,MAAMyY,EAAe9S,YAAuB,MACtC2P,EAAgBoD,aAA0BD,EAAcxC,OAAUjW,EAAW,oBAAoB,GAEvG,OACE,yBAAKtB,UAAU,aAAayK,IAAKsP,EAAcI,UAAWvD,GACxD,kBAACga,GAAA,EAAD,CAASP,UAAWA,EAAWQ,KAAMlyB,EAASmxB,GAAYP,GAAMuB,YAAaN,IAC7E,kBAAC3Y,EAAA,EAAD,CACEE,KAAMpY,EAAKiY,MAAQ,iBAAmB,QACtCmZ,YAAaf,GACblY,UAAWoY,GAEV,KACC,OAAQA,GACN,KAAKV,IAAoBC,SACvB,OAAI9wB,EAEA,kBAAC,GAAD,CACEwqB,YAAaA,EACbiC,gBAAiBA,EACjB1C,QAASA,EACT2C,mBAAoBsF,IAKxB,kBAAC,GAAD,CACExH,YAAaA,EACbe,WAAYA,EACZkB,gBAAiBA,EACjB1C,QAASA,EACT2C,mBAAoBsF,IAG1B,KAAKnB,IAAoBpB,MACvB,OAAO,kBAAC,GAAD,CAAcjF,YAAaA,IACpC,KAAKqG,IAAoBE,MACvB,OAAO,kBAAC,GAAD,CAAavG,YAAaA,IACnC,KAAKqG,IAAoBG,MACvB,OAAO,kBAAC,GAAD,CAAaxG,YAAaA,IACnC,KAAKqG,IAAoBI,MACvB,OACE,kBAAC,GAAD,CACEzvB,IAAI,QACJgpB,YAAaA,IAGnB,KAAKqG,IAAoBK,MACvB,OACE,kBAAC,GAAD,CACE1vB,IAAI,QACJqtB,SAAO,EACPrE,YAAaA,IAGnB,QACE,cCnIC,SAAS6H,GACtBC,EACAC,GAEA,MAAMC,EAAalqB,YAAOgqB,IACnBG,EAAOC,GAAYruB,YAAgBkuB,GAM1C,MAAO,CACLE,EALe1xB,YAAa4xB,IAC5BD,EAAUE,GAAiBJ,EAAWjpB,QAAQqpB,EAAcD,KAC3D,KCFE,MAAME,GAAwC,CACnD,CAAEpvB,KAAM,OAAQwZ,MAAO,iBAAkBzb,IAAK,YAC9C,CAAEiC,KAAM,eAAgBwZ,MAAO,oBAAqBzb,IAAK,eACzD,CAAEiC,KAAM,QAASwZ,MAAO,eAAgBzb,IAAK,UAC7C,CAAEiC,KAAM,UAAWwZ,MAAO,iBAAkBzb,IAAK,YACjD,CAAEiC,KAAM,OAAQwZ,MAAO,aAAczb,IAAK,SAG/BsxB,GAAwC,CACnD,CAAErvB,KAAM,OAAQwZ,MAAO,cAAezb,IAAK,gBAC3C,CAAEiC,KAAM,UAAWwZ,MAAO,iBAAkBzb,IAAK,mBACjD,CAAEiC,KAAM,YAAawZ,MAAO,aAAczb,IAAK,gBAG3CuxB,GAA2D,CAC/D,kBAAmB,OAAQ,WAAY,SAAU,WAAY,eAEzDC,GAA2D,CAC/D,kBAAmB,kBAAmB,eAAgB,eAGjD,SAASC,GAAkBR,EAAqBS,EAA+BC,GACpF,IAAIC,EAA4B,GAC5BC,EAA6C,GAEjD,GAAa,aAATH,EAAqB,CACvB,MAAM,gBACJI,KACGC,GACDJ,EACAV,EAAMc,gBAAkB,GACxB5yB,YACA8xB,EAAMe,OACNT,IAGJK,EAAkBE,GAAmB,GACrCD,EAAqB/zB,OAAOgyB,KAAKiC,GAC9BnZ,OAAQ5Y,GAAQyH,QAAQsqB,EAAe/xB,SACrC,CACL,MAAM,gBACJiyB,KACGC,GACDP,EACAV,EAAMiB,gBAAkB,GACxB/yB,YACA8xB,EAAMe,OACNR,IAGJI,EAAkBK,GAAmB,GACrCJ,EAAqB/zB,OAAOgyB,KAAKoC,GAC9BtZ,OAAQ5Y,GAAQyH,QAAQyqB,EAAelyB,KAG5C,MAAO,CACL4xB,kBACAC,qBAIJ,SAASM,GAAuBJ,GAC9B,GAAIA,EAAgB,CAClB,MAAM,gBACJD,KACGM,GACDL,EAEJ,GACEj0B,OAAOu0B,OAAOD,GAASxZ,OAAOnR,SAASpJ,OAAS,GAC5CyzB,GAAmBA,EAAgBzzB,OAEvC,MAAO,GAGT,GAAI+zB,EAAQE,KACV,MAAO,OACF,GAAIF,EAAQG,OACjB,MAAO,SACF,GAAIH,EAAQI,SACjB,MAAO,WACF,GAAIJ,EAAQK,SACjB,MAAO,WACF,GAAIL,EAAQM,YACjB,MAAO,eAIX,MAAO,GAyBT,MAAMC,GAA8B,CAClCjB,KAAM,SACNkB,WAAY,GACZZ,OAAQ,CACNvW,MAAO,GACPqW,gBAAiB,GACjBG,gBAAiB,KAIfY,GAA6D,CACjE5B,EACAE,KAEA,OAAQA,EAAOtrB,MACb,IAAK,WACH,MAAO,IACForB,EACHe,OAAQ,IACHf,EAAMe,OACTvW,MAAO0V,EAAO2B,SAEhBC,WAAW,GAEf,IAAK,qBACH,MAAO,IACF9B,EACHc,eAAgB5yB,YACd8xB,EAAMe,OACNT,KAGN,IAAK,qBACH,MAAO,IACFN,EACHiB,eAAgB/yB,YACd8xB,EAAMe,OACNR,KAGN,IAAK,oBACH,MAAO,IACFP,EACHc,eAAgBZ,EAAO2B,QACvBF,WAAY,IAEhB,IAAK,oBACH,MAAO,IACF3B,EACHiB,eAAgBf,EAAO2B,QACvBF,WAAY,IAEhB,IAAK,cACH,OAAI3B,EAAMc,eACD,IACFd,EACHe,OAAQ,IACHgB,YAAK/B,EAAMe,OAAQT,IACtB9V,MAAOwV,EAAMe,OAAOvW,MAAQwV,EAAMe,OAAOvW,MAAQ0W,GAAuBlB,EAAMc,mBAC3Ed,EAAMc,gBAEXA,oBAAgB5wB,EAChByxB,WAAY,GACZG,WAAW,GAEJ9B,EAAMiB,eACR,IACFjB,EACHe,OAAQ,IACHgB,YAAK/B,EAAMe,OAAQR,OACnBP,EAAMiB,gBAEXA,oBAAgB/wB,EAChByxB,WAAY,GACZG,WAAW,GAGN9B,EAEX,IAAK,aAAc,CACjB,MAAQzzB,GAAIy1B,EAAN,YAAgB1O,KAAgByN,GAAWb,EAAO2B,QAExD,MAAO,CACLpB,KAAM,OACNuB,WACAjB,SACAY,WAAY,IAGhB,IAAK,gBACH,MAAO,IACF3B,EACH2B,WAAYzB,EAAO2B,SAGvB,IAAK,eACH,MAAO,IACF7B,EACHzD,UAAW2D,EAAO2B,SAGtB,IAAK,WACH,MAAO,IACF7B,EACHjW,MAAOmW,EAAO2B,SAGlB,IAAK,QACH,OAAOH,GACT,QACE,OAAO1B,IC9Nb,MAAM0B,GAA4B,CAChCO,gBAAiB,GACjBC,SAAU,GACVC,KAAM,GACNC,MAAO,IAGHC,GAAuD,CAC3DrC,EACAE,KAEA,OAAQA,EAAOtrB,MACb,IAAK,qBACH,MAAO,IACForB,EACHiC,gBAAiB/B,EAAO2B,SAG5B,IAAK,cACH,MAAO,IACF7B,EACHkC,SAAUhC,EAAO2B,SAGrB,IAAK,UACH,MAAO,IACF7B,EACHmC,KAAMjC,EAAO2B,SAGjB,IAAK,WACH,MAAO,IACF7B,EACHoC,MAAOlC,EAAO2B,SAGlB,IAAK,QACH,OAAOH,GAET,QACE,OAAO1B,ICiME5qB,mBAAK/H,iBAClB6C,EACA,CAAClC,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,UAAW,qBAF/CZ,CA7NiC,EACnDi1B,gBACAC,iBACAjL,UACAkL,eACAC,UACAC,uBAEA,MAAOC,EAAqBC,GAA0BhxB,aAAS,IACxDixB,EAA0BC,GAA+BlxB,aAAS,GAEnEmxB,EAA0Bz0B,YAAY,KAC1Cs0B,GAAuB,IACtB,IAEGI,EAA2B10B,YAAY,KAC3Cs0B,GAAuB,IACtB,IAEGK,EAA+B30B,YAAY,KAC/Cw0B,GAA4B,IAC3B,IAEGI,EAAgC50B,YAAY,KAChDw0B,GAA4B,IAC3B,IAEGK,EAAuB70B,YAAY,KACvC00B,IACAP,KACC,CAACO,EAA0BP,IAExBW,EAA4B90B,YAAY,KAC5C40B,IACAR,EAAiB,CAAEn2B,GAAIg2B,IACvBjL,KACC,CAACiL,EAAgBW,EAA+BR,EAAkBpL,IAE/D+L,EAAsEjzB,YAAQ,IAC3E,EAAGC,YAAWC,YACnB,kBAACC,EAAA,EAAD,CACEC,OAAK,EACLwE,QAASrE,IACTtI,KAAK,UACLoI,MAAM,cACN7B,UAAW0B,EAAS,SAAW,GAC/BzB,QAASwB,EACTK,UAAU,gBAEV,uBAAG9B,UAAU,eAGhB,IAEGL,EAAOC,cAuIb,OACE,yBAAKI,UAAU,eACb,kBAAC2B,EAAA,EAAD,CACEC,OAAK,EACLnI,KAAK,UACLoI,MAAM,cACN5B,QAASyoB,EACT5mB,UAAWnC,EAAK,mBAEhB,uBAAGK,UAAU,qBA9InB,WACE,OAAQ0zB,GACN,KAAKgB,IAAgBC,YACnB,OAAO,4BAAKh1B,EAAK,6BACnB,KAAK+0B,IAAgBE,QACnB,OAAO,4BAAKj1B,EAAK,YACnB,KAAK+0B,IAAgBG,cACnB,OAAO,4BAAKl1B,EAAK,kBACnB,KAAK+0B,IAAgBI,QACnB,OAAO,4BAAKn1B,EAAK,oBACnB,KAAK+0B,IAAgBK,SACnB,OAAO,4BAAKp1B,EAAK,aAEnB,KAAK+0B,IAAgBM,sBACnB,OAAO,4BAAKr1B,EAAK,mBACnB,KAAK+0B,IAAgBO,2BACnB,OAAO,4BAAKt1B,EAAK,aAEnB,KAAK+0B,IAAgBQ,mBACnB,OAAO,4BAAKv1B,EAAK,iBACnB,KAAK+0B,IAAgBS,gBACnB,OAAO,4BAAKx1B,EAAK,oBACnB,KAAK+0B,IAAgBU,oBACnB,OAAO,4BAAKz1B,EAAK,yBACnB,KAAK+0B,IAAgBW,kBACnB,OAAO,4BAAK11B,EAAK,oBACnB,KAAK+0B,IAAgBY,kBACnB,OAAO,4BAAK31B,EAAK,2BACnB,KAAK+0B,IAAgBa,kCACrB,KAAKb,IAAgBc,+BACrB,KAAKd,IAAgBe,mCACrB,KAAKf,IAAgBgB,iCACrB,KAAKhB,IAAgBiB,iCACnB,OAAO,4BAAKh2B,EAAK,oBACnB,KAAK+0B,IAAgBkB,iCACrB,KAAKlB,IAAgBmB,8BACrB,KAAKnB,IAAgBoB,kCACrB,KAAKpB,IAAgBqB,gCACrB,KAAKrB,IAAgBsB,gCACnB,OAAO,4BAAKr2B,EAAK,mBAEnB,KAAK+0B,IAAgBuB,sBACnB,OAAO,4BAAKt2B,EAAK,kBACnB,KAAK+0B,IAAgBwB,oBACnB,OAAO,4BAAKv2B,EAAK,iBAEnB,KAAK+0B,IAAgByB,cACrB,KAAKzB,IAAgB0B,aACnB,OAAO,4BAAKz2B,EAAK,wBACnB,KAAK+0B,IAAgB2B,iBACrB,KAAK3B,IAAgB4B,uBACrB,KAAK5B,IAAgB6B,2BACnB,OAAO,4BAAK52B,EAAK,+BACnB,KAAK+0B,IAAgB8B,wBACnB,OAAO,4BAAK72B,EAAK,0BACnB,KAAK+0B,IAAgB+B,qBACrB,KAAK/B,IAAgBgC,wBACnB,OAAO,4BAAK/2B,EAAK,iBACnB,KAAK+0B,IAAgBiC,sBACrB,KAAKjC,IAAgBkC,mBACnB,OAAO,4BAAKj3B,EAAK,uBACnB,KAAK+0B,IAAgBmC,0BACrB,KAAKnC,IAAgBoC,uBACnB,OAAO,mDACT,KAAKpC,IAAgBqC,qBACnB,OAAO,4BAAKp3B,EAAK,mCACnB,KAAK+0B,IAAgBsC,2BACrB,KAAKtC,IAAgBuC,aACrB,KAAKvC,IAAgBwC,kCACnB,OAAO,4BAAKv3B,EAAK,+BAEnB,KAAK+0B,IAAgByC,QACnB,OAAO,4BAAKx3B,EAAK,YACnB,KAAK+0B,IAAgB0C,oBACnB,OAAO,4BAAKz3B,EAAK,cACnB,KAAK+0B,IAAgB2C,kBACnB,OACE,yBAAKr3B,UAAU,wBACb,4BAAKL,EAAK,eAETg0B,GACC,kBAAC3xB,EAAA,EAAD,CACEhC,UAAU,qBACViC,QAASwyB,EACTvyB,UAAU,SAEV,kBAACC,EAAA,EAAD,CAAUC,KAAK,SAASykB,aAAW,EAAC5mB,QAASo0B,GAA7C,mBAOV,KAAKK,IAAgB4C,qBACrB,KAAK5C,IAAgB6C,qBACnB,OACE,yBAAKv3B,UAAU,wBACZ0zB,IAAkBgB,IAAgB4C,qBACjC,4BAAK33B,EAAK,kBAEV,4BAAKA,EAAK,kBAGZ,kBAACgC,EAAA,EAAD,CACEC,OAAK,EACLnI,KAAK,UACLoI,MAAM,cACN7B,UAAU,gBACVC,QAAS2zB,EACT9xB,UAAWnC,EAAK,sBAEhB,uBAAGK,UAAU,iBAKrB,QACE,OACE,yBAAKA,UAAU,wBACb,4BAAKL,EAAK,aAEV,kBAACqC,EAAA,EAAD,CACEhC,UAAU,qBACViC,QAASwyB,EACTvyB,UAAU,SAEV,kBAACC,EAAA,EAAD,CAAUC,KAAK,SAASnC,QAASk0B,GAA0Bx0B,EAAK,mBAkBvE63B,GACD,kBAAC1a,GAAA,EAAD,CACEpb,OAAQqyB,EACRhtB,QAASqtB,EACTzxB,KAAK,oCACLoa,aAAa,UACbC,eAAgBuX,EAChBkD,sBAAoB,IAEtB,kBAAC3a,GAAA,EAAD,CACEpb,OAAQuyB,EACRltB,QAASutB,EACT3xB,KAAK,+CACLoa,aAAa,SACbC,eAAgBwX,EAChBiD,sBAAoB,Q,SC3JbjxB,mBAAK/H,YACjBC,IACC,MAAM,cAAE4Z,GAAkB5Z,EAE1B,MAAO,CACLg5B,YAAapf,EAAgBtZ,aAAWN,EAAQ4Z,QAAiBhX,IALnD7C,CA7D4B,EAC9C8Y,WACAogB,iBACAjP,UACAgP,kBAEA,MAAM/3B,EAAOC,cAIb,OAFA8X,YAAeH,EAAUmR,EAASiP,EAAgBjD,IAAgBkD,MAGhE,yBAAK53B,UAAU,kCACb,yBAAKA,UAAU,sBACZ03B,GACC,yBAAK13B,UAAU,yBACb,kBAACE,EAAA,EAAD,CAAQG,KAAMq3B,EAAaj+B,KAAK,UAChC,uBAAGuG,UAAU,QAAQqsB,aAAgBqL,IACrC,uBAAG13B,UAAU,SAAS63B,aAA0BH,EAAYI,eAGhE,kBAACld,GAAA,EAAD,CACExY,KAAK,OACLnC,QAAS,IAAM03B,EAAejD,IAAgBC,cAE7Ch1B,EAAK,6BAER,kBAACib,GAAA,EAAD,CACExY,KAAK,SACLnC,QAAS,IAAM03B,EAAejD,IAAgByC,UAE7Cx3B,EAAK,YAER,kBAACib,GAAA,EAAD,CACExY,KAAK,WACLnC,QAAS,IAAM03B,EAAejD,IAAgBE,UAE7Cj1B,EAAK,2CAER,kBAACib,GAAA,EAAD,CACExY,KAAK,SACLnC,QAAS,IAAM03B,EAAejD,IAAgBG,gBAE7Cl1B,EAAK,kBAER,kBAACib,GAAA,EAAD,CACExY,KAAK,OACLnC,QAAS,IAAM03B,EAAejD,IAAgBI,UAE7Cn1B,EAAK,oBAER,kBAACib,GAAA,EAAD,CACExY,KAAK,WACLnC,QAAS,IAAM03B,EAAejD,IAAgBK,WAE7Cp1B,EAAK,kB,iBC/BDo4B,OA9B4B,EACzC5sB,UACAnL,YACA6B,QAAQ,UACRC,YACA+J,WACA5L,UACAuM,eAEA,MAAMwrB,EAAkBt0B,YACtB,uBACAyH,GAAW,WACXnL,GAGF,OACE,kBAAC2B,EAAA,EAAD,CACE3B,UAAWg4B,EACXn2B,MAAOA,EACPD,OAAK,EACLiK,SAAUA,EACV5L,QAASkL,IAAYU,EAAW5L,OAAUqB,EAC1CQ,UAAWA,EACXsf,UAAW,GAEV5U,ICxBP,MAGMyrB,GAAoB,sBACpBC,GAAiB,oBAEjBC,GAA+BC,YAAUlQ,GAAOA,IAAM,KAAK,GAkFlD1hB,mBA1E2B,EACxC6xB,kBACAC,SACA3K,YACA4K,sBACAC,gBACA1sB,eAEA,MAAOwgB,EAAUmM,GAAez1B,YAASq1B,GAAmB,IAEtD14B,EAAOC,cACP84B,EAAaJ,EAAS,SAAW,WACjCrT,EAAiBtlB,EAAT24B,EAAc,oBAA4B,aAEjDK,EAAiBC,GAAiBp3B,YAAQ,IAC1C8qB,EAAS9tB,OAIV8tB,EAAS9tB,OAjCW,EAkCf,MAAC8C,EAAc2jB,EAAF,iBAElBqH,EAAS9tB,OAnCW,GAoCf,MAAC8C,EAAc2jB,EAAF,gBAEjBiT,GAAeW,KAAKvM,QAIGhrB,IAAxBi3B,EACK,GAIF,CACLA,EAAsB54B,EAAQ+4B,EAAF,YAAyB,iBAAcp3B,GAC3C,IAAxBi3B,EAAgC54B,EAAQ+4B,EAAF,cAAuBp3B,GAVtD,MAACA,EAAc2jB,EAAF,gCAVb,GAsBR,CAACqH,EAAUiM,EAAqB54B,EAAM+4B,EAAYzT,IAErDhiB,YAAU,KACRw1B,EAAYJ,GAAmB,KAC9B,CAACC,EAAQD,IAEZ,MAAMS,EAAuBp5B,YAAaiE,IACxC,MAAMo1B,EAAcp1B,EAAEsG,OAAO/D,MAAM8yB,OAAO1Y,QAAQ2X,GAAmB,IACrEQ,EAAYM,GACZp1B,EAAEsG,OAAO/D,MAAS,GAAEoyB,EA3DJ,gBA2D2B,KAAKS,IAEhD,MAAME,EAvDV,SAAyB3M,GACvB,OAAOA,EAAS9tB,QATU,GAUrB8tB,EAAS9tB,QATY,IAUrB05B,GAAeW,KAAKvM,GAoDP4M,CAAgBH,GAE5BE,GACFd,GAA6B,KAC3BK,EAAc,CAAElM,SAAUyM,MAI1BjtB,GACFA,IAASmtB,GAAUF,IAEpB,CAACT,EAAQE,EAAe1sB,IAE3B,OACE,kBAACoO,GAAA,EAAD,CACEhU,MAAQ,GAAEoyB,EA5EI,gBA4EmB,KAAKhM,IACtCxgB,SAAUgtB,EACV7T,MAAOA,EACP9J,MAAOyd,EACPO,QAASR,EACTS,SAAUzL,MCzDhB,MAAM1F,GAAe3kB,YAAU4kB,GAAOA,IAAM,KAAO,GAmNpC1hB,mBAAK/H,YACjBC,IACC,MAAM,cAAE4Z,GAAkB5Z,GACpB,SAAE8D,EAAF,oBAAY+1B,GAAwB75B,EAAO26B,aAAe,GAC1D3B,EAAcpf,EAAgBtZ,aAAWN,EAAQ4Z,QAAiBhX,EAExE,IAAKo2B,EACH,MAAO,CACLl1B,WACA+1B,uBAIJ,MACEe,UAAWC,EACXC,SAAUC,EACVnN,SAAU+L,EAHN,SAIJqB,GACEhC,GACIiC,IAAKC,GAAeF,GAAY,GAGxC,MAAO,CACLG,kBAHwBzmB,YAAkBskB,GAI1C6B,mBACAE,kBACAG,aACAvB,kBACA71B,WACA+1B,wBAGJ,CAACn5B,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,kBACA,gBACA,kBAnCgBZ,CA5MmD,EACrE8Y,WACAogB,iBACAjP,UACAmR,oBACAN,mBACAE,kBACAG,aACAvB,kBACA71B,WACA+1B,sBACAuB,kBACAC,gBACAvB,oBAEA,MAAM74B,EAAOC,eAENo6B,EAAmBC,GAAwBj3B,aAAS,IACpDk3B,EAAwBC,GAA6Bn3B,aAAS,IAC9DmY,EAAOif,GAAYp3B,eAEnBkO,EAAOmpB,GAAYr3B,eACnBs2B,EAAWgB,GAAgBt3B,YAASu2B,GAAoB,KACxDC,EAAUe,GAAev3B,YAASy2B,GAAmB,KACrDE,EAAKa,GAAUx3B,YAAS42B,GAAc,KACtCtN,EAAUmM,GAAez1B,YAAyBq1B,GAAmB,IAEtEoC,EAAuBnnB,YAASumB,GAAmB,EAAOtmB,iBAAeC,SAEzEma,EAAYnrB,IAAak4B,IAAoBC,WAC7CC,GAA+B,IAAbtO,EAElBuO,EAAoBr5B,YAAQ,KAC5Bo5B,IAIGhzB,QAAQsJ,IAAUgpB,IAAkD,IAAxB3B,GAClD,CAACrnB,EAAOgpB,EAAwBU,EAAiBrC,IAEpD7gB,YAAeH,EAAUmR,EAASiP,EAAgBjD,IAAgBC,aAIlE1xB,YAAU,KACRglB,GAAa,KACX6R,OAED,CAACA,IAEJ72B,YAAU,KACRo3B,OAAS/4B,IACR,CAACm5B,IAEJx3B,YAAU,KACRq3B,EAAaf,GAAoB,IACjCgB,EAAYd,GAAmB,IAC/Be,EAAOZ,GAAc,KACpB,CAACL,EAAkBE,EAAiBG,IAEvC32B,YAAU,KACRw1B,EAAYJ,GAAmB,KAC9B,CAACA,IAEJp1B,YAAU,KACJT,IAAak4B,IAAoBI,WACnCX,GAA0B,GAC1BF,GAAqB,GACrBG,OAAS94B,KAEV,CAACkB,IAEJ,MAAMu4B,EAAoBr7B,YAAas7B,IACrCX,EAASW,IACR,IAEGC,EAAwBv7B,YAAaiE,IACzC22B,EAAa32B,EAAEsG,OAAO/D,OACtBi0B,GAA0B,IACzB,IAEGe,EAAuBx7B,YAAaiE,IACxC42B,EAAY52B,EAAEsG,OAAO/D,OACrBi0B,GAA0B,IACzB,IAEGgB,EAAkBz7B,YAAaiE,IACnC62B,EAAO72B,EAAEsG,OAAO/D,OAChBi0B,GAA0B,IACzB,IAEGrB,EAAuBp5B,YAAawG,IACxCuyB,EAAYvyB,GACZ+zB,GAAqB,IACpB,IAEGmB,EAAoB17B,YAAY,KACpC,MAAM27B,EAAmB/B,EAAUN,OAC7BsC,EAAkB9B,EAASR,OAC3BuC,EAAa5B,EAAIX,OAElBqC,EAAiB78B,OAKlB+8B,EAAW/8B,OA/GI,GAgHjB47B,EA7GqB,yCAiHvBL,EAAc,CACZ7oB,WACIgpB,GAA0B,CAC5BZ,UAAW+B,EACX7B,SAAU8B,EACV3B,IAAK4B,MAEHvB,GAAqB,CACvB1N,cAjBF8N,EAzG2B,mCA6H5B,CACDlpB,EACAooB,EAAWE,EAAUG,EAAKO,EAC1B5N,EAAU0N,EACVD,IAGF,OACE,yBAAK/5B,UAAU,wBACb,yBAAKA,UAAU,kCACb,yBAAKA,UAAU,yBACb,kBAACw7B,GAAA,EAAD,CACEf,qBAAsBA,EACtB3uB,SAAUivB,EACVnf,MAAM,0BACN/P,SAAU8hB,IAEZ,kBAACzT,GAAA,EAAD,CACEhU,MAAOozB,EACPxtB,SAAUmvB,EACVhW,MAAOtlB,EAAK,aACZkM,SAAU8hB,EACVxS,MAnJqB,mCAmJdA,EAAqCA,OAAQ7Z,IAEtD,kBAAC4Y,GAAA,EAAD,CACEhU,MAAOszB,EACP1tB,SAAUovB,EACVjW,MAAOtlB,EAAK,YACZkM,SAAU8hB,IAEZ,kBAACzT,GAAA,EAAD,CACEhU,MAAOyzB,EACP7tB,SAAUqvB,EACVlW,MAAOtlB,EAAK,WACZkM,SAAU8hB,EACVxS,MA/Je,0CA+JRA,EAA+BA,OAAQ7Z,IAGhD,uBAAGtB,UAAU,4BAA4BM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAChEf,YAAWZ,EAAK,0BAA2B,CAAC,KAAM,sBAIvD,yBAAKK,UAAU,iBACb,wBAAIA,UAAU,uBAAuBM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAAY3B,EAAK,aAEhF,kBAAC87B,GAAD,CACEpD,gBAAiB/L,GAAY,GAC7BqB,UAAWA,EACX4K,oBAAqBA,EACrBC,cAAeA,EACf1sB,SAAUgtB,IAGZ,uBAAG94B,UAAU,4BAA4BM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAChEf,YAAWZ,EAAK,gBAAiB,CAAC,KAAM,qBAE1C2sB,GACC,uBAAGtsB,UAAU,4BAA4BM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAChE3B,EAAK,qBAAqB,6BAC3B,0BAAMK,UAAU,iBAAhB,gBAA8CssB,MAMtD,kBAAC,GAAD,CACEnhB,QAAS0vB,EACT56B,QAASm7B,EACTvvB,SAAU8hB,EACV7rB,UAAU,gBAET6rB,EACC,kBAACne,EAAA,EAAD,CAAS3N,MAAM,UAEf,uBAAG7B,UAAU,oB,oBC9MvB,MAAM07B,GAAiCp4B,YAAU4kB,GAAOA,IAAM,KAAO,GAyLtD1hB,mBAAK/H,YACjBC,IACC,MACEuZ,OAASC,KAAMC,GACfoQ,OAASrQ,KAAMoQ,IACb5pB,GAGFi9B,WAAYC,EACZ1jB,KAAM2jB,EACNC,YAAaC,GACXr9B,EAAOs9B,YAEX,MAAO,CACL7jB,YACAmQ,YACAsT,mBACAC,cACAE,yBACAE,eAAgB1U,aAAqB7oB,GACrCw9B,iBAAkB1U,aAAuB9oB,KAG7C,CAACU,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,6BAA8B,gBAAiB,eAvBnFZ,CArLmD,EACrE09B,iBACAC,eACA7kB,WACAogB,iBACAjP,UACAvQ,YACAmQ,YACAsT,mBACAC,cACAE,yBACAE,iBACAC,mBACAG,6BACAC,gBACAC,iBAEA,MAAOC,EAAeC,GAAoBz5B,eACnC05B,EAAmBC,GAAwB35B,aAAS,GACrD45B,EAAsBl9B,YAAY,IAAMi9B,GAAqB,GAAO,IAE1E15B,YAAU,KACHu5B,GACHK,aAAiB,cAAcC,KAAKL,IAErC,CAACD,IAIJv5B,YAAU,KACRy4B,GAA+B,KAC7BW,OAED,CAACA,IAEJ,MAAMU,EAAqBr9B,YAAY,KACjCzB,OAAOgyB,KAAK4L,GAAar9B,QAtCL,GAuCtB+9B,EAAW,CACTS,KAAM,CACJhmC,QAAS,0BACTqkB,aAAa,KAOnB8gB,KACC,CAACN,EAAaU,EAAYJ,IAEvBx8B,EAAOC,cAEb8X,YAAeH,EAAUmR,EAASiP,EAAgBjD,IAAgByC,SAElE,MAAM8F,EAAcz7B,YAAQ,KAC1B,IAAKo6B,EACH,OAGF,MAAMziB,EAAUlb,OAAOgyB,KAAK9X,GAAWwC,IAAI3Q,QAE3C,OAAO4xB,EAAiBjhB,IAAKhd,IAC3B,MAAMw0B,EAAS0J,EAAYl+B,GAE3B,MAAO,CACLA,GAAIw0B,EAAOx0B,GACXie,MAAOuW,EAAOvW,MACdshB,SAAUC,YACRx9B,EAAMwY,EAAWmQ,EAAW6J,EAAQhZ,EAAS8iB,EAAgBC,OAIlE,CAACN,EAAkBzjB,EAAW0jB,EAAavT,EAAW2T,EAAgBC,EAAkBv8B,IAErFy9B,EAAoC19B,YAAayyB,IACjDl0B,OAAOgyB,KAAK4L,GAAar9B,QA7EL,GA8EtB+9B,EAAW,CACTS,KAAM,CACJhmC,QAAS,0BACTqkB,aAAa,KAOnBihB,EAAc,CAAEnK,YACf,CAAC0J,EAAaS,EAAeC,IAEhC,OACE,yBAAKv8B,UAAU,kCACb,yBAAKA,UAAU,2BACb,yBAAKA,UAAU,yBACZw8B,GACC,kBAACa,GAAA,EAAD,CACE1/B,GAAG,sBACHlE,KAAM6jC,KACNd,cAAeA,EACfjzB,KAAMmzB,EACNa,QAAM,EACNC,OAAQZ,KAKd,uBAAG58B,UAAU,iCAAiCM,IAAI,QAC/CX,EAAK,wBAGR,kBAACgC,EAAA,EAAD,CAEE3B,UAAU,iBACV6B,MAAM,UACNpI,KAAK,UACLgkC,MAAI,EACJC,OAAK,EACLz9B,QAAS88B,EACTnlB,MAAOjY,EAAKiY,OAEZ,uBAAG5X,UAAU,aACZL,EAAK,qBAIV,yBAAKK,UAAU,sBACb,wBAAIA,UAAU,4BAA4BM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAAY3B,EAAK,YAEpFs9B,GAAeA,EAAYz+B,OAASy+B,EAAYtiB,IAAKwX,GACpD,kBAACvX,GAAA,EAAD,CACE5a,UAAU,OACV29B,QAAM,EACNC,WAAS,EACT39B,QAAS,IAAMm8B,EAAaP,EAAY1J,EAAOx0B,MAE/C,0BAAMqC,UAAU,SAASmyB,EAAOvW,OAChC,0BAAM5b,UAAU,YAAYmyB,EAAO+K,YAElCD,IAAgBA,EAAYz+B,OAC/B,uBAAGwB,UAAU,iCAAiCM,IAAI,QAAlD,4BAGE,kBAAC2a,GAAA,EAAD,OAGJ8gB,KAA4BA,EAAuBv9B,QACnD,yBAAKwB,UAAU,sBACb,wBAAIA,UAAU,4BAA4BM,IAAKX,EAAKiY,MAAQ,WAAQtW,GACjE3B,EAAK,sBAGPo8B,EAAuBphB,IAAKwX,GAC3B,kBAACvX,GAAA,EAAD,CACE5a,UAAU,OACV29B,QAAM,EACN19B,QAAS,IAAMm9B,EAAkCjL,IAEjD,yBAAKnyB,UAAU,qCACb,yBAAKA,UAAU,kBACb,0BAAMA,UAAU,SAASmyB,EAAOvW,OAChC,0BAAM5b,UAAU,YAAYmyB,EAAOzN,cAGrC,kBAAC/iB,EAAA,EAAD,CACE3B,UAAU,OACV6B,MAAM,UACNpI,KAAK,OACLgkC,MAAI,EACJC,OAAK,EACL9lB,MAAOjY,EAAKiY,OAEXjY,EAAK,gB,OChLTk+B,OAzBsB,EACnCC,QACAC,WACAC,iBACArQ,YACA1tB,cAEA,MAAMN,EAAOC,cAEb,OACE,kBAAC+B,EAAA,EAAD,CACE3B,UAAU,iBACV6B,MAAM,cACNpI,KAAK,UACLwiB,QAAM,EACN0R,UAAWA,EACX/V,MAAOjY,EAAKiY,MACZ3X,QAASA,GAET,uBAAGD,UAAU,cATf,QAUQ89B,EAVR,SAUqBA,EAAQ,EAAIE,GAAqBD,EAAF,IAAgBA,ICaxE,MAIME,GAAiB,0CACjBC,GAAiB,mDAqQR13B,mBAAK/H,YACjBC,IACC,MAAM,QAAE0Z,GAAY1Z,EAAOuZ,MAE3B,MAAO,CACLkmB,oBAAqB/lB,EAAQI,OAC7B4lB,sBAAuBhmB,EAAQO,WAGnC,CAACvZ,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,iBAAkB,gBAAiB,kBATvEZ,CAnQmD,EACrE2yB,QACAiN,WACAC,qBACAC,qBACAhnB,WACAogB,iBACAjP,UACA8V,SACAL,sBACAC,wBACAK,iBACAnC,gBACAxjB,oBAEA,MAAO0jB,EAAeC,GAAoBz5B,eACnC05B,EAAmBC,GAAwB35B,aAAS,GACrD45B,EAAsBl9B,YAAY,IAAMi9B,GAAqB,GAAO,KAEnE+B,EAA6BC,GAAkC37B,aAAS,IACxE47B,EAA6BC,GAAkC77B,aAAS,IAG7E+uB,gBAAiBE,EACjBD,kBAAmB8M,GACjBlN,GAAkBR,EAAO,aAE3BW,gBAAiBK,EACjBJ,kBAAmB+M,GACjBnN,GAAkBR,EAAO,YAE7BnuB,YAAU,KACHu5B,GACHK,aAAiB,cAAcC,KAAKL,IAErC,CAACD,IAEJv5B,YAAU,KACR07B,GAA+B,GAC/BE,GAA+B,IAC9B,CAACzN,EAAMgC,WAEV,MAAO4L,EAAwBC,GAA0Bz9B,YAAQ,KAC/D,MAAM09B,EAAoB,IAAIC,IAAI,IAC7BhB,GAAuB,MACvBC,GAAyB,KAGxBgB,EAAwBC,YAAwBpN,EAAiBiN,GACjEI,EAAwBD,YAAwBjN,EAAiB8M,GAEvE,MAAO,CACLR,EACIU,EACAA,EAAsBrP,MAAM,EA3DV,EA2DmC+O,EAAkBtgC,QAC3EogC,EACIU,EACAA,EAAsBvP,MAAM,EA9DV,EA8DmCgP,EAAkBvgC,UAE5E,CACD4zB,EAAiBH,EAAiB6M,EAAmBC,EACrDH,EAA6BF,EAC7BP,EAAqBC,IAGvBn7B,YAAU,MAEN+7B,EAAuBxgC,OAASyzB,EAAgBzzB,QAC7CygC,EAAuBzgC,OAAS4zB,EAAgB5zB,SAEnDsa,EAAc,CAAEymB,SAAU,YAE3B,CACDzmB,EACAsZ,EAAgB5zB,OAChByzB,EAAgBzzB,OAChBygC,EAAuBzgC,OACvBwgC,EAAuBxgC,SAGzB,MAAMmB,EAAOC,cA0Db,SAAS4/B,EAAY3N,GACnB,MAAMG,EAA6B,aAATH,EAAsBiN,EAAoBC,EAC9DU,EAA0B,aAAT5N,EAAsBmN,EAAyBC,EAEhES,EAAsB,aAAT7N,EAAsB6M,EAA8BE,EAEjEe,GADsB,aAAT9N,EAAsBI,EAAkBG,GACzB5zB,OAASwzB,EAAkBxzB,OAASihC,EAAejhC,OAC/EohC,EAAwB,aAAT/N,EACjB,IAAM8M,GAA+B,GACrC,IAAME,GAA+B,GAEzC,OACE,oCACG7M,EAAkBrX,IAAKxa,GAnC9B,SAAwBA,EAAa0xB,GACnC,MAAMgO,EAAoB,aAAThO,EACbL,GAAoBsO,KAAK,EAAG3/B,IAAK4/B,KAAcA,IAAY5/B,GAC3DsxB,GAAoBqO,KAAK,EAAG3/B,IAAK4/B,KAAcA,IAAY5/B,GAE/D,GAAK0/B,EAIL,OACE,kBAACjlB,GAAA,EAAD,CACEza,IAAK0/B,EAAS1/B,IACdH,UAAU,kCACVoC,KAAMy9B,EAASz9B,KACfu7B,QAAM,EACNqC,UAAQ,GAEPrgC,EAAKkgC,EAASjkB,QAkBiBqkB,CAAe9/B,EAAK0xB,IACnD4N,EAAe9kB,IAAKhd,GACnB,kBAACid,GAAA,EAAD,CACE5a,UAAU,kCACV29B,QAAM,EACNqC,UAAQ,GAEPjhC,aAAcpB,GACb,kBAACkd,GAAA,EAAD,CAAiBkN,WAAW,QAAQhN,OAAQpd,IAE5C,kBAACqd,GAAA,EAAD,CAAe+M,WAAW,QAAQppB,OAAQhB,OAI7C+hC,GAAcC,EAAiB,GAChC,kBAAC,GAAD,CACE7B,MAAO6B,EACP5B,SAAS,OACT99B,QAAS2/B,KAOnB,OA9FAloB,YAAeH,EAAUinB,EAAQ7G,EAA+B,SAAfvG,EAAMS,KACnD6C,IAAgB2C,kBAChB3C,IAAgB0C,qBA6FlB,yBAAKp3B,UAAU,wBACb,yBAAKA,UAAU,kCACb,yBAAKA,UAAU,2BACb,yBAAKA,UAAU,yBACZw8B,GACC,kBAACa,GAAA,EAAD,CACE1/B,GAAG,sBACHlE,KAAM6jC,KACNd,cAAeA,EACfjzB,KAAMmzB,GAAqB1e,OAAOoT,EAAMgC,UACxCmK,QAAM,EACNC,OAAQZ,KAKE,WAAfxL,EAAMS,MACL,uBAAG7xB,UAAU,iCAAiCM,IAAKX,EAAKiY,MAAQ,WAAQtW,GACrE3B,EAAK,sBAIV,kBAACua,GAAA,EAAD,CACEla,UAAU,OACVilB,MAAOtlB,EAAK,kBACZuG,MAAOkrB,EAAMe,OAAOvW,MACpB9P,SArHV,SAAsBo0B,GACpB,MAAM,cAAEt2B,GAAkBs2B,EAC1B7B,EAAS,CAAEr4B,KAAM,WAAYitB,QAASrpB,EAAc1D,MAAM8yB,UAoHlD7d,MAAOiW,EAAMjW,OAASiW,EAAMjW,QAAU8iB,GAAiBA,QAAiB38B,KAI5E,yBAAKtB,UAAU,gCACZoxB,EAAMjW,OAASiW,EAAMjW,QAAU+iB,IAC9B,uBAAGl+B,UAAU,8CAA8CM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAClF8vB,EAAMjW,OAIX,wBAAInb,UAAU,4BAA4BM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAAY3B,EAAK,kBAErF,kBAACib,GAAA,EAAD,CACE5a,UAAU,gDACVoC,KAAK,MACLnC,QAASq+B,GAER3+B,EAAK,mBAGP6/B,EAAY,aAGf,yBAAKx/B,UAAU,gCACb,wBAAIA,UAAU,4BAA4BM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAAY3B,EAAK,kBAErF,kBAACib,GAAA,EAAD,CACE5a,UAAU,gDACVoC,KAAK,MACLnC,QAASs+B,GAER5+B,EAAK,mBAGP6/B,EAAY,cAIjB,kBAAC,GAAD,CACEr0B,UAAWimB,EAAM8B,UACjBrnB,SAAUulB,EAAMzD,UAChB1tB,QA3JN,WACE,MAAM,MAAE2b,GAAUwV,EAAMe,OAEnBvW,EAKAqW,EAAgBzzB,QAAWP,OAAOgyB,KAAK6O,GAAmBtgC,QAK/D6/B,EAAS,CAAEr4B,KAAM,eAAgBitB,SAAS,IACvB,SAAf7B,EAAMS,KACR4M,EAAe,CAAE9gC,GAAIyzB,EAAMgC,SAAU+M,aAAc/O,EAAMe,SAEzDmK,EAAc,CAAEnK,OAAQf,EAAMe,SAGhCh3B,WAAW,KACTutB,KAvHiB,MA2GjB2V,EAAS,CAAEr4B,KAAM,WAAYitB,QAASiL,KALtCG,EAAS,CAAEr4B,KAAM,WAAYitB,QAASgL,MAwJpCn8B,UAA0B,SAAfsvB,EAAMS,KAAkB,eAAiB,iBAEnDT,EAAMzD,UACL,kBAACne,EAAA,EAAD,CAAS3N,MAAM,UAEf,uBAAG7B,UAAU,oB,uBC3FRwG,mBA7KkC,EAC/CqrB,OACA1Y,UACAinB,cACApO,oBACAqO,cACAC,sBACAC,4BACAC,iBACA/lB,iBAGA,MAAMlP,EAAWtE,YAAyB,MACpCw5B,EAAqB,aAAT5O,EAAsBL,GAAsBC,GACxDiP,EAAiBN,EAAY5hC,OAASwzB,EAAkBxzB,OAjBzC,GAkBfmiC,EAAcP,EAAY5hC,QAnBhB,IAqBhByE,YAAU,KACR9H,WAAW,KACTP,sBAAsB,KACpB2Q,EAASrD,QAAS+Q,WA1BH,MA6BlB,IAEH,MAAM2nB,EAAkBlhC,YAAa/B,IACnC,MAAMkjC,EAAiB,IAAIT,GACvBS,EAAexnC,SAASsE,GAC1BkjC,EAAeC,OAAOD,EAAe3uB,QAAQvU,GAAK,GAElDkjC,EAAe3gB,KAAKviB,GAEtB2iC,EAAoBO,IACnB,CAACT,EAAaE,IAEXS,EAAsBrhC,YAAaS,IACvC,MAAM6gC,EAAuB,IAAIhP,GAC7BgP,EAAqB3nC,SAAS8G,GAChC6gC,EAAqBF,OAAOE,EAAqB9uB,QAAQ/R,GAAM,GAE/D6gC,EAAqB9gB,KAAK/f,GAE5BogC,EAA0BS,IACzB,CAAChP,EAAmBuO,IAEjBzmB,EAAqBpa,YAAaiE,IACtC,MAAM,MAAEuC,GAAUvC,EAAEiG,cACpB42B,EAAet6B,IACd,CAACs6B,IAEE7gC,EAAOC,cAgEb,MAAO+Z,EAAaC,GAAWC,aAAkBY,EAAYtB,EAASvR,QAAQy4B,IAE9E,OACE,yBAAKrgC,UAAU,qCACb,yBAAKA,UAAU,+BACZgyB,EAAkBrX,KAnEzB,SAAgCxa,GAC9B,MAAM8gC,EAAeR,EAAUX,KAAK,EAAG3/B,IAAK4/B,KAAc5/B,IAAQ4/B,GAClE,GAAKkB,EAIL,OACE,kBAAC/T,GAAA,EAAD,CACE9qB,KAAM6+B,EAAa7+B,KACnBwZ,MAAOjc,EAAKshC,EAAarlB,OACzBslB,YAAaR,EACbS,UAAQ,EACRlhC,QAAS8gC,EACT3T,SAAU6T,EAAa9gC,SAuDtBigC,EAAYzlB,IAAI,CAAChd,EAAIsiB,IACpB,kBAACiN,GAAA,EAAD,CACEC,aAAcxvB,EACdujC,YAAaR,GAAkBzgB,EAAImgB,EAAY5hC,OA7H3B,EA8HpB2iC,UAAQ,EACRlhC,QAAS2gC,EACTxT,SAAUzvB,KAGZgjC,EAQA,uBAAG3gC,UAAU,oBAAoBM,IAAI,QACjC,6CARJ,kBAAC4Z,GAAA,EAAD,CACEzP,IAAKc,EACLrF,MAAOm6B,EACPv0B,SAAUgO,EACVM,YAAaza,EAAK,aAQxB,kBAAC4a,GAAA,EAAD,CACEva,UAAU,4BACVmuB,aAAa,aACb3T,MAAOb,EACPc,WAAYb,KAETD,IAAgBA,EAAYnb,QAAUmb,EAAYtgB,SAAS8f,EAAQ,MACpE,oCACE,wBAAIhZ,IAAI,UAAUH,UAAU,uBAAuBM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAC1E3B,EAAK,oBAEP8gC,EAAU9lB,KAnFrB,SAAwB3U,GACtB,OACE,kBAAC4U,GAAA,EAAD,CACEza,IAAK6F,EAAK7F,IACVH,UAAU,sDACVC,QAAS,IAAM8gC,EAAoB/6B,EAAK7F,KACxCiG,QAAM,GAEN,uBAAGpG,UAAY,QAAOgG,EAAK5D,OAC3B,wBAAIpC,UAAU,YAAYM,IAAI,QAAQX,EAAKqG,EAAK4V,QAChD,kBAACwlB,GAAA,EAAD,CACEnc,MAAM,GACNoc,QAASrP,EAAkB34B,SAAS2M,EAAK7F,KACzCyB,OAAK,QAuEH,yBAAKzB,IAAI,UAAUH,UAAU,wBAC7B,wBAAIG,IAAI,UAAUH,UAAU,uBAAuBM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAC1E3B,EAAK,iBAKXga,GAAeA,EAAYnb,OAC1Bmb,EAAYgB,KAzEpB,SAAoBhd,GAClB,MAAM2jC,EAAalB,EAAY/mC,SAASsE,GAExC,OACE,kBAACid,GAAA,EAAD,CACEza,IAAKxC,EACLqC,UAAU,iDACVC,QAAS,IAAM2gC,EAAgBjjC,GAC/ByI,QAAM,EACNyF,UAAWy1B,GAAcX,GAExB5hC,aAAcpB,GACb,kBAACkd,GAAA,EAAD,CAAiBE,OAAQpd,IAEzB,kBAACqd,GAAA,EAAD,CAAerc,OAAQhB,EAAI4jC,cAAY,IAEzC,kBAACH,GAAA,EAAD,CACEnc,MAAM,GACNoc,QAASC,EACT1/B,OAAK,QAuDH+X,IAAgBA,EAAYnb,OAC9B,uBAAGwB,UAAU,aAAaG,IAAI,cAA9B,yBAEA,kBAAC8a,GAAA,EAAD,CAAS9a,IAAI,gBC9CRqG,mBAAK/H,YACjBC,IACC,MACEuZ,OACEC,KAAMC,EADD,QAELC,EAFK,iBAGLC,IAEA3Z,EAEJ,MAAO,CACLyZ,YACAC,QAASA,EAAQI,OACjBH,iBAAkBA,EAAiBG,OACnCgpB,kBAAmBnpB,EAAiBM,SACpCD,gBAAiBN,EAAQO,WAG7B,CAACvZ,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,kBAlBpCZ,CAzH0D,EAC5E8Y,WACAogB,iBACAjP,UACAmJ,OACAT,QACAiN,WACAlmB,YACAC,UACAC,mBACAK,kBACA8oB,oBACA1oB,oBAEA,MAAM,WAAEia,GAAe3B,GACjB,gBAAEW,EAAF,kBAAmBC,GAAsBJ,GAAkBR,EAAOS,GAAM,GAExElyB,EAAOC,cACPqY,EAAQzW,YAAQ,KACpB,MAAMigC,EAAmBrpB,EACrBspB,aAAgBvpB,EAAWC,EAASC,EAAkB,YACtD/W,EACEqgC,EAAqBjpB,EACvBgpB,aAAgBvpB,EAAWO,EAAiB8oB,EAAmB,iBAC/DlgC,EAEJ,GAAKmgC,GAAqBE,EAI1B,MAAO,IACDF,EACA,IAAIA,EAAiBG,eAAgBH,EAAiBI,YACtD,MAEAF,EAAqBA,EAAmBE,WAAa,KAE1D,CAAC1pB,EAAWC,EAASC,EAAkBK,EAAiB8oB,IAErDM,EAAetgC,YAAQ,KAC3B,GAAKyW,EAIL,OAAOA,EACJc,OAAQ3Y,IACN2yB,GACEtZ,aAAYC,YAAa/Z,EAAMS,GAAO2yB,IACtChB,EAAgB14B,SAAS+G,EAAKzC,KAElCgd,IAAI,EAAGhd,QAASA,IAClB,CAACsa,EAAO8a,EAAYpzB,EAAMoyB,IAEvBjY,EAAqBpa,YAAaqiC,IACtC1D,EAAS,CACPr4B,KAAM,gBACNitB,QAAS8O,KAEV,CAAC1D,IAEE2D,EAA0BtiC,YAAauiC,IAEzC5D,EADW,aAATxM,EACO,CACP7rB,KAAM,oBACNitB,QAAS,IAAK7B,EAAMc,eAAgBD,gBAAiBgQ,IAG9C,CACPj8B,KAAM,oBACNitB,QAAS,IAAK7B,EAAMiB,eAAgBD,gBAAiB6P,MAGxD,CAACpQ,EAAMT,EAAOiN,IAEX6D,EAAgCxiC,YAAauwB,IACjD,MAAMkS,EAAsC,GAC5ClS,EAAKmS,QAASjiC,IACZgiC,EAAWhiC,IAAO,IAIlBk+B,EADW,aAATxM,EACO,CACP7rB,KAAM,oBACNitB,QAAS,CACPhB,gBAAiBF,KACdoQ,IAIE,CACPn8B,KAAM,oBACNitB,QAAS,CACPb,gBAAiBL,KACdoQ,MAIR,CAACtQ,EAAME,EAAiBsM,IAK3B,OAHA3mB,YAAeH,EAAUmR,EAASiP,EACvB,aAAT9F,EAAsB6C,IAAgB4C,qBAAuB5C,IAAgB6C,sBAE1EuK,EAKH,kBAAC,GAAD,CACEjQ,KAAMA,EACN1Y,QAAS2oB,EACT1B,YAAarO,EACbC,kBAAmBA,EACnBqO,YAAatN,EACbuN,oBAAqB0B,EACrBzB,0BAA2B2B,EAC3B1B,eAAgB1mB,EAChBW,WAAY3B,IAbP,kBAACmC,GAAA,EAAD,S,OCHIzU,mBAtHuB,EACpCktB,gBACA2O,cACAjR,QACAiN,WACA9mB,WACAogB,iBACAjP,cAEA,MAAM4Z,EAAc5iC,YAAY,KAE5Bg0B,IAAkBgB,IAAgB0C,qBAC/B1D,IAAkBgB,IAAgB2C,mBAErCl8B,WAAW,KACTkjC,EAAS,CAAEr4B,KAAM,WA3BG,KAgCtB0tB,IAAkBgB,IAAgB4C,sBAC/B5D,IAAkBgB,IAAgB6C,qBAUvC7O,IARqB,WAAf0I,EAAMS,KACR8F,EAAejD,IAAgB0C,qBAE/BO,EAAejD,IAAgB2C,oBAMlC,CACDjG,EAAMS,KAAMwM,EACZ3K,EAAehL,EAASiP,IAGpBoF,EAAqBr9B,YAAY,KACrC2+B,EAAS,CAAEr4B,KAAM,UACjB2xB,EAAejD,IAAgB0C,sBAC9B,CAACO,EAAgB0G,IAEdkE,EAAmB7iC,YAAayyB,IACpCkM,EAAS,CAAEr4B,KAAM,aAAcitB,QAASd,IACxCwF,EAAejD,IAAgB2C,oBAC9B,CAACgH,EAAU1G,IAER6K,EAAyB9iC,YAAY,KACzC2+B,EAAS,CAAEr4B,KAAM,uBACjB2xB,EAAejD,IAAgB4C,uBAC9B,CAAC+G,EAAU1G,IAER8K,EAAyB/iC,YAAY,KACzC2+B,EAAS,CAAEr4B,KAAM,uBACjB2xB,EAAejD,IAAgB6C,uBAC9B,CAAC8G,EAAU1G,IAEd,OAAQjE,GACN,KAAKgB,IAAgByC,QACnB,OACE,kBAAC,GAAD,CACEgF,eAAgBY,EAChBX,aAAcmG,EACd5K,eAAgBA,EAChBpgB,SAAUA,GAAY,CACpBmd,IAAgB0C,oBAChB1C,IAAgB2C,kBAChB3C,IAAgB4C,qBAChB5C,IAAgB6C,sBAChBl+B,SAASgpC,GACX3Z,QAASA,IAGf,KAAKgM,IAAgB0C,oBACrB,KAAK1C,IAAgB2C,kBACnB,OACE,kBAAC,GAAD,CACEjG,MAAOA,EACPiN,SAAUA,EACVC,mBAAoBkE,EACpBjE,mBAAoBkE,EACpB/Z,QAAS4Z,EACT3K,eAAgBA,EAChBpgB,SAAUA,GAAY,CACpBmd,IAAgB4C,qBAChB5C,IAAgB6C,sBAChBl+B,SAASgpC,GACX7D,OAAQ9V,IAGd,KAAKgM,IAAgB4C,qBACnB,OACE,kBAAC,GAAD,CACEzF,KAAK,WACLT,MAAOA,EACPiN,SAAUA,EACV3V,QAAS4Z,EACT3K,eAAgBA,EAChBpgB,SAAUA,IAGhB,KAAKmd,IAAgB6C,qBACnB,OACE,kBAAC,GAAD,CACE1F,KAAK,WACLT,MAAOA,EACPiN,SAAUA,EACV3V,QAAS4Z,EACT3K,eAAgBA,EAChBpgB,SAAUA,IAIhB,QACE,U,iBCzCS/Q,mBA/EmB,EAChC2e,UACAud,QACAzd,QACA/e,QACA2F,WACAC,eAEA,MAAMnM,EAAOC,cACP+iC,EAAejjC,YAAawgC,IAChCp0B,EAAS9B,OAAOk2B,EAAMt2B,cAAc1D,SACnC,CAAC4F,IAEE9L,EAAY0D,YAChB,cACAmI,GAAY,YAGR+2B,EAAaphC,YAAQ,KACzB,GAAI2jB,EACF,OAAQjf,GAASif,EAAQ3mB,OAAS,GAAM,IACnC,GAAIkkC,EAAO,CAChB,MAAMG,GAAwBH,EAAM/oC,IAAM+oC,EAAM58B,MAAQ48B,EAAM38B,MAAQ,GACtE,OAASG,EAAQw8B,EAAM58B,KAAO+8B,EAAwB,IAExD,OAAO,GACN,CAAC38B,EAAOif,EAASud,KAEb58B,EAAKnM,EAAKoM,GAAQvE,YAAQ,IAC3B2jB,EACK,CAAC,EAAGA,EAAQ3mB,OAAS,EAAG,GACtBkkC,EACF,CAACA,EAAM58B,IAAK48B,EAAM/oC,IAAK+oC,EAAM38B,MAAQ,GAGvC,CAAC,EAAG,EAAG,GACb,CAAC28B,EAAOvd,IAEX,OACE,yBAAKnlB,UAAWA,GACbilB,GACC,yBAAKjlB,UAAU,iBAAiBM,IAAKX,EAAKiY,MAAQ,WAAQtW,GACxD,0BAAMtB,UAAU,QAAQM,IAAI,QAAQ2kB,GACnCyd,GACC,0BAAM1iC,UAAU,QAAQM,IAAI,QAAQ4F,IAI1C,yBAAKlG,UAAU,eACb,yBACEA,UAAU,oBAEVlF,MAAQ,UAAS8nC,OAEnB,2BACE98B,IAAKA,EACLnM,IAAKA,EACLuM,MAAOA,EACPH,KAAMA,EACNC,KAAK,QACL8F,SAAU62B,IAEXxd,GACC,yBAAKnlB,UAAU,kBACZmlB,EAAQxK,IAAI,CAACmoB,EAAQrsB,IACpB,yBACEzW,UAAW0D,YAAe,6BAA8B+S,IAAUvQ,GAAS,UAC3EjG,QAAS,IAAM6L,EAAS2K,IAEvBqsB,S,mBCzCFt8B,mBA7B+B,EAC5C/M,OAAOspC,KACPC,aACAC,0BAGA,MAAMx4B,EAAMxD,YAAuB,MAE7Bi8B,EAAiBC,aAAkB14B,EAAKw4B,GAExCG,EAAa,aAAYJ,EAAWrlC,GACpC0lC,EAAa/vB,YAAS8vB,GAAYF,EAAgB3vB,iBAAe+vB,SACjE,sBAAEC,EAAF,qBAAyBt6B,GAAyBu6B,aAAsBH,EAAY,QAE1F,OACE,yBAAK54B,IAAKA,EAAKzK,UAAU,sBACrBujC,GAAyBE,aAAgBT,EAAWpnB,MAAO,GAC5D2nB,GAAyBF,GACxB,kBAAChG,GAAA,EAAD,CACE1/B,GAAIylC,EACJ3pC,KAAMA,EACN+iC,cAAe6G,EACfrjC,UAAWiJ,OCPNzC,mBAnBuB,EAAGw8B,aAAYC,0BAEnD,MAAMx4B,EAAMxD,YAAuB,MAE7Bi8B,EAAiBC,aAAkB14B,EAAKw4B,GAExCtiC,EAAY2S,YAAS0vB,EAAWU,cAAiB,aAAYV,EAAWrlC,IAAOulC,IAC/E,sBAAEK,EAAF,qBAAyBt6B,GAAyBu6B,aAAsB7iC,EAAW,QAEzF,OACE,yBAAK8J,IAAKA,EAAKzK,UAAU,sBACrBujC,GAAyBE,aAAgBT,EAAWpnB,MAAO,GAC5D2nB,GACC,yBAAKtmC,IAAK0D,EAAWX,UAAWiJ,EAAsBqG,IAAI,Q,OC+FnD9I,mBA5FqB,EAClCm9B,UAASlqC,OAAMwpC,sBAAqBW,YAAWhoB,QAAO5b,YAAWC,UAASmtB,WAAUyW,oBAGpF,MAAMp5B,EAAMxD,YAAuB,MAE7B68B,EAAkB,UAASH,EAAQhmC,GACnComC,EAAmB,kBAAiBJ,EAAQhmC,GAE5CulC,EAAiBC,aAAkB14B,EAAKw4B,GAExChvB,EAAe0vB,EAAQK,UAAYL,EAAQK,UAAUC,aAAU3iC,EAC/D4iC,EAAiB5wB,YAAYwwB,EAAF,WAA4BZ,EAAgB3vB,iBAAeC,SAEtF2wB,EAAajB,IAAmBU,EAChCP,EAAa/vB,YAASqwB,EAAQS,YAAcN,GAAiBK,EAAY5wB,iBAAe+vB,SACvF5G,EAAmB2H,EAAYC,GAAgBpe,aAAQte,QAAQy7B,IAChEkB,EAAkB7H,GAAqByH,GAEvC,kBACJK,EACAjB,sBAAuBkB,EACvBx7B,qBAAsBy7B,GACpBlB,aAAsBU,GAAkBK,EAAiB,QAG7DthC,YAAU,KACHkhC,GACHG,KAED,CAACA,EAAcH,IAelB,MAAMQ,EAAgBjhC,YACpB,gBACAigC,EAAQS,YAAc,WACtBL,EACA/jC,GAGIlF,EAAQ0pC,GAAqBvwB,EAAgB,0BAAyBA,OAAoB,GAEhG,OACE,yBACExJ,IAAKA,EACLzK,UAAW2kC,EACX/oB,MAAOA,GAAU+nB,GAAWA,EAAQiB,MAEpC9pC,MAAOA,EACP+pC,kBAAiBlB,EAAQhmC,GACzBsC,QA9BJ,WACMA,GACFA,EAAQmtB,KA8BPqX,IAAwBF,GAEvB,yBAAKtnC,IAAKinC,EAAgBlkC,UAAW0kC,IAEtCP,GAAcd,GACb,kBAAChG,GAAA,EAAD,CACE1/B,GAAImmC,EACJtH,cAAe6G,EACf95B,MAAI,EACJ9P,KAAMA,EACNqrC,eAAa,EACbtH,OAAQ6G,IAGXR,GACC,kBAACliC,EAAA,EAAD,CACE3B,UAAU,wBACV6B,MAAM,OACND,OAAK,EACL3B,QA7CR,SAA2B0D,GACzBA,EAAEC,kBACFD,EAAEyG,iBAEFy5B,EAAeF,KA2CT,uBAAG3jC,UAAU,mB,OCzBRwG,mBAnE0B,EACvCw8B,aACAC,sBACAhjC,cAEA,MAAMN,EAAOC,cAEb,IAAKojC,IAAeA,EAAW+B,SAC7B,OAGF,MAAMC,EAAehC,EAAW+B,UAAY/B,EAAW+B,SAAS,GAEhE,OAAI/B,EAAWU,eAAiBsB,EAE5B,kBAACpqB,GAAA,EAAD,CACE+iB,QAAM,EACN39B,UAAU,qBACVggC,UAAWgF,EACX/kC,QAAS,IAAM+kC,GAAgB/kC,EAAQ+kC,IAEvC,kBAACrjC,EAAA,EAAD,CACEG,UAAWkhC,EAAWpnB,MACtB/Z,MAAM,cACN+V,MAAOjY,EAAKiY,OAEXorB,EAAWoB,WACV,kBAAC,GAAD,CACE3qC,KAAMwrC,KACNjC,WAAYA,EACZC,oBAAqBA,IAGvB,kBAAC,GAAD,CACED,WAAYA,EACZC,oBAAqBA,KAI3B,yBAAKjjC,UAAU,uBACb,yBAAKA,UAAU,SAASgjC,EAAWpnB,OACnC,yBAAK5b,UAAU,YAAYL,EAAK,2BAA4BqjC,EAAWlF,MAAO,QAMlF,kBAACljB,GAAA,EAAD,CACE+iB,QAAM,EACN39B,UAAU,qBACVC,QAAS,IAAMA,EAAQ+kC,IAEvB,kBAAC,GAAD,CACErB,QAASqB,EACTvrC,KAAMwrC,KACNrpB,MAAOonB,EAAWpnB,MAClBqnB,oBAAqBA,IAEvB,yBAAKjjC,UAAU,uBACb,yBAAKA,UAAU,SAASgjC,EAAWpnB,OACnC,yBAAK5b,UAAU,YAAYL,EAAK,2BAA4BqjC,EAAWlF,MAAO,U,UCjCxF,MAAMoH,GAA0B,CAC9B,mBACA,gBACA,iBAyMa1+B,mBAAK/H,YACjBC,IACQ,IACFY,YAAKZ,EAAOoR,SAASC,MAAO,CAC7B,kBACA,iBACA,sBACA,sCACA,wCACA,kCACA,oCACA,qBACA,uBACA,wBACA,qBACA,qBACA,uBAEFo1B,cAAezmC,EAAOqmC,SAASK,MAAMC,OACrCC,gBAAiB5mC,EAAOqmC,SAASQ,WAGrC,CAACnmC,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,mBAAoB,kBAAmB,sBAvBvBZ,CAtM+C,EACjE8Y,WACAogB,iBACAjP,UACAyc,gBACAG,kBACAE,kBACA31B,iBACA41B,sBACAC,sCACAC,wCACAC,kCACAC,oCACAC,qBACAC,uBACAC,wBACAC,qBACAC,mBACAC,kBACAC,wBAGA,MAAMC,EAAqBp/B,YAAuB,OAC1Cq/B,QAASC,GAAiCC,aAAwB,CAAEC,QAASJ,KAC9EK,EAAaC,EAAWC,GAAc1gB,gBACtCyd,EAASkD,GAAc7jC,cAExBrD,EAAOC,cAEPknC,EAAyB3/B,SAO3B7F,EAP0C,CAC5C,CAAE4E,MAAO,QAAS+e,MAAOtlB,EAAK,2BAA4BonC,SAAU,6BACpE,CACE7gC,MAAO,aACP+e,MAAOtlB,EAAKqnC,IAAY,6BAA+B,+BACvDD,SAAU,sBAId9jC,YAAU,KACRkjC,KACC,CAACA,IAEJljC,YAAU,KACJkiC,GAAiBA,EAAc3mC,QACjC4nC,KAED,CAACjB,EAAeiB,IAEnB,MAAMa,EAA6BvnC,YAAawnC,IAC9ChC,GAAwB9C,QAAQ,CAAC+E,EAAGlnB,KAClCzlB,SAASC,KAAKC,UAAUka,OAAQ,mBAAkBqL,EAAKinB,IAAajnB,KAGtEimB,EAAiB,CAAEr2B,eAAgBq3B,KAClC,CAAChB,IAEEkB,EAA8B1nC,YAAa2nC,IAC/C7sC,SAAS8sC,gBAAgBxsC,MAAMysC,YAAY,sBAA0BF,EAAF,MAEnEnB,EAAiB,CAAEV,gBAAiB6B,KACnC,CAACnB,IAEEsB,EAAwB9nC,YAAawG,IACzC2gC,EAAW3gC,GACXygC,KACC,CAACA,IAEEc,EAActC,GAAiBA,EAAcxqB,IAAKhd,MAC/C2nC,GAAmBA,EAAgB3nC,IAAO2nC,EAAgB3nC,GAAI+pC,gBAAgBpC,EAAgB3nC,IACpGob,OAAsBnR,SAIzB,OAFA8P,YAAeH,EAAUmR,EAASiP,EAAgBjD,IAAgBE,SAGhE,yBAAK50B,UAAU,kCACb,yBAAKA,UAAU,sBACb,wBAAIA,UAAU,uBAAuBM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAAY3B,EAAK,aAEhF,kBAAC,GAAD,CACEslB,MAAOtlB,EAAK,YAEZ+iC,MAAO,CAAE58B,IAAK,GAAInM,IAAK,IACvBuM,MAAOs/B,EACP15B,SAAUs7B,IAGZ,kBAACxsB,GAAA,EAAD,CACExY,KAAK,QACLnC,QAAS,IAAM03B,EAAejD,IAAgBM,wBAE7Cr1B,EAAK,oBAIV,yBAAKK,UAAU,iBACb,wBAAIA,UAAU,uBAAuBM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAA/D,mBAGA,uBAAGtB,UAAU,4BAA4BM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAAnE,yCAIA,kBAAC,GAAD,CACE6jB,QAAS+f,GACTh/B,MAAO2J,EACP/D,SAAUm7B,KAIbH,GACC,yBAAK9mC,UAAU,iBACb,wBAAIA,UAAU,uBAAuBM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAAY3B,EAAK,uBAEhF,kBAACulB,GAAA,EAAD,CACEnN,KAAK,yBACLoN,QAAS2hB,EACTh7B,SAAW5F,GAAUggC,EAAiB,CAAET,oBAAqBv/B,IAC7Dkf,SAAUqgB,KAKhB,yBAAKzlC,UAAU,iBACb,wBAAIA,UAAU,uBAAuBM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAAY3B,EAAK,sBAEhF,kBAACyhC,GAAA,EAAD,CACEnc,MAAOtlB,EAAK,YACZ0hC,QAASqE,EACTiC,QAAUC,GAAc1B,EAAiB,CAAER,oCAAqCkC,MAElF,kBAACxG,GAAA,EAAD,CACEnc,MAAOtlB,EAAK,4BACZ0hC,QAASsE,EACTgC,QAAUC,GAAc1B,EAAiB,CAAEP,sCAAuCiC,MAEpF,kBAACxG,GAAA,EAAD,CACEnc,MAAOtlB,EAAK,0BACZ0hC,QAASuE,EACT+B,QAAUC,GAAc1B,EAAiB,CAAEN,gCAAiCgC,MAE9E,kBAACxG,GAAA,EAAD,CACEnc,MAAOtlB,EAAK,kBACZ0hC,QAASwE,EACT8B,QAAUC,GAAc1B,EAAiB,CAAEL,kCAAmC+B,OAIlF,yBAAK5nC,UAAU,iBACb,wBAAIA,UAAU,uBAAuBM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAAY3B,EAAK,kBAEhF,kBAACyhC,GAAA,EAAD,CACEnc,MAAOtlB,EAAK,YACZ0hC,QAASyE,EACT6B,QAAUC,GAAc1B,EAAiB,CAAEJ,mBAAoB8B,MAEjE,kBAACxG,GAAA,EAAD,CACEnc,MAAOtlB,EAAK,kCACZ0hC,QAAS0E,EACT4B,QAAUC,GAAc1B,EAAiB,CAAEH,qBAAsB6B,OAIrE,yBAAK5nC,UAAU,iBACb,wBAAIA,UAAU,uBAAuBM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAAY3B,EAAK,qBAEhF,kBAACyhC,GAAA,EAAD,CACEnc,MAAOtlB,EAAK,mBACZ0hC,QAAS2E,EACT2B,QAAUC,GAAc1B,EAAiB,CAAEF,sBAAuB4B,MAEpE,kBAACxG,GAAA,EAAD,CACEnc,MAAOtlB,EAAK,wBACZ0hC,QAAS4E,EACT0B,QAAUC,GAAc1B,EAAiB,CAAED,mBAAoB2B,MAGjE,yBAAK5nC,UAAU,OAAOyK,IAAK47B,GACxBoB,GAAeA,EAAY9sB,IAAKqoB,GAC/B,kBAAC,GAAD,CACE7iC,IAAK6iC,EAAWrlC,GAChBqlC,WAAYA,EACZC,oBAAqBsD,EACrBtmC,QAASunC,MAId7D,GACC,kBAAC,KAAD,CACEjiC,OAAQglC,EACRmB,YAAalE,EACb58B,QAAS6/B,SCtPrB,IAAIkB,GAEG,SAASC,GAAsBC,EAAS,IAAKC,EAA8BC,GAAa,GACxFJ,KACHA,GAAettC,SAASsC,cAAc,SACtCgrC,GAAaK,aAAa,OAAQ,SAGpCL,GAAaK,aAAa,SAAUH,GAEhCE,EACFJ,GAAaM,gBAAgB,YAE7BN,GAAaK,aAAa,WAAY,YAIxCL,GAAaO,SAAW,KACxBP,GAAa5hC,MAAQ,GACrB4hC,GAAaO,SAAWJ,EAExBH,GAAaQ,Q,aCPR,SAASC,GAAQC,GACtB,MAAO,CACLC,SAASD,EAAME,UAAU,EAAG,GAAI,IAChCD,SAASD,EAAME,UAAU,EAAG,GAAI,IAChCD,SAASD,EAAME,UAAU,EAAG,GAAI,KAS7B,SAASC,GAAQH,GACtB,MAAMI,EAAKJ,EAAM,GAAG95B,SAAS,IACvBm6B,EAAKL,EAAM,GAAG95B,SAAS,IACvBo6B,EAAKN,EAAM,GAAG95B,SAAS,IAC7B,OAAqB,GAAbk6B,EAAGpqC,OAAc,IAAMoqC,EAAKA,IAAoB,GAAbC,EAAGrqC,OAAc,IAAMqqC,EAAKA,IAAoB,GAAbC,EAAGtqC,OAAc,IAAMsqC,EAAKA,GAcrG,SAASC,IAASC,EAAGC,EAAGtc,IAC7Bqc,GAAK,IACLC,GAAK,IACLtc,GAAK,IAEL,IACIuc,EAAYC,EADZxvC,EAAMD,KAAKC,IAAIqvC,EAAGC,EAAGtc,GAAI7mB,EAAMpM,KAAKoM,IAAIkjC,EAAGC,EAAGtc,GACvByc,EAAYzvC,EAEnCqnB,EAAIrnB,EAAMmM,EAGd,GAFAqjC,EAAW,GAAPxvC,EAAW,EAAIqnB,EAAIrnB,EAEnBA,GAAOmM,EACTojC,EAAI,MACC,CACL,OAAQvvC,GACN,KAAKqvC,EACHE,GAAKD,EAAItc,GAAK3L,GAAKioB,EAAItc,EAAI,EAAI,GAC/B,MACF,KAAKsc,EACHC,GAAKvc,EAAIqc,GAAKhoB,EAAI,EAClB,MACF,KAAK2L,EACHuc,GAAKF,EAAIC,GAAKjoB,EAAI,EAItBkoB,GAAK,EAGP,MAAO,CAACA,EAAGC,EAAGC,GAcT,SAASC,IAASH,EAAGC,EAAGC,IAC7B,IAAIJ,EAAYC,EAAYtc,EAExB1M,EAAIvmB,KAAK2K,MAAU,EAAJ6kC,GACfI,EAAQ,EAAJJ,EAAQjpB,EACZspB,EAAIH,GAAK,EAAID,GACbK,EAAIJ,GAAK,EAAIE,EAAIH,GACjBM,EAAIL,GAAK,GAAK,EAAIE,GAAKH,GAE3B,OAAQlpB,EAAI,GACV,KAAK,EACH+oB,EAAII,EACJH,EAAIQ,EACJ9c,EAAI4c,EACJ,MACF,KAAK,EACHP,EAAIQ,EACJP,EAAIG,EACJzc,EAAI4c,EACJ,MACF,KAAK,EACHP,EAAIO,EACJN,EAAIG,EACJzc,EAAI8c,EACJ,MACF,KAAK,EACHT,EAAIO,EACJN,EAAIO,EACJ7c,EAAIyc,EACJ,MACF,KAAK,EACHJ,EAAIS,EACJR,EAAIM,EACJ5c,EAAIyc,EACJ,MACF,KAAK,EACHJ,EAAII,EACJH,EAAIM,EACJ5c,EAAI6c,EAIR,MAAO,CACL9vC,KAAKkI,MAAU,IAAJonC,GACXtvC,KAAKkI,MAAU,IAAJqnC,GACXvvC,KAAKkI,MAAU,IAAJ+qB,IAuDR,SAAS+c,GAAgBC,GAC9B,IAAKC,EAAKC,EAAY3jC,GAAS6iC,GAAQY,GAOvC,OALAE,EAAanwC,KAAKoM,IAAI,EAAG+jC,EAAa,IAAO,IAAO,EAAIA,IACxD3jC,EAAQA,EAAQ,GACZxM,KAAKC,IAAI,EAAW,IAARuM,GACZxM,KAAKC,IAAI,EAAGD,KAAKoM,IAAI,EAAG,EAAY,IAARI,IAExB,QAAa,IAAN0jC,MAA2B,IAAbC,OAA8B,IAAR3jC,U,8BClFtCM,mBAtFqB,EAClCsjC,YACArc,QACA6T,aACArhC,cAEA,MAAM,KAAE8pC,EAAF,SAAQvvC,GAAasvC,EACrBhG,EAAkB,YAAWtpC,EAASmD,GACtCqW,EAAexZ,EAAS0pC,eACxBA,EAAiB5wB,YAAYwwB,EAAF,WAC3BkG,EAAWC,aACfzvC,EAASwpC,WAAaxpC,EAASwpC,UAAUC,QACzCr8B,QAAQs8B,IACR,IAEI,kBACJM,EADI,sBACejB,EADf,qBACsCt6B,GACxCu6B,aAAsBU,GAAkBlwB,EAAc,SACnDk2B,EAAmBC,GAAwBnnC,aAAS,IAEzDrC,UAAWypC,EADP,iBACkBlpC,GACpB4S,YAA6BgwB,GAAiBoG,GAC5CG,GAAyD,IAAnC/+B,YAAY4+B,IAChCnhC,aAAcC,EAAqBC,qBAAsBC,GAAsBC,YACpF+gC,IAAsBE,GAAcL,IAASO,SAC9ChpC,EACA+oC,EACA,QAGIE,EAActjC,cACpBsjC,EAAYriC,QAAUulB,EAEtB,MAAM+c,EAAe9qC,YAAY,KAC/B,WACE,MAAM+qC,QAAaC,aAAUN,SACvBO,KAAcC,IAAsBL,EAAYriC,QAAUuiC,GAChExqC,EAAQ8pC,IAHV,IAKC,CAACK,EAAWnqC,EAAS8pC,IAExB9mC,YAAU,KACJmnC,GACFI,KAED,CAACJ,EAAWI,IAEf,MAAM3iB,EAAcnoB,YAAY,KAC1B0qC,EACFI,IAEAL,EAAsBU,IAAeA,IAEtC,CAACT,EAAWI,IAETxqC,EAAY0D,YAChB,gBACA49B,GAAc,YAGhB,OACE,yBAAKthC,UAAWA,EAAWC,QAAS4nB,GAClC,yBAAK7nB,UAAU,eACZwkC,GACC,4BACE/5B,IAAKu/B,EACLhqC,UAAU,cAGbujC,GACC,yBACEtmC,IAAKinC,GAAkBlwB,EACvBhU,UAAY,cAAaiJ,EACzBqG,IAAI,KAGPtG,GACC,yBAAKhJ,UAAW0D,YAAe,oBAAqBwF,IAClD,kBAAC3G,EAAA,EAAD,CAAiBC,SAAUtB,EAAkBjB,QAAS4nB,S,OChElE,MAEMI,GAAe3kB,YAAU4kB,GAAOA,IAAM,KAAO,GA0HpC1hB,mBAAK/H,YACjBC,IACC,MAAM+uB,EAAQC,aAAYhvB,IACpB,WAAEosC,EAAF,UAAcC,GAAcrsC,EAAOoR,SAASk7B,OAAOvd,IAAU,IAC7D,iBAAEwd,GAAqBvsC,EAAOoR,SAEpC,MAAO,CACLg7B,aACAC,YACAE,mBACAxd,UAGJ,CAACruB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,iBAAkB,kBAAmB,qBAdrBZ,CAxHyD,EAC3E8Y,WACAogB,iBACAjP,UACAoiB,aACAC,YACAE,mBACAxd,QACAyd,iBACAC,kBACAC,uBAEA,MAAMC,EAAWpkC,cACjBokC,EAASnjC,QAAUulB,EAGnBxqB,YAAU,KACRglB,GAAa,KACXijB,OAED,CAACA,IAEJ,MAAMI,EAAmB5rC,YAAaiE,IACpC,MAAM,MAAE4nC,GAAU5nC,EAAEsG,OAEhBshC,GAASA,EAAM/sC,OAAS,GAC1B2sC,EAAgBI,EAAM,KAEvB,CAACJ,IAEEK,EAAwB9rC,YAAY,KACxCqoC,GAnCoB,aAmCmBuD,GAAkB,IACxD,CAACA,IAEEG,EAAiB/rC,YAAY,KACjCi4B,EAAejD,IAAgBO,6BAC9B,CAAC0C,IAEE+T,EAAuBhsC,YAAY,KACvC0rC,EAAiB,CACf3d,QACAqd,gBAAYxpC,EACZqqC,qBAAiBrqC,EACjBypC,WAAW,EACXa,aAAwB,SAAVne,EAAmBoe,IAA2BC,OAE7D,CAACV,EAAkB3d,IAEhBse,EAAwBrsC,YAAaqqC,IACzCqB,EAAiB,CAAE3d,MAAO4d,EAASnjC,QAAS4iC,WAAYf,IACxD,MAAMiC,EAAmBf,GAAoBA,EAAiBnL,KAAMgK,GAAcA,EAAUC,OAASA,GACjGiC,GAAoBA,EAAiBxxC,SAASwpC,WFwC/CiI,eAA+BxlC,GAEpC,MACMylC,EAAuC,CAAC,EAAG,EAAG,GACpD,IAAIlP,EACA5lC,EACAK,EAEA+G,EADAyhB,GAAK,EAELksB,EAAgC,CAAC,EAAG,EAAG,GACvCrO,EAAQ,EAEZ,MAAMsO,EAAS5xC,SAASsC,cAAc,UAChCuvC,EAAUD,EAAOE,YAAcF,EAAOE,WAAW,MACvD,IAAKD,EACH,OAAOH,EAGT,MAAMh+B,QAAcq+B,aAAa9lC,GACjChP,EAASyW,EAAMs+B,eAAiBt+B,EAAMpQ,cAAgBoQ,EAAMzW,OAC5DL,EAAQ8W,EAAMu+B,cAAgBv+B,EAAMw+B,aAAex+B,EAAM9W,MACzDg1C,EAAO30C,OAASA,EAChB20C,EAAOh1C,MAAQA,EAEfi1C,EAAQM,UAAUz+B,EAAO,EAAG,GAE5B,IACE8uB,EAAOqP,EAAQO,aAAa,EAAG,EAAGx1C,EAAOK,GACzC,MAAOkM,GACP,OAAOuoC,EAMT,IAHA1tC,EAASw+B,EAAKA,KAAKx+B,QAGXyhB,GAAK4sB,IAAiBruC,KAC1Bs/B,EACFqO,EAAI,IAAMnP,EAAKA,KAAK/c,GACpBksB,EAAI,IAAMnP,EAAKA,KAAK/c,EAAI,GACxBksB,EAAI,IAAMnP,EAAKA,KAAK/c,EAAI,GAO1B,OAJAksB,EAAI,GAAKzyC,KAAK2K,MAAM8nC,EAAI,GAAKrO,GAC7BqO,EAAI,GAAKzyC,KAAK2K,MAAM8nC,EAAI,GAAKrO,GAC7BqO,EAAI,GAAKzyC,KAAK2K,MAAM8nC,EAAI,GAAKrO,GAEtBqO,EErFHW,CAAgBd,EAAiBxxC,SAASwpC,UAAUC,SACjDnH,KAAMj7B,IACL,MAAM+pC,EAAelC,GAAgB7nC,GAC/B8nC,EAAY,IAAGhB,GAAQ9mC,GAC7BupC,EAAiB,CAAE3d,MAAO4d,EAASnjC,QAASyjC,gBAAiBhC,EAAUiC,oBAG5E,CAACX,EAAkBG,IAEhB2B,EAA4BrtC,YAAaiE,IAC7CynC,EAAiB,CAAE3d,MAAO4d,EAASnjC,QAAS6iC,UAAWpnC,EAAEsG,OAAOo3B,WAC/D,CAAC+J,IAEEzrC,EAAOC,cAEb8X,YAAeH,EAAUmR,EAASiP,EAAgBjD,IAAgBM,uBAElE,MAAMgY,EAAc/B,GAAoBA,EAAiB,IAAMA,EAAiB,GAAGlB,OAASO,IAE5F,OACE,yBAAKtqC,UAAU,4DACb,yBAAKA,UAAU,sBACb,kBAAC4a,GAAA,EAAD,CACExY,KAAK,aACLpC,UAAU,OACV6L,SAAUmhC,EACV/sC,QAASurC,GAER7rC,EAAK,gBAGR,kBAACib,GAAA,EAAD,CACExY,KAAK,WACLpC,UAAU,OACVC,QAASwrC,GAER9rC,EAAK,aAGR,kBAACib,GAAA,EAAD,CAAUxY,KAAK,WAAWnC,QAASyrC,GAChC/rC,EAAK,yBAGR,kBAACyhC,GAAA,EAAD,CACEnc,MAAOtlB,EAAK,qBACZ0hC,QAASz5B,QAAQmjC,GACjBj/B,SAAUihC,KAIb9B,EACC,yBAAKjrC,UAAU,uBACZirC,EAAiBtwB,IAAKmvB,GACrB,kBAAC,GAAD,CACEA,UAAWA,EACXrc,MAAOA,EACP6T,WAAYwJ,IAAehB,EAAUC,KACrC9pC,QAAS8rC,MAKf,kBAAC9wB,GAAA,EAAD,U,OC/GR,MAAMgyB,GAAclE,GAAQR,GAAQ,WAC9B2E,GAAoB,CACxB,UAAW,UAAW,UAAW,UAAW,UAAW,UACvD,UAAW,UAAW,UAAW,UAAW,UAAW,WAsMzD,SAASC,GAAcC,EAA+BC,GACpD,MAAO,CACLC,cAAe,CACb5zC,KAAKkI,MAAOwrC,EAAI,IAAOC,EAAME,UAAUn2C,MAAQ,IAC/CsC,KAAKkI,OAAO,EAAIwrC,EAAI,KAAOC,EAAME,UAAU91C,OAAS,KAEtD+1C,YAAa9zC,KAAKkI,MAAMwrC,EAAI,IAAMC,EAAMI,QAAQr2C,MAAQ,KAI5D,SAASs2C,IACP,cAAEJ,EAAF,YAAiBE,GACjBH,GAEA,MAAO,CACLG,GAAeH,EAAMI,QAAQr2C,MAAQ,GACrCk2C,EAAc,IAAMD,EAAME,UAAUn2C,MAAQ,GAC5C,EAAIk2C,EAAc,IAAMD,EAAME,UAAU91C,OAAS,IA8EtC+O,mBAAK/H,YACjBC,IACC,MAAM+uB,EAAQC,aAAYhvB,IACpB,gBAAEitC,GAAoBjtC,EAAOoR,SAASk7B,OAAOvd,IAAU,GAC7D,MAAO,CACLke,kBACAle,UAGJ,CAACruB,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,qBATpCZ,CAlSyD,EAC3E8Y,WACAogB,iBACAjP,UACA+E,QACAke,kBACAP,uBAEA,MAAMC,EAAWpkC,cACjBokC,EAASnjC,QAAUulB,EAEnB,MAAM1T,EAAe9S,YAAuB,MAEtC0mC,EAAiB1mC,YAAuB,MAExC2mC,EAAe3mC,YAAuB,MACtC4mC,EAAgB5mC,aAAO,IAEtBmmC,EAAKU,GAAU9qC,YA2KxB,SAAuB2oC,GACrB,OAAOA,GAAmBA,EAAgBh4B,WAAW,KACjDo1B,GAAQR,GAAQoD,EAAgBrrB,QAAQ,IAAK,MAC7C2sB,GA9K2Bc,CAAcpC,IAEvCqC,EAAS/mC,YAAOmmC,GACtBnqC,YAAU,KACR+qC,EAAO9lC,QAAUklC,GAChB,CAACA,IAEJ,MAAOrgC,EAAYkhC,EAAgBC,GAAoBhoB,gBAChDioB,EAAUC,GAAeprC,YAAS,KAClCqrC,EAAUC,GAAetrC,YAAS,IAEnCurC,EAAWtnC,cACXunC,EAAcvnC,cAGpBhE,YAAU,KAER,MAAMsqC,EAAY,CAChBkB,WAAYd,EAAezlC,QAASumC,cACjCnvC,YAAKquC,EAAezlC,QAASnP,wBAAyB,CAAC,MAAO,QAAS,YAEtE00C,EAAU,CACdgB,WAAYb,EAAa1lC,QAASumC,cAC/BnvC,YAAKsuC,EAAa1lC,QAASnP,wBAAyB,CAAC,WAK1D,SAAS21C,EAAgB/qC,GACvB,MAAM2pC,EAAgB,CACpB5zC,KAAKoM,IAAIpM,KAAKC,IAAI,EAAGgK,EAAEiL,MAAS2+B,EAAUkB,YAAalB,EAAUn2C,MAAQ,GACzEsC,KAAKoM,IAAIpM,KAAKC,IAAI,EAAGgK,EAAEkL,MAAS0+B,EAAU90C,IAAMshB,EAAa7R,QAASrK,WAAY0vC,EAAU91C,OAAS,KAGjG,YAAE+1C,GAAgBL,GAAca,EAAO9lC,QAASqmC,EAASrmC,SAE/D4lC,EAAOJ,GAAc,CAAEJ,gBAAeE,eAAee,EAASrmC,UAC9D+lC,IAWF,SAASU,EAAchrC,GACrB,MAAM,cAAE2pC,GAAkBH,GAAca,EAAO9lC,QAASqmC,EAASrmC,SAC3DslC,EAAc9zC,KAAKoM,IAAIpM,KAAKC,IAAI,EAAGgK,EAAEiL,MAAS6+B,EAAQgB,YAAahB,EAAQr2C,MAAQ,GAEzF02C,EAAOJ,GAAc,CAAEJ,gBAAeE,eAAee,EAASrmC,UAC9D+lC,IA3BFM,EAASrmC,QAAU,CAAEqlC,YAAWE,WAchC32B,YAAc62B,EAAezlC,QAAU,CACrC0mC,UAAWF,EACXG,OAAQH,EACRI,UAAWZ,EACXjuC,QAASiuC,EACTa,YAAY,IAWdj4B,YAAc82B,EAAa1lC,QAAU,CACnC0mC,UAAWD,EACXE,OAAQF,EACRG,UAAWZ,EACXjuC,QAASiuC,EACTa,YAAY,KAEb,CAACd,EAAgBC,IAEpB,MAAM,cAAEZ,EAAgB,CAAC,EAAG,GAAtB,YAA0BE,EAAc,GAAMe,EAASrmC,QAAUilC,GAAcC,EAAKmB,EAASrmC,SAAW,GACxG8mC,EAAMrG,GAAQU,GAAQ+D,IACtBxD,EAAMwD,EAAI,GACV6B,EAAStG,GAAQU,GAAQ,CAACO,EAAK,EAAG,KAGxC3mC,YAAU,KACR,MAAMkpC,EAAM9C,GAAQ+D,GACdvrC,EAAS,IAAG8mC,GAAQwD,GAK1B,GAHAiC,EAAYjC,EAAIlhC,KAAK,OACrBqjC,EAAYzsC,IAEPgsC,EAAc3lC,QAAS,CAC1B,MAAM0jC,EAAelC,GAAgByC,GACrCf,EAAiB,CACf3d,MAAO4d,EAASnjC,QAChB4iC,gBAAYxpC,EACZqqC,gBAAiB9pC,EACjB+pC,iBAGJiC,EAAc3lC,SAAU,GACvB,CAACklC,EAAKhC,IAGTnoC,YAAU,MA2GZ,SACEmpC,EACAxC,EACA4E,EACAD,GAEA,IAAIW,EACAhG,EACAiG,EAECX,EAAYtmC,SAAYqmC,EAASrmC,SAWpCgnC,EAAIX,EAASrmC,QAAQqlC,UAAUn2C,MAC/B8xC,EAAIqF,EAASrmC,QAAQqlC,UAAU91C,OAC/B03C,EAAMX,EAAYtmC,UAXlBgnC,EAAI9C,EAAOM,YACXxD,EAAIkD,EAAOtuC,aACXqxC,EAAM/C,EAAOE,WAAW,MAExBF,EAAOh1C,MAAQ83C,EACf9C,EAAO30C,OAASyxC,EAEhBsF,EAAYtmC,QAAUinC,GAOxB,MAAMC,EAAUD,EAAKE,gBAAgBH,EAAGhG,GAClCoG,EAASF,EAAQpS,KACjBuS,EAAMlG,GAAQ,CAACO,EAAK,EAAG,IAE7B,IAAInzB,EAAQ,EAEZ,IAAK,IAAInJ,EAAI,EAAGA,EAAI47B,EAAG57B,IAAK,CAC1B,MAAMkiC,EAAO,EAAIliC,GAAK47B,EAAI,GACpBuG,EAAK,CAAC,IAAMD,EAAM,IAAMA,EAAM,IAAMA,GACpCE,EAAK,CAACH,EAAI,GAAKC,EAAMD,EAAI,GAAKC,EAAMD,EAAI,GAAKC,GACnD,IAAK,IAAIniC,EAAI,EAAGA,EAAI6hC,EAAG7hC,IAAK,CAC1B,MAAMsiC,EAAOtiC,GAAK6hC,EAAI,GACtBI,EAAO74B,KAAWg5B,EAAG,IAAMC,EAAG,GAAKD,EAAG,IAAME,EAC5CL,EAAO74B,KAAWg5B,EAAG,IAAMC,EAAG,GAAKD,EAAG,IAAME,EAC5CL,EAAO74B,KAAWg5B,EAAG,IAAMC,EAAG,GAAKD,EAAG,IAAME,EAC5CL,EAAO74B,KAAW,KAItB04B,EAAKS,aAAaR,EAAS,EAAG,GAvJ5BS,CAAUlC,EAAezlC,QAASnN,WAAiC6uC,EAAK4E,EAAaD,IACpF,CAAC3E,IAGJ3mC,YAAU,MAsJZ,SAAiBmpC,GACf,MAAM8C,EAAI9C,EAAOM,YAEjBN,EAAOh1C,MAAQ83C,EACf9C,EAAO30C,OAFG,EAGV,MAAM03C,EAAM/C,EAAOE,WAAW,MAExB8C,EAAUD,EAAIE,gBAAgBH,EAL1B,GAMJI,EAASF,EAAQpS,KAEvB,IAAIvmB,EAAQ,EAEZ,IAAK,IAAIpJ,EAAI,EAAGA,EAAI6hC,EAAG7hC,IAAK,CAC1B,MACM8+B,EAAM9C,GAAQ,CADRh8B,GAAK6hC,EAAI,GACK,EAAG,IAE7BI,EAAO74B,KAAW01B,EAAI,GACtBmD,EAAO74B,KAAW01B,EAAI,GACtBmD,EAAO74B,KAAW01B,EAAI,GAEtBmD,EAAO74B,KAAW,IAGpB04B,EAAIS,aAAaR,EAAS,EAAG,GA5K3BU,CAAQlC,EAAa1lC,QAASnN,aAC7B,IAEH,MAAMg1C,EAAkBrwC,YAAaiE,IACnC,MAAMqsC,EAAWrsC,EAAEiG,cAAc1D,MAAMoa,QAAQ,WAAY,IAAIyP,MAAM,EAAG,IAExE,GAAIigB,EAAS5lB,MAAM,mCAAoC,CACrD,MAAM+hB,EAAM6D,EAASxjB,MAAM,KAAK7R,IAAKs1B,GAAYjmC,OAAOimC,EAAQjX,SAChE8U,EAAO/E,GAAQoD,IAGjBxoC,EAAEiG,cAAc1D,MAAQ8pC,GACvB,IAEGE,EAAkBxwC,YAAaiE,IACnC,MAAMwsC,EAAWxsC,EAAEiG,cAAc1D,MAAMoa,QAAQ,gBAAiB,IAAIyP,MAAM,EAAG,GAEzEogB,EAAS/lB,MAAM,uBACjB0jB,EAAO/E,GAAQR,GAAQ4H,EAAS7vB,QAAQ,IAAK,OAG/C3c,EAAEiG,cAAc1D,MAAQiqC,GACvB,IAEGC,EAA6B1wC,YAAaiE,IAC9CmqC,EAAO/E,GAAQR,GAAQ5kC,EAAEiG,cAAcymC,QAAQxuC,MAAOye,QAAQ,IAAK,QAClE,IAEGtgB,EAAY0D,YAChB,gEACAqJ,GAAc,eAKhB,OAFA2K,YAAeH,EAAUmR,EAASiP,EAAgBjD,IAAgBO,4BAGhE,yBAAKxqB,IAAKsP,EAAc/Z,UAAWA,GACjC,yBAAKA,UAAU,sBACb,yBAAKyK,IAAKkjC,EAAgB3tC,UAAU,gBAClC,iCACA,yBACEA,UAAU,SAEVlF,MAAQ,wBAAuBwyC,EAAc,SAASA,EAAc,6BAA6B0B,QAGrG,yBAAKvkC,IAAKmjC,EAAc5tC,UAAU,cAChC,iCACA,yBACEA,UAAU,SAEVlF,MAAQ,yBAAwB0yC,4BAAsCyB,QAG1E,yBAAKjvC,UAAU,SACb,kBAACka,GAAA,EAAD,CAAWhU,MAAOmoC,EAAUppB,MAAM,MAAMnZ,SAAUokC,IAClD,kBAACh2B,GAAA,EAAD,CAAWhU,MAAOioC,EAAUlpB,MAAM,MAAMnZ,SAAUikC,MAGtD,yBAAK/vC,UAAU,qBACZktC,GAAkBvyB,IAAK9Y,GACtB,yBACE7B,UAAW6B,IAAW,IAAGmtC,EAAQ,cAAW1tC,EAC5CgvC,aAAYzuC,EAEZ/G,MAAQ,qBAAoB+G,KAC5B5B,QAASmwC,UC5EN5pC,mBAAK/H,YAAsBC,IACjC,CACL6xC,6BAA8B3oC,QAAQlJ,EAAOoR,SAASC,MAAMwgC,8BAC5DC,8BAA+B5oC,QAAQlJ,EAAOoR,SAASC,MAAMygC,+BAC7DC,sBAAuB7oC,QAAQlJ,EAAOoR,SAASC,MAAM0gC,uBACrDC,uBAAwB9oC,QAAQlJ,EAAOoR,SAASC,MAAM2gC,wBACtDC,0BAA2B/oC,QAAQlJ,EAAOoR,SAASC,MAAM4gC,2BACzDC,2BAA4BhpC,QAAQlJ,EAAOoR,SAASC,MAAM6gC,4BAC1DC,8BAA+BjpC,QAAQlJ,EAAOoR,SAASC,MAAM8gC,iCAGjE,CAACzxC,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,2BACA,kCACA,+BAdkBZ,CA7HqD,EACvE8Y,WACAogB,iBACAjP,UACA6nB,+BACAC,gCACAC,wBACAC,yBACAC,4BACAC,6BACAC,gCACAC,2BACAC,kCACAC,iCAEA/tC,YAAU,KACR6tC,KACC,CAACA,IAEJ,MAAMG,EAAuBvxC,YAAY,CACvCiE,EACAutC,EACAC,KAEA,MAAMC,EAA+B,YAAbF,GACnBX,IACc,UAAbW,EAAuBT,EAAwBE,GAC/CU,EAAyC,YAAbH,EAC9BV,EACc,UAAbU,EAAuBR,EAAyBE,EAErDI,EAA2B,CACzBE,cACgB,WAAZC,GAAwB,CAAEptB,UAAWpgB,EAAEsG,OAAOo3B,QAASiQ,mBAAoBD,MAC/D,iBAAZF,GAA8B,CAAEG,mBAAoB3tC,EAAEsG,OAAOo3B,QAAStd,SAAUqtB,MAErF,CACDR,EAA4BD,EAC5BD,EAAwBD,EACxBD,EAA+BD,EAC/BS,IAGIO,EAAkC7xC,YAAaiE,IACnDotC,EAAgC,CAC9BhtB,UAAWpgB,EAAEsG,OAAOo3B,WAErB,CAAC0P,IAEEpxC,EAAOC,cAIb,OAFA8X,YAAeH,EAAUmR,EAASiP,EAAgBjD,IAAgBG,eAGhE,yBAAK70B,UAAU,kCACb,yBAAKA,UAAU,iBACb,wBAAIA,UAAU,uBAAuBM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAC5D3B,EAAK,6BAGR,kBAACyhC,GAAA,EAAD,CACEnc,MAAOtlB,EAAK,gCAEZonC,SAAUpnC,EAAK4wC,EAA+B,gCAAkC,kCAChFlP,QAASkP,EACTzkC,SAAWnI,IAAQstC,EAAqBttC,EAAG,UAAW,aAExD,kBAACy9B,GAAA,EAAD,CACEnc,MAAOtlB,EAAK,kBAEZonC,SAAUpnC,EAAK6wC,EAAgC,gCAAkC,kCACjFnP,QAASmP,EACT1kC,SAAWnI,IAAQstC,EAAqBttC,EAAG,UAAW,oBAI1D,yBAAK3D,UAAU,iBACb,wBAAIA,UAAU,uBAAuBM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAAY3B,EAAK,iBAEhF,kBAACyhC,GAAA,EAAD,CACEnc,MAAOtlB,EAAK,0BACZonC,SAAUpnC,EAAK8wC,EAAwB,gCAAkC,kCACzEpP,QAASoP,EACT3kC,SAAWnI,IAAQstC,EAAqBttC,EAAG,QAAS,aAEtD,kBAACy9B,GAAA,EAAD,CACEnc,MAAOtlB,EAAK,kBACZonC,SAAUpnC,EAAK+wC,EAAyB,gCAAkC,kCAC1ErP,QAASqP,EACT5kC,SAAWnI,IAAQstC,EAAqBttC,EAAG,QAAS,oBAIxD,yBAAK3D,UAAU,iBACb,wBAAIA,UAAU,uBAAuBM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAAY3B,EAAK,mBAEhF,kBAACyhC,GAAA,EAAD,CACEnc,MAAOtlB,EAAK,4BAEZonC,SAAUpnC,EAAKgxC,EAA4B,gCAAkC,kCAC7EtP,QAASsP,EACT7kC,SAAWnI,IAAQstC,EAAqBttC,EAAG,YAAa,aAE1D,kBAACy9B,GAAA,EAAD,CACEnc,MAAOtlB,EAAK,kBAEZonC,SAAUpnC,EAAKixC,EAA6B,gCAAkC,kCAC9EvP,QAASuP,EACT9kC,SAAWnI,IAAQstC,EAAqBttC,EAAG,YAAa,oBAI5D,yBAAK3D,UAAU,iBACb,wBAAIA,UAAU,uBAAuBM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAAY3B,EAAK,eAEhF,kBAACyhC,GAAA,EAAD,CACEnc,MAAOtlB,EAAK,iBACZ0hC,QAASwP,EACT/kC,SAAUylC,SCsDL/qC,mBAAK/H,YACjBC,IACC,MACEoR,UACEC,OAAO,YAAEyhC,EAAF,mBAAeC,EAAf,mBAAmCC,GADlC,QAERC,GAHE,QAKJC,EALI,eAMJC,GACEnzC,EAEJ,MAAO,CACL8yC,cACAM,aAAcF,EAAQG,WACtBC,cAAeH,EAAerzC,OAC9BizC,qBACAC,qBACAO,6BAA8BN,EAAQ7Z,aAAe6Z,EAAQ7Z,YAAYoa,WACzEC,0BAA2BR,EAAQS,UAAYT,EAAQS,SAASF,WAChEG,8BAA+BV,EAAQW,cAAgBX,EAAQW,aAAaJ,WAC5EK,4BAA6BZ,EAAQa,UAAYb,EAAQa,SAASN,WAClEO,4BAA6Bd,EAAQe,YAAcf,EAAQe,WAAWR,aAG1E,CAAC9yC,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,sBAAuB,qBAAsB,sBAAuB,sBAAuB,0BAzB3EZ,CA3K+C,EACjE8Y,WACAogB,iBACAjP,UACA8oB,cACAM,eACAE,gBACAP,qBACAC,qBACAO,+BACAE,4BACAE,gCACAE,8BACAE,8BACAE,sBACAC,sBACAC,qBACAC,sBACAC,4BAEA9vC,YAAU,KACR2vC,IACAC,IACAF,IACAG,KACC,CAACF,EAAqBC,EAAoBF,EAAqBG,IAElE,MAAMnzC,EAAOC,cAIb,SAASozC,EAAmBd,GAC1B,OAAQA,GACN,IAAK,YACH,OAAOvyC,EAAK,gBAEd,IAAK,WACH,OAAOA,EAAK,eAEd,IAAK,SACH,OAAOA,EAAK,cAMlB,OAjBA+X,YAAeH,EAAUmR,EAASiP,EAAgBjD,IAAgBI,SAkBhE,yBAAK90B,UAAU,kCACb,yBAAKA,UAAU,sBACb,kBAAC4a,GAAA,EAAD,CACExY,KAAK,cACLu7B,QAAM,EACN19B,QAAS,IAAM03B,EAAejD,IAAgBwB,sBAE9C,yBAAKl2B,UAAU,uBACb,0BAAMA,UAAU,SAASL,EAAK,iBAC7BmyC,EAAe,GACd,0BAAM9xC,UAAU,WAAWM,IAAI,QAC5BX,EAAK,QAASmyC,MAKvB,kBAACl3B,GAAA,EAAD,CACExY,KAAK,OACLu7B,QAAM,EACN19B,QAAS,IAAM03B,EACb6Z,EAAc9c,IAAgB0B,aAAe1B,IAAgByB,gBAG/D,yBAAKn2B,UAAU,uBACb,0BAAMA,UAAU,SAASL,EAAK,wBAC9B,0BAAMK,UAAU,WAAWM,IAAI,QAC5BX,EAAK6xC,EAAc,aAAe,kBAIzC,kBAAC52B,GAAA,EAAD,CACExY,KAAK,kBACLu7B,QAAM,EACN19B,QAAS,IAAM03B,EAAejD,IAAgBuB,wBAE9C,yBAAKj2B,UAAU,uBACb,0BAAMA,UAAU,SAASL,EAAK,kBAC7BqyC,EAAgB,GACf,0BAAMhyC,UAAU,WAAWM,IAAI,QACV,IAAlB0xC,EAAsB,YAAiBA,EAAF,gBAOhD,yBAAKhyC,UAAU,iBACb,wBAAIA,UAAU,4BAA4BM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAAY3B,EAAK,iBAErF,kBAACib,GAAA,EAAD,CACE+iB,QAAM,EACN19B,QAAS,IAAM03B,EAAejD,IAAgBQ,qBAE9C,yBAAKl1B,UAAU,uBACb,0BAAMA,UAAU,SAASL,EAAK,sBAC9B,0BAAMK,UAAU,WAAWM,IAAI,QAC5B0yC,EAAmBf,MAI1B,kBAACr3B,GAAA,EAAD,CACE+iB,QAAM,EACN19B,QAAS,IAAM03B,EAAejD,IAAgBS,kBAE9C,yBAAKn1B,UAAU,uBACb,0BAAMA,UAAU,SAASL,EAAK,kBAC9B,0BAAMK,UAAU,WAAWM,IAAI,QAC5B0yC,EAAmBb,MAI1B,kBAACv3B,GAAA,EAAD,CACE+iB,QAAM,EACN19B,QAAS,IAAM03B,EAAejD,IAAgBU,sBAE9C,yBAAKp1B,UAAU,uBACb,0BAAMA,UAAU,SAASL,EAAK,6BAC9B,0BAAMK,UAAU,WAAWM,IAAI,QAC5B0yC,EAAmBX,MAI1B,kBAACz3B,GAAA,EAAD,CACE+iB,QAAM,EACN19B,QAAS,IAAM03B,EAAejD,IAAgBW,oBAE9C,yBAAKr1B,UAAU,uBACb,0BAAMA,UAAU,SAASL,EAAK,yBAC9B,0BAAMK,UAAU,WAAWM,IAAI,QAC5B0yC,EAAmBT,MAI1B,kBAAC33B,GAAA,EAAD,CACE+iB,QAAM,EACN19B,QAAS,IAAM03B,EAAejD,IAAgBY,oBAE9C,yBAAKt1B,UAAU,uBACb,0BAAMA,UAAU,SAASL,EAAK,gBAC9B,0BAAMK,UAAU,WAAWM,IAAI,QAC5B0yC,EAAmBP,OAM3Bf,GACC,yBAAK1xC,UAAU,iBACb,wBAAIA,UAAU,uBAAuBM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAC5D3B,EAAK,iCAER,kBAACyhC,GAAA,EAAD,CACEnc,MAAOtlB,EAAK,4CACZonC,SAAUpnC,EAAK,gCACf0hC,QAASz5B,QAAQ6pC,GACjB5lC,UAAW6lC,EACX/J,QAASoL,S,SC5GNvsC,mBAAK/H,YACjBC,IACQ,CACLu0C,UAAWv0C,EAAOoR,SAASC,MAAMkjC,UACjCC,SAAUx0C,EAAOoR,SAASC,MAAMmjC,WAGpC,CAAC9zC,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,gBAAiB,qBARDZ,CAhEgD,EAClE8Y,WACAogB,iBACAjP,UACAuqB,YACAC,WACAC,gBACAjN,uBAEA,MAAOkN,EAAkBC,GAAuBrwC,YAAiBkwC,IAC1DvlB,EAAW2lB,EAAeC,GAAmBrtB,eAGpDjjB,YAAU,KACRkwC,KACC,CAACA,IAEJ,MAAMxQ,EAAejjC,YAAa8zC,IAChCH,EAAoBG,GACpBF,IAEAG,aAAYD,EAAU,KACpBD,IAEArN,EAAiB,CAAEgN,SAAUM,OAE9B,CAACF,EAAeC,EAAiBrN,IAE9B/gB,EAAU3jB,YAAQ,IACfyxC,EAsBX,SAAsBA,GACpB,MAAMS,GAAmBx7C,OAAOy7C,UAAUT,UAAY,MAAMU,cACtDC,EAAgBH,EAAgBI,OAAO,EAAG,GAEhD,OAAOb,EAAUt4B,IAAI,EAAG64B,WAAUO,aAAYh8B,WAAzB,CACnB7R,MAAOstC,EACPvuB,MAAO8uB,EACPhN,SAAUhvB,KACR0U,KAAMC,IACDgnB,GAAoBhnB,EAAExmB,QAAUwtC,GAAmBhnB,EAAExmB,QAAU2tC,EAAsB,GAAJ,GA/BrEG,CAAaf,QAAa3xC,EAC5C,CAAC2xC,IAIJ,OAFAv7B,YAAeH,EAAUmR,EAASiP,EAAgBjD,IAAgBK,UAGhE,yBAAK/0B,UAAU,kEACZmlB,EACC,kBAACD,GAAA,EAAD,CACEnN,KAAK,yBACLoN,QAASA,EACTC,SAAUguB,EACVa,cAAetmB,EAAYylB,OAAmB9xC,EAC9CwK,SAAU62B,IAGZ,kBAAC1nB,GAAA,EAAD,UCtED,SAASi5B,GAAcC,GAC5B,OAAQA,GACN,KAAKzf,IAAgBQ,mBACrB,KAAKR,IAAgBa,kCACrB,KAAKb,IAAgBkB,iCACnB,MAAO,cACT,KAAKlB,IAAgBS,gBACrB,KAAKT,IAAgBc,+BACrB,KAAKd,IAAgBmB,8BACnB,MAAO,WACT,KAAKnB,IAAgBU,oBACrB,KAAKV,IAAgBe,mCACrB,KAAKf,IAAgBoB,kCACnB,MAAO,eACT,KAAKpB,IAAgBW,kBACrB,KAAKX,IAAgBgB,iCACrB,KAAKhB,IAAgBqB,gCACnB,MAAO,WACT,KAAKrB,IAAgBY,kBACrB,KAAKZ,IAAgBiB,iCACrB,KAAKjB,IAAgBsB,gCACnB,MAAO,cCwLExvB,mBAAK/H,YAClB,CAACC,GAAUy1C,aACT,IAAIC,EAEJ,MACEn8B,OAASC,KAAMC,GACfrI,UAAU,QAAE6hC,IACVjzC,EAEJ,OAAQy1C,GACN,KAAKzf,IAAgBQ,mBACnBkf,EAAkBzC,EAAQ7Z,YAC1B,MAEF,KAAKpD,IAAgBS,gBACnBif,EAAkBzC,EAAQS,SAC1B,MAEF,KAAK1d,IAAgBU,oBACnBgf,EAAkBzC,EAAQW,aAC1B,MAEF,KAAK5d,IAAgBW,kBACnB+e,EAAkBzC,EAAQa,SAC1B,MAEF,KAAK9d,IAAgBY,kBACnB8e,EAAkBzC,EAAQe,WAI9B,OAAK0B,EAIE,IACFA,EACHj8B,aALO,IAQX,CAAC/Y,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,yBAxCpCZ,CAhLyD,EAC3E01C,SACA58B,WACAogB,iBACAjP,UACAwpB,aACAmC,eACAC,eACAC,eACAC,eACAr8B,YACAs8B,2BAEA,MAAM90C,EAAOC,cAEP80C,EAAoBlzC,YAAQ,KAChC,OAAQ2yC,GACN,KAAKzf,IAAgBU,oBACrB,KAAKV,IAAgBY,kBACnB,MAAO,CACL,CAAEpvB,MAAO,YAAa+e,MAAOtlB,EAAK,iBAClC,CAAEuG,MAAO,WAAY+e,MAAOtlB,EAAK,iBAGrC,QACE,MAAO,CACL,CAAEuG,MAAO,YAAa+e,MAAOtlB,EAAK,iBAClC,CAAEuG,MAAO,WAAY+e,MAAOtlB,EAAK,gBACjC,CAAEuG,MAAO,SAAU+e,MAAOtlB,EAAK,iBAGpC,CAACA,EAAMw0C,IAEJQ,EAAiB,CACrBC,iBAAiC,WAAf1C,EAClB2C,kBAAkC,cAAf3C,GAGf4C,EAAaZ,GAAcC,GAE3BY,EAAavzC,YAAQ,KACzB,OAAQ2yC,GACN,KAAKzf,IAAgBQ,mBACnB,OAAOv1B,EAAK,qBACd,KAAK+0B,IAAgBS,gBACnB,OAAOx1B,EAAK,iBACd,KAAK+0B,IAAgBU,oBACnB,OAAOz1B,EAAK,4BACd,KAAK+0B,IAAgBW,kBACnB,OAAO11B,EAAK,wBACd,KAAK+0B,IAAgBY,kBACnB,OAAO31B,EAAK,eACd,QACE,SAEH,CAACA,EAAMw0C,IAEVz8B,YAAeH,EAAUmR,EAASiP,EAAgBwc,GAElD,MAAMa,EAAkBxzC,YAAQ,KAC9B,OAAQ2yC,GACN,KAAKzf,IAAgBS,gBACnB,OAAOx1B,EAAK,cACd,QACE,SAEH,CAACA,EAAMw0C,IAEJc,EAAwB,MAC5B,OAAQd,GACN,KAAKzf,IAAgBQ,mBACnB,OAAOR,IAAgBa,kCACzB,KAAKb,IAAgBS,gBACnB,OAAOT,IAAgBc,+BACzB,KAAKd,IAAgBU,oBACnB,OAAOV,IAAgBe,mCACzB,KAAKf,IAAgBW,kBACnB,OAAOX,IAAgBgB,iCACzB,QACE,OAAOhB,IAAgBiB,mCAXC,GAexBuf,EAAuB,MAC3B,OAAQf,GACN,KAAKzf,IAAgBQ,mBACnB,OAAOR,IAAgBkB,iCACzB,KAAKlB,IAAgBS,gBACnB,OAAOT,IAAgBmB,8BACzB,KAAKnB,IAAgBU,oBACnB,OAAOV,IAAgBoB,kCACzB,KAAKpB,IAAgBW,kBACnB,OAAOX,IAAgBqB,gCACzB,QACE,OAAOrB,IAAgBsB,kCAXA,GAevBmf,EAAe3zC,YAAQ,IACtB6yC,GAAiBC,GAAiBn8B,EAIhCm8B,EAAac,OAAO,CAACC,EAAQ12C,IAC3B02C,GAAUl9B,EAAUxZ,GAAUwZ,EAAUxZ,GAAQ22C,aAAgB,GACtEjB,EAAa71C,QALP,EAMR,CAAC81C,EAAcD,EAAcl8B,IAE1Bo9B,EAAa/zC,YAAQ,IACpB+yC,GAAiBC,GAAiBr8B,EAIhCq8B,EAAaY,OAAO,CAACC,EAAQ12C,IAC3B02C,GAAUl9B,EAAUxZ,GAAUwZ,EAAUxZ,GAAQ22C,aAAgB,GACtEf,EAAa/1C,QALP,EAMR,CAACg2C,EAAcD,EAAcp8B,IAE1Bq9B,EAAyB91C,YAAawG,IAC1CuuC,EAAqB,CACnBK,aACA5C,WAAYhsC,KAEb,CAAC4uC,EAAYL,IAEhB,OACE,yBAAKz0C,UAAU,kCACb,yBAAKA,UAAU,iBACb,wBAAIA,UAAU,uBAAuBM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAAYyzC,GAE3E,kBAAC7vB,GAAA,EAAD,CACEnN,KAAO,cAAa+8B,EACpB3vB,QAASuvB,EACT5oC,SAAU0pC,EACVpwB,SAAU8sB,IAGX8C,GACC,uBAAGh1C,UAAU,mCAAmCM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAAY0zC,IAI1F,yBAAKh1C,UAAU,iBACb,wBAAIA,UAAU,4BAA4BM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAAY3B,EAAK,sBAEpFg1C,EAAeE,mBACd,kBAACj6B,GAAA,EAAD,CACE+iB,QAAM,EACNv7B,KAAK,WACLnC,QAAS,KAAQ03B,EAAesd,KAEhC,yBAAKj1C,UAAU,iCACZm1C,EAAe,GAAK,0BAAMn1C,UAAU,OAAOM,IAAI,QAA3B,IAAoC60C,GACzD,0BAAMn1C,UAAU,SAASL,EAAK,oBAC9B,0BAAMK,UAAU,YAAYL,EAAK,wBAItCg1C,EAAeC,kBACd,kBAACh6B,GAAA,EAAD,CACE+iB,QAAM,EACNv7B,KAAK,cACLnC,QAAS,KAAQ03B,EAAeud,KAEhC,yBAAKl1C,UAAU,iCACZu1C,EAAa,GAAK,0BAAMv1C,UAAU,OAAOM,IAAI,QAA3B,IAA0Ci1C,GAC7D,0BAAMv1C,UAAU,SAASL,EAAK,mBAC9B,0BAAMK,UAAU,YAAYL,EAAK,6BCnD/C,SAAS81C,GAAYC,GACnB,MAAO,CAACA,EAAQC,OAAQD,EAAQE,SAAS78B,OAAOnR,SAASqD,KAAK,MAGhE,SAAS4qC,GAAqBH,GAC5B,MAAQ,GAAEA,EAAQI,cAAcJ,EAAQI,YAAc,KAAO,MAAMJ,EAAQK,YAAYL,EAAQM,gBAGlFxvC,mBAAK/H,YACjBC,IACQ,CACLmzC,eAAgBnzC,EAAOmzC,iBAG3B,CAACzyC,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,qBAAsB,yBAA0B,+BAPhCZ,CA3H6D,EAC/E8Y,WACAogB,iBACAjP,UACAmpB,iBACAgB,qBACAoD,yBACAC,iCAEA,MAAOC,EAAiCC,EAA+BC,GAAkCnwB,eACzGjjB,YAAU,KACR4vC,KACC,CAACA,IAEJ,MAAMyD,EAA8B52C,YAAaic,IAC/Cs6B,EAAuB,CAAEt6B,UACxB,CAACs6B,IAEEM,EAA6B72C,YAAY,KAC7C22C,IACAH,KACC,CAACG,EAAgCH,IAE9BM,EAAiBh1C,YAAQ,IACtBqwC,EAAe/R,KAAM4V,GAAYA,EAAQe,WAC/C,CAAC5E,IAEE6E,EAAgBl1C,YAAQ,IACrBqwC,EAAe94B,OAAQ28B,IAAaA,EAAQe,WAClD,CAAC5E,IAEElyC,EAAOC,cA0Cb,SAAS+2C,EAAcjB,GACrB,OACE,kBAAC96B,GAAA,EAAD,CACEza,IAAKu1C,EAAQ/5B,KACbvV,QAAM,EACNu3B,QAAM,EACNjW,eAAgB,CAAC,CACf9L,MAAO,YACPxZ,KAAM,OACNw0C,QAAS,KACPN,EAA4BZ,EAAQ/5B,UAIxC,yBAAK3b,UAAU,gCAAgCM,IAAI,QACjD,0BAAMN,UAAU,QAAQ8pB,YAAoBnqB,EAA2B,IAArB+1C,EAAQmB,aAC1D,0BAAM72C,UAAU,SAAS01C,EAAQoB,SACjC,0BAAM92C,UAAU,wBAAwB61C,GAAqBH,IAC7D,0BAAM11C,UAAU,YAAY01C,EAAQqB,GAApC,MAA2CtB,GAAYC,MAM/D,OAhEAh+B,YAAeH,EAAUmR,EAASiP,EAAgBjD,IAAgBuB,uBAiEhE,yBAAKj2B,UAAU,kCACZw2C,IAhEyBd,EAgEcc,EA9DxC,yBAAKx2C,UAAU,iBACb,wBAAIA,UAAU,4BAA4BM,IAAKX,EAAKiY,MAAQ,WAAQtW,GACjE3B,EAAK,gCAGR,kBAACib,GAAA,EAAD,CAAU+iB,QAAM,EAACqC,UAAQ,GACvB,yBAAKhgC,UAAU,sBAAsBM,IAAI,QACvC,0BAAMN,UAAU,QAAQM,IAAI,QAAQo1C,EAAQoB,SAC5C,0BAAM92C,UAAU,wBAAwB61C,GAAqBH,IAC7D,0BAAM11C,UAAU,YAAY01C,EAAQqB,GAApC,MAA2CtB,GAAYC,MAI3D,kBAAC96B,GAAA,EAAD,CACE5a,UAAU,mBACVoC,KAAK,OACLgE,QAAM,EACNu3B,QAAM,EACN19B,QAASm2C,GAERz2C,EAAK,2BA2CT+2C,IArCwBM,EAqCaN,EAnCtC,yBAAK12C,UAAU,iBACb,wBAAIA,UAAU,4BAA4BM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAApE,kBAEC01C,EAASr8B,IAAIg8B,KAiCfD,GACC,kBAAC55B,GAAA,EAAD,CACEpb,OAAQy0C,EACRpvC,QAASsvC,EACT1zC,KAAK,yDACLoa,aAAa,+BACbC,eAAgBu5B,EAChB9e,sBAAoB,KA7C5B,IAA6Buf,EA5BCtB,KCkEjBlvC,mBAAK/H,YACjBC,IACC,MACEuZ,OACEC,KAAM++B,GAER1uB,OACErQ,KAAMg/B,GAERtF,SAAS,IACP3P,IAEAvjC,EAEJ,MAAO,CACLu4C,aACAC,aACAC,WAAYlV,IAGhB,CAAC7iC,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,mBApBpCZ,CA9F2D,EAC7E8Y,WACAogB,iBACAjP,UACAuuB,aACAC,aACAC,aACAC,qBAEA,MAAMC,EAAqB33C,YAAa43C,IACtCF,EAAe,CAAEE,eAChB,CAACF,IAEEz3C,EAAOC,cA2Cb,OAzCA8X,YAAeH,EAAUmR,EAASiP,EAAgBjD,IAAgBwB,qBA0ChE,yBAAKl2B,UAAU,wBACb,yBAAKA,UAAU,oCACb,yBAAKA,UAAU,iBACb,uBAAGA,UAAU,6CAA6CM,IAAKX,EAAKiY,MAAQ,WAAQtW,GACjF3B,EAAK,sBAIV,yBAAKK,UAAU,2BACZm3C,GAAcA,EAAW34C,OACxB,yBAAKwB,UAAU,oBACZm3C,EAAYx8B,IAAI,CAAC28B,EAAWr3B,IAnDzC,SAAuBq3B,EAAmBr3B,EAAWs3B,GACnD,MAAMC,EAAYz4C,aAAcu4C,GAC1Bj3C,EAAOm3C,EAAYN,EAAWI,QAAah2C,EAC3ClB,EAAQo3C,OAAoCl2C,EAAxB21C,EAAWK,GAE/Bt3C,EAAY0D,YAChB,6CACA8zC,EAAY,UAAY,SAG1B,OACE,kBAAC58B,GAAA,EAAD,CACEza,IAAKm3C,EACLt3C,UAAWA,EACXoG,QAAM,EACNu3B,QAAM,EACNjW,eAAgB,CAAC,CACf9L,MAAO,UACPxZ,KAAM,SACNw0C,QAAS,KACPS,EAAmBC,MAGvBx8C,MAAQ,SAAQy8C,EAAiBt3B,GAAKw3B,UAEtC,kBAACv3C,EAAA,EAAD,CAAQzG,KAAK,SAAS4G,KAAMA,EAAMD,KAAMA,IACxC,yBAAKJ,UAAU,eAAeM,IAAI,QAChC,wBAAIA,IAAI,QAAQC,aAAYi3C,EAAYnrB,aAAgBhsB,GAAQqZ,YAAa/Z,EAAMS,KAAW,KAC7FC,GAAQA,EAAKy3B,aACZ,yBAAK93B,UAAU,gBAAgBM,IAAI,QAAQu3B,aAA0Bx3B,EAAKy3B,cAE3Ez3B,IAASA,EAAKy3B,aAAez3B,EAAKisB,UACjC,yBAAKtsB,UAAU,mBAAmBM,IAAI,QAAtC,IAA+CD,EAAKisB,YAmBforB,CAAcJ,EAAWr3B,EAAG,KAE/Dk3B,IAAeA,EAAW34C,OAC5B,yBAAKwB,UAAU,aAAaM,IAAI,QAAhC,iBAIA,kBAAC2a,GAAA,EAAD,CAAS9a,IAAI,cAKnB,kBAAC,GAAD,CACEgL,SAAO,EACPlL,QAAS,OAETD,UAAU,kBACV8B,UAAU,sBAEV,uBAAG9B,UAAU,kB,UC7DNwG,mBAAK/H,YAAsBC,IACjC,CACLi5C,cAAeC,YAAoBl5C,EAAQ,QAF3BD,CAzCoC,EACtD8Y,WAAUmR,UAASivB,gBAAehgB,qBAElC,MAAMh4B,EAAOC,cAIb,OAFA8X,YAAeH,EAAUmR,EAASiP,EAAgBjD,IAAgB0B,cAGhE,yBAAKp2B,UAAU,yCACb,yBAAKA,UAAU,2BACb,kBAAC63C,GAAA,EAAD,CAAelU,QAASgU,IAExB,uBAAG33C,UAAU,iCAAiCM,IAAI,QAC/CC,YAAWZ,EAAK,uBAAwB,CAAC,SAI9C,yBAAKK,UAAU,gCACb,kBAAC4a,GAAA,EAAD,CACExY,KAAK,OACLnC,QAAS,IAAM03B,EAAejD,IAAgBsC,6BAE7Cr3B,EAAK,mBAER,kBAACib,GAAA,EAAD,CACExY,KAAK,eACLnC,QAAS,IAAM03B,EAAejD,IAAgBuC,eAE7Ct3B,EAAK,oBAER,kBAACib,GAAA,EAAD,CACExY,KAAK,QACLnC,QAAS,IAAM03B,EAAejD,IAAgBwC,oCAE7Cv3B,EAAK,0B,oBC8BD6G,mBA3D6B,EAC1C2tC,SACA58B,WACAogB,iBACAjP,UACAvN,QACAwS,YACAmqB,mBACA19B,cAAc,mBACdmZ,OACAwkB,cACAC,aACAv5B,eAEA,MAAOw5B,EAAiBC,GAAsBl1C,YAAiB,KACxDm1C,EAAoBC,GAAyBp1C,aAAS,GAEvDq1C,EAAe34C,YAAa44C,IAC5BR,GAAoBQ,IAAgBR,EACtCI,EArBuB,6BAuBvBz5B,EAAS65B,IAEV,CAAC75B,EAAUq5B,IAERS,EAAmB74C,YAAY,KAC/Bs4C,GACFA,IAEFE,EAAmB,KAClB,CAACF,IAEEr4C,EAAOC,cAIb,OAFA8X,YAAeH,EAAUmR,EAASiP,EAAgBwc,GAGhD,yBAAKn0C,UAAU,yCACb,yBAAKA,UAAU,2BACb,kBAACw4C,GAAA,EAAD,CAAgBC,OAAK,EAACC,kBAAmBP,KAG3C,yBAAKn4C,UAAU,gCACb,kBAAC24C,GAAA,EAAD,CACEx9B,MAAO88B,GAAmB98B,EAC1BoY,KAAMA,EACNnZ,YAAaA,EACb29B,YAAaA,GAAep4C,EAAK,QACjCq4C,WAAYO,EACZ5qB,UAAWA,EACX+qB,kBAAmBP,EACnBS,2BAA4BR,EAC5B35B,SAAU45B,QCjCL7xC,mBAAK/H,YAAsBC,IACjC,CACLi5C,cAAeC,YAAoBl5C,EAAQ,QAF3BD,CAxBkC,EACpD8Y,WAAUogB,iBAAgBjP,UAASivB,gBAAekB,cAElD,MAAMl5C,EAAOC,cAIb,OAFA8X,YAAeH,EAAUmR,EAASiP,EAAgBjD,IAAgByB,eAGhE,yBAAKn2B,UAAU,yCACb,yBAAKA,UAAU,2BACb,kBAAC63C,GAAA,EAAD,CAAelU,QAASgU,IAExB,uBAAG33C,UAAU,iCAAiCM,IAAI,QAC/CX,EAAK,+BAIV,yBAAKK,UAAU,gCACb,kBAAC2B,EAAA,EAAD,CAAQ1B,QAAS44C,GAAUl5C,EAAK,sCCHxC,MAAMm5C,GAAyB/2C,IAA0B,IAAM,IA8HhDyE,mBAAK/H,YAAqB,CAACC,GAAU0D,WAC3C,CACLu1C,cAAeC,YAAoBl5C,EAAiB,UAAT0D,EAAmB,KAAO,QAFrD3D,CA5H0C,EAC5Dk5C,gBACA3xC,OAAO,OACP2nB,YACAxS,QACAf,cACA2+B,gBACAf,aACAv5B,WACAlH,WACAogB,iBACAjP,UACAyrB,aAGA,MAAM5oC,EAAWtE,YAAyB,OAEnCf,EAAO8yC,GAAYh2C,YAAiB,KACpCi2C,EAAgBC,EAAoBC,GAAwBjzB,cAAQ,GAE3EjjB,YAAU,KACHkE,KACHhM,WAAW,KACToQ,EAASrD,QAAS+Q,SACjB6/B,KAEJ,IAEH,MA2BMn5C,EAAOC,cAIb,OAFA8X,YAAeH,EAAUmR,EAASiP,EAAgBwc,GAGhD,yBAAKn0C,UAAU,yCACb,yBAAKA,UAAU,2BACb,kBAAC63C,GAAA,EAAD,CAAelU,QAASgU,KAG1B,yBAAK33C,UAAU,gCACb,0BAAMsxB,OAAO,GAAG7S,SA9BA9a,IACpBA,EAAEyG,iBAEGmB,EAASrD,SAIduW,EAASvY,KAwBH,kBAACgU,GAAA,EAAD,CACEzP,IAAKc,EACLrF,MAAOA,EACPob,UAAWtb,EACXif,MAAO7K,EACPe,MAAOA,EACPrP,SA7CiBnI,IACrBwX,GAAS68B,GACXA,IAGFgB,EAASr1C,EAAEsG,OAAO/D,UA2CXA,EACC,kBAACvE,EAAA,EAAD,CAAQqE,KAAK,SAAS2nB,UAAWA,EAAWvnB,QAAM,GAAEzG,EAAK,aAEzD,kBAACgC,EAAA,EAAD,CACEsa,QAAM,EACN0R,UAAWA,EACXvnB,QAAM,EACNnG,QAAS84C,EAAgBG,EArClB,KACjBz6B,MAsCW9e,EAAK,mBAIXo5C,GACC,kBAAC1+B,GAAA,EAAD,CACEra,UAAU,SACV0B,OAAQu3C,EACRr9B,MAAOjc,EAAK,wBACZoH,QAASoyC,GAER54C,YAAWZ,EAAK,4BAA6B,CAAC,KAAM,oBACrD,yBAAKK,UAAU,kBACb,kBAAC2B,EAAA,EAAD,CACEE,MAAM,SACNuE,QAAM,EACN6V,QAAM,EACNjc,UAAU,wBACVC,QArDY,KACxBk5C,IACA16B,MAqDa9e,EAAK,kBAER,kBAACgC,EAAA,EAAD,CACEE,MAAM,UACNuE,QAAM,EACN6V,QAAM,EACNjc,UAAU,wBACVC,QAASk5C,GAERx5C,EAAK,kBCxGP6G,mBAAK/H,YAAsBC,IACjC,CACLi5C,cAAeC,YAAoBl5C,EAAQ,QAF3BD,CA5B4C,EAC9D8Y,WAAUmR,UAASivB,gBAAehgB,qBAElC,MAAMh4B,EAAOC,cAQb,OAFA8X,YAAeH,EAAUmR,EAASiP,EAAgBjD,IAAgBqC,sBAGhE,yBAAK/2B,UAAU,yCACb,yBAAKA,UAAU,2BACb,kBAAC63C,GAAA,EAAD,CAAelU,QAASgU,IAExB,uBAAG33C,UAAU,iCAAiCM,IAAI,QAC/CX,EAAK,wCAIV,yBAAKK,UAAU,gCACb,kBAAC2B,EAAA,EAAD,CAAQ1B,QAjBM,KAClB03B,EAAejD,IAAgBI,WAgBIn1B,EAAK,mDCZ5C,MAAMm5C,GAAyB/2C,IAA0B,IAAM,IAmEhDyE,mBAAK/H,YAAsBC,IACjC,CACLi5C,cAAeC,YAAoBl5C,EAAQ,MAC3C06C,WAAY16C,EAAO26C,cAAcC,yBAHjB76C,CAjEsC,EACxDk5C,gBACAyB,aACAzrB,YACAxS,QACA68B,aACAv5B,WACAlH,WACAogB,iBACAjP,UACAyrB,aAGA,MAAM5oC,EAAWtE,YAAyB,OAEnCf,EAAO8yC,GAAYh2C,YAAiB,IAE3CC,YAAU,KACHkE,KACHhM,WAAW,KACToQ,EAASrD,QAAS+Q,SACjB6/B,KAEJ,IAEH,MAAMn5C,EAAOC,cAEb8X,YAAeH,EAAUmR,EAASiP,EAAgBwc,GAiBlD,OACE,yBAAKn0C,UAAU,yCACb,yBAAKA,UAAU,2BACb,kBAAC63C,GAAA,EAAD,CAAelU,QAASgU,KAG1B,yBAAK33C,UAAU,gCACb,kBAACka,GAAA,EAAD,CACEhU,MAAOA,EACPuE,IAAKc,EACL+V,UAAU,UACV2D,MAAOtlB,EAAK,iBACZwb,MAAOA,EACPrP,SA5BmBnI,IACrBwX,GAAS68B,GACXA,IAGF,MAAMuB,EAAW51C,EAAEsG,OAAO/D,MAAM6pB,MAAM,EAAGqpB,GAErCG,EAAS/6C,SAAW46C,GACtB36B,EAAS86B,GAGXP,EAASO,GACT51C,EAAEsG,OAAO/D,MAAQqzC,KAkBZ5rB,GAAa,kBAAC1S,GAAA,EAAD,WCqVPzU,mBAAK/H,YACjBC,IAAD,IAA8BA,EAAO26C,gBACrC,CAACj6C,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,iBAAkB,sBAAuB,gBAAiB,wBAC1D,gBAAiB,oBAJDZ,CA/Y6C,EAC/Di1B,gBACA2O,cACAjR,QACAmC,OACA5F,YACAxS,QACAm+B,yBACAjb,WACA9mB,WACAogB,iBACAjP,UACA8wB,iBACAC,gBACAC,kBACAC,sBACAC,wBACAC,oBAEA52C,YAAU,KACJq2C,IACE5lB,IAAkBgB,IAAgBiC,sBACpCgB,EAAejD,IAAgBmC,2BACtBnD,IAAkBgB,IAAgBkC,oBAC3Ce,EAAejD,IAAgBoC,0BAGlC,CAACpD,EAAeiE,EAAgB2hB,IAEnC,MAAMQ,EAAoBp6C,YAAY,KACpC2+B,EAAS,CAAEr4B,KAAM,UACjB2xB,EAAejD,IAAgB2B,mBAC9B,CAACgI,EAAU1G,IAERoiB,EAAoBr6C,YAAawG,IACrCm4B,EAAS,CAAEr4B,KAAM,cAAeitB,QAAS/sB,IACzCyxB,EAAejD,IAAgB8B,0BAC9B,CAAC6H,EAAU1G,IAERqiB,EAA2Bt6C,YAAY,KAC3Ci4B,EAAejD,IAAgB+B,uBAC9B,CAACkB,IAEEsiB,EAAwBv6C,YAAawG,IACzCm4B,EAAS,CAAEr4B,KAAM,UAAWitB,QAAS/sB,IACrCyxB,EAAejD,IAAgBiC,wBAC9B,CAAC0H,EAAU1G,IAERuiB,EAAyBx6C,YAAawG,IAC1Cm4B,EAAS,CAAEr4B,KAAM,WAAYitB,QAAS/sB,IACtCszC,EAAe,IACVpoB,EACHoC,MAAOttB,EACPi0C,UAAW,KACTxiB,EAAejD,IAAgBqC,0BAGlC,CAACsH,EAAU1G,EAAgBvG,EAAOooB,IAE/BY,EAA8B16C,YAAawG,IAC/Cm4B,EAAS,CAAEr4B,KAAM,qBAAsBitB,QAAS/sB,IAChDuzC,EAAc,CACZpmB,gBAAiBntB,EACjBi0C,UAAW,KACTxiB,EAAejD,IAAgB4B,4BAGlC,CAACmjB,EAAepb,EAAU1G,IAEvB0iB,EAA0B36C,YAAawG,IAC3Cm4B,EAAS,CAAEr4B,KAAM,cAAeitB,QAAS/sB,IACzCyxB,EAAejD,IAAgB6B,6BAC9B,CAAC8H,EAAU1G,IAER2iB,EAA8B56C,YAAY,KAC9Ci4B,EAAejD,IAAgBgC,0BAC9B,CAACiB,IAEE4iB,EAA2B76C,YAAawG,IAC5Cm4B,EAAS,CAAEr4B,KAAM,UAAWitB,QAAS/sB,IACrCszC,EAAe,IACVpoB,EACHmC,KAAMrtB,EACNi0C,UAAW,KACTxiB,EAAejD,IAAgBqC,0BAGlC,CAACsH,EAAU1G,EAAgBvG,EAAOooB,IAE/BgB,EAAgB96C,YAAawG,IACjC2zC,EAAc,CACZxmB,gBAAiBntB,EACjBi0C,UAAW,KACTxiB,EAAejD,IAAgBI,aAGlC,CAAC+kB,EAAeliB,IAEb8iB,EAAqC/6C,YAAawG,IACtDm4B,EAAS,CAAEr4B,KAAM,qBAAsBitB,QAAS/sB,IAChDuzC,EAAc,CACZpmB,gBAAiBntB,EACjBi0C,UAAW,KACTxiB,EAAejD,IAAgBkC,wBAGlC,CAAC6iB,EAAepb,EAAU1G,IAEvB+iB,EAAsBh7C,YAAawG,IACvCm4B,EAAS,CAAEr4B,KAAM,WAAYitB,QAAS/sB,IACtCyzC,EAAoB,IACfvoB,EACHoC,MAAOttB,EACPi0C,UAAW,KACTxiB,EAAejD,IAAgBqC,0BAGlC,CAACsH,EAAU1G,EAAgBvG,EAAOuoB,IAE/BgB,EAAkBj7C,YAAak7C,IACnChB,EAAsB,CAAEgB,UACvB,CAAChB,IAEEj6C,EAAOC,cAEb,OAAQ8zB,GACN,KAAKgB,IAAgByB,cACnB,OACE,kBAAC,GAAD,CACE0iB,QAASiB,EACTniB,eAAgBA,EAChBpgB,SAAUA,GAAY,CACpBmd,IAAgB2B,iBAChB3B,IAAgB8B,wBAChB9B,IAAgB+B,qBAChB/B,IAAgBiC,sBAChBjC,IAAgBmC,0BAChBnC,IAAgBqC,sBAChB19B,SAASgpC,GACX3Z,QAASA,IAIf,KAAKgM,IAAgB2B,iBACnB,OACE,kBAAC,GAAD,CACE8d,OAAQzgB,EACRtZ,YAAaza,EAAK,iBAClBo4C,YAAap4C,EAAK,YAClB8e,SAAUs7B,EACVpiB,eAAgBA,EAChBpgB,SAAUA,GAAY,CACpBmd,IAAgB8B,wBAChB9B,IAAgB+B,qBAChB/B,IAAgBiC,sBAChBjC,IAAgBmC,0BAChBnC,IAAgBqC,sBAChB19B,SAASgpC,GACX3Z,QAASA,IAIf,KAAKgM,IAAgB8B,wBACnB,OACE,kBAAC,GAAD,CACE2d,OAAQzgB,EACRokB,iBAAkB1mB,EAAMkC,SACxBlZ,YAAaza,EAAK,yBAClBo4C,YAAap4C,EAAK,YAClB8e,SAAUu7B,EACVriB,eAAgBA,EAChBpgB,SAAUA,GAAY,CACpBmd,IAAgB+B,qBAChB/B,IAAgBiC,sBAChBjC,IAAgBmC,0BAChBnC,IAAgBqC,sBAChB19B,SAASgpC,GACX3Z,QAASA,IAIf,KAAKgM,IAAgB+B,qBACnB,OACE,kBAAC,GAAD,CACEr0B,KAAK,OACLgY,YAAaza,EAAK,2BAClB8e,SAAUw7B,EACV9F,OAAQzgB,EACRiE,eAAgBA,EAChBpgB,SAAUA,GAAY,CACpBmd,IAAgBiC,sBAChBjC,IAAgBmC,0BAChBnC,IAAgBqC,sBAChB19B,SAASgpC,GACX3Z,QAASA,IAIf,KAAKgM,IAAgBiC,sBACnB,OACE,kBAAC,GAAD,CACEv0B,KAAK,QACL4D,KAAK,QACL2nB,UAAWA,EACXxS,MAAOA,EACP68B,WAAY0B,EACZt/B,YAAaza,EAAK,sBAClBo5C,eAAa,EACbt6B,SAAUy7B,EACV/F,OAAQzgB,EACRiE,eAAgBA,EAChBpgB,SAAUA,GAAY,CACpBmd,IAAgBmC,0BAChBnC,IAAgBqC,sBAChB19B,SAASgpC,GACX3Z,QAASA,IAIf,KAAKgM,IAAgBmC,0BACnB,OACE,kBAAC,GAAD,CACElJ,UAAWA,EACXxS,MAAOA,EACP68B,WAAY0B,EACZj7B,SAAUk8B,EACVxG,OAAQzgB,EACRiE,eAAgBA,EAChBpgB,SAAUA,GAAY8qB,IAAgB3N,IAAgBqC,qBACtDrO,QAASA,IAIf,KAAKgM,IAAgBqC,qBACnB,OACE,kBAAC,GAAD,CACEY,eAAgBA,EAChBpgB,SAAUA,EACVmR,QAASA,IAIf,KAAKgM,IAAgB0B,aACnB,OACE,kBAAC,GAAD,CACEuB,eAAgBA,EAChBpgB,SAAUA,GAAY,CACpBmd,IAAgBsC,2BAChBtC,IAAgB4B,uBAChB5B,IAAgB6B,2BAChB7B,IAAgBgC,wBAChBhC,IAAgBuC,aAChBvC,IAAgBwC,kCAChBxC,IAAgBkC,mBAChBlC,IAAgBoC,uBAChBpC,IAAgBqC,sBAChB19B,SAASgpC,GACX3Z,QAASA,IAIf,KAAKgM,IAAgBsC,2BACnB,OACE,kBAAC,GAAD,CACEmd,OAAQzgB,EACR/F,UAAWA,EACXxS,MAAOA,EACP68B,WAAY0B,EACZnmB,KAAMA,EACN9U,SAAU27B,EACVziB,eAAgBA,EAChBpgB,SAAUA,GAAY,CACpBmd,IAAgB4B,uBAChB5B,IAAgB6B,2BAChB7B,IAAgBgC,wBAChBhC,IAAgBqC,sBAChB19B,SAASgpC,GACX3Z,QAASA,IAIf,KAAKgM,IAAgB4B,uBACnB,OACE,kBAAC,GAAD,CACE6d,OAAQzgB,EACRtZ,YAAaza,EAAK,+BAClB8e,SAAU47B,EACV1iB,eAAgBA,EAChBpgB,SAAUA,GAAY,CACpBmd,IAAgB6B,2BAChB7B,IAAgBgC,wBAChBhC,IAAgBqC,sBAChB19B,SAASgpC,GACX3Z,QAASA,IAIf,KAAKgM,IAAgB6B,2BACnB,OACE,kBAAC,GAAD,CACE4d,OAAQzgB,EACRokB,iBAAkB1mB,EAAMkC,SACxBlZ,YAAaza,EAAK,yBAClB8e,SAAU67B,EACV3iB,eAAgBA,EAChBpgB,SAAUA,GAAY,CACpBmd,IAAgBgC,wBAChBhC,IAAgBqC,sBAChB19B,SAASgpC,GACX3Z,QAASA,IAIf,KAAKgM,IAAgBgC,wBACnB,OACE,kBAAC,GAAD,CACE/I,UAAWA,EACXxS,MAAOA,EACP68B,WAAY0B,EACZt3C,KAAK,OACLgY,YAAaza,EAAK,2BAClB8e,SAAU87B,EACV5iB,eAAgBA,EAChBpgB,SAAUA,GAAY8qB,IAAgB3N,IAAgBqC,qBACtDrO,QAASA,EACTyrB,OAAQzgB,IAId,KAAKgB,IAAgBuC,aACnB,OACE,kBAAC,GAAD,CACEtJ,UAAWA,EACXxS,MAAOA,EACP68B,WAAY0B,EACZnmB,KAAMA,EACN9U,SAAU+7B,EACV7iB,eAAgBA,EAChBpgB,SAAUA,EACVmR,QAASA,EACTyrB,OAAQzgB,IAId,KAAKgB,IAAgBwC,kCACnB,OACE,kBAAC,GAAD,CACEid,OAAQzgB,EACR/F,UAAWA,EACXxS,MAAOA,EACP68B,WAAY0B,EACZnmB,KAAMA,EACN9U,SAAUg8B,EACV9iB,eAAgBA,EAChBpgB,SAAUA,GAAY,CACpBmd,IAAgBkC,mBAChBlC,IAAgBoC,uBAChBpC,IAAgBqC,sBAChB19B,SAASgpC,GACX3Z,QAASA,IAIf,KAAKgM,IAAgBkC,mBACnB,OACE,kBAAC,GAAD,CACEud,OAAQzgB,EACRtxB,KAAK,QACL4D,KAAK,QACLoU,YAAaza,EAAK,sBAClB8e,SAAUi8B,EACV/iB,eAAgBA,EAChBpgB,SAAUA,GAAY,CACpBmd,IAAgBoC,uBAChBpC,IAAgBqC,sBAChB19B,SAASgpC,GACX3Z,QAASA,IAIf,KAAKgM,IAAgBoC,uBACnB,OACE,kBAAC,GAAD,CACEqd,OAAQzgB,EACR/F,UAAWA,EACXxS,MAAOA,EACP68B,WAAY0B,EACZj7B,SAAUk8B,EACVhjB,eAAgBA,EAChBpgB,SAAUA,GAAY8qB,IAAgB3N,IAAgBqC,qBACtDrO,QAASA,IAIf,QACE,WCxSSliB,mBAhGc,EAC3Bq0C,UACAza,cACAC,cACAya,oBACAC,eACAC,gBACArtB,YACA2S,sBACAE,iBACA/lB,iBAGA,MAAMlP,EAAWtE,YAAyB,MACpCy5B,EAAiBN,EAAY5hC,OAjBd,GAmBrByE,YAAU,KACR9H,WAAW,KACTP,sBAAsB,KACpB2Q,EAASrD,QAAS+Q,WAxBH,MA2BlB,IAEH,MAAM2nB,EAAkBlhC,YAAa/B,IACnC,MAAMkjC,EAAiB,IAAIT,GACvBS,EAAexnC,SAASsE,GAC1BkjC,EAAeC,OAAOD,EAAe3uB,QAAQvU,GAAK,GAElDkjC,EAAe3gB,KAAKviB,GAEtB2iC,EAAoBO,GACpBL,EAAe,KACd,CAACJ,EAAaE,EAAqBE,IAEhC1mB,EAAqBpa,YAAaiE,IACtC,MAAM,MAAEuC,GAAUvC,EAAEiG,cACpB42B,EAAet6B,IACd,CAACs6B,KAEG7mB,EAAaC,GAAWC,aAAkBY,EAAYogC,EAASjzC,QAAQy4B,IAExE1gC,EAAOC,cAEb,OACE,yBAAKI,UAAU,UACb,yBAAKA,UAAU,8BAA8BM,IAAKX,EAAKiY,MAAQ,WAAQtW,GACpE8+B,EAAYzlB,IAAI,CAAChd,EAAIsiB,IACpB,kBAACiN,GAAA,EAAD,CACEC,aAAcxvB,EACdujC,YAAaR,GAAkBzgB,EAAImgB,EAAY5hC,OApD3B,EAqDpB2iC,UAAQ,EACRlhC,QAAS2gC,EACTxT,SAAUzvB,KAGd,kBAACuc,GAAA,EAAD,CACEvc,GAAIq9C,EACJvwC,IAAKc,EACLrF,MAAOm6B,EACPv0B,SAAUgO,EACVM,YAAa0gC,GAAqBn7C,EAAK,iBAI1Cga,GAAeA,EAAYnb,OAC1B,kBAAC+b,GAAA,EAAD,CACEva,UAAU,4BACVwa,MAAOb,EACPc,WAAYb,GAEXD,EAAYgB,IAAKhd,GAChB,kBAACid,GAAA,EAAD,CACEza,IAAKxC,EACLqC,UAAU,uCACVC,QAAS,IAAM2gC,EAAgBjjC,GAC/ByI,QAAM,GAEN,kBAACg7B,GAAA,EAAD,CAAUnc,MAAM,GAAGoc,QAASjB,EAAY/mC,SAASsE,KAChDoB,aAAcpB,GACb,kBAACkd,GAAA,EAAD,CAAiBE,OAAQpd,IAEzB,kBAACqd,GAAA,EAAD,CAAerc,OAAQhB,OAK5BgwB,IAAahU,GAAgBA,EAAYnb,OAG5C,kBAACyc,GAAA,EAAD,MAFA,uBAAGjb,UAAU,cAAc+6C,GAAgB,4BC4BnD,SAASE,GAA0Bv8C,EAAqBy1C,GACtD,MAAM,QAAExC,GAAYjzC,EAAOoR,SAC3B,OAAQqkC,GACN,KAAKzf,IAAgBa,kCACrB,KAAKb,IAAgBkB,iCACnB,OAAO+b,EAAQ7Z,YACjB,KAAKpD,IAAgBc,+BACrB,KAAKd,IAAgBmB,8BACnB,OAAO8b,EAAQS,SACjB,KAAK1d,IAAgBe,mCACrB,KAAKf,IAAgBoB,kCACnB,OAAO6b,EAAQW,aACjB,KAAK5d,IAAgBgB,iCACrB,KAAKhB,IAAgBqB,gCACnB,OAAO4b,EAAQa,SACjB,KAAK9d,IAAgBsB,gCACrB,KAAKtB,IAAgBiB,iCACnB,OAAOgc,EAAQe,YAMNlsC,mBAAK/H,YAClB,CAACC,GAAUy1C,aACT,MACEl8B,OACEC,KAAMC,EADD,QAELC,EAFK,iBAGLC,GAJE,cAMJC,GACE5Z,EAEJ,MAAO,CACL4Z,gBACAH,YACAC,QAASA,EAAQI,OACjBH,iBAAkBA,EAAiBG,OACnCgpB,kBAAmBnpB,EAAiBM,SACpCD,gBAAiBN,EAAQO,SACzB7I,SAAUmrC,GAA0Bv8C,EAAQy1C,KAGhD,CAAC/0C,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,uBArBpCZ,CAzIsE,EACxF6Z,gBACA4iC,cACA/G,SACArkC,WACAqI,YACAC,UACAC,mBACAK,kBACA8oB,oBACA2Z,qBACA5jC,WACAogB,iBACAjP,cAEA,MAAM/oB,EAAOC,cAEPw7C,EAAqB55C,YAAQ,IAC5BsO,EAIDorC,EACK,IAAIprC,EAASukC,gBAAiBvkC,EAASwkC,cAEvC,IAAIxkC,EAASykC,gBAAiBzkC,EAAS0kC,cANvC,GAQR,CAAC0G,EAAaprC,KACVqZ,EAAakyB,GAAkBr4C,YAAiB,KAChDs4C,EAAeC,GAAoBv4C,aAAkB,IACrDw4C,EAAuBC,GAA4Bz4C,YAAmBo4C,GAEvEnjC,EAAQzW,YAAQ,KACpB,MAAMigC,EAAmBrpB,EACrBspB,aAAgBvpB,EAAWC,EAASC,EAAkB,YACtD/W,EACEqgC,EAAqBjpB,EACvBgpB,aAAgBvpB,EAAWO,EAAiB8oB,EAAmB,iBAC/DlgC,EAEJ,GAAKmgC,GAAqBE,EAI1B,MAAO,IACDF,EACA,IACGA,EAAiBG,eACjBH,EAAiBI,YAEpB,MAEAF,EAAqBA,EAAmBE,WAAa,KAE1D,CAAC1pB,EAAWC,EAASC,EAAkBK,EAAiB8oB,IAErDM,EAAetgC,YAAQ,KAC3B,GAAKyW,EAIL,OAAOA,EACJc,OAAQ3Y,IACLrB,aAAcqB,EAAKzC,KAAOyC,EAAKzC,KAAO2a,GAAkBkW,aAAYpuB,OAEnE+oB,GACA1P,aAAYC,YAAa/Z,EAAMS,GAAO+oB,IACtCiyB,EAAmB/hD,SAAS+G,EAAKzC,MAGrCgd,IAAI,EAAGhd,QAASA,IAClB,CAACsa,EAAOK,EAAe3Y,EAAMwpB,EAAaiyB,IAEvCM,EAAiCh8C,YAAawG,IAClDu1C,EAAyBv1C,GACzBq1C,GAAiB,IAChB,IAEGlD,EAAe34C,YAAY,KAC/By7C,EAAmB,CACjBrG,WAAYZ,GAAcC,GAC1B+G,YAAatzC,QAAQszC,GACrBS,YAAaH,IAGf7jB,EAAejD,IAAgBI,UAC9B,CAAComB,EAAaM,EAAuB7jB,EAAgBwc,EAAQgH,IAKhE,OAHAzjC,YAAeH,EAAUmR,EAASiP,EAAgBwc,GAIhD,yBAAKn0C,UAAU,wBACb,kBAAC,GAAD,CACE66C,QAAS/Y,GAAgB,GACzB1B,YAAaob,EACbnb,YAAalX,EACb2xB,kBAAiCn7C,EAAdu7C,EAAmB,6BAAqC,6BAC3EF,cAAc,0BACd1a,oBAAqBob,EACrBlb,eAAgB6a,IAGlB,kBAAC,GAAD,CACElwC,QAASmwC,EACTr7C,QAASo4C,EACTv2C,UAAyBnC,EAAdu7C,EAAmB,uBAA+B,wBAE7D,uBAAGl7C,UAAU,0B,OC1HrB,MAAMgwB,GAA0B/xB,OAAOgyB,KAAKyE,KAAiBl2B,OAAS,EAGhEo9C,GAAiB,CACrBlnB,IAAgByB,cAChBzB,IAAgB2B,iBAChB3B,IAAgB8B,wBAChB9B,IAAgB+B,qBAChB/B,IAAgBiC,sBAChBjC,IAAgBmC,0BAChBnC,IAAgBqC,qBAChBrC,IAAgB0B,aAChB1B,IAAgBsC,2BAChBtC,IAAgB4B,uBAChB5B,IAAgB6B,2BAChB7B,IAAgBgC,wBAChBhC,IAAgBuC,aAChBvC,IAAgBwC,kCAChBxC,IAAgBkC,mBAChBlC,IAAgBoC,wBAGZ+kB,GAAkB,CACtBnnB,IAAgByC,QAChBzC,IAAgB0C,oBAChB1C,IAAgB2C,kBAChB3C,IAAgB4C,qBAChB5C,IAAgB6C,sBAGZukB,GAAkB,CACtBpnB,IAAgBwB,oBAChBxB,IAAgBuB,uBAGZ8lB,GAA+B,CACnCrnB,IAAgBa,kCAChBb,IAAgBkB,kCAGZomB,GAAkC,CACtCtnB,IAAgBc,+BAChBd,IAAgBmB,+BAGZomB,GAAgC,CACpCvnB,IAAgBe,mCAChBf,IAAgBoB,mCAGZomB,GAA6B,CACjCxnB,IAAgBgB,iCAChBhB,IAAgBqB,iCAGZomB,GAA8B,CAClCznB,IAAgBiB,iCAChBjB,IAAgBsB,iCAqQHxvB,mBA1PgB,EAC7B+Q,WACAmc,gBACAiE,iBACAjP,UACA0zB,2BAEA,MAAOC,EAAcC,GxC2IdtrB,GAAWgC,GAAgBF,KwC1I3BypB,EAAYC,GvC5CZxrB,GAAWyC,GAAcX,IuC8C1BwP,EAAc5iC,YAAY,KAE5Bg0B,IAAkBgB,IAAgB0C,qBAC/B1D,IAAkBgB,IAAgB2C,mBAErCl8B,WAAW,KACTmhD,EAAgB,CAAEt2C,KAAM,WAnFJ,KAwFtB0tB,IAAkBgB,IAAgB4C,sBAC/B5D,IAAkBgB,IAAgB6C,qBAUvC7O,IAR4B,WAAtB2zB,EAAaxqB,KACf8F,EAAejD,IAAgB0C,qBAE/BO,EAAejD,IAAgB2C,oBAMlC,CACDglB,EAAaxqB,KAAMyqB,EACnB5oB,EAAehL,EAASiP,IAGpB8kB,EAAmB/8C,YAAY,KACnC48C,EAAgB,CAAEt2C,KAAM,gBACxBs8B,KACC,CAACga,EAAiBha,IAuLrB,SAASoa,EAAqBC,EAAyBC,EAAiBC,GACtE,OACE,oCACE,kBAAC,GAAD,CACEnpB,cAAeA,EACfhL,QAAS4Z,EACT1O,aAAc6oB,EACd9oB,eAAgB0oB,EAAajpB,WA5LrC,SAAqCupB,EAAyBxI,GAC5D,MAAM2I,EAA+C,CACnD,CAACpoB,IAAgBQ,oBAAqB6mB,GAA6B1iD,SAAS86C,GAC5E,CAACzf,IAAgBS,iBAAkB6mB,GAAgC3iD,SAAS86C,GAC5E,CAACzf,IAAgBU,qBAAsB6mB,GAA8B5iD,SAAS86C,GAC9E,CAACzf,IAAgBW,mBAAoB6mB,GAA2B7iD,SAAS86C,GACzE,CAACzf,IAAgBY,mBAAoB6mB,GAA4B9iD,SAAS86C,IAGtE4I,EAAgBnB,GAAeviD,SAAS86C,GACxC6I,EAAkBnB,GAAgBxiD,SAAS86C,GAC3C8I,EAAkBnB,GAAgBziD,SAAS86C,IAC5C4I,GACA9+C,OAAOgyB,KAAK6sB,GAAqBzjD,SAAS86C,EAAOzlC,aACjDzQ,OAAOu0B,OAAOsqB,GAAqBhd,KAAM3/B,IAAgB,IAARA,GAEtD,OAAQuzB,GACN,KAAKgB,IAAgBkD,KACnB,OACE,kBAAC,GAAD,CAAcD,eAAgBA,EAAgBpgB,SAAUA,EAAUmR,QAAS4Z,IAE/E,KAAK5N,IAAgBC,YACnB,OACE,kBAAC,GAAD,CACEgD,eAAgBA,EAChBpgB,SAAUA,GAAYolC,EACtBj0B,QAAS4Z,IAGf,KAAK5N,IAAgBE,QACnB,OACE,kBAAC,GAAD,CACE+C,eAAgBA,EAChBpgB,SAAUolC,GACPxI,IAAWzf,IAAgBO,4BAC3Bkf,IAAWzf,IAAgBM,uBAC3BioB,GAAmBD,EACtBt0B,QAAS4Z,IAGf,KAAK5N,IAAgBG,cACnB,OACE,kBAAC,GAAD,CAAuB8C,eAAgBA,EAAgBpgB,SAAUolC,EAAgBj0B,QAAS4Z,IAE9F,KAAK5N,IAAgBI,QACnB,OACE,kBAAC,GAAD,CACE6C,eAAgBA,EAChBpgB,SAAUolC,GAAkBM,GAAmBF,EAC/Cr0B,QAAS4Z,IAGf,KAAK5N,IAAgBK,SACnB,OACE,kBAAC,GAAD,CAAkB4C,eAAgBA,EAAgBpgB,SAAUolC,EAAgBj0B,QAAS4Z,IAEzF,KAAK5N,IAAgBM,sBACnB,OACE,kBAAC,GAAD,CACE2C,eAAgBA,EAChBpgB,SAAUolC,GAAkBxI,IAAWzf,IAAgBO,2BACvDvM,QAAS4Z,IAGf,KAAK5N,IAAgBO,2BACnB,OACE,kBAAC,GAAD,CACE0C,eAAgBA,EAChBpgB,SAAUolC,EACVj0B,QAAS4Z,IAGf,KAAK5N,IAAgBuB,sBACnB,OACE,kBAAC,GAAD,CACE0B,eAAgBA,EAChBpgB,SAAUolC,EACVj0B,QAAS4Z,IAGf,KAAK5N,IAAgBwB,oBACnB,OACE,kBAAC,GAAD,CACEyB,eAAgBA,EAChBpgB,SAAUolC,EACVj0B,QAAS4Z,IAGf,KAAK5N,IAAgBQ,mBACrB,KAAKR,IAAgBS,gBACrB,KAAKT,IAAgBU,oBACrB,KAAKV,IAAgBW,kBACrB,KAAKX,IAAgBY,kBACnB,OACE,kBAAC,GAAD,CACE6e,OAAQzgB,EACRiE,eAAgBA,EAChBpgB,SAAUolC,GAAkBG,EAAoBppB,GAChDhL,QAAS4Z,IAIf,KAAK5N,IAAgBa,kCACrB,KAAKb,IAAgBc,+BACrB,KAAKd,IAAgBe,mCACrB,KAAKf,IAAgBgB,iCACrB,KAAKhB,IAAgBiB,iCACnB,OACE,kBAAC,GAAD,CACEulB,aAAW,EACX/G,OAAQzgB,EACRiE,eAAgBA,EAChBpgB,SAAUolC,GAAkBG,EAAoBppB,GAChDhL,QAAS4Z,IAIf,KAAK5N,IAAgBkB,iCACrB,KAAKlB,IAAgBmB,8BACrB,KAAKnB,IAAgBoB,kCACrB,KAAKpB,IAAgBqB,gCACrB,KAAKrB,IAAgBsB,gCACnB,OACE,kBAAC,GAAD,CACEme,OAAQzgB,EACRiE,eAAgBA,EAChBpgB,SAAUolC,EACVj0B,QAAS4Z,IAIf,KAAK5N,IAAgByC,QACrB,KAAKzC,IAAgB0C,oBACrB,KAAK1C,IAAgB2C,kBACrB,KAAK3C,IAAgB4C,qBACrB,KAAK5C,IAAgB6C,qBACnB,OACE,kBAAC,GAAD,CACE7D,cAAeA,EACf2O,YAAa8R,EACb/iB,MAAOirB,EACPhe,SAAUie,EACV/kC,SAAUolC,EACVhlB,eAAgBA,EAChBjP,QAAS4Z,IAIf,KAAK5N,IAAgByB,cACrB,KAAKzB,IAAgB2B,iBACrB,KAAK3B,IAAgB8B,wBACrB,KAAK9B,IAAgB+B,qBACrB,KAAK/B,IAAgBiC,sBACrB,KAAKjC,IAAgBmC,0BACrB,KAAKnC,IAAgBqC,qBACrB,KAAKrC,IAAgB0B,aACrB,KAAK1B,IAAgBsC,2BACrB,KAAKtC,IAAgB4B,uBACrB,KAAK5B,IAAgB6B,2BACrB,KAAK7B,IAAgBgC,wBACrB,KAAKhC,IAAgBuC,aACrB,KAAKvC,IAAgBwC,kCACrB,KAAKxC,IAAgBkC,mBACrB,KAAKlC,IAAgBoC,uBACnB,OACE,kBAAC,GAAD,CACEpD,cAAeA,EACftC,MAAOmrB,EACPle,SAAUme,EACVna,YAAa8R,EACb58B,SAAUolC,EACVhlB,eAAgBA,EAChBjP,QAAS4Z,IAIf,QACE,QAaC4a,CAA4BP,EAAgBE,IAKnD,OACE,kBAAChlC,EAAA,EAAD,CACEla,GAAG,WACHoa,KAAMqkC,EAAuB,OAASe,IACtCrlC,UAAW4b,EACX3C,YAAaf,IAEZ0sB,KCjTP,MAAMz0B,GAAe3kB,YAAU4kB,GAAOA,IAAM,KAAO,GAkEpC1hB,mBAAK/H,YACjBC,IACC,MAAQypB,QAASi1B,GAAe1+C,EAAOgsB,aAAe,IAC9CxS,KAAMoQ,GAAc5pB,EAAO6pB,MAEnC,MAAO,CACLD,YACA80B,aACAC,iBAAkB3+C,EAAO2+C,mBAG7B,CAACj+C,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,kBAAmB,aAXvDZ,CAhE2C,EAC7D8Y,WAAUmR,UACV3P,SAAQuP,YAAW80B,aAAYx0B,kBAAiBC,WAAUw0B,uBAI1Dp6C,YAAU,KACRglB,GAAa,KACXW,QAIJlR,YAAeH,EAAUmR,GAEzB,MAAMb,EAAcnoB,YACjB/B,IACCkrB,EAAS,CAAElrB,QAEb,CAACkrB,IAGGzQ,EAAU5W,YAAQ,KACtB,IAAK47C,EACH,OAGF,MAAME,EAAYvkC,EAASqkC,EAAWrkC,OAAQpb,IAC5C,MAAM0C,EAAOioB,EAAU3qB,GACvB,IAAK0C,EACH,OAAO,EAET,MAAM+rB,EAAWC,aAAgBhsB,GACjC,OAAO+rB,GAAY3S,aAAY2S,EAAUrT,KACtCqkC,EAEL,OAAOG,aAAYD,EAAWh1B,OAAWhnB,EAAW+7C,IACnD,CAACD,EAAYrkC,EAAQuP,EAAW+0B,KAE5B1jC,EAAaC,GAAWC,kBAAkBvY,EAAW8W,EAASxQ,QAAQmR,IAE7E,OACE,kBAACwB,GAAA,EAAD,CAAgBC,MAAOb,EAAac,WAAYb,EAAS5Z,UAAU,2BAChE2Z,GAAeA,EAAYnb,OAC1Bmb,EAAYgB,IAAKhd,GACf,kBAACid,GAAA,EAAD,CACEza,IAAKxC,EACLqC,UAAU,sBACVC,QAAS,IAAM4nB,EAAYlqB,GAC3ByI,QAASrE,KAET,kBAAC8Y,GAAA,EAAD,CAAiBE,OAAQpd,EAAI6/C,eAAa,EAACz1B,WAAW,YAGxDpO,IAAgBA,EAAYnb,OAC9B,uBAAGwB,UAAU,aAAaG,IAAI,aAAaG,IAAI,QAC5CyY,EAAOva,OAAS,mCAAqC,0BAGxD,kBAACyc,GAAA,EAAD,CAAS9a,IAAI,gBCtDrB,MAAM8nB,GAAe3kB,YAAU4kB,GAAOA,IAAM,KAAO,GAkHpC1hB,mBAAK/H,YACjBC,IACC,MAAQypB,QAASsC,GAAoB/rB,EAAOgsB,aAAe,IACnDxS,KAAMoQ,GAAc5pB,EAAO6pB,OAC3BrQ,KAAMC,GAAczZ,EAAOuZ,OAC7B,cAAEK,GAAkB5Z,GAGxBqtB,MAAO5C,EADH,eAEJwB,EAFI,cAGJC,EAHI,aAIJC,GACEnsB,EAAO+pB,cACHN,QAAS4C,GAAkBH,GAAiB,IAC5CzC,QAAS8C,GAAiBJ,GAAgB,GAElD,MAAO,CACLvS,gBACAgQ,YACAnQ,YACAsS,kBACAtB,cACAs0B,YAAa9yB,GAAkBA,EAAe1S,MAC9C8S,gBACAE,iBAGJ,CAAC7rB,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,kBAAmB,yBA3BvDZ,CAhH4C,EAC9Dqd,YACAvE,WACAmmC,oBACAC,4BACAC,aACAl1B,UACApQ,gBACAgQ,YACAnQ,YACAsS,kBACAtB,cACAs0B,cACAxyB,eACAF,gBACAnC,kBACAi1B,2BAIA56C,YAAU,KACRglB,GAAa,KACXW,QAIJ,MAAMjpB,EAAOC,cAEb8X,YAAeH,EAAUmR,GAEzB,MAAM5O,EAAqBpa,YAAaqsB,IACtC8xB,EAAqB,CAAE9xB,WACtB,CAAC8xB,IAEE/b,EAAetgC,YAAQ,KAC3B,MAAM47C,EAAa3yB,EACfnR,aAAYmR,EAAgB1R,OAAQpb,GAAOA,IAAO2a,GAAgBH,GAClE,GAEJ,IAAKgR,EACH,OAAOi0B,EAGT,MAAMjxB,EAAkBixB,EAAWrkC,OAAQpb,IACzC,MAAM0C,EAAOioB,EAAU3qB,GACvB,IAAK0C,EACH,OAAO,EAET,MAAM+rB,EAAWC,aAAgBhsB,GACjC,OAAO+rB,GAAY3S,aAAY2S,EAAUjD,KAG3C,OAAO7P,aACLD,YAAO,IACF8S,KACClB,GAAgB,MAChBF,GAAiB,KAEvB5S,GACA,EACAulC,IAED,CACDjzB,EAAiBtS,EAAWgR,EAAa8B,EAAcF,EAAe2yB,EACtEplC,EAAegQ,IAGXw1B,EAAiBp+C,YAAY,MAC7Bg+C,EAAkBl/C,QAAUsd,KAC9B+hC,EAAqB,CAAE9xB,MAAO,KAC9B6xB,MAED,CAACF,EAAkBl/C,OAAQsd,EAAW+hC,EAAsBD,IAE/D,OACE,yBAAK59C,UAAU,kBACb,yBAAKA,UAAU,eACb,kBAAC2B,EAAA,EAAD,CACEC,OAAK,EACLnI,KAAK,UACLoI,MAAM,cACN5B,QAASyoB,EACT5mB,UAAU,uBAEV,uBAAG9B,UAAU,qBAEf,4BAAKL,EAAK,qBAEZ,yBAAKK,UAAU,wBACb,kBAAC,GAAD,CACE66C,QAAS/Y,EACT1B,YAAasd,EACbrd,YAAalX,EACb2xB,kBAAmBn7C,EAAK,iBACxBq7C,cAAc,0BACdrtB,UAAW8vB,EACXnd,oBAAqBqd,EACrBnd,eAAgB1mB,IAGlB,kBAAC,GAAD,CACE3O,QAASvD,QAAQ81C,EAAkBl/C,QAAUsd,GAC7C7b,QAAS69C,EACTh8C,UAAWga,EAAY,2BAA6B,0BAEpD,uBAAG9b,UAAU,2BC4CRwG,mBAAK/H,YACjBC,IACC,MACE8D,SAAUu7C,EACV5iC,MAAO6iC,GACLt/C,EAAOu/C,cAAgB,GAE3B,MAAO,CACLF,mBACAC,kBAGJ,CAAC5+C,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,kBAAmB,kBAbHZ,CA3J4C,EAC9Dqd,YACAvE,WACA2mC,YACAx1B,UACAq1B,mBACAC,gBACAG,kBACAC,oBAEA,MAAMz+C,EAAOC,cAEb8X,YAAeH,EAAUmR,GAEzB,MAAO9M,EAAOyiC,GAAYr7C,YAAS,KAC5Bs7C,EAAOC,GAAYv7C,YAAS,KAC5BkO,EAAOmpB,GAAYr3B,eACnBmY,EAAOif,GAAYp3B,cAMpB2qB,EAAYowB,IAAqBS,IAAqB7jB,WAEtD8jB,EAAoB/+C,YAAaiE,IACrC,MAAM,MAAEuC,GAAUvC,EAAEiG,cACd2vC,EAAWrzC,EAAMoa,QAAQ,OAAQ,IAEvC+9B,EAAS9E,GAELA,IAAarzC,IACfvC,EAAEiG,cAAc1D,MAAQqzC,IAEzB,IAEGx0B,EAA0BrlB,YAAaiE,IAC3C46C,EAAS56C,EAAEiG,cAAc1D,QACxB,IAEGw4C,EAAoBh/C,YAAY,KAC/Bkc,EAAMpd,OAKP0/C,EAAU1/C,OAhDgB,IAiD5B47B,EA1B0B,oDA8B5B+jB,EAAgB,CACdviC,QACA1K,QACAgtC,cAZA9jB,EAvBwB,8BAqCzB,CAACxe,EAAOsiC,EAAWC,EAAiBjtC,EArCX,4BAEE,qDAqCxBytC,EAAsBj/C,YAAY,KACjCkc,EAAMpd,OAKX4/C,EAAc,CACZxiC,QACA0iC,QACAptC,QACAgtC,cARA9jB,EAxC2B,iCAkD5B,CAACxe,EAAOwiC,EAAeE,EAAOptC,EAAOgtC,EAlDT,iCAoD/Bj7C,YAAU,KACJ86C,IAAqBS,IAAqB1jB,UAC5CpS,GAAQ,IAET,CAACq1B,EAAkBr1B,IAEtB,MAAMk2B,EAAgBZ,IA3DM,8BA4D1B7iC,GA3D6B,iCA2DIA,EAC7BA,OACA7Z,GAGN,OACE,yBAAKtB,UAAU,WACb,yBAAKA,UAAU,eACb,kBAAC2B,EAAA,EAAD,CACEC,OAAK,EACLnI,KAAK,UACLoI,MAAM,cACN5B,QAAS,IAAMyoB,IACf5mB,UAAU,8BAEV,uBAAG9B,UAAU,qBAEf,4BAAKL,EAAKmc,EAAY,aAAe,cAEvC,yBAAK9b,UAAU,wBACb,kBAACw7B,GAAA,EAAD,CACE1vB,SAAUuuB,EACVze,MAAOjc,EAAK,cAEd,kBAACua,GAAA,EAAD,CACEhU,MAAO0V,EACP9P,SAAU2yC,EACVx5B,MAAOtlB,EAAKmc,EAAY,mBAAqB,aAC7CX,MAxFoB,8BAwFbA,GAvFgB,iCAuFiBA,EAAmCA,OAAQ7Z,IAEpFwa,GACC,oCACE,kBAAC5B,GAAA,EAAD,CACEhU,MAAOo4C,EACPxyC,SAAUiZ,EACVE,MAAOtlB,EAAK,oCAEd,uBAAGK,UAAU,QAAQL,EAAK,qBAI7Bi/C,GACC,uBAAG5+C,UAAU,SAAS4+C,GAGvBV,EAAU1/C,OAAS,GAClB,oCACE,wBAAIwB,UAAU,wBAAwBL,EAAK,6BAA8Bu+C,EAAU1/C,OAAQ,MAE3F,yBAAKwB,UAAU,mCACZk+C,EAAUvjC,IAAKhd,GACd,kBAACid,GAAA,EAAD,CAAUolB,UAAQ,EAAChgC,UAAU,uBAC3B,kBAAC6a,GAAA,EAAD,CAAiBE,OAAQpd,SAQrC,kBAAC,GAAD,CACEwN,QAA0B,IAAjByQ,EAAMpd,OACfyB,QAAS6b,EAAY6iC,EAAsBD,EAC3C7yC,SAAU8hB,EACV7rB,UAAWga,EAAYnc,EAAK,8BAAgC,gBAE3DguB,EACC,kBAACne,EAAA,EAAD,CAAS3N,MAAM,UAEf,uBAAG7B,UAAU,0B,OCnKvB,MAAM6+C,GAAe5gD,OAAOgyB,KAAK6uB,KAAmBtgD,OAAS,EAsD9CgI,mBApDe,EAC5B+Q,WACAuE,aAAY,EACZ4U,UACAquB,kBACAr2B,cAEA,MAAOs2B,EAAkBC,GAAuBj8C,YAAmB,IAE7D86C,EAAiBp+C,YAAY,KACjCq/C,EAAgBjjC,EAAYgjC,IAAkBI,gBAAkBJ,IAAkBK,gBACjF,CAACrjC,EAAWijC,IAEf,OACE,kBAAClnC,EAAA,EAAD,CACEla,GAAG,UACHoa,KAAMolC,IACNpsB,YAAa8tB,GACb/mC,UAAW4Y,GAET0uB,IACA,OAAQ1uB,GACN,KAAKouB,IAAkBO,gBACvB,KAAKP,IAAkBQ,cACrB,OACE,kBAAC,GAAD,CACExjC,UAAWA,EACXvE,SAAUA,EACVmmC,kBAAmBsB,EACnBrB,0BAA2BsB,EAC3BrB,WAAYE,EACZp1B,QAASA,IAGf,KAAKo2B,IAAkBI,gBACvB,KAAKJ,IAAkBK,cACrB,OACE,kBAAC,GAAD,CACErjC,UAAWA,EACXvE,SAAU6nC,GAAgB7nC,EAC1B2mC,UAAWc,EACXt2B,QAASA,IAGf,QACE,Y,iBC5BGliB,mBAxBqB,EAAG+Q,WAAUmR,UAASq2B,sBACxD,MAAMp/C,EAAOC,cAIb,OAFA8X,YAAeH,EAAUmR,EAASq2B,EAAiBD,IAAkBS,UAGnE,yBAAKv/C,UAAU,iBACb,yBAAKA,UAAU,eACb,kBAAC2B,EAAA,EAAD,CACEC,OAAK,EACLnI,KAAK,UACLoI,MAAM,cACN5B,QAASyoB,EACT5mB,UAAU,uBAEV,uBAAG9B,UAAU,qBAEf,4BAAKL,EAAK,mBAEZ,kBAAC8vB,GAAA,EAAD,CAAU+vB,WAAW,WAAWC,YAAY,oBAAoBloC,SAAUA,OCpChF,MAAMmoC,GAAwC,CAC5CC,MAAM,EACNC,WAAW,EACXC,IAAI,EACJC,SAAS,EACT3oC,MAAM,EACN4oC,WAAW,EACX7oC,OAAO,EACP8oC,YAAY,EACZ,KAAK,EACLC,QAAQ,EACRC,UAAU,EACVC,KAAK,EACLC,MAAM,EACNC,KAAK,GAkBP,MAAMj2C,GAAkBzG,IACtBA,EAAEyG,kBAGJ,SAASk2C,GAA4B38C,GAC/B+7C,GAAa/7C,EAAExD,OApBrB,SAAmB8J,GACjB,KAAKA,GAAYA,aAAkBs2C,aAAc,OAAO,EACxD,MAAMxiD,EAAUkM,EACVu2C,EAAUziD,EAAQyiD,QAAQ5M,cAChC,GAAgB,aAAZ4M,EAAwB,OAAO,EACnC,GAAgB,UAAZA,EAAqB,OAAO,EAChC,MAAMx6C,EAAOjI,EAAQ0iD,aAAa,QAClC,QAAKz6C,GACc,CACjB,OAAQ,WAAY,SAAU,QAAS,MAAO,MAC9C,SAAU,OAAQ,WAAY,iBAAkB,OAAQ,QAAS,QAEjDkM,QAAQlM,EAAK4tC,gBAAkB,EAQrB8M,CAAU/8C,EAAEsG,SACtCG,GAAezG,GAIZ,SAASg9C,KAEdnmD,SAAS+I,iBAAiB,QAAS6G,GAAgB,CAAEw2C,SAAS,IAC9D1oD,OAAO2oD,YAAcz2C,GACrB5P,SAASsmD,UAAYR,GAGhB,SAASS,KACdvmD,SAASgJ,oBAAoB,QAAS4G,IAEtClS,OAAO2oD,YAAc,KAErBrmD,SAASsmD,UAAY,K,uBCmBvB,SAASE,GAAaC,GACpB,OAAIA,EACK,4BAEF,wB,8BCsEMC,OAhG0B,EACvCx/C,SACA1K,UACAmqD,SACAC,aACAC,gBACAC,WACAC,UACAC,SACAC,WACAn8B,YACAC,YACAm8B,aACAC,iBACAC,mBACAC,UACAC,cACAC,YACAC,UACAC,SACAC,QACAj+B,UACAljB,YACAylB,WACA27B,WACAC,gBACAC,kBACAv7B,WACAw7B,SACAC,eACAx7C,UACAy7C,sBACAC,iBAEA,MAAMC,ED1ED,SACL1rD,EAAqB2rD,EAA0BF,GAE/C,MAAMt9B,EAAwB,GACxBxiB,EAAOigD,YAAe5rD,GACtBka,EAAQC,YAAgBna,GACxBosC,EAAY/hC,YAAoBrK,EAAS,UACzC6rD,EAAmB3xC,GAASkyB,GAAa0f,KACzCC,EAAY7qD,OAAO8qD,eAezB,GAbIH,GACF19B,EAAQjF,KAAK,CACX+E,MAAO,yBACP2xB,QAAS,KACPqM,KAAkB7f,EAAW7vB,iBAAeC,SAASspB,KAAKomB,MAEtDP,GACFA,OAMJhgD,EAAM,CAER,MAAMs+C,EAAer5C,QACnBm7C,GACGA,EAAUI,YACVJ,EAAUI,WAAWC,YACpBL,EAAUI,WAAWC,WAA2B1lD,QAAQ,4BACD,KAAxDqlD,EAAUr0C,WAAW4R,QAAQ,kBAAmB,KAGrD6E,EAAQjF,KAAK,CACX+E,MAAO+7B,GAAaC,GACpBrK,QAAS,KACP,MAAMyM,EAAgBpC,GAAgB8B,EAAYA,EAAUr0C,WAAa/L,EACzE2gD,aAAoBD,GAEhBV,GACFA,OAmBR,OAbIF,GACFt9B,EAAQjF,KAAK,CACX+E,MAAO,gCACP2xB,QAAS,KACP6L,IAEIE,GACFA,OAMDx9B,ECeao+B,CAAsBvsD,EAAS+P,EAAS+6C,EAAcW,OAAanhD,GAEjFkiD,EAAoB9jD,YAAY,IAC7BlF,SAASmB,cAAe,+CAA8C3E,EAAQ2G,QACpF,CAAC3G,EAAQ2G,KAEN8lD,EAAiB/jD,YACrB,IAAMlF,SAASmB,cAAc,0BAC7B,IAGI+nD,EAAiBhkD,YACrB,IAAMlF,SAASmB,cAAc,+BAC7B,KAGI,UAAEuG,EAAF,UAAayhD,EAAb,MAAwB7oD,GAAU8oD,aACtCzC,EACAqC,EACAC,EACAC,EAxDoB,GA0DnBlpD,SAASmB,cAAc,iBAAiCmC,cAGrD6B,EAAOC,cAEb,OACE,kBAACikD,GAAA,EAAD,CACEniD,OAAQA,EACRQ,UAAWA,EACXyhD,UAAWA,EACX7oD,MAAOA,EACPkF,UAAU,2BACV+G,QAASA,EACTy7C,oBAAqBA,GAEpBpB,GAAc,kBAACj/C,EAAA,EAAD,CAAUC,KAAK,eAAenC,QAASqiD,GAAS3iD,EAAK,wBACnE0hD,GACC,kBAACl/C,EAAA,EAAD,CAAUC,KAAK,WAAWnC,QAASsiD,GAAe5iD,EAAK,4BAExD2hD,GAAY,kBAACn/C,EAAA,EAAD,CAAUC,KAAK,QAAQnC,QAAS+hD,GAAUriD,EAAK,UAC3D4hD,GAAW,kBAACp/C,EAAA,EAAD,CAAUC,KAAK,OAAOnC,QAASgiD,GAAStiD,EAAK,SACxDgiD,GACC,kBAACx/C,EAAA,EAAD,CAAUC,KAAK,WAAWnC,QAASmiD,GAAgBziD,EAAK,mBAEzDiiD,GACC,kBAACz/C,EAAA,EAAD,CAAUC,KAAK,WAAWnC,QAASoiD,GAAkB1iD,EAAK,iCAE3DkiD,GAAWa,EAAY/nC,IAAKwK,GAC3B,kBAAChjB,EAAA,EAAD,CAAUhC,IAAKglB,EAAQF,MAAO7iB,KAAK,OAAOnC,QAASklB,EAAQyxB,SAAUj3C,EAAKwlB,EAAQF,SAEnFu8B,GAAU,kBAACr/C,EAAA,EAAD,CAAUC,KAAK,MAAMnC,QAASiiD,GAAQviD,EAAK,cACrD8hD,GAAY,kBAACt/C,EAAA,EAAD,CAAUC,KAAK,QAAQnC,QAASgkB,GAAUtkB,EAAK,gBAC3D+hD,GAAc,kBAACv/C,EAAA,EAAD,CAAUC,KAAK,UAAUnC,QAASc,GAAYpB,EAAK,YACjEoiD,GAAa,kBAAC5/C,EAAA,EAAD,CAAUC,KAAK,SAASnC,QAAS6mB,GAAWnnB,EAAK,kBAC9D4lB,GAAa,kBAACpjB,EAAA,EAAD,CAAUC,KAAK,OAAOnC,QAASkiD,GAAWxiD,EAAK,2BAC5D2lB,GAAa,kBAACnjB,EAAA,EAAD,CAAU0kB,aAAW,EAACzkB,KAAK,SAASnC,QAASumB,GAAW7mB,EAAK,aCuJlE6G,mBAAK/H,YAClB,CAACC,GAAU1H,UAASquB,sBAClB,MAAM,SAAE5V,GAAawS,YAAyBvjB,IAAW,IACnD,UACJolD,EADI,SAEJxC,EAFI,OAGJE,EAHI,SAIJC,EAJI,UAKJn8B,EALI,UAMJC,EANI,QAOJg8B,EAPI,WAQJG,EARI,eASJC,EATI,iBAUJC,EAVI,QAWJC,EAXI,YAYJC,EAZI,UAaJC,GACGtyC,GAAY0S,YAA4BzjB,EAAQ1H,EAASyY,IAAc,GACtE0X,EAA+B,WAApB9B,EACX0+B,EAAkC,cAApB1+B,EAEpB,MAAO,CACLy+B,YACA1C,WAAY2C,EACZ1C,cAAe0C,EACfzC,UAAWn6B,IAAa48B,GAAezC,EACvCE,QAASuC,GAAevC,EACxBC,UAAWsC,GAAetC,EAC1Bn8B,YACAC,YACAg8B,SAAUp6B,GAAYo6B,EACtBG,YAAaqC,GAAerC,EAC5BC,gBAAiBoC,GAAepC,EAChCC,kBAAmBmC,GAAenC,EAClCC,UACAC,aAAciC,GAAejC,EAC7BC,cAGJ,CAAC3iD,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,kBACA,eACA,aACA,kBACA,cACA,gBACA,yBACA,wBACA,oBACA,oBAjDgBZ,CA9OoD,EACtEiD,SACA2jB,kBACAruB,UACA2rB,QACAw+B,SACAp6C,UACAy7C,sBACAsB,YACA1C,aACAC,gBACAC,WACAE,SACAC,WACAn8B,YACAC,YACAg8B,UACAG,aACAC,iBACAC,mBACAC,UACAC,cACAC,YACAiC,kBACAC,eACAvgC,aACA3S,kBACAmzC,cACAC,gBACAC,yBACAC,wBACAC,oBACAC,sBAEA,MAAM,qBAAEt7C,GAAyBE,YAAkBzH,EAAQ8gD,OAAqBlhD,GAAW,IACpFkjD,EAAYC,GAAiBzhD,aAAS,IACtC+iB,EAAmB2+B,GAAwB1hD,aAAS,IACpDmjB,EAAmBw+B,GAAwB3hD,aAAS,IACpD4hD,EAAgBC,GAAqB7hD,aAAS,IAC9C8hD,EAAgBC,EAAcC,GAAiB9+B,eAEhD0B,EAAeloB,YAAY,KAC/B+kD,GAAc,GACdC,GAAqB,IACpB,IAEG9/B,EAAellB,YAAY,KAC/B+kD,GAAc,GACdE,GAAqB,IACpB,IAEGM,EAAYvlD,YAAY,KAC5B+kD,GAAc,GACd19C,KACC,CAACA,IAEEkf,EAAmBvmB,YAAY,KACnCglD,GAAqB,GACrB39C,KACC,CAACA,IAEEsf,EAAmB3mB,YAAY,KACnCilD,GAAqB,GACrB59C,KACC,CAACA,IAEEm+C,EAAgBxlD,YAAY,KAChCmlD,GAAkB,GAClB99C,KACC,CAACA,IAEEo+C,EAAsBzlD,YAAY,KACtCslD,IACAj+C,KACC,CAACi+C,EAAej+C,IAEbq+C,GAAc1lD,YAAY,KAC9BskD,EAAgB,CAAEplD,UAAW5H,EAAQ2G,KACrCsnD,KACC,CAACjB,EAAiBhtD,EAAQ2G,GAAIsnD,IAE3BI,GAAa3lD,YAAY,KAC7BukD,EAAa,CAAErlD,UAAW5H,EAAQ2G,KAClCsnD,KACC,CAAChB,EAAcjtD,EAAQ2G,GAAIsnD,IAExBK,GAAY5lD,YAAY,KAC5B+kD,GAAc,GACdI,GAAkB,IACjB,IAEGU,GAAc7lD,YAAY,KAC9BgkB,EAAW,CAAE9kB,UAAW5H,EAAQ2G,GAAIimB,SAAS,IAC7CqhC,KACC,CAACvhC,EAAY1sB,EAAQ2G,GAAIsnD,IAEtBjvC,GAAgBtW,YAAY,KAEhC,GADAulD,IACItiC,GAASA,EAAMI,SAAU,CAC3B,MAAMhR,EAAa4Q,EAAMI,SAASpI,IAAI,EAAGhd,QAASA,GAClDoT,EAAgB,CAAEkF,WAAYjf,EAAQ2H,OAAQoT,oBAE9ChB,EAAgB,CAAEkF,WAAYjf,EAAQ2H,OAAQoT,WAAY,CAAC/a,EAAQ2G,OAEpE,CAACoT,EAAiB/Z,EAASiuD,EAAWtiC,IAEnC6iC,GAAoB9lD,YAAY,KACpCulD,IACAf,EAAY,CAAEvgB,QAAS3sC,EAAQ05B,QAAQiT,WACtC,CAACshB,EAAWjuD,EAAQ05B,QAAQiT,QAASugB,IAElCuB,GAAsB/lD,YAAY,KACtCulD,IACAd,EAAc,CAAExgB,QAAS3sC,EAAQ05B,QAAQiT,WACxC,CAACshB,EAAWjuD,EAAQ05B,QAAQiT,QAASwgB,IAElCuB,GAAsBhmD,YAAY,KACtC,MAAMimD,EAAShjC,GAASA,EAAMI,SAC1B,CACAnkB,UAAW5H,EAAQ2G,GACnBioD,gBAAiBjjC,EAAMI,SAASpI,IAAI,EAAGhd,QAASA,GAChDkoD,WAAW,GAEX,CAAEjnD,UAAW5H,EAAQ2G,GAAIkoD,WAAW,GAExCzB,EAAuBuB,GACvBV,KACC,CAACA,EAAWjuD,EAAQ2G,GAAIymD,EAAwBzhC,IAE7CmjC,GAA6BpmD,YAAY,KAC7C2kD,EAAsB,CAAE1lD,OAAQ3H,EAAQ2H,OAAQhB,GAAI3G,EAAQ2G,KAC5DsnD,KACC,CAACA,EAAWjuD,EAAQ2H,OAAQ3H,EAAQ2G,GAAI0mD,IAErC0B,GAAqBrmD,YAAY,KACrC+kD,GAAc,GACdM,KACC,CAACA,IAEEiB,GAA0BtmD,YAAae,IAC3C6jD,EAAkB,CAChB3lD,OAAQ3H,EAAQ2H,OAChBC,UAAW5H,EAAQ2G,GACnBsoD,YAAavsD,KAAKkI,MAAMnB,EAAK+f,UAAY,QAE1C,CAACxpB,EAAQ2H,OAAQ3H,EAAQ2G,GAAI2mD,IAE1B4B,GAAiBxmD,YAAY,KACjC6kD,EAAgB,CACd3lD,UAAW5H,EAAQ2G,GACnBgB,OAAQ3H,EAAQ2H,SAElBsmD,KACC,CAACA,EAAWV,EAAiBvtD,EAAQ2H,OAAQ3H,EAAQ2G,KAExDsF,YAAU,KACR09C,KAEOI,IACN,IAEH,MAAMoF,GAAmB3kD,YAAQ,KAAOmhB,EAAQA,EAAMI,SAAW,CAAC/rB,IAAU2jB,IAAI,EAAGhd,QAASA,GAAK,CAACglB,EAAO3rB,IAEzG,GAAI8sD,EAGF,YAFAmB,IAKF,MAAMmB,GAAmB,IAAI3oC,KAG7B,OAFA2oC,GAAiBxmC,YAAYwmC,GAAiBzoC,cAAgB,GAG5D,yBAAK3d,UAAW,CAAC,uBAAwBiJ,GAAsBgC,KAAK,MAClE,kBAAC,GAAD,CACEjU,QAASA,EACT0K,OAAQ8iD,EACRrD,OAAQA,EACRC,WAAYA,EACZC,cAAeA,EACfC,SAAUA,EACVh8B,UAAWA,EACXC,UAAWA,EACXi8B,OAAQA,EACRC,SAAUA,EACVF,QAASA,EACTG,WAAYA,EACZC,eAAgBA,EAChBC,iBAAkBA,EAClBC,QAASA,EACTC,YAAaA,EACbC,UAAWA,EACXC,QAASoD,GACTnD,OAAQoD,GACRnD,MAAOoD,GACPrhC,QAASshC,GACTxkD,UAAWiV,GACXwQ,SAAUoB,EACVu6B,SAAUv9B,EACVw9B,cAAeoD,GACfnD,gBAAiBoD,GACjB3+B,SAAU4+B,GACVpD,OAAQwD,GACRvD,aAAcwD,GACdh/C,QAASk+C,EACTxC,WAAYyD,KAEd,kBAAC,GAAD,CACExkD,OAAQqkB,EACR/D,WAAgC,cAApBqD,EACZte,QAASkf,EACTtD,MAAOA,EACP3rB,QAASA,IAEX,kBAAC,GAAD,CACE0K,OAAQykB,EACRpf,QAASsf,EACTtU,WAAYo0C,KAEd,kBAAC,GAAD,CACEzkD,OAAQkjD,EACRhmD,UAAW5H,EAAQ2G,GACnBgB,OAAQ3H,EAAQ2H,OAChBoI,QAASm+C,IAEX,kBAAC,GAAD,CACExjD,OAAQojD,EACRxmC,gBAAc,EACdJ,WAA2B,IAAflnB,EAAQyJ,KACpB0d,MAAOkoC,YAAcD,IACrBhoC,cAAY,EACZrX,QAASo+C,EACT1mC,SAAUunC,S,OC1KHx/C,mBAAK/H,YAClB,CAACC,GAAUmpC,kBACF,CAAE7E,WAAYsjB,aAAiB5nD,EAAQmpC,EAAY0e,gBAE5D,CAACnnD,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,eACA,mBACA,gBAPgBZ,CAlF+C,EACjEiD,SACAmmC,cACA7E,aACAj8B,UACAy/C,eACAC,mBACAC,kBAGA,MAAM3sC,EAAe9S,YAAuB,MACtCtH,EAAOC,eAGX0mC,QAASrD,GACPuD,aAAwB,CAAEC,QAAS1sB,EAAc4sC,WAjBzB,IAiB4DC,YAAallD,IAErGuB,YAAU,KACR,GAAIvB,EAAQ,CACV,MAAM,aAAE6kD,EAAF,qBAAgBM,GAAyBhf,EAC/C2e,EAAa,CAAED,eAAcM,2BAE9B,CAACnlD,EAAQmmC,EAAa2e,IAEzB,MAAMhc,EAAe9qC,YAAaikC,IAChCA,EAAU,IACLA,EACHmjB,qBAAqB,GAGvBJ,EAAY,CAAE/iB,YACd58B,KACC,CAACA,EAAS2/C,IAEPK,EAAoBrnD,YAAY,KACpC+mD,EAAiB,CAAEF,aAAc1e,EAAY0e,eAC7Cx/C,KACC,CAAC8gC,EAAY0e,aAAcx/C,EAAS0/C,IAEvC,OACE,kBAACpsC,GAAA,EAAD,CACEra,UAAU,kBACV0B,OAAQA,EACRqF,QAASA,EACTigD,gBAAc,EACdprC,MAAOonB,EAAaA,EAAWpnB,MAAQjc,EAAK,uBAE3CqjC,GAAcA,EAAW+B,SACxB,oCACE,yBAAKt6B,IAAKsP,EAAc/Z,UAAU,0BAC/BgjC,EAAW+B,SAASpqB,IAAKgpB,GACxB,kBAAC,GAAD,CACEA,QAASA,EACTlqC,KAAMwtD,KACNhkB,oBAAqBA,EACrBhjC,QAASuqC,EACTpd,SAAUuW,MAIhB,yBAAK3jC,UAAU,kBACb,kBAAC2B,EAAA,EAAD,CACElI,KAAK,UACLikC,OAAK,EACL77B,MAAOmhC,EAAW0E,cAAgB,SAAW,UAC7CznC,QAAS8mD,GAERpnD,EACCqjC,EAAW0E,cAAgB,iCAAmC,8BAC9D1E,EAAWlF,MACX,QAMR,kBAAC7iB,GAAA,EAAD,U,iBC0EOzU,mBAAK/H,YAClB,CAACC,GAAUC,aACT,MAAMyB,EAAOnB,YAAWP,EAAQC,GAChC,OAAKyB,GAAQA,EAAK8mD,aACT,GAGF,CACL9mD,OACAinB,QAASC,aAAkBlnB,EAAMmnB,aAAqB7oB,GAAS8oB,aAAuB9oB,IACtF84C,UAAWz4C,aAAcqB,EAAKzC,IAC9BwpD,cAAeC,YAAiBhnD,KAGpC,CAAChB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,uBACA,2BAhBgBZ,CAvImD,EACrEE,SACA+C,SACAy/C,SACArlC,YACAurC,eACAC,YACAC,UACAxF,YACAyF,WACApnD,OACAo3C,YACAnwB,UACA8/B,gBACAM,qBACAC,gBACA3gD,UACAy7C,sBACAmF,uBACAC,6BAEA,MAAOpD,EAAYC,GAAiBzhD,aAAS,IACtC+iB,EAAmB2+B,GAAwB1hD,aAAS,IACrD,EAAEqK,EAAF,EAAKC,GAAM6zC,EAEjBh4C,YAAkBzH,EAAQ8gD,OAAqBlhD,GAAW,GAE1D,MAAMsmB,EAAeloB,YAAY,KAC/B+kD,GAAc,GACdC,GAAqB,IACpB,IAEGO,EAAYvlD,YAAY,KAC5B+kD,GAAc,GACd19C,KACC,CAACA,IAEEkf,EAAmBvmB,YAAY,KACnCglD,GAAqB,GACrB39C,KACC,CAACA,IAEE8gD,EAAwBnoD,YAAY,KACxCioD,EAAqB,CAAEhpD,SAAQ0oB,SAAUA,IACzC49B,KACC,CAACtmD,EAAQsmD,EAAW59B,EAASsgC,IAE1BG,EAAkBpoD,YAAY,KAClC+nD,IACAxC,KACC,CAACA,EAAWwC,IAETM,EAAeroD,YAAY,KAC/BgoD,IACAzC,KACC,CAACA,EAAWyC,IAETM,EAAuBtoD,YAAY,KACvCkoD,IACA3C,KACC,CAACA,EAAW2C,IAEf3kD,YAAU,KACR09C,KAEOI,IACN,IAEH,MAAMphD,EAAOC,cAEb,OACE,kBAACqoD,GAAA,EAAD,KACE,yBAAKjoD,UAAU,uBACb,kBAAC6jD,GAAA,EAAD,CACEniD,OAAQ8iD,EACRtiD,UAAU,QACVpH,MAAQ,SAAQuS,YAAYC,OAC5BvG,QAASk+C,GAERljD,KAA2BslD,GAC1B,kBAACllD,EAAA,EAAD,CACEC,KAAM0Z,EAAY,UAAY,QAC9B7b,QAAS6nD,GAERnoD,EAAKmc,EAAY,YAAc,eAGnC/Z,KAA2BulD,GAC1B,kBAACnlD,EAAA,EAAD,CACEC,KAAK,SACLnC,QAAS8nD,GAERpoD,EAAK,WAGT4nD,GACC,kBAACplD,EAAA,EAAD,CACEC,KAAMilB,EAAU,SAAW,OAC3BpnB,QAAS4nD,GAERloD,EAAK0nB,EAAU,cAAgB,cAGnC06B,GACC,kBAAC5/C,EAAA,EAAD,CACEC,KAAK,SACLnC,QAAS+nD,GAERroD,EAAK,yBAGT6nD,GACC,kBAACrlD,EAAA,EAAD,CACE0kB,aAAW,EACXzkB,KAAK,SACLnC,QAAS2nB,GAERjoB,EAAK63C,EACF,SACC2P,EAAgB,0BAA6BrrC,EAAY,eAAiB,sBAIpF1b,GACC,kBAAC4nB,GAAA,EAAD,CACEtmB,OAAQqkB,EACRhf,QAASkf,EACT7lB,KAAMA,S,iBC7IlB,MAAM8nD,GAAwB9vB,YAAUlQ,GAAOA,IAAM,KAAK,GAsK3C1hB,mBAAK/H,YACjBC,IACC,MAAM0B,EAAOikB,YAAkB3lB,GAC/B,IAAK0B,EACH,MAAO,GAGT,MAAM,MAAE2rB,EAAF,QAASo8B,GAAYC,YAAwB1pD,IAAW,IACxD,WAAEqzC,EAAF,SAAcphC,GAAaw3C,GAAW,GAE5C,MAAO,CACL/nD,OACA2rB,QACAgmB,aACAphC,WACA03C,sBAAuBzgD,QAAQlJ,EAAOgjB,6BAG1C,CAACtiB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,0BACA,0BACA,eACA,uBACA,wBAvBgBZ,CApKuC,EACzD8Y,WACAnX,OACA2rB,QACAgmB,aACAphC,WACA03C,wBACAC,0BACAC,0BACA/oD,eACAgpD,uBACAC,0BAGA,MAAMl9C,EAAWtE,YAAyB,OACnCyhD,EAAcC,GAAmB3lD,YAAS,GAGjDC,YAAU,KACR,MAAM,eAAE2lD,GAAmB1wD,OAC3B,IAAK0wD,EACH,OAGF,MAAMC,EAASruD,SAASkB,eAAe,QACjC2H,EAAe,KACnB,MAAM,cAAE2jB,GAAkBxsB,SAC1B,GAAIwsB,GAAkBA,IAAkBzb,EAASrD,QAAU,CACzD,MAAM,QAAE4gD,EAAF,OAAWrxD,GAAWmxD,EAC5BC,EAAO/tD,MAAMR,UAAa,cAAawuD,OACvCD,EAAO/tD,MAAMrD,OAAYA,EAAF,KACvB+C,SAAS8sC,gBAAgBzpC,UAAYirD,OAErCD,EAAO/tD,MAAMR,UAAY,GACzBuuD,EAAO/tD,MAAMrD,OAAS,IAM1B,OAFAmxD,EAAerlD,iBAAiB,SAAUF,GAEnC,KACLulD,EAAeplD,oBAAoB,SAAUH,KAE9C,IAGHJ,YAAU,KACJ7C,GAAQuQ,GAAYA,EAASnS,QAC/BgB,EAAa,CAAEb,OAAQyB,EAAKzC,GAAIiB,UAAW+R,EAASA,EAASnS,OAAS,KACtEmqD,EAAgB,IAEhBA,GAAiB,IAElB,CAACvoD,EAAMZ,EAAcmR,IAGxB1N,YAAU,KACR8lD,MAAMC,KAAKxuD,SAAS+D,iBAAmC,UAAU6jC,QAAS6mB,IACxEA,EAAMp9C,SAAWjE,QAAQ2P,GAAY0xC,IAAU19C,EAASrD,WAG1D6gD,MAAMC,KAAKxuD,SAAS+D,iBAAiC,yBAAyB6jC,QAAS8mB,IACrFA,EAAIC,gBAAkB5xC,EAAW,QAAU,UAE5C,CAACA,IAGJtU,YAAU,KACHsU,GACHhM,EAASrD,QAASgR,QAEnB,CAAC3B,IAEJ1P,YAAgB,KACMrN,SAASmB,cAAgC,uBACjDud,QACX,CAACmvC,IAEJ,MAAMe,EAAiC1pD,YAAa2pD,IAClDf,EAAwB,CAAEv8B,MAAOs9B,IAE7BA,EAAS7qD,QACX0pD,GAAsBK,IAEvB,CAACA,EAAyBD,IAEvBgB,EAAW5pD,YAAY,KAC3B,GAAIU,GAAQuQ,EAAU,CACpB,MAAM44C,EAAgBb,EAAe,EACrClpD,EAAa,CAAEb,OAAQyB,EAAKzC,GAAIiB,UAAW+R,EAASA,EAASnS,OAAS,EAAI+qD,KAC1EZ,EAAgBY,KAEjB,CAACnpD,EAAMsoD,EAAclpD,EAAcmR,IAEhC64C,EAAa9pD,YAAY,KAC7B,GAAIU,GAAQuQ,EAAU,CACpB,MAAM44C,EAAgBb,EAAe,EACrClpD,EAAa,CAAEb,OAAQyB,EAAKzC,GAAIiB,UAAW+R,EAASA,EAASnS,OAAS,EAAI+qD,KAC1EZ,EAAgBY,KAEjB,CAACnpD,EAAMsoD,EAAclpD,EAAcmR,IAEtC,OACE,yBAAKhT,GAAG,eAAeqC,UAAWuX,EAAW,SAAW,IACtD,yBAAKvX,UAAU,UACb,kBAAC2B,EAAA,EAAD,CACElI,KAAK,UACLmI,OAAK,EACLC,MAAM,cACN5B,QAASuoD,GAET,uBAAGxoD,UAAU,qBAEf,kBAACypD,GAAA,EAAD,CACEh/C,IAAKc,EACLrF,MAAO6lB,EACPjgB,SAAUs9C,KAGd,yBAAKppD,UAAU,UACb,yBAAKA,UAAU,WACZ+rB,EACCpb,GAAYA,EAASnS,OAClB,GAAEkqD,EAAe,QAAQ3W,IACxBphC,IAAaA,EAASnS,OACxB,aAEA,GAGF,kBAACmD,EAAA,EAAD,CACEC,OAAK,EACLnI,KAAK,UACLoI,MAAM,cACN5B,QAAS,IAAMwoD,EAAoB,CAAEvqC,WAAYmoC,YAAc5oC,KAAKkB,SACpE7c,UAAU,2BAEV,uBAAG9B,UAAU,oBAInB,kBAAC2B,EAAA,EAAD,CACEC,OAAK,EACLnI,KAAK,UACLoI,MAAM,cACN5B,QAASqpD,EACTz9C,UAAW8E,IAAaA,EAASnS,QAAUkqD,IAAiB/3C,EAASnS,OAAS,GAE9E,uBAAGwB,UAAU,aAEf,kBAAC2B,EAAA,EAAD,CACEC,OAAK,EACLnI,KAAK,UACLoI,MAAM,cACN5B,QAASupD,EACT39C,UAAW8E,IAAaA,EAASnS,QAA2B,IAAjBkqD,GAE3C,uBAAG1oD,UAAU,oB,iDCnMR,SAAS0pD,GACtBluD,EACAmuD,EACAC,EAAS,EACTC,GAAU,EACVC,GAAsB,EACtBC,GAAe,GAEf,MAAMC,EAAaxuD,EAAUuuD,EAAe,aAAe,aACrDE,EAAaD,EAAaxuD,EAAUuuD,EAAe,cAAgB,gBACnEG,EAA4C,iBAAvBP,EACvBnuD,EAAU+C,iBAA8BorD,GACxCA,GACE,OAAEnrD,GAAW0rD,EACbC,EAA2B,GACjC,IAAIC,GAAU,EAEd,IAAK,IAAInqC,EAAI,EAAGA,EAAIzhB,EAAQyhB,IAAK,CAC/B,MAAMliB,EAAUmsD,EAAYjqC,GACtBoqC,EAAKtsD,EAAQgsD,EAAe,aAAe,aAC3CO,EAAKD,EAAKtsD,EAAQgsD,EAAe,cAAgB,gBAKvD,GAJkBD,EACdQ,GAAMN,EAAaJ,GAAUU,GAAML,EAAaL,EAChDS,GAAMJ,EAAaL,GAAUU,GAAMN,EAAaJ,EAGlDO,EAAejqC,KAAKD,GACpBmqC,GAAU,OACL,GAAIA,IAAYP,EACrB,MAIJ,MAAO,CAAEK,cAAaC,kBCzBTI,OARf,SAAwB/uD,EAAwBuC,EAAsBgsD,GAAe,GACnF,MAAMC,EAAaxuD,EAAUuuD,EAAe,aAAe,aACrDE,EAAaD,EAAaxuD,EAAUuuD,EAAe,cAAgB,gBACnEM,EAAKtsD,EAAQgsD,EAAe,aAAe,aAC3CO,EAAKD,EAAKtsD,EAAQgsD,EAAe,cAAgB,gBACvD,OAAOM,EAAKL,GAAcM,EAAKL,G,2BC6JlBzjD,mBA3GsB,EACnC9E,SACAqX,SACAhS,UACAyjD,mBACAliC,YACAmiC,0BAGA,MAAM1wC,EAAe9S,YAAuB,OACtC,aAAE8B,EAAF,qBAAgBE,GAAyBE,YAAkBzH,OAAQJ,OAAWA,GAAW,GAEzFopD,EAAmBhrD,YAAairD,IACpC,IAAKF,EACH,OAAQ,EAEV,MAAMnV,EAAemV,EAAqBjsD,OAC1C,OAAOosD,aAActV,EAAcqV,IAClC,CAACF,KAEGI,EAAsBC,GAA2B9nD,aAAU,GAE5D+nD,EAAiBrrD,YAAY,CAACwG,EAAevC,KACjDA,EAAEyG,iBACF0gD,EAAyBr0C,GAAWi0C,EAAiBj0C,EAAQvQ,KAC5D,CAAC4kD,EAAyBJ,IAEvBM,EAAmBtrD,YAAY,CAACqb,EAAgBkwC,GAAa,KACjE,MAAM5qD,EAAOioB,GAAaA,EAAUvN,GAC/B1a,GAILmqD,EAAiBnqD,EAAM4qD,IACtB,CAAC3iC,EAAWkiC,IAETU,EAAsBxrD,YAAaiE,IACvC,GAAI8mD,GAAuBA,EAAoBjsD,QAAUqsD,GAAwB,EAAG,CAClF,MAAMM,EAASV,EAAoBI,GAC/BM,IACFxnD,EAAEyG,iBACF4gD,EAAiBG,EAAOpwC,QAAQ,MAGnC,CAAC0vC,EAAqBI,EAAsBG,IAE/C/nD,YAAU,IAAOvB,EAAS4kB,aAAyB,CACjDG,MAAO1f,EACPqkD,KAAOznD,GAAqBonD,GAAgB,EAAGpnD,GAC/C0nD,OAAS1nD,GAAqBonD,EAAe,EAAGpnD,GAChDuf,QAASgoC,EACTI,MAAOJ,SACJ5pD,EAAY,CAACI,EAAQqF,EAASgkD,EAAgBG,IAEnDjoD,YAAU,KACJwnD,IAAwBA,EAAoBjsD,QAC9CuI,KAED,CAAC0jD,EAAqB1jD,IAEzB9D,YAAU,KACR6nD,EAAwB,IACvB,CAAC/xC,IAEJ9V,YAAU,MAhGZ,SAAwBwT,EAAesD,GACrC,MAAMve,EAAYue,EAAa7R,QAC/B,IAAK1M,GAAaib,EAAQ,EACxB,OAEF,MAAM,eAAE0zC,EAAF,YAAkBD,GAAgBR,GACtCluD,EACA,uBAVoB,GAYpB,GACA,GAEF,IAAK0uD,EAAY1rD,SAAW0rD,EAAYzzC,GACtC,OAEF,MAAM80C,EAAQpB,EAAe,GAC7B,IAAKA,EAAe9wD,SAASod,IACvBA,IAAU80C,IAAUhB,GAAe/uD,EAAW0uD,EAAYqB,IAAU,CACxE,MAAMC,EAAW/0C,EAAQ0zC,EAAeA,EAAe3rD,OAAS,GAAK,QAAU,MAC/EitD,aAAiBjwD,EAAW0uD,EAAYzzC,GAAQ+0C,EArB9B,KAmGlBE,CAAeb,EAAsB9wC,IACpC,CAAC8wC,IAEJ,MAAMc,EAAkBrgD,YACtBm/C,GAAuBA,EAAoBjsD,OACvCisD,OACAnpD,EACJyH,GAEI6iD,EAAsBnB,IAAwBA,EAAoBjsD,OACpEmtD,EACAlB,EAEJ,IAAK1hD,GAAiB6iD,IAAwBA,EAAoBptD,OAChE,OAGF,MAAMwB,EAAY0D,YAChB,gDACAuF,GAGF,OACE,yBAAKjJ,UAAWA,EAAWyK,IAAKsP,GAC7B6xC,GAAuBA,EAAoBjxC,IAAI,EAAGI,UAAUtE,IAC3D,kBAACmE,GAAA,EAAD,CACEza,IAAK4a,EACL/a,UAAU,kCACVC,QAAS,IAAM+qD,EAAiBjwC,GAChC9B,MAAO4xC,IAAyBp0C,GAEhC,kBAACoE,GAAA,EAAD,CACEE,OAAQA,EACRgN,WAAW,QACXN,cAAY,S,iBC0GTjhB,mBAtNuB,EACpCqlD,cACAC,UACAC,oBACAC,mBACA1zC,gBACAgQ,YACA2jC,eACA/Y,WACAgZ,gBACAC,kBACAC,iBACAC,oBACA/J,SACAgK,eACAC,cAGA,MAAMC,EAAiBvlD,YAAe,MAChCwlD,EAAkBnhD,YAAYugD,GAC9Ba,EAAuBb,EAAYrtD,OAASqtD,EAAcY,EAC1D/qD,EAASkG,QAAQikD,EAAYrtD,SAC5BmuD,EAAWC,EAAaC,GAAiB3mC,eAC1C4mC,EAAUJ,GAAwBA,EAAqBK,MAAOrgC,GAAMA,EAAEsgC,OACtErtD,EAAOC,eAEP,qBACJqtD,EADI,cACkBC,EADlB,oBAEJC,EAFI,cAEiBC,EAFjB,uBAGJC,GACEC,aACFvB,GAAqBrqD,EACrBoqD,EACAK,EACAoB,IACAvB,EACA1zC,EACAgQ,IAEI,mBACJklC,EADI,kBACgBC,EADhB,eACmCC,EADnC,YACmDC,GACrDC,aACFlsD,EACAoqD,EACAG,EACAsB,IACApB,EACAD,GAGFjpD,YAAU,IAAOvB,EAASwU,YAAsBq2C,QAAWjrD,EAAY,CAACI,EAAQ6qD,IAEhF,MAAMsB,EAAkBnuD,YAAY,KAC9BgC,GACF4gD,KAED,CAAC5gD,EAAQ4gD,IAsBNwL,EAAkBpuD,YAAaiE,IACnCA,EAAEyG,iBACFyiD,IAEA,MAAQkB,cAAc,MAAExiB,IAAY5nC,EAEpC,GAAI4nC,GAASA,EAAM/sC,OAAQ,CACzB,MAAMwvD,EAAWlB,EACb/D,MAAMC,KAAKzd,GAAOxyB,OAAQk1C,GACnBA,EAAKjoD,MAAQkoD,IAA+B70D,SAAS40D,EAAKjoD,OAEjE+iD,MAAMC,KAAKzd,GAEf+gB,EAAa0B,GAAU,KAExB,CAAClB,EAASR,EAAcO,IAW3B,IAAKH,EACH,OAGF,MAAMyB,EAAezB,EAAqBK,MAAOrgC,GAAMA,EAAE0hC,SAASz6C,WAAW,WACvE06C,EAAe3B,EAAqBK,MAAOrgC,GAAMA,EAAE0hC,SAASz6C,WAAW,WAE7E,IAAIiI,EAAQ,GAgCZ,OA9BEA,EAAQjc,EADNwuD,EACW,0BACJE,EACI,0BAEA,yBAJ2B3B,EAAqBluD,OAAQ,KA+BrE,kBAAC6b,GAAA,EAAD,CACE3Y,OAAQA,EACRqF,QAASwlD,EACTjyC,OA3BJ,WACE,GAAKoyC,EAIL,OACE,yBAAK1sD,UAAU,yBAAyBM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAChE,kBAACK,EAAA,EAAD,CAAQC,OAAK,EAACC,MAAM,cAAcpI,KAAK,UAAUqI,UAAU,qBAAqB7B,QAASssD,GACvF,uBAAGvsD,UAAU,gBAEf,yBAAKA,UAAU,eAAe4b,GAC9B,kBAACja,EAAA,EAAD,CACEE,MAAM,UACNpI,KAAK,UACLuG,UAAU,sBACVC,QAAS4tD,GAERluD,EAAK,UAUF2uD,GACRtuD,UAAY,oBAAkB2sD,EAAY,UAAY,KAEtD,yBACE3sD,UAAU,cACVuuD,YAAa3B,EACb4B,OAAQV,EACRW,WA3DN,SAAwB9qD,GACtBA,EAAEyG,iBACFzG,EAAEC,kBAEE4oD,EAAetkD,SACjBhQ,OAAOuN,aAAa+mD,EAAetkD,UAuDjCwmD,YAjGmB/qD,IACvB,MAAQgrD,cAAeC,EAAU3kD,OAAQ4kD,GAAelrD,EAGnDkrD,EAA8Bv2D,QAAQ,kBAAoBs2D,IAC7DpC,EAAetkD,QAAUhQ,OAAOiD,WAAW0xD,EAjEnB,MAqEtBgC,GAAeA,EAA2BnxD,QAAQ,8BAIlDkxD,GACFjrD,EAAEC,kBAGJipD,MAiFIiC,0BAAyBnvD,EAAK,4BAA6B,KAE1DmtD,EACC,yBAAK9sD,UAAU,+BACZ0sD,EAAqB/xC,IAAKo0C,GACzBA,EAAWX,SAASz6C,WAAW,UAC3B,yBAAK1W,IAAK8xD,EAAW5/C,QAASG,IAAI,KAClC,2BAAOrS,IAAK8xD,EAAW5/C,QAASzE,UAAQ,EAACG,OAAK,EAACD,MAAI,MAI3D,yBAAK5K,UAAU,kCACZ0sD,EAAqB/xC,IAAKo0C,GACzB,kBAACC,GAAA,EAAD,CACEj3C,KAAMg3C,EAAWE,SACjBC,UAAWC,aAAiBJ,EAAWE,SAAUF,EAAWX,UAC5DgB,YAAaL,EAAW7qB,eACxBzqC,KAAMs1D,EAAWt1D,KACjBw1B,SAAO,MAMf,yBAAKjvB,UAAU,8BACb,kBAAC,GAAD,CACE0B,OAAQurD,EACRlmD,QAASomD,EACTp0C,OAAQm0C,EACR1C,iBAAkB4C,EAClB3C,oBAAqB4C,EACrB/kC,UAAWA,IAEb,kBAAC,KAAD,CACE5mB,OAAQ8rD,EACR6B,OAAQ3B,EACR3mD,QAAS0mD,EACTva,SAAUA,EACVoc,cAAe3B,EACfvB,eAAgBA,EAChBC,kBAAmBA,IAErB,kBAACkD,GAAA,EAAD,CACE5xD,GAAG,qBACH6xD,wBAAsB,EACtBC,KAAM3D,EACN4D,gBAAiBnC,IACjBnzC,YAAaza,EAAK,WAClBgwD,SAAUxD,EACV7J,OAAQA,EACRsN,eAAgBluD,S,iBCkGb8E,mBA/TiB,EAAG9E,SAAQ4gD,SAAQiK,cAEjD,MAAMsD,EAAmB5oD,YAAyB,MAE5C6oD,EAAiB7oD,YAAuB,MAExC8oD,EAAc9oD,YAAuB,OAEpC+oD,EAAUC,GAAejtD,YAAiB,KAC1CmiB,EAAS+qC,GAAcltD,YAAmB,CAAC,MAC3CmtD,EAAaC,GAAkBptD,aAAS,IACxCqtD,EAAmBC,GAAwBttD,aAAS,IACpDutD,EAAYC,GAAiBxtD,aAAS,IACtCytD,EAAUC,GAAe1tD,eACzB2tD,EAAeC,GAAoB5tD,eACnC6tD,EAAWC,GAAgB9tD,aAAkB,GAE9CrD,EAAOC,cAEPmxD,EAAarxD,YAAa+K,IAC1B/I,GAAU+I,EAAIvC,SAChBuC,EAAIvC,QAAQ+Q,SAEb,CAACvX,IAEJuB,YAAU,IAAOvB,EAASwU,YAAsBq2C,QAAWjrD,EAAY,CAACI,EAAQ6qD,IAChFtpD,YAAU,KACHvB,IACHuuD,EAAY,IACZC,EAAW,CAAC,KACZE,GAAe,GACfE,GAAqB,GACrBE,GAAc,GACdE,EAAY,IACZE,EAAiB,IACjBE,GAAa,KAEd,CAACpvD,IAEJuB,YAAU,IAAM8tD,EAAWlB,GAAmB,CAACkB,EAAYrvD,IAE3DmG,YAAgB,KACd,MAAMmpD,EAAajB,EAAY7nD,QAE3B8oD,GAAcP,IAAaO,EAAWC,YACxCD,EAAWC,UAAYR,IAExB,CAACA,IAEJ,MAAMS,EAAexxD,YAAY,CAACyxD,EAAuB,MACvDjB,EAAW,IAAIiB,EAAY,KAC3Bv2D,sBAAsB,KACpB,MAAMw2D,EAAOtB,EAAe5nD,QACvBkpD,IAILA,EAAK12D,UAAUka,OAAO,YAAaw8C,EAAKC,aA/DtB,KAgElBD,EAAKE,SAAS,CAAE74D,IAAK24D,EAAKC,aAAcE,SAAU,eAEnD,IAEGC,EAAe9xD,YAAY,KAE/B,GADAoxD,GAAa,IACRpvD,EACH,OAGF,MAAM+vD,EAAkBzB,EAASh3B,OAAO0P,UAAU,EAvE1B,KAwElBgpB,EAAiBvsC,EAAQxK,IAAKg3C,GAAMA,EAAE34B,OAAO0P,UAAU,EAzEvC,MAyE8D3vB,OAAQ44C,GAAMA,EAAEnzD,QAEpG,IAAKizD,GAAmBC,EAAelzD,OAAS,EAY9C,OAXAyxD,EAAYwB,GACRC,EAAelzD,OACbkzD,EAAelzD,OAAS,EAC1B0yD,EAAaQ,GAEbxB,EAAWwB,GAGbR,SAEFJ,GAAa,GAIf,GAAIP,KAAgBI,IAAkBe,EAAe1nD,OAAO2mD,KAE1D,YADAG,GAAa,GAIf,MAOM79B,EAAsB,CAC1B2+B,QAAS,CACP5B,SAAUyB,EACVI,QAVYH,EACb/2C,IAAI,CAAChY,EAAM8T,KAAP,CACH9T,KAAMA,EAAKq2B,OACX8J,OAAQ9kB,OAAOvH,MACXuH,OAAOvH,KAAWk6C,GAAiB,CAAEmB,SAAS,UAO7C3B,GAAe,CAAE4B,UAAU,MAC5B1B,GAAqB,CAAE2B,gBAAgB,MACvCzB,GAAc,CAAE0B,MAAM,KAI9B,GAAI1B,EAAY,CACd,MAAM,KAAE5tD,EAAF,SAAQuvD,GAAczB,GAAY0B,aAAkB1B,EAAS/nB,UAAU,EA/GvD,OA+GoF,GAE1GzV,EAAQg/B,KAAO,CACbG,eAAgB,CAACzB,MACbhuD,GAAQ,CAAE8tD,SAAU9tD,MACpBuvD,GAAY,CAAEG,iBAAkBH,IAIxC5P,EAAOrvB,IACN,CACDvxB,EACAsuD,EACA7qC,EACAorC,EACAI,EACAR,EACAE,EACA/N,EACA4O,EACAT,IAGI6B,EAAe5yD,YAAY,CAAC+W,EAAe9T,KAC/C,MAAMwuD,EAAa,IAAIhsC,GACvBgsC,EAAW16C,GAAS9T,EAChBwuD,EAAWA,EAAW3yD,OAAS,GAAGw6B,OAAOx6B,QAAU2yD,EAAW3yD,OA5I5C,GA6IpB0yD,EAAaC,GAEbjB,EAAWiB,IAEZ,CAAChsC,EAAS+rC,IAEPqB,EAAe7yD,YAAa+W,IAChC,MAAM06C,EAAa,IAAIhsC,GACvBgsC,EAAWrwB,OAAOrqB,EAAO,GACzBy5C,EAAWiB,GACXv2D,sBAAsB,KACfk1D,EAAe5nD,SAIpB4nD,EAAe5nD,QAAQxN,UAAUka,OAAO,YAAak7C,EAAe5nD,QAAQmpD,aA7J1D,QA+JnB,CAAClsC,IAEEqtC,EAA4B9yD,YAAa65C,IAC7CqX,EAAiBrX,IAChB,CAACqX,IAEE6B,EAA0B/yD,YAAaiE,IAC3CysD,EAAezsD,EAAEsG,OAAOo3B,UACvB,IAEGqxB,EAA8BhzD,YAAaiE,IAC/C2sD,EAAqB3sD,EAAEsG,OAAOo3B,UAC7B,IAEGsxB,EAAuBjzD,YAAaiE,IACxC6sD,EAAc7sD,EAAEsG,OAAOo3B,UACtB,IAEGuxB,EAAiBlzD,YAAaiE,IAChB,KAAdA,EAAEkvD,SACJrB,KAED,CAACA,IAEEsB,EAAmBpzD,YAAY,KACnC,GAAImxD,IAAcb,EAASh3B,OAAOx6B,OAChC,OAAOmB,EAAK,8BAIb,CAACkxD,EAAWlxD,EAAMqwD,IAEf+C,EAAkBrzD,YAAa+W,IACnC,MAAMi7C,EAAiBvsC,EAAQxK,IAAKg3C,GAAMA,EAAE34B,QAAQjgB,OAAQ44C,GAAMA,EAAEnzD,QACpE,GAAIqyD,GAAaa,EAAelzD,OAAS,IAAM2mB,EAAQ1O,GAAOuiB,OAAOx6B,OACnE,OAAOmB,EAAK,6BAGb,CAACkxD,EAAWlxD,EAAMwlB,IAqBrB,SAAS6tC,IACP,OAAO7tC,EAAQxK,IAAI,CAACmoB,EAAQrsB,IAC1B,yBAAKzW,UAAU,kBACb,kBAACka,GAAA,EAAD,CACE+K,MAAOxO,IAAU0O,EAAQ3mB,OAAS,GA7NlB,KA6NuB2mB,EAAQ3mB,OAC3CmB,EAAK,cACLA,EAAK,wBACTwb,MAAO43C,EAAgBt8C,GACvBvQ,MAAO48B,EACPh3B,SAAWnI,GAAM2uD,EAAa77C,EAAO9S,EAAEiG,cAAc1D,OACrD+sD,WAAYL,IAEbn8C,IAAU0O,EAAQ3mB,OAAS,GAC1B,kBAACmD,EAAA,EAAD,CACE3B,UAAU,uBACV4B,OAAK,EACLC,MAAM,cACNpI,KAAK,UACLqI,UAAWnC,EAAK,UAChBM,QAAS,IAAMsyD,EAAa97C,IAE5B,uBAAGzW,UAAU,kBAoBvB,OACE,kBAACqa,GAAA,EAAD,CAAO3Y,OAAQA,EAAQqF,QAASwlD,EAASjyC,OA3DvC,yBAAKta,UAAU,0BACb,kBAAC2B,EAAA,EAAD,CAAQC,OAAK,EAACC,MAAM,cAAcpI,KAAK,UAAUqI,UAAU,uBAAuB7B,QAASssD,GACzF,uBAAGvsD,UAAU,gBAEf,yBAAKA,UAAU,eAAeL,EAAK,YACnC,kBAACgC,EAAA,EAAD,CACEE,MAAM,UACNpI,KAAK,UACLuG,UAAU,sBACVC,QAASuxD,GAER7xD,EAAK,YAgDqDK,UAAU,aACzE,kBAACka,GAAA,EAAD,CACEzP,IAAKolD,EACL5qC,MAAOtlB,EAAK,gBACZuG,MAAO8pD,EACP70C,MAAO23C,IACPhnD,SAAWnI,GAAMssD,EAAYtsD,EAAEiG,cAAc1D,OAC7C+sD,WAAYL,IAEd,yBAAK5yD,UAAU,oBAEf,yBAAKA,UAAU,6BAA6ByK,IAAKqlD,GAC/C,wBAAI9vD,UAAU,kBAAkBL,EAAK,gBAEpCkxD,GAvBP,WACE,MAAMa,EAAiBvsC,EAAQxK,IAAKg3C,GAAMA,EAAE34B,QAAQjgB,OAAQ44C,GAAMA,EAAEnzD,QAEpE,OAAO+xD,KAAgBI,IAAkBe,EAAe1nD,OAAO2mD,MAC7D,uBAAG3wD,UAAU,SAASL,EAAK,6BAmBXuzD,GACb3C,EACC,kBAACrrC,GAAA,EAAD,CACEnN,KAAK,gBACLoN,QA/BD6tC,IACJr4C,IAAI,CAACsK,EAAOxO,KAAR,CAAqBvQ,MAAO8X,OAAOvH,GAAQwO,QAAOkuC,OAAQ18C,IAAU0O,EAAQ3mB,OAAS,KA+BpFsN,SAAU0mD,IAGZQ,KAKJ,yBAAKhzD,UAAU,oBAEf,yBAAKA,UAAU,aACb,kBAACohC,GAAA,EAAD,CACEnc,MAAOtlB,EAAK,iBACZ0hC,QAAS8uB,EACTrkD,SAAU2mD,IAEZ,kBAACrxB,GAAA,EAAD,CACEnc,MAAOtlB,EAAK,gBACZ0hC,QAASgvB,EACTxkD,SAAU0kD,EACVzkD,SAAU4mD,IAEZ,kBAACtxB,GAAA,EAAD,CACEnc,MAAOtlB,EAAK,YACZ0hC,QAASkvB,EACT1kD,SAAUwkD,EACVvkD,SAAU6mD,IAEXpC,GACC,oCACE,wBAAIvwD,UAAU,kBAAkBL,EAAK,6BACrC,yBACE8K,IAAKslD,EACL/vD,UAAU,eACVmpD,iBAAe,EACf7oD,IAAI,OACJwL,SAAWnI,GAAM+sD,EAAY/sD,EAAEiG,cAAcqnD,aAE/C,yBAAKjxD,UAAU,QAAQL,EAAK,oCCjVxC,IAAIyzD,GAEW,SAASC,GACtB3xD,EAAiBqF,EAA6BusD,EAJrB,IAI4D1M,GAAa,GAElG,MAAM2M,EAAgBtsD,aAAO,GAE7BhE,YAAU,KACJmwD,KACF3tD,aAAa2tD,IACbA,QAAe9xD,IAGbI,GAAWyF,KAAiBy/C,IAC9BwM,GAAel7D,OAAOiD,WAAW,KAC1Bo4D,EAAcrrD,SACjBnB,KAEkB,EAAnBusD,KAEJ,CAAC1M,EAAYllD,EAAQ4xD,EAAkBvsD,IAqB1C,MAAO,CAnBkBrH,YAAY,KACnC6zD,EAAcrrD,SAAU,GACvB,IAEsBxI,YAAY,KACnC6zD,EAAcrrD,SAAU,EAEpBkrD,KACF3tD,aAAa2tD,IACbA,QAAe9xD,GAGjB8xD,GAAel7D,OAAOiD,WAAW,KAC1Bo4D,EAAcrrD,SACjBnB,KAEDusD,IACF,CAACA,EAAkBvsD,K,8BCbTP,mBAnBmB,EAAGo+B,QAAO3rB,QAAOhZ,cACjD,MAAM4nB,EAAcnoB,YAAaiE,IAE/BA,EAAEyG,iBAEFnK,EAAQ2kC,EAAM4uB,OAAQ5uB,EAAMjnC,KAC3B,CAACinC,EAAO3kC,IAEX,OACE,yBACED,UAAY,gBAAciZ,EAAQ,QAAU,IAC5ClN,YAAa8b,EACbjM,MAAQ,IAAGgpB,EAAM6uB,MAAM,OAEtBC,IAAqB9uB,EAAM4uB,OAAS,yBAAKv2D,IAAM,kBAAiB2nC,EAAM12B,YAAaoB,IAAI,GAAGqkD,QAAQ,YCmD1FntD,mBApDqB,EAClCotD,WAAUn9C,QAAOo9C,YAAW5wB,sBAAqBl6B,eAAcumD,oBAG/D,MAAM7kD,EAAMxD,YAAuB,MAEnC6sD,aAAerpD,EAAKw4B,GAEpB,MAAM,qBAAEh6B,GAAyBE,YAAkBJ,OAAczH,OAAWA,EAAW,QAEjF3B,EAAOC,cAEPm0D,EAAehyD,IACjBrI,KAAK2K,OAAO/M,IAAWC,MAAMH,MAzBF,GAyBhB,IA3BiB,EA6B1BK,EAAS,GAAAiC,KAAKs6D,KAAKJ,EAASvE,OAAO7wD,OAASu1D,GAElD,OACE,yBACEtpD,IAAKA,EACLtK,IAAKyzD,EAASj2D,GACdA,GAAK,kBAAiB8Y,EACtBzW,UAAU,cAEV,uBAAGA,UAAU,kBAAkBM,IAAI,QAChCX,EAAqB,WAAhBi0D,EAASj2D,GAAkB,iBAAoB,QAAO8Y,IAE9D,yBACEzW,UAAW0D,YAAe,uBAAwBuF,GAElDnO,MAAQ,WAAUrD,OAClB6I,IAAKX,EAAKiY,MAAQ,WAAQtW,GAEzByH,GAAgB6qD,EAASvE,OAAO10C,IAAK5C,IACpC,MAAM6sB,EAAQivB,EAAU97C,GAGlBk8C,EAAiB,OAAQrvB,EAAQA,EAAQA,EAAM,GAErD,OACE,kBAAC,GAAD,CACEzkC,IAAK8zD,EAAet2D,GACpBinC,MAAOqvB,EACPh0D,QAASqvD,U,OC7BvB,MAAM4E,GAA4C,CAChDC,OAAQ,cACRC,OAAQ,aACRC,OAAQ,eACRC,MAAO,YACPC,SAAU,aACVC,OAAQ,WACRC,QAAS,YACTC,QAAS,gBACTC,MAAO,aAUHC,GAAmC,GAEzC,IAAIC,GACAC,GACAC,GAuKWvuD,mBAAK/H,YACjBC,GAAuBY,YAAKZ,EAAQ,CAAC,iBADpBD,CArK2B,EAC7CuB,YAAWsvD,gBAAerD,mBAG1B,MAAMlyC,EAAe9S,YAAuB,MAEtC+tD,EAAY/tD,YAAuB,OAElCguD,EAAYC,GAAiBlyD,eAC7BqsD,EAAQ8F,GAAanyD,eACrBoyD,EAAqBC,GAA0BryD,YAAS,IAEvDsjC,QAASrD,GAAwBuD,aAAwB,CAC/DC,QAAS1sB,EACT4sC,WAtB0B,KAuBxB2O,IACFA,EAAQlzB,QAASmzB,IACf,MAAM,GAAE53D,GAAO43D,EAAMtrD,OACrB,IAAKtM,IAAOA,EAAGgW,WAAW,mBACxB,OAGF,MAAM8C,EAAQzM,OAAOrM,EAAG2iB,QAAQ,kBAAmB,KACnDs0C,GAAsBn+C,GAAS8+C,EAAMryB,iBAGvC,MAAMsyB,EAA0BZ,GAC7Bj6C,IAAI,CAACuoB,EAAgBzsB,KAAjB,CAA8BA,QAAOysB,oBACzCnqB,OAAO,EAAGmqB,oBAAqBA,GAE7BsyB,EAAwBh3D,QAI7B62D,EAAuBG,EAAwB97D,KAAK2K,MAAMmxD,EAAwBh3D,OAAS,IAAIiY,SAGjGwS,aAAoB+rC,EAAU9sD,SAAUnG,KAGxCkB,YAAU,KACR,IAAKgyD,EACH,OAGF,MAAM36C,EAAS06C,EAAU9sD,QACzB,IAAKoS,EACH,OAGF,MAAMm7C,EA3DkB,GA2DRL,EAA4C96C,EAAOoyB,YAAc,EAAIgpB,GAErFC,aAA2Br7C,EAAQm7C,IAClC,CAACR,EAAYG,IAEhB,MAAMz1D,EAAOC,cAEPg2D,EAAgBp0D,YAAQ,KAC5B,IAAKyzD,EACH,OAAO/oC,KAET,MAAM2pC,EAAkB,IAAIZ,GAS5B,OARIhJ,GAAgBA,EAAaztD,QAC/Bq3D,EAAgBC,QAAQ,CACtBn4D,GAAI,SACJoa,KAAMpY,EAAK,kBACX0vD,OAAQpD,IAIL4J,GACN,CAACZ,EAAYt1D,EAAMssD,IAGtBhpD,YAAU,KACR9H,WAAW,KACT,MAAM46D,EAAO,KACXb,EAAcH,GAAUE,YAExBE,EAAUJ,GAAU1F,SAGlB0F,GACFgB,IAuER9pB,iBACO4oB,KACHA,GAAmB,kCACnBC,UAAsBD,IAAkBmB,QAExCjB,GAAYkB,aAAgBnB,KAG9B,OAAOD,GA7EDqB,GACGp5B,KAAKi5B,IAnGa,MAsGxB,IAEH,MAAMI,EAAiBz2D,YAAa+W,IAClC4+C,EAAuB5+C,GACvB,MAAM2/C,EAAa57D,SAASkB,eAAgB,kBAAiB+a,GAC7Dg1C,aAAiB1xC,EAAa7R,QAAUkuD,EAAY,QAxGnC,GADU,MA0G1B,IAEGC,EAAoB32D,YAAY,CAACklC,EAAe7sB,KACpDu3C,EAAc1qB,EAAO7sB,IACpB,CAACu3C,IAEExhC,EAAoBC,aAAkB,GAAIuoC,KAmBhD,MAAMC,EAAqB7yD,YAAe,cAAe1D,GAEzD,OAAKqvD,GAAWvhC,EASd,yBAAK9tB,UAAWu2D,GACd,yBAAK9rD,IAAKuqD,EAAWh1D,UAAU,qBAAqBM,IAAKX,EAAKiY,MAAQ,MAAQ,IAC3Eg+C,EAAcj7C,KA9BrB,SAA8Bi5C,EAA6Bn9C,GACzD,MAAMrU,EAAO8xD,GAAkBN,EAASj2D,IAExC,OAAOyE,GACL,kBAACT,EAAA,EAAD,CACE3B,UAAY,sBAAoByW,IAAU2+C,EAAsB,YAAc,IAC9ExzD,OAAK,EACL40D,OAAK,EACL30D,MAAM,cACN5B,QAAS,IAAMk2D,EAAe1/C,GAC9B3U,UAAW8xD,EAAS77C,MAEpB,uBAAG/X,UAAWoC,SAoBhB,yBACEqI,IAAKsP,EACL/Z,UAAW0D,YAAe,gCAAiCyD,IAAe,eAAiB,kBAE1FyuD,EAAcj7C,IAAI,CAACi5C,EAAU3zC,IAC5B,kBAAC,GAAD,CACE2zC,SAAUA,EACVn9C,MAAOwJ,EACP4zC,UAAWxE,EACXpsB,oBAAqBA,EACrBl6B,aAAcqsD,GAAuBn1C,EAAI,GAAKm1C,GAAuBn1C,EAAI,EACzEqvC,cAAe+G,OAtBrB,yBAAKr2D,UAAWu2D,GACd,kBAACt7C,GAAA,EAAD,UCtKR,MACMw7C,GAAiB10D,IAA0B,EAAI,GAsDtCyE,mBAnDkB,EAC/Bw8B,aACA0zB,cACAjgD,QACAwsB,sBACAl6B,eACA4tD,kBACAC,sBAGA,MAAMnsD,EAAMxD,YAAuB,MAEnC6sD,aAAerpD,EAAKw4B,GAEpB,MAAM,qBAAEh6B,GAAyBE,YAAkBJ,OAAczH,OAAWA,EAAW,QAEjFu1D,EAAiB90D,IACnBrI,KAAK2K,OAAO/M,IAAWC,MAAMH,MAnBF,IAmBuC0/D,KAAsBL,KArB1D,EAuB5Bh/D,EAASiC,KAAKs6D,KAAKhxB,EAAWlF,MAAQ+4B,IAAmBC,KAAsBL,IAErF,OACE,yBACEhsD,IAAKA,EACLtK,IAAK6iC,EAAWrlC,GAChBA,GAAK,eAAc8Y,EACnBzW,UAAU,cAEV,uBAAGA,UAAU,mBAAmBgjC,EAAWpnB,OAC3C,yBACE5b,UAAW0D,YAAe,uBAAwBuF,GAElDnO,MAAQ,WAAUrD,QAEjBsR,GAAgBi6B,EAAW+B,UAAY/B,EAAW+B,SAASpqB,IAAKgpB,GAC/D,kBAAC,GAAD,CACExjC,IAAKwjC,EAAQhmC,GACbgmC,QAASA,EACTlqC,KAAMq9D,KACN7zB,oBAAqBA,EACrBW,WAAY8yB,EACZz2D,QAAS02D,EACTvpC,SAAUuW,EACVE,cAAiC,aAAlBb,EAAWrlC,GAAoBi5D,OAAkBt1D,S,OCpB5E,MAIMy1D,GAAqC,GAmO5BvwD,mBAAK/H,YACjBC,IACC,MAAM,SACJ6mC,EADI,MAEJH,EAFI,OAGJ+uB,EAHI,SAIJ6C,GACEt4D,EAAOqmC,SAEX,MAAO,CACLkyB,eAAgB9C,EAAOpvB,SACvBmyB,iBAAkBF,EAASjyB,SAC3BO,gBAAiBC,EACjB4xB,YAAa/xB,EAAMC,OACnBlB,WAAYzlC,EAAOoR,SAASC,MAAMk2B,qBAGtC,CAAC7mC,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,kBACA,qBACA,uBACA,oBACA,mBACA,kBAvBgBZ,CAjO6C,EAC/DuB,YACA02D,cACAU,kBACAH,iBACAC,mBACAC,cACA7xB,kBACAnB,aACAwyB,kBACAxwB,kBACAkxB,qBACAC,uBACAlxB,oBACAmxB,mBACApT,oBAGA,MAAMpqC,EAAe9S,YAAuB,MAEtC+tD,EAAY/tD,YAAuB,OAClCuwD,EAAgBC,GAAqBz0D,YAAiB,IAErDsjC,QAASrD,GAAwBuD,aAAwB,CAC/DC,QAAS1sB,EACT4sC,WA7BkC,KA8BhC2O,IACFA,EAAQlzB,QAASmzB,IACf,MAAM,GAAE53D,GAAO43D,EAAMtrD,OACrB,IAAKtM,IAAOA,EAAGgW,WAAW,gBACxB,OAGF,MAAM8C,EAAQzM,OAAOrM,EAAG2iB,QAAQ,eAAgB,KAChDy2C,GAAwBtgD,GAAS8+C,EAAMryB,iBAGzC,MAAMsyB,EAA0BuB,GAC7Bp8C,IAAI,CAACuoB,EAAgBzsB,KAAjB,CAA8BA,QAAOysB,oBACzCnqB,OAAO,EAAGmqB,oBAAqBA,GAE7BsyB,EAAwBh3D,QAI7Bi5D,EAAkBjC,EAAwB97D,KAAK2K,MAAMmxD,EAAwBh3D,OAAS,IAAIiY,UAEpF6vB,QAASC,GAAiCC,aAAwB,CAAEC,QAASuuB,IAE/Er1D,EAAOC,cAEP83D,EAAiB9vD,QAAQuvD,GAEzBQ,EAAUn2D,YAAQ,IACjB21D,EAIE,CACL,CACEx5D,GAAI,SACJie,MAAOjc,EAAK,kBACZolC,SAAUkyB,EACVn5B,MAAOm5B,EAAez4D,QAExB,CACEb,GAAI,WACJie,MAAOjc,EAAK,oBACZolC,SAAUmyB,EACVp5B,MAAOo5B,EAAiB14D,WAEvB24D,EAAYx8C,IAAKhd,GAAO2nC,EAAgB3nC,IAAKob,OAAOnR,UAhBhDskB,KAkBR,CAACirC,EAAax3D,EAAMs3D,EAAgBC,EAAkB5xB,IAEnDsyB,EAAkBp2D,YAAQ,IAC9Bk2D,GAC2E,IAAxEC,EAAQ5+C,OAAQ8+C,GAAQA,EAAI9yB,UAAY8yB,EAAI9yB,SAASvmC,QAAQA,OAC/D,CAACm5D,EAASD,IAEbz0D,YAAU,KACJyzD,IACFvwB,IACAkxB,IACAC,MAED,CAACZ,EAAaY,EAAsBD,EAAoBlxB,IAE3DljC,YAAU,KACJk0D,GAAeA,EAAY34D,QAC7B4nC,KAED,CAAC+wB,EAAa/wB,IAEjBnd,aAAoB+rC,EAAU9sD,SAG9BjF,YAAU,KACR,IAAKy0D,EACH,OAGF,MAAMp9C,EAAS06C,EAAU9sD,QACzB,IAAKoS,EACH,OAGF,MAAMm7C,EAhHkB,GAgHR+B,GAAwCl9C,EAAOoyB,YAAc,EAAIgpB,IAEjFC,aAA2Br7C,EAAQm7C,IAClC,CAACiC,EAAgBF,IAEpB,MAAMlR,EAAmB5mD,YAAa+W,IACpCghD,EAAkBhhD,GAClB,MAAMqhD,EAAet9D,SAASkB,eAAgB,eAAc+a,GAC5Dg1C,aAAiB1xC,EAAa7R,QAAU4vD,EAAc,aAASx2D,EAzHpC,MA0H1B,IAEGy2D,EAAsBr4D,YAAaikC,IACvCgzB,EAAgBhzB,GAChB4zB,EAAiB,CAAE5zB,aAClB,CAAC4zB,EAAkBZ,IAEhBqB,EAAsBt4D,YAAaikC,IACvCwgB,EAAc,CAAExgB,aACf,CAACwgB,IAEEr2B,EAAoBC,aAAkB,GAAIC,MAqDhD,MAAM2W,EAAgBjhC,YAAe,gBAAiB1D,GAEtD,OAAK03D,GAAmB5pC,IAAqB8pC,GAAoBR,EAe/D,yBAAKp3D,UAAW2kC,GACd,yBACEl6B,IAAKuqD,EACLh1D,UAAU,kDAET23D,EAAQh9C,KAzEf,SAAqBqoB,EAAgCvsB,GACnD,MAAMuuB,EAAehC,EAAW+B,UAAY/B,EAAW+B,SAAS,GAC1D/M,EAAkBt0B,YACtB,uCACA+S,IAAU+gD,GAAkB,aAG9B,MAAsB,WAAlBx0B,EAAWrlC,IAAqC,aAAlBqlC,EAAWrlC,IAAqBqlC,EAAWU,eAAiBsB,EAE1F,kBAACrjC,EAAA,EAAD,CACExB,IAAK6iC,EAAWrlC,GAChBqC,UAAWg4B,EACXl2B,UAAWkhC,EAAWpnB,MACtBha,OAAK,EACL40D,MAAyB,WAAlBxzB,EAAWrlC,IAAqC,aAAlBqlC,EAAWrlC,GAChDkE,MAAM,cACN5B,QAAS,IAAMqmD,EAAiB7vC,IAEb,WAAlBusB,EAAWrlC,GACV,uBAAGqC,UAAU,gBACO,aAAlBgjC,EAAWrlC,GACb,uBAAGqC,UAAU,kBACXgjC,EAAWoB,WACb,kBAAC,GAAD,CACEpB,WAAYA,EACZC,oBAAqBsD,IAGvB,kBAAC,GAAD,CACEvD,WAAYA,EACZC,oBAAqBsD,KAO3B,kBAAC,GAAD,CACEpmC,IAAK6iC,EAAWrlC,GAChBgmC,QAASqB,EACTvrC,KAAMspC,KACNnnB,MAAOonB,EAAWpnB,MAClB5b,UAAWg4B,EACXiL,oBAAqBsD,EACrBtmC,QAASqmD,EACTl5B,SAAU3W,QA8Bd,yBACEhM,IAAKsP,EACL/Z,UAAW0D,YAAe,kCAAmCyD,IAAe,eAAiB,kBAE5FwwD,EAAQh9C,IAAI,CAACqoB,EAAY/iB,IACxB,kBAAC,GAAD,CACE9f,IAAK6iC,EAAWrlC,GAChBqlC,WAAYA,EACZ0zB,YAAa9uD,QAAQu8B,GAAcuyB,GACnCjgD,MAAOwJ,EACPgjB,oBAAqBA,EACrBl6B,aAAcyuD,GAAkBv3C,EAAI,GAAKu3C,GAAkBv3C,EAAI,EAC/D02C,gBAAiBoB,EACjBnB,gBAAiBoB,OAjCvB,yBAAKh4D,UAAW2kC,GACZyyB,EAEEQ,EACF,yBAAK53D,UAAU,mBAAf,+BAEA,kBAACib,GAAA,EAAD,MAJA,yBAAKjb,UAAU,mBAAf,qD,wNC5IKwG,mBA7EiB,EAC9ByxD,MAAKh1B,sBAAqB2jB,aAAY3mD,cAGtC,MAAMwK,EAAMxD,YAAuB,MAE7BD,EAAWC,YAAyB,MAEpCy8B,EAAeu0B,EAAIj0B,aAAei0B,EAAIj0B,UAAUC,QAChDH,EAAkB,MAAKm0B,EAAIt6D,GAE3B+4D,EADiBvzB,aAAkB14B,EAAKw4B,KACP2jB,EACjC1iB,EAAiB5wB,YAAYwwB,EAAF,WAA4B4yB,EAAanjD,iBAAeC,SACnFw2B,EAAWC,aAAcguB,EAAIj0B,WAAai0B,EAAIj0B,UAAUC,QAASr8B,QAAQs8B,IACzEg0B,EAAY5kD,YAASwwB,GAAiB4yB,EAAanjD,iBAAeC,SAClE2kD,EAAoBvwD,QAAQ8uD,GAAewB,IAC3C,qBAAEjvD,GAAyBu6B,aAAsBE,GAAgBQ,GAAkBg0B,EAAW,SAC9F,WAAEtvD,EAAF,kBAAcC,GAAsBC,aAAa,GACjDE,EAAsB0tD,IAAgB9tD,EAE5CY,YAAgBxC,EAAU,CAACmxD,IAE3B,MAAMtwC,EAAcnoB,YAClB,IAAMO,EAAQ,IACTg4D,EACH9oD,QAAS+oD,IAEX,CAACj4D,EAASg4D,EAAKC,IAGXl4D,EAAY0D,YAChB,YACAu0D,EAAI7gE,OAAS6gE,EAAIxgE,QAAUwgE,EAAI7gE,MAAQ6gE,EAAIxgE,OAAS,WAAa,aACjEwR,EACA66B,GAGF,OACE,yBACEr5B,IAAKA,EACLzK,UAAWA,EACXC,QAAS4nB,GAER6b,GACC,4BACEj5B,IAAKu/B,EACLhqC,UAAU,eAGZ0jC,GAAgBQ,GAChB,yBACEjnC,IAAKinC,EACL50B,IAAI,GACJtP,UAAU,eAGZm4D,GAAqBj0B,IACrB,8BACEz5B,IAAKzD,EACL0D,UAAQ,EACRE,MAAI,EACJC,OAAK,EACLF,aAAW,EACXytD,QAAQ,QAEJvvD,GAEJ,4BAAQ5L,IAAKi7D,KAGhBlvD,GACC,kBAACwG,EAAA,EAAD,CAAS3N,MAAOqiC,GAAkBR,EAAe,QAAU,a,OCZpDl9B,mBAAK/H,YACjBC,IACQ,CACL25D,UAAW35D,EAAO45D,KAAKC,MAAMD,OAGjC,CAACl5D,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,kBANpCZ,CAjDyC,EAC3DuB,YACA02D,cACA8B,cACAH,YACAI,cACAC,oBAGA,MAAM3+C,EAAe9S,YAAuB,OAG1Cq/B,QAASrD,GACPuD,aAAwB,CAAEC,QAAS1sB,EAAc4+C,WAfzB,MAiB5B11D,YAAU,KACJyzD,GACFgC,KAED,CAAChC,EAAagC,IAEjB,MAAM5qC,EAAoBC,aAAkB,GAAIC,MAEhD,OACE,yBACEvjB,IAAKsP,EACL/Z,UAAW0D,YAAe,YAAa1D,EAAWmH,IAAe,eAAiB,kBAEhFqxD,EAEE1qC,GAAqBuqC,GAAaA,EAAU75D,OAC9C65D,EAAU19C,IAAKs9C,GACb,kBAAC,GAAD,CACE93D,IAAK83D,EAAIt6D,GACTs6D,IAAKA,EACLh1B,oBAAqBA,EACrB2jB,YAAa8P,EACbz2D,QAASw4D,KAGX3qC,GAAqBuqC,EACvB,yBAAKr4D,UAAU,mBAAf,kBAEA,kBAACib,GAAA,EAAD,MAdA,yBAAKjb,UAAU,mBAAf,iDCnDD,IAAK44D,I,SAAAA,O,iBAAAA,I,uBAAAA,I,gBAAAA,Q,KAQL,MAAMC,GAAyB56D,OAAOu0B,OAAOomC,IACjD7/C,OAAQ7S,GAA4C,iBAAVA,GAEvC4yD,GAAwB,CAC5B,CAACF,GAAeG,OAAQ,aACxB,CAACH,GAAeI,UAAW,gBAC3B,CAACJ,GAAeK,MAAO,aAkEVzyD,mBA/DwB,EACrC6pB,YAAWS,cAAaooC,iBAAgBC,mBAExC,MAAMx5D,EAAOC,cAEb,SAASw5D,EAAgB3oC,GACvB,OACE,kBAAC9uB,EAAA,EAAD,CACE3B,UAAY,sBAAoBqwB,IAAcI,EAAM,YAAc,IAClExwB,QAAS,IAAM6wB,EAAYL,GAC3B3uB,UAAW+2D,GAAuBpoC,GAClC7uB,OAAK,EACL40D,OAAK,EACL30D,MAAM,eAEN,uBAAG7B,UAAW84D,GAAsBroC,MAK1C,MAAM4oC,EAAmB35D,YAAY,KACnCy5D,EAAa9oC,IAAcuoC,GAAeI,SAAW,WAAa,SACjE,CAAC3oC,EAAW8oC,IAMf,OACE,yBAAKn5D,UAAU,oBAAoBC,QALrC,SAAyBigC,GACvBA,EAAMt8B,mBAIuDtD,IAAKX,EAAKiY,MAAQ,WAAQtW,GACpF+uB,IAAcuoC,GAAeG,OAC5B,kBAACp3D,EAAA,EAAD,CACE3B,UAAU,uBACV8B,UAAWuuB,IAAcuoC,GAAeI,SAAW,kBAAoB,cACvEp3D,OAAK,EACL40D,OAAK,EACL30D,MAAM,cACN5B,QAASo5D,GAET,uBAAGr5D,UAAU,iBAIhBo5D,EAAgBR,GAAeG,OAC/BK,EAAgBR,GAAeI,UAC/BI,EAAgBR,GAAeK,MAE/B5oC,IAAcuoC,GAAeG,OAC5B,kBAACp3D,EAAA,EAAD,CACE3B,UAAU,uBACVC,QAASi5D,EACTp3D,UAAU,gBACVF,OAAK,EACL40D,OAAK,EACL30D,MAAM,eAEN,uBAAG7B,UAAU,yB,OCzCvB,IAAIs5D,IAAc,EAmLH9yD,mBAAK/H,YACjBC,IACQ,CACL66D,kBAAmB76D,EAAO66D,oBAHZ96D,CAjL0B,EAC5CiD,SAAQ83D,2BAA0BD,oBAClC/7B,SAAQz2B,UACRuoD,gBAAeqH,kBAAiB8B,cAChCS,iBAAgBC,eAAc/M,qBAE9B,MAAO/7B,EAAWC,GAAgBttB,YAAiB,IAC5CipD,EAAcwN,GAAmBz2D,YAAmB,KAEpD02D,EAAkBC,GAAoBtG,GAAe3xD,EAAQqF,OAASzF,EAAWS,MAClF,aAAEgH,EAAF,qBAAgBE,GAAyBE,YAAkBzH,EAAQqF,GAAS,GAAO,IAEpFuyD,IAAe53D,IAClB43D,IAAc,GAGhBr2D,YAAU,KACRu6B,KACC,CAACA,IAEJ31B,YAAgB,KACd,GAAK9F,IASL,OALIL,IACFlH,SAASC,KAAKC,UAAUC,IAAI,iCAC5BH,SAASC,KAAKC,UAAUC,IAAI,wBAGvB,KACD+G,GACFk4D,YAAQ,KACNp/D,SAASC,KAAKC,UAAUO,OAAO,uBAC/BE,WAAW,KACTX,SAASC,KAAKC,UAAUO,OAAO,kCAxDhB,SA6DtB,CAACyG,IAEJ,MAAMm4D,EAAkB5yD,YAAOglD,GAC/B4N,EAAgB3xD,QAAU+jD,EAC1BhpD,YAAU,KACH42D,EAAgB3xD,QAAQ1J,SAI7Bq7D,EAAgB3xD,QAAQk6B,QAASrqB,IAC/Bq0C,EAAe,CAAExnB,MAAO7sB,MAG1B0hD,EAAgB,MACf,CAAC/3D,EAAQ2uB,EAAW+7B,IAEvB,MAAMiK,EAAoB32D,YAAY,CAACklC,EAAe7sB,KACpD0hD,EAAiBpK,GACR,IAAIA,EAAQt3C,IAGrBu3C,EAAc1qB,IACb,CAAC0qB,IAEEvH,EAAeroD,YAAasG,IAChCe,IACAoyD,EAAanzD,IACZ,CAACe,EAASoyD,IAEPx5D,EAAOC,eAEP,gBAAEw3D,EAAF,YAAmBoB,GAAgBgB,EAEzC,SAASM,EAAcviD,EAAmBqlC,GACxC,OAAQvsB,GACN,KAAKuoC,GAAeG,MAClB,OACE,kBAAC,GAAD,CACE/4D,UAAU,aACVsvD,cAAe+G,IAGrB,KAAKuC,GAAeI,SAClB,OACE,kBAAC,GAAD,CACEh5D,UAAU,aACV02D,cAAaU,IAAkB11D,IAAW6V,GAAYqlC,IACtDwa,gBAAiBA,EACjBT,gBAAiBA,IAGvB,KAAKiC,GAAeK,KAClB,OACE,kBAAC,GAAD,CACEj5D,UAAU,aACV02D,cAAa8B,IAAc92D,IAAW6V,GAAYqlC,IAClD4b,YAAaA,EACbC,YAAaA,KAYvB,MAAM/nC,EACJ,oCACE,yBAAK1wB,UAAU,kBAAkBC,QANrC,SAAyBigC,GACvBA,EAAMt8B,oBAMD01D,IACC,kBAACzhD,EAAA,EAAD,CAAYE,KAAK,QAAQD,UAAWuY,EAAWU,YAAa8nC,GAAuBr6D,QAChFs7D,IAIN/3D,KACC,kBAACJ,EAAA,EAAD,CACEC,OAAK,EACL40D,OAAK,EACL30D,MAAM,cACNC,UAAWnC,EAAK,SAChBK,UAAU,sBACVvG,KAAK,OACLwG,QAAS8G,GAET,uBAAG/G,UAAU,gBAGjB,kBAAC,GAAD,CACEqwB,UAAWA,EACXS,YAAaR,EACb4oC,eAAgBA,EAChBC,aAAcpR,KAKpB,GAAIhmD,IAAyB,CAC3B,IAAKgH,EACH,OAGF,MAAM/I,EAAY0D,YAChB,yBACAuF,GACCswD,GAAqB,sBAGxB,OACE,kBAACtR,GAAA,EAAD,KACE,yBAAKjoD,UAAWA,GACb0wB,IAMT,OACE,kBAACmzB,GAAA,EAAD,CACEniD,OAAQA,EACRQ,UAAU,OACVyhD,UAAU,SACV58C,QAASA,EACT/G,UAAU,aACVwiD,oBAAqBz7C,EACrBgzD,aAAe5yD,SAAkC7F,EAAnBo4D,EAC9BM,aAAe7yD,SAAkC7F,EAAnBq4D,EAC9BM,mBAAoB9yD,KAEnBupB,M,OCtIQlqB,mBA/DkB,EAC/B9E,SAAQ83D,2BAA0BU,eAAcC,eAAcpzD,cAE9D,MAAO2yD,EAAkBC,GAAoBtG,GAAe3xD,EAAQqF,GAE9DukC,EAAmB5rC,YAAY,CAACiE,EAAUmpD,KAC9C,MAAM,MAAEvhB,GAAU5nC,EAAEsG,OAEhBshC,GAASA,EAAM/sC,OAAS,GAC1B07D,EAAanR,MAAMC,KAAKzd,GAAQuhB,IAEjC,CAACoN,IAEEE,EAAoB16D,YAAY,KACpCqoC,GACEmmB,IACCvqD,GAAM2nC,EAAiB3nC,GAAG,KAE5B,CAAC2nC,IAEE+uB,EAAuB36D,YAAY,KACvCqoC,GAAsB,IAAMpkC,GAAM2nC,EAAiB3nC,GAAG,KACrD,CAAC2nC,IAEE3rC,EAAOC,eAEP,eAAE06D,EAAF,eAAkBC,GAAmBf,EAE3C,OACE,kBAAC3V,GAAA,EAAD,CACEniD,OAAQA,EACR84D,WAAS,EACTt4D,UAAU,QACVyhD,UAAU,SACV58C,QAASA,EACT/G,UAAU,mBACVwiD,oBAAqBz7C,EACrBgzD,aAAe5yD,SAAkC7F,EAAnBo4D,EAC9BM,aAAe7yD,SAAkC7F,EAAnBq4D,EAC9BM,mBAAoB9yD,MAMlBmzD,GACA,kBAACn4D,EAAA,EAAD,CAAUnC,UAAU,iBAAiB6L,UAAQ,GAA7C,uDAEDyuD,GACC,oCACE,kBAACn4D,EAAA,EAAD,CAAUC,KAAK,QAAQnC,QAASm6D,GAC7Bz6D,EAAK,gCAER,kBAACwC,EAAA,EAAD,CAAUC,KAAK,WAAWnC,QAASo6D,GAAuB16D,EAAK,oBAGlE46D,GACC,kBAACp4D,EAAA,EAAD,CAAUC,KAAK,OAAOnC,QAASk6D,GAAex6D,EAAK,Y,OCa5C6G,mBAAK/H,YACjBC,IACC,MAAM,SAAEqmC,GAAarmC,EAAOqmC,SAAS01B,SAErC,MAAO,CAAE11B,aAEX,CAAC3lC,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,0BANpCZ,CAzD8C,EAChEiD,SACAi1D,kBACA5xB,WACA21B,4BAGA,MAAM3gD,EAAe9S,YAAuB,OACtC,aAAE8B,EAAF,qBAAgBE,GAAyBE,YAAkBzH,OAAQJ,OAAWA,GAAW,GACzFq5D,EAAervD,YAAYy5B,GAAU,GACrC61B,EAAoB71B,GAAY41B,GAGpCr0B,QAASrD,GACPuD,aAAwB,CAAEC,QAAS1sB,EAAc4sC,WAhBzB,MAkB5B1jD,YAAU,IAAOvB,EAASwU,YAAsBwkD,QAAyBp5D,EAAY,CAACI,EAAQg5D,IAE9F,MAQM16D,EAAY0D,YAChB,gDACAuF,IACE2xD,GAAqBA,EAAkBp8D,SAAW,UAGtD,OACE,yBACEiM,IAAKsP,EACL/Z,UAAWA,EACX+5D,aAAe5yD,SAAkC7F,EAlB5B,KACvB9G,SAASC,KAAKC,UAAUC,IAAI,cAkB1Bq/D,aAAe7yD,SAAkC7F,EAf5B,KACvB9G,SAASC,KAAKC,UAAUO,OAAO,eAgB5B8N,GAAgB6xD,EACfA,EAAkBjgD,IAAKgpB,GACrB,kBAAC,GAAD,CACExjC,IAAKwjC,EAAQhmC,GACbgmC,QAASA,EACTlqC,KAAMq9D,KACN7zB,oBAAqBA,EACrBhjC,QAAS02D,EACTvpC,SAAUuW,KAGZ56B,EACF,kBAACkS,GAAA,EAAD,WACE3Z,M,OClBKkF,mBAAK/H,YAClB,CAACC,GAAUE,gBACT,MAAM,OAAED,GAAWsjB,YAAyBvjB,IAAW,GACvD,OAAKC,EAIE,CAAE3H,QAASkI,YAAkBR,EAAQC,EAAQC,IAH3C,IAKX,CAACQ,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,sBAVgBZ,CAzC+C,EACjEiD,SAAQ1K,UAAS+P,UAAS8zD,wBAE1B,MAAOnB,EAAkBC,GAAoBtG,GAAe3xD,EAAQqF,GAEpE,GAAK/P,GAAYA,EAAQ8jE,gBAIzB,OACE,kBAACjX,GAAA,EAAD,CACEniD,OAAQA,EACR84D,WAAS,EACTt4D,UAAU,QACVyhD,UAAU,SACV58C,QAASA,EACT/G,UAAU,eACVwiD,oBAAqBz7C,EACrBgzD,aAAe5yD,SAAkC7F,EAAnBo4D,EAC9BM,aAAe7yD,SAAkC7F,EAAnBq4D,EAC9BM,mBAAoB9yD,KAEpB,yBAAKnH,UAAU,WACZhJ,EAAQ8jE,gBAAgBngD,IAAKogD,GAC5B,yBAAK/6D,UAAU,OACZ+6D,EAAIpgD,IAAKqgD,GACR,kBAACr5D,EAAA,EAAD,CACEyE,QAAM,EACNyF,SAA0B,kBAAhBmvD,EAAOh1D,KACjB/F,QAAS,IAAM46D,EAAkB,CAAEG,YAElCA,EAAOr4D,c,OCdT6D,mBA1BsB,EACnC9E,SAAQu5D,eAAcC,iBAAgBn0D,UAASy7C,0BAE/C,MAAOkX,EAAkBC,GAAoBtG,GAAe3xD,EAAQqF,GAE9DpH,EAAOC,cAEb,OACE,kBAACikD,GAAA,EAAD,CACEniD,OAAQA,EACR84D,WAAS,EACTt4D,UAAU,QACVyhD,UAAU,SACV3jD,UAAU,iBACV+G,QAASA,EACTy7C,oBAAqBA,EACrBuX,aAAe5yD,SAAkC7F,EAAnBo4D,EAC9BM,aAAe7yD,SAAkC7F,EAAnBq4D,EAC9BM,mBAAoB9yD,KAEnB8zD,GAAgB,kBAAC94D,EAAA,EAAD,CAAUC,KAAK,OAAOnC,QAASg7D,GAAet7D,EAAK,qBACnEu7D,GAAkB,kBAAC/4D,EAAA,EAAD,CAAUC,KAAK,WAAWnC,QAASi7D,GAAiBv7D,EAAK,uB,qCC2HnE6G,mBAnGoB,EACjC9E,SACAwxC,WACAmc,SACAtoD,UACAuoD,gBACAlD,iBACAC,wBAGA,MAAMtyC,EAAe9S,YAAuB,OACtC,aAAE8B,EAAF,qBAAgBE,GAAyBE,YAAkBzH,OAAQJ,OAAWA,GAAW,GACzF65D,EAAsBC,aAAuB/L,EAAO7wD,OAAS6wD,OAAS/tD,EArDvD,MAqDqF,IAEnG+5D,EAAeC,GAAoBt4D,aAtDZ,GAwD9BC,YAAU,KACRopD,EAAkB,CAAEnZ,SAAU,OACb,OAAbA,GACFmZ,EAAkB,CAAEnZ,cAErB,CAACmZ,EAAmBnZ,IAEvBjwC,YAAU,KACRq4D,EAAiB,IAChB,CAACjM,IAEJpsD,YAAU,MAjEZ,SAAwBwT,EAAesD,GACrC,MAAMve,EAAYue,EAAa7R,QAC/B,IAAK1M,EACH,OAGF,MAAM,eAAE2uD,EAAF,YAAkBD,GAAgBR,GACtCluD,EACA,eAboB,GAepB,GACA,GACA,GAGF,IAAK0uD,EAAY1rD,SAAW0rD,EAAYzzC,GACtC,OAEF,MAAM80C,EAAQpB,EAAe,GAC7B,IAAKA,EAAe9wD,SAASod,IACvBA,IAAU80C,IAAUhB,GAAe/uD,EAAW0uD,EAAYqB,IAAQ,GAAQ,CAC9E,MACMkK,EAAuB,WADZh/C,EAAQ0zC,EAAeA,EAAe3rD,OAAS,GAAK,QAAU,OAzBxD,GA0BgBiY,EAA6B,EAEpEk/C,aAA2Bn6D,EAAWi6D,IA0CtC/J,CAAe2P,EAAethD,IAC7B,CAACshD,IAEJ,MAAM3Q,EAAmBhrD,YAAairD,IACpC,IAAK0E,EAAO7wD,OACV,OAzE0B,EA4E5B,MAAM+8D,EAAclM,EAAO7wD,OAC3B,OAAOosD,aAAc2Q,EAAa5Q,IACjC,CAAC0E,IAEEtE,EAAiBrrD,YAAY,CAACwG,EAAevC,KACjDA,EAAEyG,iBACFkxD,EAAkB7kD,GAAWi0C,EAAiBj0C,EAAQvQ,KACrD,CAACo1D,EAAkB5Q,IAEhB8Q,EAAoB97D,YAAaiE,IACrC,GAAI0rD,EAAO7wD,QAAU68D,GAtFO,EAsFkC,CAC5D,MAAMz2B,EAAQyqB,EAAOgM,GACjBz2B,IACFjhC,EAAEyG,iBACFklD,EAAc1qB,EAAM4uB,QACpBpH,EAAe,CAAExnB,MAAOA,EAAMjnC,QAGjC,CAACyuD,EAAgBiD,EAAQC,EAAe+L,IAE3Cp4D,YAAU,IAAOvB,EAAS4kB,aAAyB,CACjDG,MAAO1f,EACP00D,OAAS93D,GAAqBonD,GAAgB,EAAGpnD,GACjD+3D,QAAU/3D,GAAqBonD,EAAe,EAAGpnD,GACjDuf,QAASs4C,SACNl6D,EAAY,CAACypD,EAAgByQ,EAAmB95D,EAAQqF,IAE7D,MAQM/G,EAAY0D,YAChB,gDACAuF,GAGF,OACE,yBACEwB,IAAKsP,EACL/Z,UAAWA,EACX+5D,aAAe5yD,SAAkC7F,EAjB5B,KACvB9G,SAASC,KAAKC,UAAUC,IAAI,cAiB1Bq/D,aAAe7yD,SAAkC7F,EAd5B,KACvB9G,SAASC,KAAKC,UAAUO,OAAO,eAe5B8N,GAAgBoyD,EACfA,EAAWxgD,IAAI,CAACiqB,EAAOnuB,IACrB,kBAAC,GAAD,CACEtW,IAAKykC,EAAMjnC,GACXinC,MAAOA,EACP3rB,MAAOoiD,IAAkB5kD,EACzBxW,QAASqvD,KAGXvmD,EACF,kBAACkS,GAAA,EAAD,WACE3Z,K,iBCUKkF,mBAAK/H,YAClB,CAACC,GAAUC,aACT,MAAMyB,EAAOnB,YAAWP,EAAQC,GAC1Bg9D,EAAev7D,GAAQkQ,YAAmB5R,EAAQ0B,EAAKzC,IAC7D,IAAKyC,IAASu7D,EACZ,MAAO,GAGT,MAAM,MAAE5vC,EAAF,QAASo8B,GAAYC,YAAwB1pD,IAAW,IACxD,WAAEqzC,EAAF,SAAcphC,GAAaw3C,GAAW,GAE5C,MAAO,CACL/nD,OACAu7D,eACA5vC,QACAgmB,aACAphC,aAGJ,CAACjS,EAAQW,IAA2BC,YAAKD,EAAS,CAAC,0BAA2B,iBAnB5DZ,CA9G2C,EAC7DE,SACA8Q,WACA1I,UACAwQ,WACAnX,OACAu7D,eACA5vC,QACAgmB,aACAphC,WACA43C,0BACA/oD,mBAEA,MAAMG,EAAOC,cAEPg8D,EAAep6D,YAAQ,KAC3B,KAAKuqB,GAAUpb,GAAaA,EAASnS,QAAWm9D,GAC9C,OAAOzvC,KAGT,MAAMi8B,EAAUx3C,EAASgK,IAAKhd,IAC5B,MAAM3G,EAAU2kE,EAAah+D,GAC7B,IAAK3G,EACH,OAGF,MAAM6kE,EAAa7kE,EAAQgZ,SAAWhR,aAAW88D,cAAa9kE,EAAQgZ,eAAY1O,EAElF,IAAIy6D,EACJ,GAAI37D,GAAQkjB,aAAcljB,GACxB27D,EAAa37D,OACR,GAAIpJ,EAAQglE,YAAa,CAC9B,MAAM,cAAEC,EAAF,WAAiBhmD,GAAejf,EAAQglE,YAC9CD,EAAaE,GAAiBhmD,EAAahX,YAAW68D,cAAa7lD,QAAc3U,OAEjFy6D,EAAa/kE,EAAQgZ,SAAW/Q,YAAW68D,cAAa9kE,EAAQgZ,eAAY1O,EAG9E,MAAO,CACLtK,UACA6kE,aACAE,aACA97D,QAAS,IAAMT,EAAa,CAAEb,SAAQ8Q,WAAU7Q,UAAWjB,OAE5Dob,OAAOnR,SAEV,OAAOs0D,YAAQ/T,EAAS,EAAGnxD,aAAcA,EAAQyJ,KAAM,SACtD,CAAC9B,EAAQ8Q,EAAUjQ,EAAcmR,EAAUvQ,EAAMu7D,EAAc5vC,IA2BlErU,YAAeH,EAAUxQ,GAGzB,MAAMgT,EAAe9S,YAAuB,MACtC2P,EAAgBoD,aAA0BD,GAAc,EAAOtD,IAC/DmlD,GAAgBA,EAAanlD,IAC/BmlD,EAAanlD,GAAOxW,WAErB,oBAAoB,GAEvB,OACE,kBAACsa,GAAA,EAAD,CACEva,UAAU,4BACVwa,MAAOohD,EACPO,iBAAkB,EAClB1hD,WAAY8tC,EACZv7B,YAAU,EACV7S,UAAWvD,EACXnM,IAAKsP,GAEL,uBAAG/Z,UAAU,cAAcM,IAAI,QAC3ByrB,EAEkB,IAAfgmB,GAAqB6pB,EAAap9D,OAEpB,IAAfuzC,EACF,mBAEI6pB,EAAap9D,SAAWuzC,GAAc6pB,EAAap9D,SAAtD,kBAJDmB,EAAK,yBAFLA,EAAK,gCASRi8D,EAAajhD,IAxDS,EACzB3jB,UAAS6kE,aAAYE,aAAY97D,cAEjC,MAAM2b,EAAQmgD,EAAariD,YAAa/Z,EAAMo8D,GAAc1vC,aAAgBwvC,GACtEl5D,EAAOonB,YAAsBpqB,EAAM3I,GAEzC,OACE,kBAAC4jB,GAAA,EAAD,CACE5a,UAAU,gDACVC,QAASA,GAET,kBAACC,EAAA,EAAD,CAAQE,KAAM27D,EAAY17D,KAAMw7D,IAChC,yBAAK77D,UAAU,QACb,yBAAKA,UAAU,SACb,wBAAIM,IAAI,QAAQsb,GAASrb,YAAWqb,IACpC,kBAACwgD,GAAA,EAAD,CAAiBplE,QAASA,KAE5B,yBAAKgJ,UAAU,WAAWM,IAAI,QAC3BC,YAAWoC,EAAM,CAAC,QAAS,aAAc,CAAEqnB,UAAW+B,a,SCLpDvlB,mBAAK/H,YAClB,CAACC,GAAU6nD,mBACF,CACLsR,IAAKvR,aAAiB5nD,EAAQ6nD,GAC9BpiB,WAAYk4B,aAAyB39D,KAGzC,CAACU,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,eAAgB,qBAPpDZ,CAnFgD,EAClE8nD,eAActjB,sBAAqB40B,MAAK1zB,aACxCqiB,eAAcC,mBAAkB6V,kBAAiBC,oBAEjD,MAAM58D,EAAOC,cACP48D,EAAU3E,GAAOjwD,QAAQiwD,EAAInwB,eAC7B+0B,EAAoB70D,QAAQiwD,GAAOA,EAAI9yB,WAEtC2B,EAAaC,EAAWC,GAAc1gB,eAE7Cw2C,aAAY,KACVH,EAAc71B,IACb,CAACA,EAAa61B,IAEjB,MAAM3B,EAAoBp5D,YAAQ,KAChC,IAAKq2D,EACH,MAAO,GAGT,MAAM8E,GAAmB9E,EAAI+E,QAAU,IAAIjiD,IAAI,EAAGhd,QAASA,GACrDk/D,EAAgBhF,EAAI9yB,SAAW8yB,EAAI9yB,SAAShsB,OAAO,EAAGpb,SAAUg/D,EAAgBtjE,SAASsE,IAAO,GAEtG,MAAO,IAAIk6D,EAAI+E,QAAU,MAAOC,GAAe9sC,MAAM,EAxB7B,IAyBvB,CAAC8nC,IAEJ50D,YAAU,MAEHw5D,GAAqB7B,EAAkBp8D,OA7BpB,GA8BtBgoD,EAAa,CAAED,kBAEhB,CAACkW,EAAmB7B,EAAkBp8D,OAAQgoD,EAAcD,IAE/D,MAAMuW,EAAiBp9D,YAAY,KACjC+mD,EAAiB,CAAEF,kBAClB,CAACE,EAAkBF,IAEtB,IAAKsR,EACH,OAGF,MAAMkF,EAAoBnC,EAAkBp8D,OAAS,EAErD,OACE,yBAAK2B,IAAK03D,EAAIl6D,GAAIqC,UAAU,cAAcM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAClE,yBAAKtB,UAAU,sBACb,yBAAKA,UAAU,iBACb,wBAAIA,UAAU,QAAQM,IAAI,QAAQu3D,EAAIj8C,OACtC,uBAAG5b,UAAU,QAAQM,IAAI,QAAQX,EAAK,WAAYk4D,EAAI/5B,MAAO,OAE/D,kBAACn8B,EAAA,EAAD,CACE3B,UAAWw8D,EAAU,gBAAal7D,EAClCO,MAAM,UACNpI,KAAK,OACLgkC,MAAI,EACJC,OAAK,EACLz9B,QAAS68D,GAERn9D,EAAK68D,EAAU,qBAAuB,sBAG3C,yBAAKx8D,UAAU,qBACX+8D,GAAqB,kBAACvtD,EAAA,EAAD,MACtButD,GAAqBnC,EAAkBjgD,IAAKgpB,GAC3C,kBAAC,GAAD,CACEA,QAASA,EACTlqC,KAAMujE,KACN/5B,oBAAqBA,EACrBW,WAAYO,GAAcuC,GAAe41B,EACzCr8D,QAAS0mC,MAIdo2B,GACC,kBAAC,KAAD,CACEr7D,OAAQglC,EACRmB,YAAa+yB,EAAkB,GAC/B7zD,QAAS6/B,Q,OCjFnB,MAEM3e,GAAe3kB,YAAU4kB,GAAOA,IAAM,KAAO,GA0EpC1hB,mBAAK/H,YACjBC,IACC,MAAM+R,EAAgBwsD,YAA2Bv+D,IAC3C,MAAEqtB,EAAF,UAASuxB,GAAc7sC,GAAiB,IACxC,SAAEysD,GAAax+D,EAAOqmC,SAE5B,MAAO,CACLhZ,QACAoxC,YAAaD,EAAS73B,OACtBiY,cAGJ,CAACl+C,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,yBAZpCZ,CAxE6C,EAC/DsI,UACAwQ,WACAwU,QACAoxC,cACA7f,YACA8f,2BAGA,MAAMrjD,EAAe9S,YAAuB,MAEtCtH,EAAOC,eAEN8mC,EAAa22B,GAAkBr6D,aAAS,IAG7CsjC,QAASrD,GACPuD,aAAwB,CAAEC,QAAS1sB,EAAc4sC,WArBzB,MAqE5B,OA5CA1jD,YAAU,KACRglB,GAAa,KACXm1C,QAIJ1lD,YAAeH,EAAUxQ,GAuCvB,yBAAK0D,IAAKsP,EAAc/Z,UAAU,8BAA8BM,IAAKX,EAAKiY,MAAQ,WAAQtW,GArC5F,WACE,QAAcA,IAAVyqB,EAIJ,OAAKA,GAASoxC,EACLA,EAAYxiD,IAAKhd,GACtB,kBAAC,GAAD,CACEwC,IAAKxC,EACL4oD,aAAc5oD,EACdslC,oBAAqBA,EACrBq5B,gBAAiB51B,EACjB61B,cAAec,KAKjB/f,EACGA,EAAU9+C,OAIR8+C,EAAU3iC,IAAKhd,GACpB,kBAAC,GAAD,CACEwC,IAAKxC,EACL4oD,aAAc5oD,EACdslC,oBAAqBA,EACrBq5B,gBAAiB51B,EACjB61B,cAAec,KATV,uBAAGr9D,UAAU,cAAcM,IAAI,QAA/B,kBAcJ,kBAAC2a,GAAA,EAAD,MAKJ6+C,O,OCuBQtzD,mBAAK/H,YACjBC,IACC,MAAM+R,EAAgB6sD,YAAuB5+D,IACvC,MAAEqtB,EAAF,QAASo8B,GAAY13C,GAAiB,IACtC,OAAE9R,GAAWsjB,YAAyBvjB,IAAW,GACjD0B,EAAOzB,EAASM,YAAWP,EAAQC,QAAU2C,EAGnD,MAAO,CACLyqB,QACAo8B,UACA/nD,OACAm9D,cANoBn9D,EAAOo9D,YAAoB9+D,EAAQ0B,QAAQkB,IASnE,CAAClC,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,iBAAkB,cAAe,sBAfrEZ,CAjFyC,EAC3DsI,UACAwQ,WACAwU,QACAo8B,UACA/nD,OACAm9D,gBACAE,iBACA/W,cACAgX,wBAGA,MAAM3jD,EAAe9S,YAAuB,OAG1Cq/B,QAASrD,GACPuD,aAAwB,CAAEC,QAAS1sB,EAAc4+C,WAlBzB,OAoBtB,YAAEH,GAAgBmF,YAA4Bv9D,EAAMm9D,GAEpDK,EAAiBl+D,YAAau4D,IAC9BO,GACF9R,EAAY,CAAEuR,QAGZ9wD,KACFu2D,EAAkB,CAAE3xC,WAAOzqB,KAE5B,CAACk3D,EAAa9R,EAAagX,IAExB/9D,EAAOC,cAEb8X,YAAeH,EAAUxQ,GA6BzB,MAAM82D,EAAaj2D,aAAkBtG,IAAVyqB,GAAuBo8B,GAAWA,EAAQ3pD,QAErE,OACE,yBAAKwB,UAAU,YAAYM,IAAKX,EAAKiY,MAAQ,WAAQtW,GACnD,kBAACiZ,GAAA,EAAD,CACE9P,IAAKsP,EACL/Z,UAAW0D,YAAe,8BAA+Bm6D,GAAc,QACvErjD,MAAO2tC,EACPh6B,aAAa,aACbguC,iBAzEkB,GA0ElBnvC,YAAU,EACVvS,WAAYgjD,GAtClB,WACE,QAAcn8D,IAAVyqB,EAIJ,OAAKo8B,EAMAA,EAAQ3pD,OAMN2pD,EAAQxtC,IAAKs9C,GAClB,kBAAC,GAAD,CACE93D,IAAK83D,EAAIt6D,GACTs6D,IAAKA,EACLh1B,oBAAqBA,EACrBhjC,QAAS29D,KATT,uBAAG59D,UAAU,cAAcM,IAAI,QAAQX,EAAK,gBAN5C,kBAACsb,GAAA,EAAD,MAiCC6+C,Q,OCcMtzD,mBAAK/H,YAClB,CAACC,GAAUo/D,aACT,MAAM,OAAEC,EAAF,QAAUC,GAAYt/D,EAAOu/D,YAEnC,MAAO,CACLF,OAAQA,GAAUA,EAAOD,EAAOh7B,QAChCo7B,OAASF,GAAWA,EAAQF,EAAOh7B,SAAY,KAGnD,CAACpkC,EAAQW,IAA2BC,YAAKD,EAAS,CAAC,wBAAyB,WAAY,qBATtEZ,CA5FiD,EACnE2B,OACApJ,UACA8mE,SACAK,aACAC,cACAL,SACAG,SACAG,wBACAx1C,WACAy1C,uBAEA,MAAMC,EAAkBjzD,YAAoB6yD,EAAWK,cAChD7wC,EAAW8wC,GAAgBz7D,aAAkB,GAC9C07D,EAAkB92D,QAAQm2D,IAC1B,OAAEj7B,EAAF,KAAUngC,GAASm7D,EACnBn+D,EAAOC,cAEbqD,YAAU,KAEHy7D,GAAmBH,IAAoBJ,EAAWK,aACrDH,EAAsB,CACpBj+D,OAAMxB,UAAW5H,EAAQ2G,GAAImlC,SAAQo7B,SAAQS,MAzB/B,EAyBqDC,mBAAmB,KAIzF,CAACT,EAAWK,YAAaE,IAE5B,MAAMG,EAAsBn/D,YAAY,KACtC++D,GAAa,GACbJ,EAAsB,CACpBj+D,OAAMxB,UAAW5H,EAAQ2G,GAAImlC,SAAQo7B,SAAQS,MAjC3B,MAmCnB,CAACv+D,EAAMi+D,EAAuBrnE,EAAQ2G,GAAIugE,EAAQp7B,IAErD7/B,YAAU,KACRw7D,GAAa,IACZ,CAACV,IAEJ,MAAMe,EAAoBp/D,YAAa/B,IACrCkrB,EAAS,CAAElrB,OACX2gE,KACC,CAACA,EAAkBz1C,IAetB,OACE,yBAAK7oB,UAAU,qBACb,yBAAKA,UAAU,eACZ+9D,EACGA,EAAOpjD,IAAKhd,GACZ,kBAACid,GAAA,EAAD,CACEza,IAAKxC,EACLqC,UAAU,sBACVC,QAAS,IAAM6+D,EAAkBnhE,IAEjC,kBAACkd,GAAA,EAAD,CACEkN,WAAW,OACXhN,OAAQpd,EACR6/C,eAAa,EACbuhB,kBAAgB,MAIpB,kBAAC9jD,GAAA,EAAD,MACH8iD,GAhCP,WACE,MAAMiB,EAAkBb,EAAWK,YAAcT,EAAQv/D,OAEzD,OAAO2/D,EAAWK,YAlDA,GAkD+BQ,EAAkB,GACjE,kBAAC,GAAD,CACElhC,MAAOkhC,EACPjhC,SAAS,QACTpQ,UAAWA,EACX1tB,QAAS4+D,IAwBEI,IAEb,yBAAKj/D,UAAU,cAAcM,IAAKX,EAAKiY,MAAQ,WAAQtW,GACrD,0BAAMtB,UAAU,eAAeM,IAAI,QAAQqC,GAC3C,0BAAM3C,UAAU,iBAAiBM,IAAKX,EAAKiY,MAAQ,YAAStW,IAQ7C4E,EAPEi4D,EAAWK,aAOEU,EAPWd,GAQhC,GAAMl4D,EAAQg5D,EAAS,KAAK36D,UAAY,GATjD,OAQR,IAAuB2B,EAAeg5D,K,OC9DvB14D,mBAAK/H,YACjBC,IACC,MACEu/D,aAAa,OAAEt/D,EAAF,UAAUC,GADnB,aAEJsqB,GACExqB,EAEJ,IAAKC,IAAWC,EACd,MAAO,GAMT,MAAO,CACLwB,KAJWnB,YAAWP,EAAQC,GAK9B3H,QAJckI,YAAkBR,EAAQC,EAAQC,GAKhDsqB,iBAjBczqB,CAzC2B,EAC7CsI,UACAwQ,WACAnX,OACApJ,UACAkyB,mBAEA,MAAMvpB,EAAOC,cAGb,GAFA8X,YAAeH,EAAUxQ,IAEpB/P,IAAYoJ,EACf,OAAO,kBAAC6a,GAAA,EAAD,MAGT,MAAM,QAAE22C,EAAF,QAAWzJ,GAAYgX,YAAenoE,GAC5C,IAAKmxD,EAAQA,QACX,OAGF,MAAMiX,EAAkBC,YAAqBlX,EAAQA,QAAS,UAE9D,OACE,yBAAKnoD,UAAU,cAAcM,IAAKX,EAAKiY,MAAQ,WAAQtW,GACrD,wBAAItB,UAAU,gBAAgBM,IAAI,QAAQsxD,EAAQ5B,UAClD,yBAAKhwD,UAAU,mCACZkpB,GAAgB0oC,EAAQC,QAAQl3C,IAAKmjD,GACpC,kBAAC,GAAD,CACE39D,IAAM,GAAEnJ,EAAQ2G,MAAMmgE,EAAOh7B,SAC7B1iC,KAAMA,EACNpJ,QAASA,EACT8mE,OAAQA,EACRK,WAAYiB,EAAgBtB,EAAOh7B,QACnCs7B,YAAajW,EAAQiW,gBAGvBl1C,GAAgB,kBAACjO,GAAA,EAAD,W,OCqJXzU,mBAAK/H,YAClB,CAACC,GAAUqc,aACT,MAAM1a,EAAOrB,aAAWN,EAAQqc,GAC1B3a,EAAOnB,YAAWP,EAAQqc,IAC1B,SAAEvY,GAAa9D,EAAO4gE,WAG5B,MAAO,CACLj/D,OAAMD,OAAMoC,WAAU6kB,QAHRC,aAAkBlnB,EAAMmnB,aAAqB7oB,GAAS8oB,aAAuB9oB,MAM/F,CAACA,EAAQW,IAA2BC,YAAKD,EAAS,CAChD,gBAAiB,aAAc,kBAAmB,WAAY,kBAZ9CZ,CAlK0C,EAC5Dsc,SACA1a,OACAD,OACAoC,WACA6kB,UACAk4C,gBACAC,aACAC,gBACAC,kBACA72C,WACA9hB,UACAwQ,eAEA,MAAOooD,EAAoBC,EAAkBC,GAAqB35C,gBAC3DgU,EAAwBC,GAA6Bn3B,aAAS,IAC9DmY,EAAOif,GAAYp3B,cACpBrD,EAAOC,cAEb8X,YAAeH,EAAUxQ,GAEzB,MAAMwyB,EAAmBl5B,GAAQA,EAAKi5B,WAAmB,GACnDG,EAAkBp5B,GAAQA,EAAKm5B,UAAkB,IAEhDF,EAAWgB,GAAgBt3B,YAASu2B,IACpCC,EAAUe,GAAev3B,YAASy2B,IAClCqmC,EAAwBC,GAA6B/8D,aAAUqkB,GAEtEpkB,YAAU,KACR88D,GAA2B14C,IAC1B,CAACA,IAEJpkB,YAAU,KACRk3B,GAA0B,GAC1B0lC,KACC,CAACA,EAAmB9kD,IAEvB9X,YAAU,KACRq3B,EAAaf,GACbgB,EAAYd,IACX,CAACF,EAAkBE,EAAiBp5B,IAEvC4C,YAAU,KACJT,IAAaw9D,IAAmBllC,WAClCX,GAA0B,GAC1BC,OAAS94B,GACTu+D,MAED,CAACA,EAAmBr9D,IAEvB,MAAMy4B,EAAwBv7B,YAAaiE,IACzC22B,EAAa32B,EAAEsG,OAAO/D,OACtBi0B,GAA0B,IACzB,IAEGe,EAAuBx7B,YAAaiE,IACxC42B,EAAY52B,EAAEsG,OAAO/D,OACrBi0B,GAA0B,IACzB,IAEG8lC,EAA2BvgE,YAAaiE,IAC5Co8D,EAA0Bp8D,EAAEsG,OAAOo3B,SACnClH,GAA0B,IACzB,IAEGiB,EAAoB17B,YAAY,KACpC,MAAM27B,EAAmB/B,EAAUN,OAC7BsC,EAAkB9B,EAASR,OAE5BqC,EAAiB78B,QACpB47B,EAxE2B,6BA2E7BmlC,EAAc,CACZxkD,SACAsM,SAAUy4C,EACVxmC,UAAW+B,EACX7B,SAAU8B,KAEX,CAAChC,EAAWE,EAAU+lC,EAAexkD,EAAQ+kD,IAE1CI,EAAsBxgE,YAAY,KACtC+/D,EAAc,CACZ9gE,OAAQyB,EAAKzC,GACbqlB,oBAAoB,IAEtBw8C,EAAW,CAAEzkD,WACb8kD,IACAH,IACA72C,EAAS,CAAElrB,QAAI2D,KACd,CAAClB,EAAKzC,GAAIkiE,EAAmBH,EAAiBD,EAAeD,EAAY32C,EAAU9N,IAEtF,IAAK1a,EACH,OAGF,MAAMstB,EAAYnrB,IAAaw9D,IAAmBrlC,WAElD,OACE,yBAAK36B,UAAU,cACb,yBAAKA,UAAU,iBACb,yBAAKA,UAAU,WACb,kBAAC6a,GAAA,EAAD,CACEE,OAAQ1a,EAAK1C,GACboqB,WAAW,QACXjN,OAAO,gBACPqlD,cAAY,IAEd,kBAACjmD,GAAA,EAAD,CACEvc,GAAG,kBACHsnB,MAAOtlB,EAAK,iCACZmM,SAAUmvB,EACV/0B,MAAOozB,EACPne,MAnHqB,8BAmHdA,EAAqCA,OAAQ7Z,IAEtD,kBAAC4Y,GAAA,EAAD,CACEvc,GAAG,iBACHsnB,MAAOtlB,EAAK,gCACZmM,SAAUovB,EACVh1B,MAAOszB,IAET,yBAAKx5B,UAAU,gCACb,kBAACohC,GAAA,EAAD,CACEC,QAASy+B,EACT76C,MAAOtlB,EAAK,iBACZonC,SAAUpnC,EAAKmgE,EACX,gCACA,kCACJh0D,SAAUm0D,MAIhB,yBAAKjgE,UAAU,WACb,kBAAC4a,GAAA,EAAD,CAAUxY,KAAK,SAASgE,QAAM,EAACygB,aAAW,EAAC5mB,QAAS2/D,GACjDjgE,EAAK,oBAIZ,kBAAC,GAAD,CACEwL,QAAS+uB,EACTj6B,QAASm7B,EACTvvB,SAAU8hB,EACV7rB,UAAWnC,EAAK,SAEfguB,EACC,kBAACne,EAAA,EAAD,CAAS3N,MAAM,UAEf,uBAAG7B,UAAU,gBAGjB,kBAAC8c,GAAA,EAAD,CACEpb,OAAQi+D,EACR54D,QAAS84D,EACTl9D,KAAMhD,EAAK,2BACXod,aAAcpd,EAAK,iBACnBqd,eAAgBkjD,EAChBzoC,sBAAoB,QCiHbjxB,mBAAK/H,YAClB,CAACC,GAAUC,aACT,MAAMyB,EAAOnB,YAAWP,EAAQC,IAC1B,SAAE6D,GAAa9D,EAAO4gE,WACtBc,EAAmBx4D,QAAQxH,EAAKs5B,UAAYt5B,EAAKs5B,SAAS2mC,cAEhE,MAAO,CACLjgE,OACAoC,WACA89D,aAAc99C,aAAiBpiB,GAC/BggE,mBACAG,cAAeC,YAAiBpgE,EAAM,cACtCqgE,YAAaD,YAAiBpgE,EAAM,cAGxC,CAAChB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,yBAA0B,aAAc,kBACxC,eAAgB,gBAAiB,aAAc,aAjB/BZ,CApQ2C,EAC7DE,SACAyB,OACAoC,WACA89D,eACAF,mBACAG,gBACAE,cACA9oC,iBACA+oC,yBACAC,aACAC,aACAC,eACAC,gBACApB,kBACA72C,WACA9hB,UACAwQ,eAEA,MAAOooD,EAAoBC,EAAkBC,GAAqB35C,eAC5D66C,EAAe3gE,EAAKwb,MACpBolD,EAAe5gE,EAAKs5B,UAAYt5B,EAAKs5B,SAAS4kB,OAAe,IAE5DpkB,EAAwBC,GAA6Bn3B,aAAS,IAC9D4Y,EAAOyiC,GAAYr7C,YAAS+9D,IAC5BziB,EAAOC,GAAYv7C,YAASg+D,IAC5B9vD,EAAOmpB,GAAYr3B,eACnBmY,EAAOif,GAAYp3B,cACpBi+D,EAAY7tD,YAAkBhT,GAC9Bq6B,EAAuBnnB,YAAS2tD,GAAW,EAAO1tD,iBAAeC,SACjE7T,EAAOC,cAEb8X,YAAeH,EAAUxQ,GAEzB9D,YAAU,KACJT,IAAaw9D,IAAmBllC,WAClCX,GAA0B,GAC1BC,OAAS94B,KAEV,CAACkB,IAEJ,MAAM0+D,EAAsBxhE,YAAY,KACtCi4B,EAAewpC,IAAkBC,kBAChC,CAACzpC,IAEE0pC,EAAwB3hE,YAAY,KACxCi4B,EAAewpC,IAAkBG,aAChC,CAAC3pC,IAEE4pC,EAAyB7hE,YAAY,KACzCi4B,EAAewpC,IAAkBK,mBAChC,CAAC7pC,IAEE8pC,EAA4B/hE,YAAY,KAC5Ci4B,EAAewpC,IAAkBO,qBAChC,CAAC/pC,IAEEgqC,EAAiBjiE,YAAauuD,IAClC5zB,EAAS4zB,GACT9zB,GAA0B,IACzB,IAEGskB,EAAoB/+C,YAAaiE,IACrC06C,EAAS16C,EAAEsG,OAAO/D,OAClBi0B,GAA0B,IACzB,IAEGynC,EAAoBliE,YAAaiE,IACrC46C,EAAS56C,EAAEsG,OAAO/D,OAClBi0B,GAA0B,IACzB,IAEG0nC,EAAoBniE,YAAY,KACpC,MAAMoiE,EAAelmD,EAAMod,OACrB+oC,EAAezjB,EAAMtlB,OAEtB8oC,EAAatjE,OAKlBmiE,EAAW,CACThiE,SACAid,MAAOkmD,EACPxjB,MAAOyjB,EACP7wD,UARAkpB,EAnFoB,+BA6FrB,CAACkkB,EAAO3/C,EAAQuS,EAAO0K,EAAO+kD,IAE3BqB,EAAqBtiE,YAAY,KACrCi4B,EAAewpC,IAAkBc,eAChC,CAACtqC,IAEEuqC,EAAyBxiE,YAAY,KACzC,IAAKU,EAAKs5B,SACR,OAGF,MAAM,mBAAEyoC,GAAuB/hE,EAAKs5B,SAEpCgnC,EAAuB,CAAE/hE,OAAQyB,EAAKzC,GAAIykE,WAAYD,KACrD,CAAC/hE,EAAMsgE,IAEJ2B,GAA0B7gE,YAAQ,KACtC,IAAKpB,EAAKkiE,oBACR,OAAO,EAGT,IAAIvwB,EAAa,CACf,eACA,YACA,aACA,YACA,aACA,cACA,eACAh5B,OACC5Y,IAASC,EAAKkiE,oBAAqBniE,IACpC3B,OAEF,MAAM,aAAE+jE,EAAF,SAAgBC,GAAapiE,EAAKkiE,oBAOxC,OAJKC,GAAiBC,IACpBzwB,GAAc,GAGTA,GACN,CAAC3xC,IAEEqiE,GAAeriE,EAAKs5B,UAAYt5B,EAAKs5B,SAASgpC,cAAgBtiE,EAAKs5B,SAASgpC,aAAalkE,QAAW,EAEpGmkE,GAAoBjjE,YAAY,KAChC4gE,EACFM,EAAW,CAAEjiE,OAAQyB,EAAKzC,KAChByC,EAAKwiE,UAGf9B,EAAc,CAAEniE,OAAQyB,EAAKzC,KAF7BkjE,EAAa,CAAEliE,OAAQyB,EAAKzC,KAI9BkiE,IACAH,IACA72C,EAAS,CAAElrB,QAAI2D,KACd,CACDg/D,EAAclgE,EAAKwiE,UAAWxiE,EAAKzC,GACnCkiE,EAAmBH,EAAiBmB,EAAcC,EAAeF,EAAY/3C,IAG/E,GAAIzoB,EAAK8mD,aACP,OAGF,MAAMv5B,GAAYnrB,IAAaw9D,IAAmBrlC,WAElD,OACE,yBAAK36B,UAAU,cACb,yBAAKA,UAAU,iBACb,yBAAKA,UAAU,WACb,kBAACw7B,GAAA,EAAD,CACEf,qBAAsBA,EACtB3uB,SAAU61D,EACV91D,UAAW00D,IAEb,kBAACrmD,GAAA,EAAD,CACEvc,GAAG,cACHsnB,MAAOtlB,EAAK,aACZmM,SAAU2yC,EACVv4C,MAAO0V,EACPT,MA9Kc,+BA8KPA,EAA8BA,OAAQ7Z,EAC7CuK,UAAW00D,IAEb,kBAACrmD,GAAA,EAAD,CACEvc,GAAG,cACHqC,UAAU,OACVilB,MAAOtlB,EAAK,0BACZmM,SAAU81D,EACV17D,MAAOo4C,EACPzyC,UAAW00D,IAEZngE,EAAKwiE,WACJ,kBAAChoD,GAAA,EAAD,CAAUxY,KAAK,OAAOw7B,WAAS,EAACx3B,QAAM,EAACnG,QAASihE,GAC9C,0BAAMlhE,UAAU,SAASL,EAAK,cAC9B,0BAAMK,UAAU,YAAYI,EAAKksB,SAAW3sB,EAAK,cAAgBA,EAAK,iBAGzEygE,GACC,kBAACxlD,GAAA,EAAD,CAAUxY,KAAK,UAAUw7B,WAAS,EAACx3B,QAAM,EAACnG,QAASohE,GACjD,0BAAMrhE,UAAU,SAASL,EAAK,kBAC9B,0BAAMK,UAAU,YAAYL,EAAK,sBAGrC,kBAACib,GAAA,EAAD,CACExY,KAAK,cACLw7B,WAAS,EACTx3B,QAAM,EACNnG,QAASshE,EACT11D,UAAW40D,GAEX,0BAAMzgE,UAAU,SAASL,EAAK,uBAC9B,0BAAMK,UAAU,WAAWM,IAAI,QAC5B+hE,GADH,IAzMoB,IA6MtB,kBAACznD,GAAA,EAAD,CAAUxY,KAAK,QAAQw7B,WAAS,EAACx3B,QAAM,EAACnG,QAASwhE,GAC/C,0BAAMzhE,UAAU,SAASL,EAAK,0BAC9B,0BAAMK,UAAU,YAAY6iE,aAAcJ,OAG9C,yBAAKziE,UAAU,WACb,kBAAC4a,GAAA,EAAD,CAAUxY,KAAK,QAAQw7B,WAAS,EAACx3B,QAAM,EAACnG,QAAS+hE,GAC/C,0BAAMhiE,UAAU,SAASL,EAAK,iBAC9B,0BAAMK,UAAU,YAAY6iE,aAAcziE,EAAKk1C,gBAGhDl1C,EAAKs5B,UACJ,yBAAK15B,UAAU,gCACb,kBAACohC,GAAA,EAAD,CACEC,SAAUjhC,EAAKs5B,SAASyoC,mBACxBl9C,MAAOtlB,EAAK,eACZmM,SAAUo2D,EACVr2D,UAAW40D,MAKnB,yBAAKzgE,UAAU,WACb,kBAAC4a,GAAA,EAAD,CAAUxY,KAAK,SAASgE,QAAM,EAACygB,aAAW,EAAC5mB,QAAS2/D,GACjDjgE,EAAK,iBAIZ,kBAAC,GAAD,CACEwL,QAAS+uB,EACTj6B,QAAS4hE,EACTh2D,SAAU8hB,GACV7rB,UAAWnC,EAAK,SAEfguB,GACC,kBAACne,EAAA,EAAD,CAAS3N,MAAM,UAEf,uBAAG7B,UAAU,gBAGjB,kBAAC8c,GAAA,EAAD,CACEpb,OAAQi+D,EACR54D,QAAS84D,EACTvqD,UAAW/U,YACT+/D,IAAiBlgE,EAAKwiE,UAClBjjE,EAAK,2BACLA,EAAK,oCAAqCS,EAAKwb,OACnD,CAAC,KAAM,oBAETmB,aAAcujD,IAAiBlgE,EAAKwiE,UAAYjjE,EAAK,cAAgBA,EAAK,qBAC1Eqd,eAAgB2lD,GAChBlrC,sBAAoB,QCbbjxB,mBAAK/H,YAClB,CAACC,GAAUC,aAGF,CAAEyB,KAFInB,YAAWP,EAAQC,GAEjB2Z,cAAe5Z,EAAO4Z,gBAEvC,CAAClZ,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,kCANpCZ,CA9OsD,EACxEk5B,iBACAmrC,qBACA1iE,OACAkY,gBACAyqD,gCACAh8D,UACAwQ,eAEA,MAAOyrD,EAAaC,GAAkBjgE,YAA8B,KAC7DkgE,EAAuBC,GAA4BngE,aAAS,IAC5D2qB,EAAW8wC,GAAgBz7D,aAAS,GACrCrD,EAAOC,cAEb8X,YAAeH,EAAUxQ,GAEzB,MAAMq8D,EAA0B1jE,YAAY,KAC1Ci4B,EAAewpC,IAAkBkC,oBAChC,CAAC1rC,IAEE2rC,EAA0B5jE,YAAY,KAC1Ci4B,EAAewpC,IAAkBoC,6BAChC,CAAC5rC,IAEE6rC,EAA6B9jE,YAAayrD,IAC9C2X,EAAmB3X,EAAOpwC,OAAQowC,EAAOsY,mBAAqBnrD,GAC9Dqf,EAAewpC,IAAkBuC,uBAChC,CAACprD,EAAewqD,EAAoBnrC,IAEvC10B,YAAU,KACRggE,EAAgB7iE,GAAQA,EAAKkiE,qBAAwB,IACrDa,GAAyB,GACzBhoE,WAAW,KACTsjE,GAAa,IA1D0B,MA4DxC,CAACr+D,IAEJ,MAAMujE,EAAyBjkE,YAAaiE,IAC1C,MAAM,KAAEoU,GAASpU,EAAEsG,OAEnB,SAAS25D,EAA0B19D,GACjC,OAAOA,QAAQ5E,EAGjB2hE,EAAgB15B,IAAD,IACVA,EACH,CAACxxB,GAAO6rD,EAA0Br6B,EAAExxB,OACvB,iBAATA,GAA2B,CAC7ByqD,SAAUoB,EAA0Br6B,EAAExxB,QAG1CorD,GAAyB,IACxB,IAEGU,EAAwBnkE,YAAY,KACnCU,IAILq+D,GAAa,GACbsE,EAA8B,CAAEpkE,OAAQyB,EAAKzC,GAAImmE,aAAcd,MAC9D,CAAC5iE,EAAM4iE,EAAaD,IAEjBgB,EAAoBviE,YAAQ,IAC3BpB,GAASA,EAAKs5B,UAAat5B,EAAKs5B,SAASsqC,cAIvC5jE,EAAKs5B,SAASsqC,cAAcxlE,OAH1B,EAIR,CAAC4B,IAEE6jE,EAAmBziE,YAAQ,IAC1BpB,GAASA,EAAKs5B,UAAat5B,EAAKs5B,SAASwqC,QAIvC9jE,EAAKs5B,SAASwqC,QAAQnrD,OAAO,EAAG+qD,oBAAqBA,GAHnD,GAIR,CAAC1jE,IAEE+jE,EAAsBzkE,YAAayrD,IACvC,MAAM,aAAE2Y,GAAiB3Y,EACzB,IAAK2Y,IAAiB1jE,EACpB,OAGF,MAAM,oBAAEkiE,GAAwBliE,EAEhC,OAAOnC,OAAOgyB,KAAK6zC,GAAc1uB,OAAO,CAACC,EAAQl1C,KAC/C,IACG2jE,EAAa3jE,IACVmiE,GAAuBA,EAAoBniE,IACpC,eAARA,GAAgC,iBAARA,GAAkC,cAARA,EAErD,OAAOk1C,EAGT,MAAM+uB,EAvHZ,SAAqCjkE,GACnC,OAAQA,GACN,IAAK,eACH,MAAO,yBACT,IAAK,YACH,MAAO,8BACT,IAAK,eACH,MAAO,iCACT,IAAK,aACH,MAAO,+BACT,IAAK,YACH,MAAO,8BACT,IAAK,aACH,MAAO,+BACT,IAAK,cACH,MAAO,8BACT,IAAK,cACH,MAAO,8BACT,QACE,QAoGgBkkE,CAA4BlkE,GAE5C,IAAKikE,EACH,OAAO/uB,EAGT,MAAMivB,EAAmB3kE,EAAKykE,GAE9B,MAAQ,GAAE/uB,IAAUA,EAAO72C,OAA6B,KAAI8lE,EAAxBA,KACnC,KACF,CAAClkE,EAAMT,IAEV,OACE,yBAAKK,UAAU,cACb,yBAAKA,UAAU,iBACb,yBAAKA,UAAU,WACb,wBAAIA,UAAU,kBAAkBM,IAAI,QAAQX,EAAK,6BAEjD,yBAAKK,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,eACLspB,SAAU2hC,EAAYuB,aACtBt/C,MAAOtlB,EAAK,wBACZ6kE,UAAQ,EACR14D,SAAU63D,KAGd,yBAAK3jE,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,YACLspB,SAAU2hC,EAAYyB,UACtBx/C,MAAOtlB,EAAK,6BACZ6kE,UAAQ,EACR14D,SAAU63D,KAGd,yBAAK3jE,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,eACLspB,SAAU2hC,EAAYT,eAAiBS,EAAYR,SACnDv9C,MAAOtlB,EAAK,gCACZ6kE,UAAQ,EACR14D,SAAU63D,KAGd,yBAAK3jE,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,YACLspB,SAAU2hC,EAAY0B,UACtBz/C,MAAOtlB,EAAK,6BACZ6kE,UAAQ,EACR14D,SAAU63D,KAGd,yBAAK3jE,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,aACLspB,SAAU2hC,EAAY2B,WACtB1/C,MAAOtlB,EAAK,8BACZ6kE,UAAQ,EACR14D,SAAU63D,KAGd,yBAAK3jE,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,cACLspB,SAAU2hC,EAAY4B,YACtB3/C,MAAOtlB,EAAK,+BACZ6kE,UAAQ,EACR14D,SAAU63D,KAGd,yBAAK3jE,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,cACLspB,SAAU2hC,EAAY6B,YACtB5/C,MAAOtlB,EAAK,+BACZ6kE,UAAQ,EACR14D,SAAU63D,KAGd,yBAAK3jE,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,aACLspB,SAAU2hC,EAAY8B,WACtB7/C,MAAOtlB,EAAK,8BACZ6kE,UAAQ,EACR14D,SAAU63D,MAKhB,yBAAK3jE,UAAU,WACb,kBAAC4a,GAAA,EAAD,CAAUxY,KAAK,cAAcw7B,WAAS,EAACx3B,QAAM,EAACu3B,QAAM,EAAC19B,QAASmjE,GAC5D,0BAAMpjE,UAAU,SAASL,EAAK,wBAC9B,0BAAMK,UAAU,YAAY+jE,KAIhC,yBAAK/jE,UAAU,WACb,wBAAIA,UAAU,kBAAkBM,IAAI,QAAQX,EAAK,sBAEjD,kBAACib,GAAA,EAAD,CACExY,KAAK,WACLgE,QAAM,EACNnG,QAASqjE,GAER3jE,EAAK,wBAGPskE,EAAiBtpD,IAAKwwC,GACrB,kBAACvwC,GAAA,EAAD,CACEza,IAAKgrD,EAAOpwC,OACZ/a,UAAU,wCACVoG,QAAM,EACNnG,QAAS,IAAMujE,EAA2BrY,IAE1C,kBAACtwC,GAAA,EAAD,CACEE,OAAQowC,EAAOpwC,OACfD,OAAQqpD,EAAoBhZ,SAOtC,kBAAC,GAAD,CACEhgD,QAAS+3D,EACTjjE,QAAS4jE,EACT/hE,UAAWnC,EAAK,QAChBkM,SAAU8hB,GAETA,EACC,kBAACne,EAAA,EAAD,CAAS3N,MAAM,UAEf,uBAAG7B,UAAU,oBC3LRwG,mBAAK/H,YAClB,CAACC,GAAUC,aACT,MAAMyB,EAAOnB,YAAWP,EAAQC,IACxBuZ,KAAMoQ,GAAc5pB,EAAO6pB,MAEnC,MAAO,CAAEnoB,OAAMkoB,cAEjB,CAAClpB,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,iCAPpCZ,CA1EuD,EACzE2B,OACAkoB,YACAy8C,+BACAh+D,UACAwQ,eAEA,MAAM5X,EAAOC,cAEb8X,YAAeH,EAAUxQ,GAEzB,MAAMi+D,EAAiBxjE,YAAQ,IACxBpB,GAASA,EAAKs5B,UAAat5B,EAAKs5B,SAASsqC,cAIvC5jE,EAAKs5B,SAASsqC,cAHZ,GAIR,CAAC5jE,IAEE6kE,EAAevlE,YAAayrD,IAChC,IAAKA,EAAO+Z,eACV,OAGF,MAAMC,EAAe78C,EAAU6iC,EAAO+Z,gBACtC,OAAKC,EAIExlE,EAAK,gBAAiB0sB,aAAgB84C,SAJ7C,GAKC,CAACxlE,EAAM2oB,IAEJ88C,EAAoB1lE,YAAayrD,IACrC,GAAK/qD,EAIL,MAAO,CAAC,CACNwb,MAAOjc,EAAK,WACZyC,KAAM,SACNykB,aAAa,EACb+vB,QAAS,IAAMmuB,EAA6B,CAC1CpmE,OAAQyB,EAAKzC,GACbod,OAAQowC,EAAOpwC,OACf+oD,aAAc,QAGjB,CAACnkE,EAAMS,EAAM2kE,IAEhB,OACE,yBAAK/kE,UAAU,cACb,yBAAKA,UAAU,iBACb,yBAAKA,UAAU,UAAUM,IAAKX,EAAKiY,MAAQ,WAAQtW,GACjD,uBAAGtB,UAAU,cAAcL,EAAK,oBAE/BqlE,EAAerqD,IAAKwwC,GACnB,kBAACvwC,GAAA,EAAD,CACEza,IAAKgrD,EAAOpwC,OACZ/a,UAAU,sBACVoG,QAAM,EACNshB,eAAgB09C,EAAkBja,IAElC,kBAACtwC,GAAA,EAAD,CACEE,OAAQowC,EAAOpwC,OACfD,OAAQmqD,EAAa9Z,aCqJtB3kD,mBAAK/H,YAClB,CAACC,GAAUC,aACT,MAAMyB,EAAOnB,YAAWP,EAAQC,IAC1B,SAAE6D,GAAa9D,EAAO4gE,WAG5B,MAAO,CACLl/D,OACAoC,WACA6iE,kBALwBz9D,QAAQxH,GAAQA,EAAKilE,mBAM7C9E,cAAeC,YAAiBpgE,EAAM,gBAG1C,CAAChB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,mBAAoB,aAAc,kBAAmB,eAAgB,gBAAiB,aAdtEZ,CAnM6C,EAC/DE,SACAyB,OACAoC,WACA6iE,oBACA9E,gBACA5oC,iBACAgpC,aACA2E,mBACA5F,kBACAmB,eACAC,gBACAj4C,WACA9hB,UACAwQ,eAEA,MAAMwpD,EAAe3gE,GAAQA,EAAKwb,OAAe,GAC3ColD,EAAe5gE,GAAQA,EAAKs5B,UAAYt5B,EAAKs5B,SAAS4kB,OAAe,GACrEinB,EAAgBnlE,GAAQA,EAAKs5B,UAAYt5B,EAAKs5B,SAAS2mC,cAEtDV,EAAoBC,EAAkBC,GAAqB35C,gBAC3DgU,EAAwBC,GAA6Bn3B,aAAS,IAC9D4Y,EAAOyiC,GAAYr7C,YAAS+9D,IAC5BziB,EAAOC,GAAYv7C,YAASg+D,IAC5B9vD,EAAOmpB,GAAYr3B,eACnBmY,EAAOif,GAAYp3B,cACpBi+D,EAAY7gE,GAAQgT,YAAkBhT,GACtCq6B,EAAuBnnB,YAAS2tD,GAAW,EAAO1tD,iBAAeC,SACjE7T,EAAOC,cAEb8X,YAAeH,EAAUxQ,GAEzB9D,YAAU,KACJT,IAAaw9D,IAAmBllC,WAClCX,GAA0B,GAC1BC,OAAS94B,KAEV,CAACkB,IAEJ,MAAMigE,EAAeriE,GAAQA,EAAKs5B,UAAYt5B,EAAKs5B,SAASgpC,cAAgBtiE,EAAKs5B,SAASgpC,aAAalkE,QAAW,EAE5G0iE,EAAsBxhE,YAAY,KACtCi4B,EAAewpC,IAAkBC,kBAChC,CAACzpC,IAEE0pC,EAAwB3hE,YAAY,KACxCi4B,EAAewpC,IAAkBG,aAChC,CAAC3pC,IAEE8pC,EAA4B/hE,YAAY,KAC5Ci4B,EAAewpC,IAAkBO,qBAChC,CAAC/pC,IAEEgqC,EAAiBjiE,YAAauuD,IAClC5zB,EAAS4zB,GACT9zB,GAA0B,IACzB,IAEGskB,EAAoB/+C,YAAaiE,IACrC06C,EAAS16C,EAAEsG,OAAO/D,OAClBi0B,GAA0B,IACzB,IAEGynC,EAAoBliE,YAAaiE,IACrC46C,EAAS56C,EAAEsG,OAAO/D,OAClBi0B,GAA0B,IACzB,IAEGqrC,EAAsB9lE,YAAY,KACtC,MAAMoiE,EAAelmD,EAAMod,OACrB+oC,EAAezjB,EAAMtlB,OAEtB8oC,EAAatjE,OAKlBmiE,EAAW,CACThiE,SACAid,MAAOkmD,EACPxjB,MAAOyjB,EACP7wD,UARAkpB,EA3EsB,iCAqFvB,CAACkkB,EAAO3/C,EAAQuS,EAAO0K,EAAO+kD,IAE3B8E,EAAyB/lE,YAAY,KACzC4lE,EAAiB,CAAE3mE,SAAQyjE,WAAYiD,KACtC,CAAC1mE,EAAQ0mE,EAAmBC,IAEzBI,EAAyBhmE,YAAY,KACzCi4B,EAAewpC,IAAkBwE,qBAChC,CAAChuC,IAGEiuC,EAAsBlmE,YAAY,KAClCU,EAAKwiE,UACP9B,EAAc,CAAEniE,OAAQyB,EAAKzC,KAE7BkjE,EAAa,CAAEliE,OAAQyB,EAAKzC,KAG9BkiE,IACAH,IACA72C,EAAS,CAAElrB,QAAI2D,KACd,CAAClB,EAAKwiE,UAAWxiE,EAAKzC,GAAIkiE,EAAmBH,EAAiBmB,EAAcC,EAAej4C,IAE9F,GAAIzoB,EAAK8mD,aACP,OAGF,MAAMv5B,EAAYnrB,IAAaw9D,IAAmBrlC,WAElD,OACE,yBAAK36B,UAAU,cACb,yBAAKA,UAAU,iBACb,yBAAKA,UAAU,WACb,kBAACw7B,GAAA,EAAD,CACEf,qBAAsBA,EACtB3uB,SAAU61D,EACV91D,UAAW00D,IAEb,kBAACrmD,GAAA,EAAD,CACEvc,GAAG,gBACHsnB,MAAOtlB,EAAK,oBACZmM,SAAU2yC,EACVv4C,MAAO0V,EACPT,MAhIgB,iCAgITA,EAAgCA,OAAQ7Z,EAC/CuK,UAAW00D,IAEb,kBAACrmD,GAAA,EAAD,CACEvc,GAAG,gBACHqC,UAAU,OACVilB,MAAOtlB,EAAK,0BACZmM,SAAU81D,EACV17D,MAAOo4C,EACPzyC,UAAW00D,IAEZngE,EAAKwiE,WACJ,kBAAChoD,GAAA,EAAD,CAAUxY,KAAK,OAAOgE,QAAM,EAACw3B,WAAS,EAAC39B,QAASihE,GAC9C,0BAAMlhE,UAAU,SAASL,EAAK,gBAC9B,0BAAMK,UAAU,YAAYI,EAAKksB,SAAW3sB,EAAK,cAAgBA,EAAK,iBAG1E,kBAACib,GAAA,EAAD,CAAUxY,KAAK,UAAUw7B,WAAS,EAACx3B,QAAM,EAACnG,QAASohE,EAAuBx1D,UAAW00D,GACnF,0BAAMvgE,UAAU,SAASL,EAAK,eAC9B,0BAAMK,UAAU,YAA4BL,EAAhB4lE,EAAqB,mBAA2B,SAE9E,kBAAC3qD,GAAA,EAAD,CAAUxY,KAAK,QAAQw7B,WAAS,EAACx3B,QAAM,EAACnG,QAASwhE,GAC/C,0BAAMzhE,UAAU,SAASL,EAAK,0BAC9B,0BAAMK,UAAU,YAAYyiE,IAE9B,yBAAKziE,UAAU,gCACb,kBAACohC,GAAA,EAAD,CACEC,QAASgkC,EACTpgD,MAAOtlB,EAAK,uBACZmM,SAAU25D,MAIhB,yBAAKzlE,UAAU,WACb,kBAAC4a,GAAA,EAAD,CAAUxY,KAAK,QAAQw7B,WAAS,EAACx3B,QAAM,EAACnG,QAASylE,GAC/C,0BAAM1lE,UAAU,QAAQM,IAAI,QAAQX,EAAK,uBACzC,0BAAMK,UAAU,WAAWM,IAAI,QAAQX,EAAK,cAAeS,EAAKk1C,aAAe,QAGnF,yBAAKt1C,UAAU,WACb,kBAAC4a,GAAA,EAAD,CAAUxY,KAAK,SAASgE,QAAM,EAACygB,aAAW,EAAC5mB,QAAS2/D,GACjDx/D,EAAKwiE,UAAYjjE,EAAK,iBAAmBA,EAAK,mBAIrD,kBAAC,GAAD,CACEwL,QAAS+uB,EACTj6B,QAASulE,EACT35D,SAAU8hB,EACV7rB,UAAWnC,EAAK,SAEfguB,EACC,kBAACne,EAAA,EAAD,CAAS3N,MAAM,UAEf,uBAAG7B,UAAU,gBAGjB,kBAAC8c,GAAA,EAAD,CACEpb,OAAQi+D,EACR54D,QAAS84D,EACTl9D,KAAMvC,EAAKwiE,UAAYjjE,EAAK,sBAAwBA,EAAK,qBACzDod,aAAc3c,EAAKwiE,UAAYjjE,EAAK,iBAAmBA,EAAK,gBAC5Dqd,eAAgB4oD,EAChBnuC,sBAAoB,Q,SCrEbjxB,mBAAK/H,YAClB,CAACC,GAAUC,aACT,MAAMyB,EAAOnB,YAAWP,EAAQC,IAC1B,oBAAE45B,GAAwBstC,aAAiBnnE,EAAQC,GAEzD,MAAO,CACLyB,OACA0b,UAAWwH,aAAcljB,GACzBoC,SAAU9D,EAAO4gE,WAAW98D,SAC5B+1B,wBAGJ,CAACn5B,EAAWC,IAAYC,YAAKD,EAAS,CACpC,kBAAmB,mBAAoB,sBAbvBZ,CA5HqD,EACvE2B,OACA2G,UACAwQ,WACAuE,YACAtZ,WACA+1B,sBACAutC,kBACAC,mBACAC,wBAEA,MAAMjU,EAAWnqD,QAAQxH,EAAKksB,UACxB25C,EAAc7lE,EAAKs5B,UAAYt5B,EAAKs5B,SAASwsC,YAE5CC,EAAaC,GAAkBpjE,YAAsB+uD,EAAW,SAAW,YAC3EzlC,EAAUmM,GAAez1B,eACzBqjE,EAA2BC,EAAyBC,GAA4BrgD,eAEjFsgD,EACa,WAAhBL,GAA4B75C,GAAYiM,GACrB,YAAhB4tC,GAA6BpU,EAGnCr6C,YAAeH,EAAUxQ,GAEzB9D,YAAU,KACJkjE,IAAgBF,GAClBD,KAED,CAACG,EAAaF,EAAaD,IAE9B,MAAMS,EAAqB/mE,YAAawG,IACtCkgE,EAAelgE,IACd,IAEGwgE,EAAahnE,YAAY,KAC7BqmE,EAAiB,CAAEz5C,SAA0B,WAAhB65C,EAA2B75C,EAAW,MAClE,CAAC65C,EAAaJ,EAAkBz5C,IAE7Bq6C,EAA0BjnE,YAAY,KAC1C6mE,IACAP,KACC,CAACO,EAA0BP,IAExBrmE,EAAOC,cACPgnE,EAAc9qD,EAAY,UAAY,OACtC+qD,EAAc/qD,EAAY,UAAY,QAEtCqJ,EAAU,CACd,CAAEjf,MAAO,UAAW+e,MAAOtlB,EAAQinE,EAAF,WAAyB7/B,SAAUpnC,EAAQinE,EAAF,gBAC1E,CAAE1gE,MAAO,SAAU+e,MAAOtlB,EAAQinE,EAAF,UAAwB7/B,SAAUpnC,EAAQinE,EAAF,gBAGpEj5C,EAAYnrB,IAAaw9D,IAAmBrlC,WAElD,OACE,yBAAK36B,UAAU,cACb,yBAAKA,UAAU,iBACb,yBAAKA,UAAU,UAAUM,IAAKX,EAAKiY,MAAQ,WAAQtW,GACjD,wBAAItB,UAAU,mBAAmBL,EAAQknE,EAAF,SACvC,kBAAC3hD,GAAA,EAAD,CACEE,SAAU+gD,EACVpuD,KAAK,eACLoN,QAASA,EACTrZ,SAAU26D,KAGG,YAAhBN,EACC,yBAAKnmE,UAAU,UAAUM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAChD2kE,EACC,oCACE,kBAACa,GAAA,EAAD,CAAUrgE,IAAKw/D,EAAajmE,UAAU,aAAa2C,KAAMsjE,IACzD,uBAAGjmE,UAAU,eAAeM,IAAKX,EAAKiY,MAAQ,WAAQtW,GACnD3B,EAAQinE,EAAF,oBAGT,kBAAChsD,GAAA,EAAD,CAAUxY,KAAK,SAASgE,QAAM,EAACygB,aAAW,EAAC5mB,QAASqmE,GACjD3mE,EAAK,eAER,kBAACmd,GAAA,EAAD,CACEpb,OAAQ2kE,EACRt/D,QAASw/D,EACT5jE,KAAMhD,EAAK,eACXod,aAAcpd,EAAK,gBACnBqd,eAAgB2pD,EAChBlvC,sBAAoB,KAIxB,kBAACxc,GAAA,EAAD,OAIJ,yBAAKjb,UAAU,qBACb,kBAACy7B,GAAD,CACEnD,QAAM,EACND,gBAAiBj4B,EAAKksB,SACtBqB,UAAWA,EACX4K,oBAAqBA,EACrBC,cAAestC,EACfh6D,SAAU2sB,IAEZ,uBAAGz4B,UAAU,eAAeM,IAAI,QAC7BX,EAAQknE,EAAF,qCAKf,kBAAC,GAAD,CACE17D,QAASq7D,EACT36D,SAAU8hB,EACV7rB,UAAWnC,EAAK,QAChBM,QAASymE,GAER/4C,EACC,kBAACne,EAAA,EAAD,CAAS3N,MAAM,UAEf,uBAAG7B,UAAU,oBCkGRwG,mBAAK/H,YAClB,CAACC,GAAUC,aACT,MAAMyB,EAAOnB,YAAWP,EAAQC,IAC1B,iBAAEooE,EAAkB7uD,KAAM++B,GAAev4C,EAAOuZ,MAKtD,MAAO,CACL7X,OACA62C,aACA8vB,mBACAC,WARiB5mE,GAAQA,EAAKs5B,UAAYt5B,EAAKs5B,SAAS2mC,aACtDphE,YAAWP,EAAQ0B,EAAKs5B,SAAS2mC,mBACjC/+D,EAOFwa,UAAW1b,GAAQkjB,aAAcljB,KAGrC,CAAChB,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,0BAA2B,sBAAuB,0BAjBlCZ,CAxNgD,EAClE2B,OACA2G,UACAwQ,WACA5Y,SACAs4C,aACA+vB,aACAD,mBACAjrD,YACA6b,iBACAsvC,0BACAC,sBACAC,4BAEA,MAAOC,EAAeC,GAAoBrkE,eACnCw5B,EAAeC,GAAoBz5B,eACnC05B,EAAmBC,GAAwB35B,aAAS,GACrD45B,EAAsBl9B,YAAY,IAAMi9B,GAAqB,GAAO,KACnE2qC,EAAgCC,EAA8BC,GAAiCthD,gBAC/FuhD,EAA8BC,EAA4BC,GAA+BzhD,eAC1FvmB,EAAOC,cACPygE,EAAe2G,GAAcA,EAAWrpE,GAE9C+Z,YAAeH,EAAUxQ,GAEzB9D,YAAU,KACRgkE,KACC,CAACA,IAEJhkE,YAAU,KACHu5B,GACHK,aAAiB,oBAAoBC,KAAKL,IAE3C,CAACD,IAEJ,MAAMorC,EAA4BloE,YAAY,KAC5C8nE,IACAL,EAAsB,CAAEU,UAAW/rD,EAAYnd,EAAS0hE,IACnDvkD,GACH6b,EAAewpC,IAAkB2G,UAElC,CAACN,EAA+BL,EAAuBrrD,EAAWnd,EAAQ0hE,EAAc1oC,IAErFowC,EAA0BroE,YAAY,KAC1CioE,IACAT,EAAoB,CAAEW,UAAWlpE,EAAQA,OAAQyoE,KAChD,CAACO,EAA6BT,EAAqBvoE,EAAQyoE,IAoB9D,SAASY,IACP,MAAMC,EAAchxB,EAAWmwB,GAE/B,GAAKa,EAIL,OACE,yBAAKjoE,UAAU,gBACb,kBAACE,EAAA,EAAD,CACEzG,KAAK,OACL2G,KAAM6nE,IAER,yBAAKjoE,UAAU,eACZL,EAAK,uCAMd,SAASuoE,IACP,MAAMD,EAAchxB,EAAWmwB,GAE/B,GAAKa,EAIL,OAAIA,EAAYE,eACP5nE,YACJ,yBAAwB0nE,EAAYrsD,sCAAsCxb,EAAMwb,WACjF,CAAC,KAAM,oBAQJrb,YAEJ,yBAAwB0nE,EAAYrsD,sCAAsCxb,EAAMwb,kFACjF,CAAC,KAAM,oBAqFX,OACE,yBAAK5b,UAAU,cACb,yBAAKA,UAAU,iBACb,yBAAKA,UAAU,WACb,yBAAKA,UAAU,gBACZw8B,GACC,kBAACa,GAAA,EAAD,CACE1/B,GAAG,wBACHlE,KAAM2uE,KACN5rC,cAAeA,EACfjzB,KAAMmzB,EACNa,QAAM,EACNC,OAAQZ,KAIboqC,GA3FL,6BACE,kBAACpsD,GAAA,EAAD,CACE5a,UAAU,sBACVggC,UAAQ,GAER,kBAAChlB,GAAA,EAAD,CAAerc,OAAQqoE,EAAYrpE,MAErC,kBAACid,GAAA,EAAD,CACExY,KAAK,SACLgE,QAAM,EACNygB,aAAW,EACX5mB,QAASsnE,GAER5nE,EAAKmc,EAAY,wBAA0B,4BAE9C,kBAACgB,GAAA,EAAD,CACEpb,OAAQ4lE,EACRvgE,QAASygE,EACTltD,OAhFJ,yBAAKta,UAAU,gBACb,kBAACE,EAAA,EAAD,CACEzG,KAAK,OACL2G,KAAM4mE,IAER,yBAAKhnE,UAAU,eACZL,EAAKmc,EAAY,wBAA0B,6BA2E5CxG,UAAW/U,YACTZ,EAAKmc,EAAY,+BAAiC,6BAA8BkrD,EAAYprD,OAC5F,CAAC,KAAM,oBAETmB,aAAcpd,EAAKmc,EAAY,wBAA0B,2BACzDkB,eAAgB4qD,EAChBnwC,sBAAoB,MAmElBuvC,GA3DN,6BACE,uBAAGhnE,UAAU,eAAeM,IAAI,QAAQX,EAAK,0BAE7C,yBAAK0oE,eAAa,GAChB,kBAACztD,GAAA,EAAD,CACEza,IAAI,eACJiC,KAAK,QACLgE,QAAM,EACNkiE,cAAe,EACftoE,UAAU,mBAETL,EAAK,0BAEPonE,EACCA,EAAiBpsD,IAAI,CAAChd,EAAIsiB,IACxB,kBAACrF,GAAA,EAAD,CACEza,IAAKxC,EACL2qE,cAAeroD,EAAI,EACnBjgB,UAAU,kCACVC,QAAS,KAxHrBonE,EAwH+C1pE,GAvH/C+pE,MAyHY,kBAAC1sD,GAAA,EAAD,CAAerc,OAAQhB,MAI3B,kBAACsvB,GAAA,EAAD,CAAc9sB,IAAI,gBAAgBmoE,cAAe,EAAG3lE,KAAK,gCAG7D,uBAAG3C,UAAU,yBAAyBM,IAAI,QAAQX,EAAK,2BACvD,kBAACmd,GAAA,EAAD,CACEpb,OAAQ+lE,EACR1gE,QAAS4gE,EACTrtD,OAAQ0tD,IACR1yD,UAAW4yD,IACXnrD,aAAcpd,EAAK,uBACnBqd,eAAgB+qD,EAChBQ,mBAAiB,WCiCZ/hE,mBAAK/H,YAClB,CAACC,GAAUC,SAAQ6pE,8BACjB,MAAMpoE,EAAOnB,YAAWP,EAAQC,GAGhC,MAAO,CAAEyB,OAAMqoE,sBAFeroE,EAAKwiE,WAAa4F,KAIlD,CAACppE,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,iCAPpCZ,CAhO0D,EAC5E2B,OACAsoE,uBACA/wC,iBACAotC,+BACA0D,sBACA1hE,UACAwQ,eAEA,MAAOyrD,EAAaC,GAAkBjgE,YAA8B,KAC7DkgE,EAAuBC,GAA4BngE,aAAS,IAC5D2qB,EAAW8wC,GAAgBz7D,aAAS,IACpC2lE,EAA6BC,EAA2BC,GAA8B3iD,eACvFvmB,EAAOC,cAEb8X,YAAeH,EAAUxQ,GAEzB,MAAM+hE,EAAqBtnE,YAAQ,KACjC,GAAKpB,GAASA,EAAKs5B,UAAat5B,EAAKs5B,SAASwqC,QAI9C,OAAO9jE,EAAKs5B,SAASwqC,QAAQpkC,KAAK,EAAG/kB,YAAaA,IAAW2tD,IAC5D,CAACtoE,EAAMsoE,IAEVzlE,YAAU,KACJ7C,GAAQA,EAAKs5B,UAAYgvC,IAAyBI,GACpDnxC,EAAewpC,IAAkBK,mBAElC,CAACphE,EAAMu3B,EAAgBmxC,EAAoBJ,IAE9CzlE,YAAU,KACRggE,EAAgB6F,GAAsBA,EAAmBhF,cAAkB1jE,GAAQA,EAAKkiE,qBAAwB,IAChHa,GAAyB,GACzB1E,GAAa,IACZ,CAACr+D,EAAM0oE,IAEV,MAAMnF,EAAyBjkE,YAAaiE,IAC1C,MAAM,KAAEoU,GAASpU,EAAEsG,OAEnB,SAAS25D,EAA0B19D,GACjC,OAAOA,QAAQ5E,EAGjB2hE,EAAgB15B,IAAD,IACVA,EACH,CAACxxB,GAAO6rD,EAA0Br6B,EAAExxB,OACvB,iBAATA,GAA2B,CAC7ByqD,SAAUoB,EAA0Br6B,EAAExxB,QAG1CorD,GAAyB,IACxB,IAEGU,EAAwBnkE,YAAY,KACnCU,GAASsoE,IAIdjK,GAAa,GACbsG,EAA6B,CAC3BpmE,OAAQyB,EAAKzC,GACbod,OAAQ2tD,EACR5E,aAAcd,MAEf,CAAC5iE,EAAMsoE,EAAsB1F,EAAa+B,IAEvCgE,EAAqBrpE,YAAY,KAChCU,GAASsoE,GAId3D,EAA6B,CAC3BpmE,OAAQyB,EAAKzC,GACbod,OAAQ2tD,EACR5E,aAAc,CACZkF,cAAc,MAGjB,CAAC5oE,EAAMsoE,EAAsB3D,IAE1BkE,EAAuBvpE,YAAaS,KACpCsoE,MAICroE,IAASA,EAAKkiE,sBAIZliE,EAAKkiE,oBAAoBniE,GAC/B,CAACC,EAAMqoE,IAEV,GAAKK,EAIL,OACE,yBAAK9oE,UAAU,cACb,yBAAKA,UAAU,iBACb,yBAAKA,UAAU,WACb,kBAAC4a,GAAA,EAAD,CAAUolB,UAAQ,EAAChgC,UAAU,uBAC3B,kBAAC6a,GAAA,EAAD,CAAiBE,OAAQ+tD,EAAmB/tD,UAG9C,wBAAI/a,UAAU,uBAAuBM,IAAI,QAAQX,EAAK,0BAEtD,yBAAKK,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,eACLspB,SAAU2hC,EAAYuB,aACtBt/C,MAAOtlB,EAAK,wBACZ6kE,UAAQ,EACR34D,SAAUo9D,EAAqB,gBAC/Bn9D,SAAU63D,KAGd,yBAAK3jE,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,YACLspB,SAAU2hC,EAAYyB,UACtBx/C,MAAOtlB,EAAK,6BACZ6kE,UAAQ,EACR34D,SAAUo9D,EAAqB,aAC/Bn9D,SAAU63D,KAGd,yBAAK3jE,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,eACLspB,SAAU2hC,EAAYT,eAAiBS,EAAYR,SACnDv9C,MAAOtlB,EAAK,gCACZ6kE,UAAQ,EACR34D,SAAUo9D,EAAqB,gBAC/Bn9D,SAAU63D,KAGd,yBAAK3jE,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,YACLspB,SAAU2hC,EAAY0B,UACtBz/C,MAAOtlB,EAAK,6BACZ6kE,UAAQ,EACR34D,SAAUo9D,EAAqB,aAC/Bn9D,SAAU63D,KAGd,yBAAK3jE,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,aACLspB,SAAU2hC,EAAY2B,WACtB1/C,MAAOtlB,EAAK,8BACZ6kE,UAAQ,EACR34D,SAAUo9D,EAAqB,cAC/Bn9D,SAAU63D,KAGd,yBAAK3jE,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,cACLspB,SAAU2hC,EAAY4B,YACtB3/C,MAAOtlB,EAAK,+BACZ6kE,UAAQ,EACR34D,SAAUo9D,EAAqB,eAC/Bn9D,SAAU63D,KAGd,yBAAK3jE,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,cACLspB,SAAU2hC,EAAY6B,YACtB5/C,MAAOtlB,EAAK,+BACZ6kE,UAAQ,EACR34D,SAAUo9D,EAAqB,eAC/Bn9D,SAAU63D,KAGd,yBAAK3jE,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,aACLspB,SAAU2hC,EAAY8B,WACtB7/C,MAAOtlB,EAAK,8BACZ6kE,UAAQ,EACR34D,SAAUo9D,EAAqB,cAC/Bn9D,SAAU63D,OAKd8E,GACA,yBAAKzoE,UAAU,WACb,kBAAC4a,GAAA,EAAD,CAAUxY,KAAK,cAAcgE,QAAM,EAACygB,aAAW,EAAC5mB,QAAS2oE,GACtDjpE,EAAK,4BAMd,kBAAC,GAAD,CACEwL,QAAS+3D,EACTjjE,QAAS4jE,EACT/hE,UAAWnC,EAAK,QAChBkM,SAAU8hB,GAETA,EACC,kBAACne,EAAA,EAAD,CAAS3N,MAAM,UAEf,uBAAG7B,UAAU,gBAIjB,kBAAC8c,GAAA,EAAD,CACEpb,OAAQinE,EACR5hE,QAAS8hE,EACTlmE,KAAK,oEACLoa,aAAa,SACbC,eAAgB+rD,EAChBtxC,sBAAoB,QCtIbjxB,mBAAK/H,YAClB,CAACC,GAAUC,aACT,MAAMyB,EAAOnB,YAAWP,EAAQC,IACxBuZ,KAAMoQ,GAAc5pB,EAAO6pB,MAEnC,MAAO,CACLnoB,OACAkY,cAAe5Z,EAAO4Z,cACtBwD,UAAWwH,aAAcljB,GACzBkoB,cATc7pB,CA1FwC,EAC1D2B,OACA0b,YACAxD,gBACAgQ,YACAqP,iBACAmrC,qBACA/7D,UACAwQ,eAEA,MAAM5X,EAAOC,cAEb8X,YAAeH,EAAUxQ,GAMzB,MAAM27D,EAAelhE,YAAQ,IACtBpB,EAAKs5B,UAAat5B,EAAKs5B,SAASgpC,aAI9BtiE,EAAKs5B,SAASgpC,aAAaj2C,KAAK,CAACC,EAAGC,IACrCD,EAAEw8C,SACI,EACCv8C,EAAEu8C,QACJ,EAGF,GAVA,GAYR,CAAC9oE,IAEE+oE,EAAyBzpE,YAAayrD,IAC1C2X,EAAmB3X,EAAOpwC,OAAQowC,EAAOsY,mBAAqBnrD,GAC9Dqf,EAAewpC,IAAkBiI,kBAChC,CAAC9wD,EAAewqD,EAAoBnrC,IAEjC0xC,EAAkB3pE,YAAayrD,IACnC,GAAIA,EAAO+d,QACT,OAAOvpE,EAAK,kBAGd,MAAM2pE,EAAiBne,EAAOsY,iBAAmBn7C,EAAU6iC,EAAOsY,uBAAoBniE,EAEtF,OAAIgoE,EACK3pE,EAAK,sBAAuB0sB,aAAgBi9C,IAG9C3pE,EAAK,iBACX,CAACA,EAAM2oB,IAEV,OACE,yBAAKtoB,UAAU,cACb,yBAAKA,UAAU,iBACb,yBAAKA,UAAU,WACb,kBAAC4a,GAAA,EAAD,CAAUxY,KAAK,SAASw7B,WAAS,EAACx3B,QAAM,EAACnG,QA3CjD,WACE03B,EAAewpC,IAAkBoI,sBA2CzB,0BAAMvpE,UAAU,SAASL,EAAK,aAC9B,0BAAMK,UAAU,YAAYL,EAAKmc,EAAY,4BAA8B,yBAI/E,yBAAK9b,UAAU,UAAUM,IAAKX,EAAKiY,MAAQ,WAAQtW,GACjD,uBAAGtB,UAAU,aAAaM,IAAI,QAC3Bwb,EACG,8DACA,6DAGL4mD,EAAa/nD,IAAKwwC,GACjB,kBAACvwC,GAAA,EAAD,CACEza,IAAKgrD,EAAOpwC,OACZ/a,UAAU,sBACVoG,QAAM,EACNnG,QAAS,IAAMkpE,EAAuBhe,IAEtC,kBAACtwC,GAAA,EAAD,CACEE,OAAQowC,EAAOpwC,OACfD,OAAQuuD,EAAgBle,GACxB3N,eAAa,YCuCdh3C,mBAAK/H,YAClB,CAACC,GAAUC,aAGF,CAAEyB,KAFInB,YAAWP,EAAQC,KAFhBF,CA9HwC,EAAG2B,OAAM2G,UAASwQ,eAC5E,MAAM5X,EAAOC,cAEb8X,YAAeH,EAAUxQ,GAEzB,MAAM27D,EAAelhE,YAAQ,IACtBpB,GAASA,EAAKs5B,UAAat5B,EAAKs5B,SAASgpC,aAIvCtiE,EAAKs5B,SAASgpC,aAAaj2C,KAAK,CAACC,EAAGC,IACrCD,EAAEw8C,SACI,EACCv8C,EAAEu8C,QACJ,EAGF,GAVA,GAYR,CAAC9oE,IAEEipE,EAAkB3pE,YAAayrD,GAC/BA,EAAO+d,QACFvpE,EAAK,kBAGPA,EAAK,gBACX,CAACA,IAEJ,OACE,yBAAKK,UAAU,cACb,yBAAKA,UAAU,iBACb,yBAAKA,UAAU,0BAA0BM,IAAKX,EAAKiY,MAAQ,WAAQtW,GACjE,wBAAItB,UAAU,kBAAkBM,IAAI,QAApC,WAEA,yBAAKN,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,aACLspB,SAAS,EACTpc,MAAOtlB,EAAK,qBACZmM,cAAUxK,KAGd,yBAAKtB,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,aACLspB,SAAS,EACTpc,MAAOtlB,EAAK,2BACZmM,cAAUxK,KAGd,yBAAKtB,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,aACLspB,SAAS,EACTpc,MAAOtlB,EAAK,4BACZmM,cAAUxK,KAGd,yBAAKtB,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,aACLspB,SAAS,EACTpc,MAAOtlB,EAAK,6BACZmM,cAAUxK,KAGd,yBAAKtB,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,aACLspB,SAAS,EACTpc,MAAOtlB,EAAK,iCACZmM,cAAUxK,KAGd,yBAAKtB,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,aACLspB,SAAS,EACTpc,MAAOtlB,EAAK,gCACZmM,cAAUxK,KAGd,yBAAKtB,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,aACLspB,SAAS,EACTpc,MAAOtlB,EAAK,gCACZmM,cAAUxK,MAKhB,yBAAKtB,UAAU,0BAA0BM,IAAKX,EAAKiY,MAAQ,WAAQtW,GACjE,wBAAItB,UAAU,kBAAkBM,IAAI,QAAQX,EAAK,6BAEjD,yBAAKK,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,aACLspB,SAAS,EACTpc,MAAOtlB,EAAK,qBACZmM,cAAUxK,KAIbohE,EAAa/nD,IAAKwwC,GACjB,kBAACvwC,GAAA,EAAD,CACEza,IAAKgrD,EAAOpwC,OACZ/a,UAAU,uCACVC,aAASqB,EACT8E,QAAM,GAEN,kBAACg7B,GAAA,EAAD,CAAUnc,MAAM,GAAGoc,SAAS,IAC5B,kBAACxmB,GAAA,EAAD,CACEE,OAAQowC,EAAOpwC,OACfD,OAAQuuD,EAAgBle,GACxB3N,eAAa,YCoMdh3C,mBAAK/H,YAClB,CAACC,GAAUC,SAAQ6pE,8BACjB,MAAMpoE,EAAOnB,YAAWP,EAAQC,IACxBuZ,KAAMoQ,GAAc5pB,EAAO6pB,OAC7B,cAAEjQ,GAAkB5Z,EAI1B,MAAO,CACL0B,OACAkoB,YACAhQ,gBACAwD,UAPgBwH,aAAcljB,GAQ9BqoE,sBAP4BroE,EAAKwiE,WAAa4F,KAUlD,CAACppE,EAAWC,IAA2BC,YAAKD,EAAS,CAAC,oBAhBpCZ,CAnSsD,EACxEiqE,uBACA/wC,iBACAv3B,OACAkoB,YACAhQ,gBACAwD,YACA2sD,sBACAe,kBACAziE,UACAwQ,eAEA,MAAOyrD,EAAaC,GAAkBjgE,YAA6B,KAC5DkwB,EAAWu2C,GAAgBzmE,aAAS,IACpC2qB,EAAW8wC,GAAgBz7D,aAAS,IACpC0mE,EAAiCC,EAA+BC,GAAkC1jD,gBAClG2jD,EAAaC,GAAkB9mE,YAAS,IACzCrD,EAAOC,cAEb8X,YAAeH,EAAUxQ,GAEzB,MAAM+hE,EAAqBtnE,YAAQ,KACjC,GAAKpB,EAAKs5B,UAAat5B,EAAKs5B,SAASgpC,aAIrC,OAAOtiE,EAAKs5B,SAASgpC,aAAa5iC,KAAK,EAAG/kB,YAAaA,IAAW2tD,IACjE,CAACtoE,EAAMsoE,IAEVzlE,YAAU,KACJ7C,GAAQA,EAAKs5B,UAAYgvC,IAAyBI,GACpDnxC,EAAewpC,IAAkBO,qBAElC,CAACthE,EAAMu3B,EAAgBmxC,EAAoBJ,IAE9CzlE,YAAU,KACRggE,EAAgB6F,GAAsBA,EAAmBiB,aAAgB,IACzED,GAAiBhB,GAAsBA,EAAmBe,aAAgB,IAAI/1B,OAAO,EAvCzD,KAwC5B21B,GAAa,GACbhL,GAAa,IACZ,CAACqK,IAEJ,MAAMnF,EAAyBjkE,YAAaiE,IAC1C,MAAM,KAAEoU,GAASpU,EAAEsG,OAMnBg5D,EAAgB15B,IAAD,UACVA,EACH,CAACxxB,IANgC7R,EAMCqjC,EAAExxB,IAL7B7R,QAAQ5E,IADjB,IAAmC4E,IAQnCujE,GAAa,IACZ,IAEG5F,EAAwBnkE,YAAY,KACnCgpE,IAILjK,GAAa,GACb+K,EAAgB,CACd7qE,OAAQyB,EAAKzC,GACbod,OAAQ2tD,EACRqB,YAAa/G,EACb6G,kBAED,CAACzpE,EAAMsoE,EAAsB1F,EAAa6G,EAAaL,IAEpDQ,EAAqBtqE,YAAY,KAChCgpE,IAILc,EAAgB,CACd7qE,OAAQyB,EAAKzC,GACbod,OAAQ2tD,EACRqB,YAAa,KAEfH,MACC,CAACxpE,EAAKzC,GAAIisE,EAAgClB,EAAsBc,IAE7DP,EAAuBvpE,YAAaS,IACpCqiB,aAAiBpiB,QAIjBqoE,GAAwBroE,EAAK2pE,eAIzB3pE,EAAK2pE,YAAa5pE,IACzB,CAACC,EAAMqoE,IAEJwB,EAAezoE,YAAQ,KAC3B,IAAKsnE,EACH,OAGF,GAAIA,EAAmBI,QACrB,OAAOvpE,EAAK,kBAGd,MAAM2pE,EAAiBR,EAAmBrF,iBACtCn7C,EAAUwgD,EAAmBrF,uBAC7BniE,EAEJ,OAAIgoE,EACK3pE,EAAK,sBAAuB0sB,aAAgBi9C,IAG9C3pE,EAAK,iBACX,CAACmpE,EAAoBxgD,EAAW3oB,IAE7BuqE,EAA0BxqE,YAAaiE,IAC3C,MAAM,MAAEuC,GAAUvC,EAAEsG,OACpB6/D,EAAe5jE,GACfujE,GAAa,IACZ,IAEH,GAAKX,EAIL,OACE,yBAAK9oE,UAAU,cACb,yBAAKA,UAAU,iBACb,yBAAKA,UAAU,WACb,kBAAC4a,GAAA,EAAD,CAAUolB,UAAQ,EAAChgC,UAAU,uBAC3B,kBAAC6a,GAAA,EAAD,CACEE,OAAQ+tD,EAAmB/tD,OAC3BD,OAAQmvD,EACRzsB,eAAa,KAIjB,wBAAIx9C,UAAU,uBAAuBM,IAAI,QAAQX,EAAK,uBAEtD,yBAAKK,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,aACLspB,UAAW2hC,EAAY8B,WACvB7/C,MAAOtlB,EAAKmc,EAAY,6BAA+B,4BACvD0oD,UAAQ,EACR34D,SAAUo9D,EAAqB,cAC/Bn9D,SAAU63D,KAGb7nD,GACC,yBAAK9b,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,eACLspB,UAAW2hC,EAAYmH,aACvBllD,MAAOtlB,EAAK,yBACZ6kE,UAAQ,EACR34D,SAAUo9D,EAAqB,gBAC/Bn9D,SAAU63D,KAIf7nD,GACC,yBAAK9b,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,eACLspB,UAAW2hC,EAAYoH,aACvBnlD,MAAOtlB,EAAK,yBACZ6kE,UAAQ,EACR34D,SAAUo9D,EAAqB,gBAC/Bn9D,SAAU63D,KAIhB,yBAAK3jE,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,iBACLspB,UAAW2hC,EAAYpgD,eACvBqC,MAAOtlB,EAAKmc,EAAY,0BAA4B,gCACpD0oD,UAAQ,EACR34D,SAAUo9D,EAAqB,kBAC/Bn9D,SAAU63D,MAGZ7nD,GACA,yBAAK9b,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,WACLspB,UAAW2hC,EAAYqH,SACvBplD,MAAOtlB,EAAK,qBACZ6kE,UAAQ,EACR34D,SAAUo9D,EAAqB,YAC/Bn9D,SAAU63D,KAIhB,yBAAK3jE,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,cACLspB,UAAW2hC,EAAY4B,YACvB3/C,MAAOtlB,EAAK,qBACZ6kE,UAAQ,EACR34D,SAAUo9D,EAAqB,eAC/Bn9D,SAAU63D,MAGZ7nD,GACA,yBAAK9b,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,cACLspB,UAAW2hC,EAAY6B,YACvB5/C,MAAOtlB,EAAK,wBACZ6kE,UAAQ,EACR34D,SAAUo9D,EAAqB,eAC/Bn9D,SAAU63D,KAIhB,yBAAK3jE,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,YACLspB,UAAW2hC,EAAYsH,UACvBrlD,MAAOtlB,EAAK,sBACZ6kE,UAAQ,EACR34D,SAAUo9D,EAAqB,aAC/Bn9D,SAAU63D,MAGZ7nD,GACA,yBAAK9b,UAAU,yBACb,kBAACohC,GAAA,EAAD,CACErpB,KAAK,YACLspB,UAAW2hC,EAAYuH,UACvBtlD,MAAOtlB,EAAK,4BACZ6kE,UAAQ,EACR34D,SAAUo9D,EAAqB,aAC/Bn9D,SAAU63D,KAKf8E,GACC,uBAAGzoE,UAAU,oBAAoBM,IAAI,QAClCX,EAAK,kCAIRmc,GACA,kBAAC5B,GAAA,EAAD,CACEvc,GAAG,cACHsnB,MAAOtlB,EAAK,iBACZmM,SAAUo+D,EACVhkE,MAAO2jE,EACPh+D,SAAU48D,EACV+B,UA/PkB,KAmQrBlyD,IAAkBowD,IAAyBD,GAC1C,kBAAC7tD,GAAA,EAAD,CAAUxY,KAAK,SAASgE,QAAM,EAACygB,aAAW,EAAC5mB,QAAS0pE,GACjDhqE,EAAK,2BAMd,kBAAC,GAAD,CACEwL,QAAS+nB,EACTjzB,QAAS4jE,EACT/hE,UAAWnC,EAAK,QAChBkM,SAAU8hB,GAETA,EACC,kBAACne,EAAA,EAAD,CAAS3N,MAAM,UAEf,uBAAG7B,UAAU,gBAIjB,kBAAC8c,GAAA,EAAD,CACEpb,OAAQgoE,EACR3iE,QAAS6iE,EACTjnE,KAAK,+CACLoa,aAAa,UACbC,eAAgBgtD,EAChBvyC,sBAAoB,QCvPbjxB,mBAAK/H,YAClB,CAACC,GAAUC,aACT,MAAMyB,EAAOnB,YAAWP,EAAQC,IACxBuZ,KAAMoQ,GAAc5pB,EAAO6pB,MAInC,MAAO,CACL27C,QAJc9jE,GAAQA,EAAKs5B,UAAYt5B,EAAKs5B,SAASwqC,QAKrD57C,YACAxM,UALgB1b,GAAQkjB,aAAcljB,GAMtCi9C,iBAAkB3+C,EAAO2+C,mBAG7B,CAACj+C,EAAWC,IAA2BC,YAAKD,EAAS,CACnD,iBAfgBZ,CAnDkD,EACpEylE,UACA57C,YACAxM,YACA2uD,eACA1jE,UACAwQ,WACA8lC,uBAEA,MAAMa,EAAY18C,YAAQ,KACxB,GAAK0iE,GAAY57C,EAIjB,OAAOi1B,aAAY2mB,EAAQvpD,IAAI,EAAGI,YAAaA,GAASuN,OAAWhnB,EAAW+7C,IAC7E,CAAC6mB,EAAS7mB,EAAkB/0B,IAEzBw2C,EAAoBp/D,YAAa/B,IACrC8sE,EAAa,CAAE9sE,QACd,CAAC8sE,IAIJ,OAFA/yD,YAAeH,EAAUxQ,GAGvB,yBAAK/G,UAAU,cACb,yBAAKA,UAAU,iBACb,yBAAKA,UAAU,UAAUqoE,eAAa,GACnCnqB,EACCA,EAAUvjC,IAAI,CAAChd,EAAIsiB,IACjB,kBAACrF,GAAA,EAAD,CACEza,IAAKxC,EACL2qE,cAAeroD,EACfjgB,UAAU,kCACVC,QAAS,IAAM6+D,EAAkBnhE,IAEjC,kBAACkd,GAAA,EAAD,CAAiBE,OAAQpd,EAAI6/C,eAAa,MAI9C,kBAACvwB,GAAA,EAAD,CACEq7C,cAAe,EACfnoE,IAAI,gBACJwC,KAAMmZ,EAAY,uBAAyB,2BCe1CtV,mBAAK/H,YAClB,CAACC,GAAUC,aACT,MAAMyB,EAAOnB,YAAWP,EAAQC,IACxBuZ,KAAMoQ,GAAc5pB,EAAO6pB,MAInC,MAAO,CACL27C,QAJc9jE,GAAQA,EAAKs5B,UAAYt5B,EAAKs5B,SAASwqC,QAKrD57C,YACAxM,UALgB1b,GAAQkjB,aAAcljB,GAMtCi9C,iBAAkB3+C,EAAO2+C,mBAXX5+C,CAzDgD,EAClE6pB,YACA47C,UACApoD,YACA6b,iBACAmrC,qBACA/7D,UACAwQ,WACA8lC,uBAEA3lC,YAAeH,EAAUxQ,GAEzB,MAAMm3C,EAAY18C,YAAQ,KACxB,GAAK0iE,GAAY57C,EAIjB,OAAOi1B,aACL2mB,EAAQnrD,OAAQoyC,IAAYA,EAAO+d,SAASvuD,IAAI,EAAGI,YAAaA,GAChEuN,OAAWhnB,EAAW+7C,IAEvB,CAAC6mB,EAAS7mB,EAAkB/0B,IAEzBk7C,EAA6B9jE,YAAagrE,IAC9C5H,EAAmB4H,GACnB/yC,EAAewpC,IAAkBuC,uBAChC,CAACZ,EAAoBnrC,IAExB,OACE,yBAAK33B,UAAU,cACb,yBAAKA,UAAU,iBACb,yBAAKA,UAAU,UAAUqoE,eAAa,GACnCnqB,EACCA,EAAUvjC,IAAI,CAAChd,EAAIsiB,IACjB,kBAACrF,GAAA,EAAD,CACEza,IAAKxC,EACL2qE,cAAeroD,EACfjgB,UAAU,kCACVC,QAAS,IAAMujE,EAA2B7lE,IAE1C,kBAACkd,GAAA,EAAD,CAAiBE,OAAQpd,EAAI6/C,eAAa,MAI9C,kBAACvwB,GAAA,EAAD,CACEq7C,cAAe,EACfnoE,IAAI,gBACJwC,KAAMmZ,EAAY,uBAAyB,2BC4I1CtV,mBAAK/H,YACjBC,IAGQ,CACLisE,eAHqBC,YAA4BlsE,KAFnCD,CAtL0B,EAC5CE,SACA+0B,gBACAg1C,uBACAF,0BACA7wC,iBACAmrC,qBACA/7D,UACAwQ,WACAozD,qBAEA,OAAQj3C,GACN,KAAKytC,IAAkB2G,QACrB,OAAQ6C,GACN,IAAK,OACH,OACE,kBAAC,GAAD,CACExqE,IAAKxB,EACLoc,OAAQpc,EACRoI,QAASA,EACTwQ,SAAUA,IAGhB,IAAK,QACH,OACE,kBAAC,GAAD,CACEpX,IAAKxB,EACLA,OAAQA,EACRg5B,eAAgBA,EAChB5wB,QAASA,EACTwQ,SAAUA,GAAY,CACpB4pD,IAAkBC,gBAClBD,IAAkBG,WAClBH,IAAkBK,iBAClBL,IAAkBO,mBAClBP,IAAkBkC,kBAClBlC,IAAkBoC,2BAClBpC,IAAkBuC,qBAClBvC,IAAkBiI,gBAClBjI,IAAkBoI,oBAClBlwE,SAASq6B,KAGjB,IAAK,UACH,OACE,kBAAC,GAAD,CACEvzB,IAAKxB,EACLA,OAAQA,EACRg5B,eAAgBA,EAChB5wB,QAASA,EACTwQ,SAAUA,GAAY,CACpB4pD,IAAkBwE,mBAClBxE,IAAkBO,mBAClBP,IAAkBG,WAClBH,IAAkBC,gBAClBD,IAAkBiI,gBAClBjI,IAAkBoI,oBAClBlwE,SAASq6B,KAKnB,MAGF,KAAKytC,IAAkBC,gBACrB,OACE,kBAAC,GAAD,CACEziE,OAAQA,EACR4Y,SAAUA,EACVxQ,QAASA,IAIf,KAAKo6D,IAAkBG,WACrB,OACE,kBAAC,GAAD,CACE3iE,OAAQA,EACRg5B,eAAgBA,EAChBpgB,SAAUA,EACVxQ,QAASA,IAIf,KAAKo6D,IAAkBK,iBACrB,OACE,kBAAC,GAAD,CACE7iE,OAAQA,EACRg5B,eAAgBA,EAChBmrC,mBAAoBA,EACpBvrD,SAAUA,GAAY,CACpB4pD,IAAkBkC,kBAClBlC,IAAkBoC,2BAClBpC,IAAkBuC,sBAClBrqE,SAASq6B,GACX3sB,QAASA,IAIf,KAAKo6D,IAAkBkC,kBACrB,OACE,kBAAC,GAAD,CACE1kE,OAAQA,EACR4Y,SAAUA,EACVxQ,QAASA,IAIf,KAAKo6D,IAAkBoC,2BACrB,OACE,kBAAC,GAAD,CACE5kE,OAAQA,EACRmkE,mBAAoBA,EACpBnrC,eAAgBA,EAChBpgB,SAAUA,GAAY,CACpB4pD,IAAkBuC,sBAClBrqE,SAASq6B,GACX3sB,QAASA,IAIf,KAAKo6D,IAAkBuC,qBACrB,OACE,kBAAC,GAAD,CACE/kE,OAAQA,EACR+pE,qBAAsBA,EACtBF,wBAAyBA,EACzB7wC,eAAgBA,EAChBpgB,SAAUA,EACVxQ,QAASA,IAIf,KAAKo6D,IAAkBO,mBACrB,OACE,kBAAC,GAAD,CACE/iE,OAAQA,EACRg5B,eAAgBA,EAChBmrC,mBAAoBA,EACpBvrD,SAAUA,GAAY,CACpB4pD,IAAkBiI,gBAClBjI,IAAkBoI,oBAClBlwE,SAASq6B,GACX3sB,QAASA,IAIf,KAAKo6D,IAAkBoI,mBACrB,OACE,kBAAC,GAAD,CACE5qE,OAAQA,EACR4Y,SAAUA,EACVxQ,QAASA,IAIf,KAAKo6D,IAAkBiI,gBACrB,OACE,kBAAC,GAAD,CACEzqE,OAAQA,EACR+pE,qBAAsBA,EACtBF,wBAAyBA,EACzB7wC,eAAgBA,EAChBpgB,SAAUA,EACVxQ,QAASA,IAIf,KAAKo6D,IAAkBwE,mBACvB,KAAKxE,IAAkBc,aACrB,OACE,kBAAC,GAAD,CACEtjE,OAAQA,EACR4Y,SAAUA,EACVxQ,QAASA,QClNnB,MAAM8jE,GAAqC,CACzCC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,OAGA,SAASC,GAAgBC,GAC9B,OAAKA,GAGEV,GAAWU,IAFT,GCbX,MAAMC,GAAO,8BACPC,GAAc,uBACdC,GAAc,uBAEb,IAAKC,I,SAAAA,O,qBAAAA,I,eAAAA,I,4BAAAA,Q,KAMZ,MAAMC,GAAgC,CACpC,CAACD,GAASE,SAAU,GACpB,CAACF,GAASG,MAAO,OACjB,CAACH,GAASI,YAAa,cAGlB,SAASC,GAAeC,GAE7B,OADAA,EAAaA,EAAW3rD,QAAQ,MAAO,IACnCkrD,GAAK3yC,KAAKozC,GACLN,GAASG,KAEdL,GAAY5yC,KAAKozC,IAAeP,GAAY7yC,KAAKozC,GAC5CN,GAASI,WAEXJ,GAASE,Q,aCSlB,MAAM/4C,GAA2B,CAC/Bo5C,YAAa,GACbC,YAAa,GACbC,KAAM,GACNh7C,MAAO,GACPi7C,YAAa,GACbC,SAAU,GACVlgD,SAAU,GACVoH,MAAO,GACP+4C,MAAO,GACPC,SAAU,GACVP,WAAY,GACZQ,WAAY,GACZC,OAAQ,GACRC,IAAK,GACLC,eAAgB,GAChBC,WAAY,GACZC,UAAU,EACVC,iBAAiB,EACjBC,WAAY,IAGR/7C,GAAgD,CAACG,EAAOE,KAC5D,OAAQA,EAAOtrB,MACb,IAAK,iBACH,MAAO,IACForB,EACH86C,YAAa56C,EAAO2B,QACpB+5C,WAAY,IACP57C,EAAM47C,WACTd,iBAAa5qE,IAGnB,IAAK,iBACH,MAAO,IACF8vB,EACH+6C,YAAa76C,EAAO2B,QACpB+5C,WAAY,IACP57C,EAAM47C,WACTb,iBAAa7qE,IAGnB,IAAK,aACH,MAAO,IACF8vB,EACHg7C,KAAM96C,EAAO2B,QACb+5C,WAAY,IACP57C,EAAM47C,WACTZ,UAAM9qE,IAGZ,IAAK,cACH,MAAO,IACF8vB,EACHA,MAAOE,EAAO2B,QACd+5C,WAAY,IACP57C,EAAM47C,WACT57C,WAAO9vB,IAGb,IAAK,gBACH,MAAO,IACF8vB,EACHi7C,YAAa/6C,EAAO2B,QACpB25C,eAAgBK,GAAkB37C,EAAO2B,SACzC+5C,WAAY,IACP57C,EAAM47C,WACTX,iBAAa/qE,IAGnB,IAAK,iBACH,MAAO,IACF8vB,EACHk7C,SAAUh7C,EAAO2B,QACjB+5C,WAAY,IACP57C,EAAM47C,WACTV,cAAUhrE,IAGhB,IAAK,iBACH,MAAO,IACF8vB,EACHhF,SAAUkF,EAAO2B,QACjB+5C,WAAY,IACP57C,EAAM47C,WACT5gD,cAAU9qB,IAGhB,IAAK,cACH,MAAO,IACF8vB,EACHoC,MAAOlC,EAAO2B,QACd+5C,WAAY,IACP57C,EAAM47C,WACTx5C,WAAOlyB,IAGb,IAAK,cACH,MAAO,IACF8vB,EACHm7C,MAAOj7C,EAAO2B,QACd+5C,WAAY,IACP57C,EAAM47C,WACTT,WAAOjrE,IAGb,IAAK,iBACH,MAAO,IAAK8vB,EAAOo7C,SAAUl7C,EAAO2B,SACtC,IAAK,mBACH,MAAO,IACF7B,EACH66C,WAAY36C,EAAO2B,QACnB+5C,WAAY,IACP57C,EAAM47C,WACTf,gBAAY3qE,IAGlB,IAAK,mBACH,MAAO,IACF8vB,EACHq7C,WAAYn7C,EAAO2B,QACnB+5C,WAAY,IACP57C,EAAM47C,WACTP,gBAAYnrE,IAGlB,IAAK,mBACH,MAAO,IACF8vB,EACHs7C,OAAQp7C,EAAO2B,QACf+5C,WAAY,IACP57C,EAAM47C,WACTN,YAAQprE,IAGd,IAAK,gBACH,MAAO,IACF8vB,EACHu7C,IAAKr7C,EAAO2B,QACZ+5C,WAAY,IACP57C,EAAM47C,WACTL,SAAKrrE,IAGX,IAAK,uBACH,MAAO,IACF8vB,EACHw7C,eAAgBt7C,EAAO2B,QACvB+5C,WAAY,IACP57C,EAAM47C,WACTJ,oBAAgBtrE,IAGtB,IAAK,mBACH,MAAO,IACF8vB,EACHy7C,WAAYv7C,EAAO2B,QACnB+5C,WAAY,IACP57C,EAAM47C,WACTH,gBAAYvrE,IAGlB,IAAK,iBACH,MAAO,IAAK8vB,EAAO07C,SAAUx7C,EAAO2B,SACtC,IAAK,wBACH,MAAO,IAAK7B,EAAO27C,gBAAiBz7C,EAAO2B,SAC7C,IAAK,iBACH,OAAI3B,EAAO2B,QAAQo5C,YACV,IACFj7C,KACAE,EAAO2B,QACV25C,eAAgBK,GAAkB37C,EAAO2B,QAAQo5C,cAG9C,IAAKj7C,KAAUE,EAAO2B,SAC/B,IAAK,gBACH,MAAO,IACF7B,EACH47C,WAAY,IACP57C,EAAM47C,cACN17C,EAAO2B,UAGhB,QACE,OAAO7B,IAIb,SAAS67C,GAAkBC,GACzB,MAAMt3B,EAAUu3B,KAAYrtC,KAAK,EAAGniC,QAASA,IAAOuvE,GACpD,OAAOt3B,EAAUA,EAAQ79B,KAAO,GCvNnB,SAASq1D,GACtB3iE,EAAkC4iE,EAHX,KAKvBpqE,YAAU,KACJkE,KAIJhM,WAAW,KACTy+D,YAAQ,KACFnvD,EAAIvC,SACNuC,EAAIvC,QAAQ+Q,WAGfo0D,IACF,CAAC5iE,EAAK4iE,ICoCI7mE,mBAzCe8mB,IAC5B,MAAM,GACJ3vB,EADI,MAEJuI,EAFI,MAGJ+e,EAHI,SAIJqoD,EAJI,MAKJnyD,EALI,IAMJ1Q,EANI,YAOJ2P,EAPI,SAQJtO,EARI,SASJU,GACE8gB,EACEigD,EAAYpyD,GAAS8J,EACrB0f,EAAgBjhC,YACpB,cACAwC,GAAS,UACTiV,GAAS,QACToyD,GAAa,aACbD,GAAY,aACZ,eAGF,OACE,yBAAKttE,UAAW2kC,GACd,4BACE3kC,UAAU,eACVrC,GAAIA,EACJuI,MAAOA,GAAS,GAChB4F,SAAUA,EACVsO,YAAaA,GAAe6K,EAC5Bxa,IAAKA,GAEJ+B,GAEF+gE,GAAa5vE,GACZ,2BAAO6vE,QAAS7vE,GAAK4vE,M,OCqJd/mE,mBAlLoB,EACjC4qB,QACAq8C,YACAC,YACAC,WACAC,cACAvvC,eAGA,MAAM9yB,EAAWtE,YAAyB,MAEpC4mE,EAAW5mE,YAAyB,MAEpC6mE,EAAmB7mE,YAA0B,MAEnDhE,YAAU,KACJ6qE,EAAiB5lE,SAChB4lE,EAAiB5lE,QAAQhC,QAAUkrB,EAAMi7C,cAC5CyB,EAAiB5lE,QAAQhC,MAAQkrB,EAAMi7C,cAExC,CAACj7C,EAAMi7C,cAEV,MAAM1sE,EAAOC,cAEbwtE,GAAuB7hE,GAEvB,MAAMwiE,EAAuBruE,YAAaiE,IACxC06B,EAAS,CAAEr4B,KAAM,iBAAkBitB,QAAStvB,EAAEsG,OAAO/D,SACpD,CAACm4B,IAEE2vC,EAAuBtuE,YAAaiE,IACxC06B,EAAS,CAAEr4B,KAAM,iBAAkBitB,QAAStvB,EAAEsG,OAAO/D,SACpD,CAACm4B,IAEE4vC,EAAmBvuE,YAAaiE,IACpC06B,EAAS,CAAEr4B,KAAM,aAAcitB,QAAStvB,EAAEsG,OAAO/D,SAChD,CAACm4B,IAEE6vC,EAAoBxuE,YAAaiE,IACrC06B,EAAS,CAAEr4B,KAAM,cAAeitB,QAAStvB,EAAEsG,OAAO/D,SACjD,CAACm4B,IAEE8vC,EAAsBzuE,YAAaiE,IACvC06B,EAAS,CAAEr4B,KAAM,gBAAiBitB,QAAStvB,EAAEsG,OAAO/D,SACnD,CAACm4B,IAEE+vC,EAAuB1uE,YAAaiE,IACxC06B,EAAS,CAAEr4B,KAAM,iBAAkBitB,QAAStvB,EAAEsG,OAAO/D,SACpD,CAACm4B,IAEEgwC,EAAuB3uE,YAAaiE,IACxC06B,EAAS,CAAEr4B,KAAM,iBAAkBitB,QAAStvB,EAAEsG,OAAO/D,SACpD,CAACm4B,IAEEiwC,EAAoB5uE,YAAaiE,IACrC06B,EAAS,CAAEr4B,KAAM,cAAeitB,QAAStvB,EAAEsG,OAAO/D,SACjD,CAACm4B,IAEEkwC,EAAoB7uE,YAAaiE,IACrC,IAAI,MAAEuC,GAAUvC,EAAEsG,OAClB/D,EAAS,IAAGA,EAAMoa,QAAQ,MAAO,IAC7ButD,EAAS3lE,UACX2lE,EAAS3lE,QAAQhC,MAAQA,GAE3Bm4B,EAAS,CAAEr4B,KAAM,cAAeitB,QAAS/sB,KACxC,CAACm4B,IAEEmwC,EAAuB9uE,YAAaiE,IACxC06B,EAAS,CAAEr4B,KAAM,iBAAkBitB,QAAStvB,EAAEsG,OAAO/D,SACpD,CAACm4B,KAEE,WAAE2uC,GAAe57C,EACvB,OACE,yBAAKpxB,UAAU,gBACb,8BACG4tE,EACC,6BACE,4BAAKjuE,EAAK,2BACV,kBAACua,GAAA,EAAD,CACEzP,IAAKc,EACL0Z,MAAM,oBACNnZ,SAAUiiE,EACV7nE,MAAOkrB,EAAM86C,YACb5qD,UAAU,OACVnG,MAAO6xD,EAAWd,cAEpB,kBAAChyD,GAAA,EAAD,CACE+K,MAAM,oBACNnZ,SAAUkiE,EACV9nE,MAAOkrB,EAAM+6C,YACb7qD,UAAU,OACVnG,MAAO6xD,EAAWb,cAEpB,kBAACjyD,GAAA,EAAD,CACE+K,MAAM,OACNnZ,SAAUmiE,EACV/nE,MAAOkrB,EAAMg7C,KACb9qD,UAAU,OACVnG,MAAO6xD,EAAWZ,OAEpB,kBAAClyD,GAAA,EAAD,CACE+K,MAAM,QACNnZ,SAAUoiE,EACVhoE,MAAOkrB,EAAMA,MACb9P,UAAU,OACVnG,MAAO6xD,EAAW57C,QAEpB,kBAAC,GAAD,CACEnM,MAAM,UACN7K,YAAY,UACZtO,SAAUqiE,EACVjoE,MAAOkrB,EAAMi7C,YACbiB,SAAU1lE,SAAQ,GAClBjK,GAAG,mBACHwd,MAAO6xD,EAAWX,YAClB5hE,IAAKqjE,GAEJX,KAAYxyD,IAAI,EAAG5C,OAAMpa,QACxB,4BACEuI,MAAOvI,EACPqC,UAAU,eAET+X,KAKP,kBAACmC,GAAA,EAAD,CACE+K,MAAM,YACNnZ,SAAUsiE,EACVloE,MAAOkrB,EAAMk7C,SACbhrD,UAAU,OACVnG,MAAO6xD,EAAWV,iBAGpBhrE,EACFqsE,GAAYF,GAAaC,EACzB,4BAAK/tE,EAAK,iCACR2B,EACFqsE,GACA,kBAACzzD,GAAA,EAAD,CACE+K,MAAM,YACNnZ,SAAUuiE,EACVnoE,MAAOkrB,EAAMhF,SACb9K,UAAU,OACVnG,MAAO6xD,EAAW5gD,WAGpBqhD,GACA,kBAACvzD,GAAA,EAAD,CACE+K,MAAM,QACNnZ,SAAUwiE,EACVpoE,MAAOkrB,EAAMoC,MACblS,UAAU,QACVnG,MAAO6xD,EAAWx5C,QAGpBk6C,GACA,kBAACxzD,GAAA,EAAD,CACE+K,MAAM,eACNnZ,SAAUyiE,EACVroE,MAAOkrB,EAAMm7C,MACbjrD,UAAU,MACVnG,MAAO6xD,EAAWT,MAClB9hE,IAAKojE,IAGT,kBAACzsC,GAAA,EAAD,CACEnc,MAAOtlB,EAAK,uBACZonC,SAAUpnC,EAAK,2BACf0hC,QAASz5B,QAAQwpB,EAAM07C,UACvBhhE,SAAU0iE,Q,OC1ILhoE,mBAtCgB,EAC7B4qB,QACAq9C,kBACAlD,WACAltC,eAEAp7B,YAAU,KACHwrE,IAAmBr9C,EAAMo7C,UAG9BnuC,EAAS,CAAEr4B,KAAM,iBAAkBitB,QAASw7C,EAAgB,GAAG9wE,MAC9D,CAAC8wE,EAAiBr9C,EAAMo7C,SAAUnuC,IAErC,MAAMqwC,EAAuBhvE,YAAawG,IACxCm4B,EAAS,CAAEr4B,KAAM,iBAAkBitB,QAAS/sB,KAC3C,CAACm4B,IAEElZ,EAAU3jB,YAAQ,IAAOitE,EAAgB9zD,IAAI,EAAGhd,GAAIuI,EAAO0V,MAAOqJ,EAAO0pD,aAA5B,CACjD1pD,QACA8hB,SAAW,GAAEwkC,KAAYvtD,OAAO2wD,EAAS,OACzCzoE,WACI,CAACuoE,EAAiBlD,IAExB,OACE,yBAAKvrE,UAAU,YACb,8BACE,qDACA,kBAACklB,GAAA,EAAD,CACEnN,KAAK,mBACLoN,QAASA,EACTrZ,SAAU4iE,EACVtpD,SAAUgM,EAAMo7C,e,OC+B1B,SAASoC,GAAkBhzD,EAAe1V,EAAeqlE,EAAmBsD,GAAO,GACjF,OACE,yBAAK7uE,UAAY,oBAAkB6uE,EAAO,uBAAyB,KACjE,yBAAK7uE,UAAU,SACX4b,GAEJ,yBAAK5b,UAAU,SACV,GAAEurE,GAAY,OAAOrlE,EAAQ,KAAK3B,QAAQ,OAMrD,SAASuqE,GAAmB1sE,EAAcwZ,EAAeohB,GACvD,OACE,yBAAKh9B,UAAU,sBACb,uBAAGA,UAAWoC,GAAd,KACA,yBAAKpC,UAAU,QACb,yBAAKA,UAAU,SACX4b,GAEJ,uBAAG5b,UAAU,QACTg9B,KAOGx2B,mBAjFgB,EAC7BuoE,iBACAC,SACAC,iBACAC,eACA3D,WACA4D,iBAGA,MAAM,SAAEC,EAAF,MAAYxzD,EAAZ,KAAmBjZ,GAAUosE,GAAkB,IAC/C,cACJM,EADI,gBAEJC,EAFI,gBAGJC,EAHI,KAIJx3D,EAJI,MAKJw0D,EALI,eAMJiD,GACGN,GAAgB,GACrB,OACE,yBAAKlvE,UAAU,YACb,yBAAKA,UAAU,yBACXovE,GACA,yBAAKnyE,IAAKmyE,EAAU9/D,IAAI,KAE1B,yBAAKtP,UAAU,QACb,4BAAM4b,GACN,2BAAKjZ,KAGT,yBAAK3C,UAAU,cACXgvE,GAAUA,EAAOr0D,IAAK80D,GACtBb,GAAkBa,EAAKxqD,MAAOwqD,EAAKd,OAAQpD,GAAU,IAErD0D,GAAkBA,EAAet0D,IAAK80D,GACtCb,GAAkBa,EAAKxqD,MAAOwqD,EAAKd,OAAQpD,GAAU,SAEtCjqE,IAAf6tE,GACAP,GAAkB,QAASO,EAAY5D,GAAU,IAGrD,yBAAKvrE,UAAU,gBACZqvE,GAAiBP,GAAmB,YAAaO,EAAe,kBAChEC,GAAmBR,GAAmB,kBAAmBQ,EAAiB,oBAC1EC,GAAmBT,GAAmB,gBAAiBS,EAAiB,oBACxEx3D,GAAQ+2D,GAAmB,YAAa/2D,EAAM,QAC9Cw0D,GAASuC,GAAmB,aAAcvC,EAAO,gBACjDiD,GAAkBV,GAAmB,aAAcU,EAAgB,uBC5B7DhpE,mBA/BoB,EAAGN,QAAOiV,QAAOrP,eAElD,MAAM4jE,EAAiBzoE,YAAyB,MAE1C2P,EAAgBlX,YAAaiE,IACjC,GAAc,cAAVA,EAAExD,KAA0D,MAAnC+F,EAAMypE,OAAOzpE,EAAM1H,OAAS,GAAY,CACnE,MAAM+6C,EAAWrzC,EAAM6pB,MAAM,EAAG7pB,EAAM1H,OAAS,GAC3CkxE,EAAexnE,UACjBwnE,EAAexnE,QAAQhC,MAAQqzC,KAGlC,CAACrzC,IAEEy8B,EAAejjC,YAAaiE,IAChCmI,EC9BG,SAA0Bm9C,GAE/B,MAAM2mB,GADN3mB,EAAQA,EAAM3oC,QAAQ,SAAU,IAAIyP,MAAM,EAAG,IACzB3F,MAAM,WAO1B,OANIwlD,GAASA,EAAM,IAAM5lE,OAAO4lE,EAAM,IAAM,KAC1CA,EAAM,GAAK,MAETA,GAASA,EAAM,IAA0B,IAApBA,EAAM,GAAGpxE,SAAiBoxE,EAAM,KACvDA,EAAM,GAAK,IAENA,EAAQA,EAAM3kE,KAAK,KAAO,GDqBtB4kE,CAAiBlsE,EAAEsG,OAAO/D,SAClC,CAAC4F,IAEJ,OACE,kBAACoO,GAAA,EAAD,CACE+K,MAAM,cACNxa,IAAKilE,EACL5jE,SAAU62B,EACVxoB,UAAWvD,EACX1Q,MAAOA,EACPiV,MAAOA,EACPmG,UAAU,UACVkpD,UAlCmB,MERV,I,OAAA,IAA0B,mDCA1B,OAA0B,4CCmE1BhkE,mBA1CkB,EAAGN,QAAOiV,QAAOrP,eAEhD,MAAMgkE,EAAgB7oE,YAAyB,MAE/CmmE,GAAuB0C,GAEvB,MAAOC,EAAUC,GAAehtE,YAAiB2oE,GAASE,SAC1D5oE,YAAU,KACR,MAAMgtE,EAAcjE,GAAe9lE,GACnC8pE,EAAYC,IAEX,IAEH,MAAMttC,EAAejjC,YAAaiE,IAChC,MAAM41C,EH3BH,SAA0B0P,GAE/B,MAAM2mB,GADN3mB,EAAQA,EAAM3oC,QAAQ,SAAU,KACZ8J,MAAM,WAC1B,OAAOwlD,EAAQA,EAAM3kE,KAAK,KAAO,GGwBdilE,CAAiBvsE,EAAEsG,OAAO/D,OACrC+pE,EAAcjE,GAAeroE,EAAEsG,OAAO/D,OAC5C8pE,EAAYC,GACZnkE,EAASytC,GACLu2B,EAAc5nE,UAChB4nE,EAAc5nE,QAAQhC,MAAQqzC,IAE/B,CAACztC,EAAUgkE,IAERK,EAqBR,SAAqBJ,GACnB,OAAQA,GACN,KAAKpE,GAASI,WACZ,OAAO,yBAAK9uE,IAAKmzE,GAAoB9gE,IAAI,KAC3C,KAAKq8D,GAASG,KACZ,OAAO,yBAAK7uE,IAAKozE,GAAc/gE,IAAI,KACrC,QACE,QA5BaghE,CAAYP,GAE7B,OACE,yBAAK/vE,UAAU,aACb,0BAAMA,UAAU,cAAcmwE,GAC9B,kBAACj2D,GAAA,EAAD,CACEzP,IAAKqlE,EACL7qD,MAAM,cACNnZ,SAAU62B,EACVz8B,MAAOA,EACPob,UAAU,UACVthB,UAAW+vE,EAAW,iBAAmB,GACzC50D,MAAOA,EACPqvD,UA5CuB,Q,OC0IhBhkE,mBAlImB,EAChC4qB,QACAm/C,qBACAC,qBACAC,cACAC,UACAryC,eAGA,MAAMyvC,EAAmB7mE,YAA0B,MAEnDhE,YAAU,KACJ6qE,EAAiB5lE,SAChB4lE,EAAiB5lE,QAAQhC,QAAUkrB,EAAMw7C,iBAC5CkB,EAAiB5lE,QAAQhC,MAAQkrB,EAAMw7C,iBAExC,CAACx7C,EAAMw7C,iBAEV,MAAM+D,EAAyBjxE,YAAawG,IAC1Cm4B,EAAS,CAAEr4B,KAAM,mBAAoBitB,QAAS/sB,KAC7C,CAACm4B,IAEEuyC,EAAyBlxE,YAAaiE,IAC1C06B,EAAS,CAAEr4B,KAAM,mBAAoBitB,QAAStvB,EAAEsG,OAAO/D,MAAM2qE,iBAC5D,CAACxyC,IAEEyyC,EAAqBpxE,YAAawG,IACtCm4B,EAAS,CAAEr4B,KAAM,mBAAoBitB,QAAS/sB,KAC7C,CAACm4B,IAEE0yC,EAAkBrxE,YAAaiE,IACnC06B,EAAS,CAAEr4B,KAAM,gBAAiBitB,QAAStvB,EAAEsG,OAAO/D,SACnD,CAACm4B,IAEE8vC,EAAsBzuE,YAAaiE,IACvC06B,EAAS,CAAEr4B,KAAM,uBAAwBitB,QAAStvB,EAAEsG,OAAO/D,SAC1D,CAACm4B,IAEE2yC,EAA8BtxE,YAAaiE,IAC/C06B,EAAS,CAAEr4B,KAAM,mBAAoBitB,QAAStvB,EAAEsG,OAAO/D,SACtD,CAACm4B,IAEE4yC,EAA8BvxE,YAAaiE,IAC/C06B,EAAS,CAAEr4B,KAAM,wBAAyBitB,QAAStvB,EAAEsG,OAAO/D,SAC3D,CAACm4B,IAEE1+B,EAAOC,eAEP,WAAEotE,EAAa,IAAO57C,EAE5B,OACE,yBAAKpxB,UAAU,eACb,8BACE,4BAAKL,EAAK,qBACV,kBAAC,GAAD,CACEmM,SAAU6kE,EACVzqE,MAAOkrB,EAAM66C,WACb9wD,MAAO6xD,EAAWf,aAElBuE,GACA,kBAACt2D,GAAA,EAAD,CACE+K,MAAM,eACNnZ,SAAU8kE,EACV1qE,MAAOkrB,EAAMq7C,WACbnrD,UAAU,OACVnG,MAAO6xD,EAAWP,aAGtB,6BAASzsE,UAAU,iBACjB,kBAAC,GAAD,CACEkG,MAAOkrB,EAAMs7C,OACb5gE,SAAUglE,EACV31D,MAAO6xD,EAAWN,SAEpB,kBAACxyD,GAAA,EAAD,CACE+K,MAAM,WACNnZ,SAAUilE,EACV7qE,MAAOkrB,EAAMu7C,IACbrrD,UAAU,UACVkpD,UAAW,EACXrvD,MAAO6xD,EAAWL,OAGpB8D,GAAeC,EACf,4BAAK/wE,EAAK,+BACR2B,EACFmvE,GACA,kBAAC,GAAD,CACExrD,MAAM,UACN7K,YAAY,UACZtO,SAAUqiE,EACVjoE,MAAOkrB,EAAMw7C,eACbU,SAAU1lE,SAAQ,GAClBjK,GAAG,kBACHwd,MAAO6xD,EAAWJ,eAClBniE,IAAKqjE,GAGHX,KAAYxyD,IAAI,EAAG5C,UACjB,4BACE7R,MAAO6R,EACP/X,UAAU,eAET+X,KAMT24D,GACA,kBAACx2D,GAAA,EAAD,CACE+K,MAAM,YACNnZ,SAAUklE,EACV9qE,MAAOkrB,EAAMy7C,WACbvrD,UAAU,OACVnG,MAAO6xD,EAAWH,aAGpB0D,GACA,kBAACnvC,GAAA,EAAD,CACEnc,MAAOtlB,EAAK,qCACZ0hC,QAASjQ,EAAM27C,gBACfjhE,SAAUmlE,Q,OCwNPzqE,mBAAK/H,YACjBC,IACC,MAAM,KACJqH,EADI,gBAEJ0oE,EAFI,UAGJyC,EAHI,mBAIJX,EAJI,QAKJY,EALI,eAMJpC,EANI,eAOJqC,EAPI,aAQJC,EARI,gBASJC,EATI,MAUJn2D,GACEzc,EAAO6yE,QAELC,EAAkB5pE,QAAQupE,KAAaC,GA/VxB,WA+V0CA,KACzD,mBAAEZ,EAAF,YAAsBC,EAAtB,QAAmCC,GAAaW,GAAgB,IAChE,cACJI,EADI,eAEJC,EAFI,eAGJC,EAHI,yBAIJC,EAJI,SAKJC,EALI,gBAMJC,EANI,gBAOJC,EAPI,SAQJxG,EARI,OASJyD,GACGmC,GAAW,GAEhB,MAAO,CACLprE,OACA0oE,kBACAyC,YACAX,qBACAa,iBACAE,kBACAG,gBACAG,2BACAF,iBACAC,iBACAE,WACAC,kBACAC,kBACAxG,WACAyD,SACAwC,kBACAzC,iBACAyB,qBACAC,cACAC,UACAv1D,QACA62D,cAAetzE,EAAO4c,UAG1B,CAAClc,EAAWC,IACHC,YAAKD,EAAS,CACnB,wBACA,kBACA,iBACA,sBACA,sBA5DcZ,CAjT0D,EAC5EiD,SACAqF,UACAhB,OACA0oE,kBACAyC,YACAX,qBACAkB,gBACAG,2BACAF,iBACAC,iBACAG,kBACAC,kBACAxG,WACA+F,kBACAE,kBACAzC,iBACAqC,iBACApC,SACAwB,qBACAC,cACAC,UACAv1D,QACA62D,gBACAC,wBACAC,kBACAC,iBACAC,sBACAC,wBAEA,MAAOC,EAAcC,GZ2IdvhD,GAAWC,GAAS6B,IY1IrB0/C,EAAelH,GAAgBC,IAC9B59C,EAAW8wC,GAAgBz7D,aAAS,GACrCrD,EAAOC,cAEbqD,YAAU,MACJ8C,GAAQoV,GAAS62D,IACnBvT,GAAa,IAEd,CAAC14D,EAAMoV,EAAO62D,IAEjB/uE,YAAU,KACR,GAAIkY,GAASA,EAAMs3D,MACjBF,EAAgB,CACdvsE,KAAM,gBACNitB,QAAS,CACP,CAAC9X,EAAMs3D,OAAQt3D,EAAMu3D,mBAK3B,GAAIV,GAAiBA,EAAcxzE,OAAQ,CACzC,MAAMm0E,EAASC,aAAkBZ,GACjCO,EAAgB,CACdvsE,KAAM,gBACNitB,QAAS,IACJ0/C,OAIR,CAACx3D,EAAO62D,EAAeO,IAE1BtvE,YAAU,KACR,GAAIiuE,EAAW,CACb,MACEn5D,KAAMqU,EADF,MACYmgD,EADZ,MACmB/4C,EADnB,gBAC0B+7C,GAC5B2B,EACJqB,EAAgB,CACdvsE,KAAM,iBACNitB,QAAS,CACP7G,WACAmgD,MAAOA,GAA6B,MAApBA,EAAMoD,OAAO,GACxB,IAAGpD,EACJA,EACJ/4C,WACI+7C,GAAmB,QAI5B,CAAC2B,EAAWqB,IAEf,MAAMM,EAAwBnzE,YAAY,KACxC2yE,KACC,CAACA,IAEElD,EAAa3tE,YAAQ,IACrBuE,IAAS+sE,IAAYC,SAChB,EAoSb,SAAuB/D,EAAkB,GAAIP,EAA+CuE,GAC1F,MAAM/D,EAAiBR,EACnBwE,GAAkBxE,EAAiBuE,GACnC,GACJ,IAAI9T,EAAQ,EACZ,MAAMgU,EAAclE,EAAOmE,OAAOlE,GAAkB,IAIpD,OAHA/P,EAAQgU,EAAY99B,OAAO,CAACg+B,EAAKC,IACxBD,EAAMC,EAAI1E,OAChBzP,GACIA,EA1SEoU,CAActE,EAAQP,EAAiB6D,EAAa9F,UAC1D,CAACzmE,EAAMusE,EAAa9F,SAAUwC,EAAQP,IAEnCS,EAAe1tE,YAAQ,KAC3B,GAAIuE,IAAS+sE,IAAYC,SAGzB,OAsSJ,SAAyB3hD,EAAkBq9C,EAA+Ca,GACxF,MACMD,EAAiB,GbxalB,SAA4BpD,GACjC,MAAM8D,EAAW/D,GAAeC,GAChC,OAAOL,GAAMmE,IAAuB,GaqafwD,CAAmBniD,EAAM66C,gBACJ76C,EAAM66C,WAAWl8C,OAAO,KAC5Dw/C,EAAkBn+C,EAAM86C,YACzB,GAAE96C,EAAM86C,gBAAgB96C,EAAMg7C,SAASh7C,EAAMi7C,mBAC9C/qE,GACE,MAAEirE,EAAOngD,SAAUrU,GAASqZ,EAC5B4hD,EAAiBvE,EAAkB+E,GAAmB/E,EAAiBr9C,EAAMo7C,eAAYlrE,EACzFkuE,EAAiBwD,EAAiBA,EAAep3D,WAAQta,EAC/D,MAAO,CACL+tE,gBACAC,kBACAC,kBACAx3D,OACAw0D,QACAiD,kBArTOiE,CAAgBnB,EAAc7D,EAAiB2C,GAAkB,KACvE,CAACrrE,EAAMusE,EAAc7D,EAAiB2C,IA2EzC,MAAMsC,EAAkBh0E,YAAY,KAClC,MAAM,SAAEotE,GAAawF,EACfqB,EA2OV,SAAwBrB,GACtB,MAAM,YACJpG,EADI,YAEJC,EAFI,KAGJC,EAHI,MAIJh7C,EAJI,YAKJi7C,EALI,SAMJC,EACAlgD,SAAUrU,EAPN,MAQJw0D,EARI,MASJ/4C,GACE8+C,EAWJ,MAAO,CACLv6D,OACAw0D,QACA/4C,QACA+7C,gBAbsB,CACtBrD,cACAC,cACAC,OACAh7C,QACAi7C,cACAC,aA9PoBsH,CAAetB,GACnCL,EAAsB,CAAE0B,cAAa7G,cACpC,CAACmF,EAAuBK,IAErBuB,EAAkBn0E,YAAY,KAClC,MAAMo0E,EAoQV,SAAwBxB,GACtB,MAAM,WACJrG,EADI,WACQQ,EADR,OACoBC,EADpB,IAC4BC,EAD5B,eACiCC,EADjC,WACiDC,GACnDyF,GACGyB,EAAaC,GAActH,EAAOlgD,MAAM,KAW/C,MAAO,CACLwQ,KAXW,CACXivC,aACAQ,aACAsH,cACAC,aACArH,MACA/2B,QAASg3B,EACTqH,IAAKpH,IAhReqH,CAAe5B,GACnCF,EAAoB,CAClB0B,iBAED,CAAC1B,EAAqBE,IAEnB6B,EAAWz0E,YAAY,KAC3BwyE,EAAgB,CACdkC,iBAAkB9B,EAAa9F,SAC/BO,gBAAiBuF,EAAavF,mBAE/B,CAACmF,EAAiBI,IAEf+B,EAAU30E,YAAa40E,IAC3BnC,EAAe,CAAEpsE,KAAMuuE,KACtB,CAACnC,IAEEprB,EAAoBrnD,YAAY,KAEpC,OADA++D,GAAa,GACL14D,GACN,KAAK+sE,IAAYyB,aACf,OAAOb,IACT,KAAKZ,IAAY0B,SACf,OAAOH,EAAQvB,IAAY2B,aAC7B,KAAK3B,IAAY2B,YACf,OAAOZ,IACT,KAAKf,IAAYC,SACf,OAAOoB,IACT,QACE,MAAO,SAEV,CAACpuE,EAAM2tE,EAAiBW,EAASR,EAAiBM,IAE/Cl6D,EAAczY,YAAQ,KAC1B,OAAQuE,GACN,KAAK+sE,IAAYyB,aACf,OAAO50E,EAAK,uBACd,KAAKmzE,IAAY0B,SACf,OAAO70E,EAAK,yBACd,KAAKmzE,IAAY2B,YACf,OAAO90E,EAAK,mBACd,KAAKmzE,IAAYC,SACf,OAAOpzE,EAAK,mBACd,QACE,MAAO,KAEV,CAACoG,EAAMpG,IAEJ+0E,EAAalzE,YAAQ,KACzB,OAAQuE,GACN,KAAK+sE,IAAYC,SACf,OAAOpzE,EAAK,oBAAsB,GAAE6yE,KAAgBrD,EAAa,KAAK5qE,QAAQ,MAChF,QACE,OAAO5E,EAAK,UAEf,CAACoG,EAAMpG,EAAM6yE,EAAcrD,IAE9B,OAAIqC,EAEA,kBAACn3D,GAAA,EAAD,CACEra,UAAU,QACV0B,OAAQA,EACRqF,QAASA,GAET,oGAC6E,6BAD7E,iDAIA,kBAACpF,EAAA,EAAD,CACEsa,QAAM,EACNhc,QAAS8G,GAERpH,EAAK,QAOZ,kBAAC0a,GAAA,EAAD,CACEra,UAAU,eACV0B,OAAQA,EACRqF,QAASA,GAET,yBAAK/G,UAAU,SAASM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAChD,kBAACK,EAAA,EAAD,CACE3B,UAAU,eACV6B,MAAM,cACND,OAAK,EACLnI,KAAK,UACLwG,QAAS8G,EACTjF,UAAU,SAEV,uBAAG9B,UAAU,gBAEf,4BAAKia,SAEG3Y,IAATyE,EACC,kBAAC8R,EAAA,EAAD,CAAYE,KAAK,QAAQD,UAAW/R,GACjC,IACC,yBAAK/F,UAAU,yBA9JzB,SAA4B20E,GAC1B,OAAQA,GACN,KAAK7B,IAAYyB,aACf,OACE,kBAAC,GAAD,CACEnjD,MAAOkhD,EACPj0C,SAAUk0C,EACV3E,YAAahmE,QAAQgqE,GACrBnE,UAAW7lE,QAAQ+pE,GAAkBI,GACrCrE,UAAW9lE,QAAQ8pE,GAAkBI,GACrCnE,SAAU/lE,QAAQ6pE,KAGxB,KAAKqB,IAAY0B,SACf,OACE,kBAAC,GAAD,CACEpjD,MAAOkhD,EACPj0C,SAAUk0C,EACV9D,gBAAiBA,GAAmB,GACpClD,SAAUiH,IAGhB,KAAKM,IAAY2B,YACf,OACE,kBAAC,GAAD,CACErjD,MAAOkhD,EACPj0C,SAAUk0C,EACVhC,mBAAoB3oE,SAAS0pE,GAAmBf,GAChDC,mBAAoBA,EACpBC,YAAaA,EACbC,QAASA,IAGf,KAAKoC,IAAYC,SACf,OACE,kBAAC,GAAD,CACE/D,OAAQA,EACRC,eAAgBqD,EAAa9F,UAAYiC,EACrCwE,GAAkBxE,EAAiB6D,EAAa9F,eAChDlrE,EACJ6tE,WAAYA,EACZJ,eAAgBA,EAChBG,aAAcA,EACd3D,SAAUiH,IAGhB,QACE,QAgHOoC,CAAmB7uE,KAK1B,yBAAK/F,UAAU,iBACb,kBAACwP,EAAA,EAAD,CAAS3N,MAAM,UAGnB,yBAAK7B,UAAU,UACb,kBAAC2B,EAAA,EAAD,CACEqE,KAAK,SACL/F,QAAS8mD,EACTl7C,SAAU8hB,EACVA,UAAWA,GAEV+mD,IAGJv5D,IAAUA,EAAMs3D,OAxMrB,WACE,GAAKt3D,EAGL,OACE,kBAACd,GAAA,EAAD,CACEra,UAAU,QACV0B,OAAQkG,QAAQuT,GAChBpU,QAAS8rE,GAET,4BAAK13D,EAAMuJ,aAAe,SAC1B,2BAAIvJ,EAAMuJ,aAAe,SACzB,kBAAC/iB,EAAA,EAAD,CACEsa,QAAM,EACNhc,QAASoyE,GAER1yE,EAAK,QAwLgBk1E,OAsEhC,SAASrB,GAAmB/E,EAAmCqG,GAC7D,OAAOrG,EAAgB3uC,KAAK,EAAGniC,QAASA,IAAOm3E,GAGjD,SAAS7B,GAAkBxE,EAAmCuE,GAC5D,MAAMlwC,EAAS0wC,GAAmB/E,EAAiBuE,GACnD,OAAOlwC,EAASA,EAAOksC,YAAS1tE,ECjVnBkF,mBAAK/H,YACjBC,IACC,MAAM,QAAEq2E,GAAYr2E,EAAO6yE,SACrB,SACJhG,EACAyD,OAAQgG,EAFJ,KAGJC,EAHI,YAIJC,EAJI,iBAKJC,EALI,eAMJlG,EANI,eAOJO,EAPI,SAQJJ,EARI,KASJzsE,EATI,MAUJiZ,GACGm5D,GAAW,GAEhB,MAAO,CACLxJ,WACAyD,OAAQgG,EACRC,OACAC,cACAC,mBACAlG,iBACAO,iBACAJ,WACAzsE,OACAiZ,UA1Bcnd,CA1D4B,EAC9CiD,SACAqF,UACAioE,SACAC,iBACAiG,cACA3J,WACA0J,OACA7F,WACAzsE,OACAiZ,QACAu5D,mBACA3F,qBAEA,MAAM7vE,EAAOC,cACP4yE,EAAelH,GAAgBC,GAC/B2D,EAAe1tE,YAAQ,IAyE/B,SAAyB6tE,EACvB4F,EAKAzF,GACA,IAAKyF,EACH,MAAO,CAAE5F,iBAEX,MAAM,gBAAEE,GAAoB0F,EACtBG,EAAc7F,GAAmBA,EAAgBrD,YAClD,GAAEqD,EAAgBrD,gBAAgBqD,EAAgBnD,SAASmD,EAAgBlD,mBAC5E/qE,GACE,MAAEirE,EAAF,KAASx0D,GAASk9D,EACxB,MAAO,CACL5F,gBACAC,gBAAiB,SACjBC,gBAAiB6F,EACjBr9D,OACAw0D,QACAiD,kBA7FOiE,CAAgB0B,EAAkBF,EAAMzF,GAC9C,CAACyF,EAAMzF,EAAgB2F,IAC1B,OACE,kBAAC96D,GAAA,EAAD,CACEra,UAAU,oCACV0B,OAAQA,EACRqF,QAASA,GAET,6BACE,yBAAK/G,UAAU,SAASM,IAAKX,EAAKiY,MAAQ,WAAQtW,GAChD,kBAACK,EAAA,EAAD,CACE3B,UAAU,eACV6B,MAAM,cACND,OAAK,EACLnI,KAAK,UACLwG,QAAS8G,EACTjF,UAAU,SAEV,uBAAG9B,UAAU,gBAEf,gCAAML,EAAK,kBAAX,MAEF,yBAAKK,UAAU,iCACb,kBAAC,GAAD,CACEgvE,OAAQA,EACRC,eAAgBA,EAChBE,WAAY+F,EACZnG,eAAgB,CACdK,WACAzsE,OACAiZ,SAEFszD,aAAcA,EACd3D,SAAUiH,W,wGCtEf,MAAM6C,EAA0B,CACrCC,WCpBa,IAA0B,gEDqBvCC,eErBa,IAA0B,oEFsBvCC,YGtBa,IAA0B,iEHuBvCC,WIvBa,IAA0B,gEJwBvCC,WKxBa,IAA0B,kDLyBvCC,WMzBa,IAA0B,kDN0BvCC,iBO1Ba,IAA0B,8DP6B1B,SAAS/4C,EAAiB9kB,GACvC,MAAM89D,EAAOR,EAAwBt9D,GAAMuI,QAAQpoB,OAAO49E,SAASl/E,OAAQ,IAE3E,OAAOqsD,IAAmB,OAAM4yB,EAAQtiE,iBAAe+vB,U,yGQjBzD,MAAMyyC,EAAiE,CACrE/vE,KAAM,OACNgwE,QAAS,GACTC,OAAQ,OACRC,QAAQ,GAIV,IAAIC,EACAC,EAWAC,EAgGW7vE,kBAxDiB,EAAGynD,OAAMniD,WAAU/E,cACjD,MAAOuvE,EAAgBC,GAAqBvzE,aAAS,GAErDC,YAAU,KACHgrD,IAIAqoB,EA9CTrqC,eAA2BuqC,GACzB,IACE,MAAMC,EAAgBj8E,SAASkB,eAAe,eAC9C,IAAK+6E,EACH,OAGF,MAAM,YAAE/pC,EAAF,aAAe5uC,GAAiB24E,EAEtCJ,EAAU,IAAIF,EAAQM,EAAe,CACnCC,YAAY,EACZC,SAAU,CACRv/E,MAAOs1C,EACPj1C,OAAQqG,GAEV84E,SAAU,CACRx/E,MAAOs1C,EAAc,GACrBj1C,OAAQqG,EAAe,GACvBkI,KAAM,YAIV,MAAMi+B,QAAgB4yC,YAAcL,SAC9BH,EAAQS,KAAK,CAAErwE,IAAKw9B,IAC1B,MAAO8yC,GACHC,KAEFC,QAAQ97D,MAAM47D,IAyBhBG,CAAYjpB,GA/DhBhiB,iBAME,OALKmqC,IACHA,EAAiB,oDACjBD,SAAiBC,GAAgBpgB,SAG5BogB,EAoDHe,GAAgBr6C,KAAK,IAAMy5C,GAAkB,MAM9C,CAACtoB,EAAMqoB,IAEV,MAAM32E,EAAOC,cAab,OACE,kBAACya,EAAA,EAAD,CACE3Y,OAAQkG,QAAQqmD,GAChBlnD,QAASA,EACT6U,MAAM,qBACN5b,UAAU,YACVgnD,gBAAc,GAEbsvB,EACC,yBAAK34E,GAAG,gBAER,kBAACsd,EAAA,EAAD,MAEF,kBAACtZ,EAAA,EAAD,CACE3B,UAAU,iBACV4B,OAAK,EACLC,MAAM,UACN5B,QA5BNgsC,iBACE,IAAKoqC,EACH,OAGF,MAAMhhC,QAA8BghC,EAAQhhC,OAAO0gC,GAC7CqB,EAA+B,iBAAX/hC,EAAsBA,EAASgiC,YAAWhiC,EAAQ,cAE5EvpC,EAASsrE,IAqBLt1E,UAAWnC,EAAK,cAEhB,uBAAGK,UAAU,mB,OC3CNwG,gBAhEsB,EACnCoV,QAAQ,8BACR/P,WACA4uB,uBACA3uB,eAEA,MAAOwrE,EAAcC,GAAmBv0E,eACjCw0E,EAAgBC,GAAqBz0E,YAA6By3B,GAEzEx3B,YAAU,KACRw0E,EAAkBh9C,IACjB,CAACA,IA2BJ,MAAMi9C,EAAiBh0E,YACrB8zE,GAAkB,SAClB3rE,GAAY,YAGd,OACE,yBAAK7L,UAAU,kBACb,2BACEA,UAAW03E,EACXv2D,KAAK,SACLC,SAAU,EACVxF,MAAOA,GAEP,2BACE5V,KAAK,OACL8F,SAxCR,SAA0Bo0B,GACxB,MAAMj2B,EAASi2B,EAAMj2B,OAEhBA,GAAWA,EAAOshC,OAAUthC,EAAOshC,MAAM,KAI9CgsC,EAAgBttE,EAAOshC,MAAM,IAC7BthC,EAAO/D,MAAQ,KAiCT8hC,OAAO,0BAET,uBAAGhoC,UAAU,oBACZw3E,GAAkB,yBAAKv6E,IAAKu6E,EAAgBloE,IAAI,YAEnD,kBAAC,EAAD,CAAW2+C,KAAMqpB,EAAcvwE,QAzBnC,WACEwwE,OAAgBj2E,IAwB4CwK,SAnC9D,SAA0BsrE,GACxBG,OAAgBj2E,GAChBwK,EAASsrE,GAELI,GACFG,IAAIC,gBAAgBJ,GAEtBC,EAAkBE,IAAIE,gBAAgBT,W,8DCjD1C,kDAiBA,MACMU,EAAuC,CAAC,EAAG,IAC3CC,EAAwC,CAAC,EAAG,IAC5CC,EAAsC,CAAC,GAAI,GAC3CC,EAAel2E,IAA0Bm2E,KAA2BC,KAsD3D3xE,gBApDsB,EAAGkyC,oBAAmBD,YACzD,MAAO2/B,EAAiBC,GAAsBr1E,eACvCs1E,EAAgBC,GAAqBv1E,eACrCw1E,EAAqBC,GAA0Bz1E,aAAS,IACxD01E,EAAaC,GAAkB31E,aAAS,GAE/CC,YAAU,KACHm1E,EAGHj9E,WAAW,IAAMw9E,GAAe,GAhBP,KAczB97C,YAAiB,eAAeC,KAAKu7C,IAItC,CAACD,IAEJn1E,YAAU,KACHq1E,GACHz7C,YAAiB,cAAcC,KAAKy7C,IAErC,CAACD,IAEJ,MAAMM,EAAwBl5E,YAAY,IAAM+4E,GAAuB,GAAO,IAE9E,OACE,yBAAK96E,GAAG,SAASqC,UAAWy4C,EAAQ,MAAQ,KACxC+/B,GACA,yBAAKx4E,UAAU,mBAEhBo4E,GACC,kBAAC,IAAD,CACEz6E,GAAG,cACHlE,KAAMg/C,EAAQogC,KAAsBZ,EACpCj4E,UAAW04E,EAAc,SAAW,QACpCl8C,cAAe47C,EACfU,YAAahB,EACbv6C,QAAM,EACNC,OAAQo7C,IAGXN,GACC,kBAAC,IAAD,CACE36E,GAAG,aACHlE,KAAMg/C,EAAQogC,KAAsBZ,EACpCj4E,UAAW04E,EAAc,QAAU,SACnCl8C,cAAe87C,EACfQ,YAAapgC,EAAoBq/B,EAAsBC,EACvDz6C,QAAM,Q,6BCnEhB,gDAwBA,MAAMub,EAAyB/2C,IAA0B,IAAM,IAuGhDyE,gBArGoB,EACjCmnB,aAAY,EACZ+qB,oBACAv9B,QACAoY,OACAnZ,cAAc,WACd29B,cAAc,OACdC,aACAY,6BACAmgC,gBACAt6D,eAGA,MAAMlT,EAAWtE,YAAyB,MACpCtH,EAAOC,eAEN0zB,EAAU0lD,GAAeh2E,YAAS,KAClCi2E,EAAWC,GAAgBl2E,aAAS,GAgD3C,OA9CAC,YAAU,KACHkE,KACHhM,WAAW,KACToQ,EAASrD,QAAS+Q,SACjB6/B,IAEJ,IAEH71C,YAAU,KACJkY,GACFvgB,sBAAsB,KACpB2Q,EAASrD,QAAS+Q,QAClB1N,EAASrD,QAASixE,YAGrB,CAACh+D,IAgCF,0BAAMmW,OAAO,GAAG7S,SAblB,SAAsByhB,GACpBA,EAAM91B,iBAEFujB,GAIAsrD,GACFx6D,EAAS6U,IAK6B8lD,aAAa,OACnD,yBACEp5E,UAAW0D,YAAe,6BAA8B4vB,GAAY,UAAWnY,GAAS,SACxF7a,IAAKX,EAAKiY,MAAQ,WAAQtW,GAE1B,2BACEmJ,IAAKc,EACLvL,UAAU,eACVgG,KAAM0yC,EAAoB,OAAS,WACnC/6C,GAAG,mBACHuI,MAAOotB,GAAY,GACnB8lD,aAAa,mBACbttE,SA1CR,SAA0BnI,GACpBwX,GACF68B,IAGF,MAAM,OAAE/tC,GAAWtG,EACnBq1E,EAAY/uE,EAAO/D,OACnBgzE,EAAajvE,EAAO/D,MAAM1H,QAAU66E,KAChCN,GACFA,EAAc9uE,EAAO/D,QAkCjB5F,IAAI,SAEN,+BAAQ6a,GAASoY,GAAQnZ,GACzB,yBACEpa,UAAU,kBACVC,QAnCR,WACE24C,GAA4BF,IAmCtBv3B,KAAK,SACLC,SAAU,EACVxF,MAAM,8BAEN,uBAAG5b,UAAW04C,EAAoB,WAAa,sBAGlDugC,GACC,kBAAC,IAAD,CAAQjzE,KAAK,SAASI,QAAM,EAACunB,UAAWA,GACrCoqB,O","file":"3.8057e9c779ca8c033777.js","sourcesContent":["import { ApiMessage, ApiDimensions } from '../../../api/types';\n\nimport { MediaViewerOrigin } from '../../../types';\n\nimport { ANIMATION_END_DELAY } from '../../../config';\nimport {\n calculateDimensions,\n getMediaViewerAvailableDimensions,\n MEDIA_VIEWER_MEDIA_QUERY,\n REM,\n} from '../../common/helpers/mediaDimensions';\nimport windowSize from '../../../util/windowSize';\n\nconst ANIMATION_DURATION = 200;\n\nexport function animateOpening(\n hasFooter: boolean,\n origin: MediaViewerOrigin,\n bestImageData: string,\n dimensions: ApiDimensions,\n isVideo: boolean,\n message?: ApiMessage,\n) {\n const { mediaEl: fromImage } = getNodes(origin, message);\n if (!fromImage) {\n return;\n }\n\n const { width: windowWidth } = windowSize.get();\n const {\n width: availableWidth, height: availableHeight,\n } = getMediaViewerAvailableDimensions(hasFooter, isVideo);\n const { width: toWidth, height: toHeight } = calculateDimensions(\n availableWidth, availableHeight, dimensions.width, dimensions.height,\n );\n const toLeft = (windowWidth - toWidth) / 2;\n const toTop = getTopOffset(hasFooter) + (availableHeight - toHeight) / 2;\n\n let {\n top: fromTop, left: fromLeft, width: fromWidth, height: fromHeight,\n } = fromImage.getBoundingClientRect();\n\n if ([\n MediaViewerOrigin.SharedMedia,\n MediaViewerOrigin.Album,\n MediaViewerOrigin.ScheduledAlbum,\n MediaViewerOrigin.SearchResult,\n ].includes(origin)) {\n const uncovered = uncover(toWidth, toHeight, fromTop, fromLeft, fromWidth, fromHeight);\n fromTop = uncovered.top;\n fromLeft = uncovered.left;\n fromWidth = uncovered.width;\n fromHeight = uncovered.height;\n }\n\n const fromTranslateX = (fromLeft + fromWidth / 2) - (toLeft + toWidth / 2);\n const fromTranslateY = (fromTop + fromHeight / 2) - (toTop + toHeight / 2);\n const fromScaleX = fromWidth / toWidth;\n const fromScaleY = fromHeight / toHeight;\n\n const ghost = createGhost(bestImageData || fromImage);\n applyStyles(ghost, {\n top: `${toTop}px`,\n left: `${toLeft}px`,\n width: `${toWidth}px`,\n height: `${toHeight}px`,\n transform: `translate3d(${fromTranslateX}px, ${fromTranslateY}px, 0) scale(${fromScaleX}, ${fromScaleY})`,\n });\n applyShape(ghost, origin);\n\n document.body.classList.add('ghost-animating');\n\n requestAnimationFrame(() => {\n document.body.appendChild(ghost);\n\n requestAnimationFrame(() => {\n ghost.style.transform = '';\n clearShape(ghost);\n\n setTimeout(() => {\n requestAnimationFrame(() => {\n if (document.body.contains(ghost)) {\n document.body.removeChild(ghost);\n }\n document.body.classList.remove('ghost-animating');\n });\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n });\n });\n}\n\nexport function animateClosing(origin: MediaViewerOrigin, bestImageData: string, message?: ApiMessage) {\n const { container, mediaEl: toImage } = getNodes(origin, message);\n if (!toImage) {\n return;\n }\n\n const fromImage = document.getElementById('MediaViewer')!.querySelector(\n '.active .media-viewer-content img, .active .media-viewer-content video',\n );\n if (!fromImage || !toImage) {\n return;\n }\n\n const {\n top: fromTop, left: fromLeft, width: fromWidth, height: fromHeight,\n } = fromImage.getBoundingClientRect();\n const {\n top: targetTop, left: toLeft, width: toWidth, height: toHeight,\n } = toImage.getBoundingClientRect();\n\n let toTop = targetTop;\n if (!isElementInViewport(container)) {\n const { height: windowHeight } = windowSize.get();\n toTop = targetTop < fromTop ? -toHeight : windowHeight;\n }\n\n const fromTranslateX = (fromLeft + fromWidth / 2) - (toLeft + toWidth / 2);\n const fromTranslateY = (fromTop + fromHeight / 2) - (toTop + toHeight / 2);\n let fromScaleX = fromWidth / toWidth;\n let fromScaleY = fromHeight / toHeight;\n\n const shouldFadeOut = (\n [MediaViewerOrigin.Inline, MediaViewerOrigin.ScheduledInline].includes(origin)\n && !isMessageImageFullyVisible(container, toImage)\n ) || (\n [MediaViewerOrigin.Album, MediaViewerOrigin.ScheduledAlbum].includes(origin)\n && !isMessageImageFullyVisible(container, toImage)\n );\n\n if ([\n MediaViewerOrigin.SharedMedia,\n MediaViewerOrigin.Album,\n MediaViewerOrigin.ScheduledAlbum,\n MediaViewerOrigin.SearchResult,\n ].includes(origin)) {\n if (fromScaleX > fromScaleY) {\n fromScaleX = fromScaleY;\n } else if (fromScaleY > fromScaleX) {\n fromScaleY = fromScaleX;\n }\n }\n\n const existingGhost = document.getElementsByClassName('ghost')[0] as HTMLDivElement;\n\n const ghost = existingGhost || createGhost(bestImageData || toImage, origin === MediaViewerOrigin.ProfileAvatar);\n if (!existingGhost) {\n applyStyles(ghost, {\n top: `${toTop}px`,\n left: `${toLeft}px`,\n width: `${toWidth}px`,\n height: `${toHeight}px`,\n transform: `translate3d(${fromTranslateX}px, ${fromTranslateY}px, 0) scale(${fromScaleX}, ${fromScaleY})`,\n });\n }\n\n requestAnimationFrame(() => {\n if (existingGhost) {\n const {\n top,\n left,\n width,\n height,\n } = existingGhost.getBoundingClientRect();\n const scaleX = width / toWidth;\n const scaleY = height / toHeight;\n\n applyStyles(ghost, {\n transition: 'none',\n top: `${toTop}px`,\n left: `${toLeft}px`,\n transformOrigin: 'top left',\n transform: `translate3d(${left - toLeft}px, ${top - toTop}px, 0) scale(${scaleX}, ${scaleY})`,\n width: `${toWidth}px`,\n height: `${toHeight}px`,\n });\n }\n document.body.classList.add('ghost-animating');\n if (!existingGhost) document.body.appendChild(ghost);\n\n requestAnimationFrame(() => {\n if (existingGhost) {\n existingGhost.style.transition = '';\n }\n\n ghost.style.transform = '';\n\n if (shouldFadeOut) {\n ghost.style.opacity = '0';\n }\n\n applyShape(ghost, origin);\n\n setTimeout(() => {\n requestAnimationFrame(() => {\n if (document.body.contains(ghost)) {\n document.body.removeChild(ghost);\n }\n document.body.classList.remove('ghost-animating');\n });\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n });\n });\n}\n\nfunction createGhost(source: string | HTMLImageElement | HTMLVideoElement, shouldAppendProfileInfo = false) {\n const ghost = document.createElement('div');\n ghost.classList.add('ghost');\n\n const img = new Image();\n\n if (typeof source === 'string') {\n img.src = source;\n } else if (source instanceof HTMLVideoElement) {\n img.src = source.poster;\n } else {\n img.src = source.src;\n }\n\n ghost.appendChild(img);\n\n if (shouldAppendProfileInfo) {\n ghost.classList.add('ProfileInfo');\n const profileInfo = document.querySelector('#RightColumn .ProfileInfo .info');\n if (profileInfo) {\n ghost.appendChild(profileInfo.cloneNode(true));\n }\n }\n\n return ghost;\n}\n\nfunction uncover(realWidth: number, realHeight: number, top: number, left: number, width: number, height: number) {\n if (realWidth === realHeight) {\n const size = Math.max(width, height) * (realWidth / realHeight);\n left -= (size - width) / 2;\n top -= (size - height) / 2;\n width = size;\n height = size;\n } else if (realWidth > realHeight) {\n const srcWidth = width;\n width = height * (realWidth / realHeight);\n left -= (width - srcWidth) / 2;\n } else if (realHeight > realWidth) {\n const srcHeight = height;\n height = width * (realHeight / realWidth);\n top -= (height - srcHeight) / 2;\n }\n\n return {\n top, left, width, height,\n };\n}\n\nfunction isElementInViewport(el: HTMLElement) {\n if (el.style.display === 'none') {\n return false;\n }\n\n const rect = el.getBoundingClientRect();\n const { height: windowHeight } = windowSize.get();\n\n return (rect.top <= windowHeight) && ((rect.top + rect.height) >= 0);\n}\n\nfunction isMessageImageFullyVisible(container: HTMLElement, imageEl: HTMLElement) {\n const messageListElement = document.querySelector('.active > .MessageList')!;\n let imgOffsetTop = container.offsetTop + imageEl.closest('.content-inner, .WebPage')!.offsetTop;\n if (container.id.includes('album-media-')) {\n imgOffsetTop += container.parentElement!.offsetTop + container.closest('.Message')!.offsetTop;\n }\n\n return imgOffsetTop > messageListElement.scrollTop\n && imgOffsetTop + imageEl.offsetHeight < messageListElement.scrollTop + messageListElement.offsetHeight;\n}\n\nfunction getTopOffset(hasFooter: boolean) {\n const mql = window.matchMedia(MEDIA_VIEWER_MEDIA_QUERY);\n let topOffsetRem = 4.125;\n if (hasFooter) {\n topOffsetRem += mql.matches ? 0.875 : 3.375;\n }\n\n return topOffsetRem * REM;\n}\n\nfunction applyStyles(element: HTMLElement, styles: Record) {\n Object.assign(element.style, styles);\n}\n\nfunction getNodes(origin: MediaViewerOrigin, message?: ApiMessage) {\n let containerSelector;\n let mediaSelector;\n\n switch (origin) {\n case MediaViewerOrigin.Album:\n case MediaViewerOrigin.ScheduledAlbum:\n containerSelector = `.active > .MessageList #album-media-${message!.id}`;\n mediaSelector = '.full-media';\n break;\n\n case MediaViewerOrigin.SharedMedia:\n containerSelector = `#shared-media${message!.id}`;\n mediaSelector = 'img';\n break;\n\n case MediaViewerOrigin.SearchResult:\n containerSelector = `#search-media${message!.id}`;\n mediaSelector = 'img';\n break;\n\n case MediaViewerOrigin.MiddleHeaderAvatar:\n containerSelector = '.MiddleHeader .ChatInfo .Avatar';\n mediaSelector = 'img.avatar-media';\n break;\n\n case MediaViewerOrigin.ProfileAvatar:\n containerSelector = '#RightColumn .ProfileInfo .active .ProfilePhoto';\n mediaSelector = 'img.avatar-media';\n break;\n\n case MediaViewerOrigin.ScheduledInline:\n case MediaViewerOrigin.Inline:\n default:\n containerSelector = `.active > .MessageList #message${message!.id}`;\n mediaSelector = '.message-content .full-media, .message-content .thumbnail';\n }\n\n const container = document.querySelector(containerSelector)!;\n const mediaEls = container && container.querySelectorAll(mediaSelector);\n\n return {\n container,\n mediaEl: mediaEls && mediaEls[mediaEls.length - 1],\n };\n}\n\nfunction applyShape(ghost: HTMLDivElement, origin: MediaViewerOrigin) {\n switch (origin) {\n case MediaViewerOrigin.Album:\n case MediaViewerOrigin.ScheduledAlbum:\n case MediaViewerOrigin.Inline:\n case MediaViewerOrigin.ScheduledInline:\n ghost.classList.add('rounded-corners');\n break;\n\n case MediaViewerOrigin.SharedMedia:\n case MediaViewerOrigin.ProfileAvatar:\n case MediaViewerOrigin.SearchResult:\n (ghost.firstChild as HTMLElement).style.objectFit = 'cover';\n break;\n\n case MediaViewerOrigin.MiddleHeaderAvatar:\n ghost.classList.add('circle');\n break;\n }\n}\n\nfunction clearShape(ghost: HTMLDivElement) {\n (ghost.firstChild as HTMLElement).style.objectFit = 'default';\n ghost.classList.remove('rounded-corners', 'circle');\n}\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, ApiMessage, ApiUser } from '../../api/types';\n\nimport { getSenderTitle, isChatPrivate } from '../../modules/helpers';\nimport { formatMediaDateTime } from '../../util/dateFormat';\nimport renderText from '../common/helpers/renderText';\nimport {\n selectChat,\n selectChatMessage,\n selectSender,\n selectUser,\n} from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Avatar from '../common/Avatar';\n\nimport './SenderInfo.scss';\n\ntype OwnProps = {\n chatId?: number;\n messageId?: number;\n isAvatar?: boolean;\n};\n\ntype StateProps = {\n sender?: ApiUser | ApiChat;\n message?: ApiMessage;\n};\n\ntype DispatchProps = Pick;\n\nconst SenderInfo: FC = ({\n chatId, messageId, sender, isAvatar, message, closeMediaViewer, focusMessage,\n}) => {\n const handleFocusMessage = useCallback(() => {\n closeMediaViewer();\n focusMessage({ chatId, messageId });\n }, [chatId, focusMessage, messageId, closeMediaViewer]);\n\n const lang = useLang();\n\n if (!sender || (!message && !isAvatar)) {\n return undefined;\n }\n\n const isFromChat = sender.id < 0;\n const senderTitle = getSenderTitle(lang, sender);\n\n return (\n
\n {isFromChat ? (\n \n ) : (\n \n )}\n
\n
\n {senderTitle && renderText(senderTitle)}\n
\n
\n {isAvatar ? lang('lng_mediaview_profile_photo') : formatMediaDateTime(lang, message!.date * 1000)}\n
\n
\n
\n );\n};\n\nexport default withGlobal(\n (global, { chatId, messageId, isAvatar }): StateProps => {\n if (isAvatar && chatId) {\n return {\n sender: isChatPrivate(chatId) ? selectUser(global, chatId) : selectChat(global, chatId),\n };\n }\n\n if (!messageId || !chatId) {\n return {};\n }\n\n const message = selectChatMessage(global, chatId, messageId);\n\n return {\n message,\n sender: message && selectSender(global, message),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['closeMediaViewer', 'focusMessage']),\n)(SenderInfo);\n","import React, { FC, useMemo } from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { getMessageMediaHash } from '../../modules/helpers';\nimport useLang from '../../hooks/useLang';\nimport useMediaDownload from '../../hooks/useMediaDownload';\n\nimport Button from '../ui/Button';\nimport DropdownMenu from '../ui/DropdownMenu';\nimport MenuItem from '../ui/MenuItem';\nimport ProgressSpinner from '../ui/ProgressSpinner';\n\nimport './MediaViewerActions.scss';\n\ntype OwnProps = {\n mediaData?: string;\n isVideo: boolean;\n isZoomed: boolean;\n message?: ApiMessage;\n fileName?: string;\n isAvatar?: boolean;\n onCloseMediaViewer: NoneToVoidFunction;\n onForward: NoneToVoidFunction;\n onZoomToggle: NoneToVoidFunction;\n};\n\nconst MediaViewerActions: FC = ({\n mediaData,\n isVideo,\n isZoomed,\n message,\n fileName,\n isAvatar,\n onCloseMediaViewer,\n onForward,\n onZoomToggle,\n}) => {\n const {\n isDownloadStarted,\n downloadProgress,\n handleDownloadClick,\n } = useMediaDownload(\n message && isVideo ? getMessageMediaHash(message, 'download') : undefined,\n fileName,\n );\n\n const lang = useLang();\n\n const MenuButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n \n \n \n );\n }, []);\n\n if (IS_SINGLE_COLUMN_LAYOUT) {\n return (\n
\n \n {!isAvatar && (\n \n {lang('Forward')}\n \n )}\n {isVideo ? (\n \n {isDownloadStarted ? `${Math.round(downloadProgress * 100)}% Downloading...` : 'Download'}\n \n ) : (\n \n {lang('AccActionDownload')}\n \n )}\n \n {isDownloadStarted && }\n
\n );\n }\n\n return (\n
\n {!isAvatar && (\n <>\n \n \n \n \n )}\n {isVideo ? (\n \n {isDownloadStarted ? (\n \n ) : (\n \n )}\n \n ) : (\n \n \n \n )}\n \n \n \n \n \n \n
\n );\n};\n\nexport default MediaViewerActions;\n","import React, { FC, useEffect, useState } from '../../lib/teact/teact';\n\nimport { throttle } from '../../util/schedulers';\nimport { TextPart } from '../common/helpers/renderMessageText';\nimport buildClassName from '../../util/buildClassName';\nimport { REM } from '../common/helpers/mediaDimensions';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\n\nimport './MediaViewerFooter.scss';\n\nconst RESIZE_THROTTLE_MS = 500;\n\ntype OwnProps = {\n text: TextPart | TextPart[];\n onClick: () => void;\n isHidden?: boolean;\n isForVideo: boolean;\n};\n\nconst MediaViewerFooter: FC = ({\n text = '', isHidden, isForVideo, onClick,\n}) => {\n const [isMultiline, setIsMultiline] = useState(false);\n useEffect(() => {\n const footerContent = document.querySelector('.MediaViewerFooter .media-text') as HTMLDivElement | null;\n\n const checkIsMultiline = () => {\n const height = footerContent ? footerContent.clientHeight : 0;\n\n setIsMultiline(height > REM * 2);\n };\n\n // First run for initial detection of multiline footer text\n checkIsMultiline();\n\n const handleResize = throttle(checkIsMultiline, RESIZE_THROTTLE_MS, true);\n\n window.addEventListener('resize', handleResize, false);\n\n return () => {\n window.removeEventListener('resize', handleResize, false);\n };\n }, []);\n\n function stopEvent(e: React.MouseEvent) {\n if (text) {\n e.stopPropagation();\n }\n }\n\n const classNames = buildClassName(\n 'MediaViewerFooter',\n isForVideo && 'is-for-video',\n isHidden && 'is-hidden',\n );\n\n return (\n
\n {text && (\n
\n

{text}

\n
\n )}\n
\n );\n};\n\nexport default MediaViewerFooter;\n","import { useLayoutEffect, useState } from '../lib/teact/teact';\nimport { PLATFORM_ENV } from '../util/environment';\n\ntype RefType = {\n current: HTMLElement | null;\n};\n\ntype ReturnType = [boolean, () => void, () => void] | [false];\ntype CallbackType = (isPlayed: boolean) => void;\n\nconst prop = getBrowserFullscreenElementProp();\n\nexport default function useFullscreenStatus(elRef: RefType, setIsPlayed: CallbackType): ReturnType {\n const [isFullscreen, setIsFullscreen] = useState(Boolean(prop && document[prop]));\n\n const setFullscreen = () => {\n if (!elRef.current || !(prop || PLATFORM_ENV === 'iOS')) {\n return;\n }\n\n if (elRef.current.requestFullscreen) {\n elRef.current.requestFullscreen();\n } else if (elRef.current.webkitRequestFullscreen) {\n elRef.current.webkitRequestFullscreen();\n } else if (elRef.current.webkitEnterFullscreen) {\n elRef.current.webkitEnterFullscreen();\n } else if (elRef.current.mozRequestFullScreen) {\n elRef.current.mozRequestFullScreen();\n }\n\n setIsFullscreen(true);\n };\n\n const exitFullscreen = () => {\n if (!elRef.current) {\n return;\n }\n\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.mozCancelFullScreen) {\n document.mozCancelFullScreen();\n } else if (document.webkitCancelFullScreen) {\n document.webkitCancelFullScreen();\n } else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n }\n\n setIsFullscreen(false);\n };\n\n useLayoutEffect(() => {\n const listener = () => { setIsFullscreen(Boolean(prop && document[prop])); };\n const listenerEnter = () => { setIsFullscreen(true); };\n const listenerExit = () => {\n setIsFullscreen(false);\n setIsPlayed(false);\n };\n const video = elRef.current;\n\n document.addEventListener('fullscreenchange', listener, false);\n document.addEventListener('webkitfullscreenchange', listener, false);\n document.addEventListener('mozfullscreenchange', listener, false);\n\n if (video) {\n video.addEventListener('webkitbeginfullscreen', listenerEnter, false);\n video.addEventListener('webkitendfullscreen', listenerExit, false);\n }\n\n return () => {\n document.removeEventListener('fullscreenchange', listener, false);\n document.removeEventListener('webkitfullscreenchange', listener, false);\n document.removeEventListener('mozfullscreenchange', listener, false);\n if (video) {\n video.removeEventListener('webkitbeginfullscreen', listenerEnter, false);\n video.removeEventListener('webkitendfullscreen', listenerExit, false);\n }\n };\n // eslint-disable-next-line\n }, []);\n\n if (!prop && PLATFORM_ENV !== 'iOS') {\n return [false];\n }\n\n return [isFullscreen, setFullscreen, exitFullscreen];\n}\n\nfunction getBrowserFullscreenElementProp() {\n if (typeof document.fullscreenElement !== 'undefined') {\n return 'fullscreenElement';\n } else if (typeof document.mozFullScreenElement !== 'undefined') {\n return 'mozFullScreenElement';\n } else if (typeof document.webkitFullscreenElement !== 'undefined') {\n return 'webkitFullscreenElement';\n }\n\n return '';\n}\n","const units = ['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'];\n\nexport default (bytes: number) => {\n const number = bytes === 0 ? 0 : Math.floor(Math.log(bytes) / Math.log(1024));\n\n return `${(bytes / 1024 ** Math.floor(number)).toFixed(1)} ${units[number]}`;\n};\n","import React, { FC, useState, useEffect } from '../../lib/teact/teact';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { formatMediaDuration } from '../../util/dateFormat';\nimport formatFileSize from './helpers/formatFileSize';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\nimport './VideoPlayerControls.scss';\n\ntype IProps = {\n bufferedProgress: number;\n currentTime: number;\n duration: number;\n fileSize: number;\n isForceVisible: boolean;\n isForceMobileVersion?: boolean;\n isPlayed: boolean;\n isFullscreenSupported: boolean;\n isFullscreen: boolean;\n onChangeFullscreen: (e: React.MouseEvent) => void;\n onPlayPause: (e: React.MouseEvent) => void;\n onSeek: OnChangeHandler;\n};\n\ntype OnChangeHandler = (e: React.ChangeEvent) => void;\n\nconst stopEvent = (e: React.MouseEvent) => {\n e.stopPropagation();\n};\n\nconst HIDE_CONTROLS_TIMEOUT_MS = 800;\n\nconst VideoPlayerControls: FC = ({\n bufferedProgress,\n currentTime,\n duration,\n fileSize,\n isForceVisible,\n isForceMobileVersion,\n isPlayed,\n isFullscreenSupported,\n isFullscreen,\n onChangeFullscreen,\n onPlayPause,\n onSeek,\n}) => {\n const [isVisible, setVisibility] = useState(true);\n\n useEffect(() => {\n if (isForceVisible) {\n setVisibility(isForceVisible);\n }\n }, [isForceVisible]);\n\n useEffect(() => {\n let timeout: number | undefined;\n\n if (!isForceVisible) {\n if (IS_SINGLE_COLUMN_LAYOUT) {\n setVisibility(false);\n } else {\n timeout = window.setTimeout(() => {\n setVisibility(false);\n }, HIDE_CONTROLS_TIMEOUT_MS);\n }\n }\n\n return () => {\n if (timeout) {\n window.clearTimeout(timeout);\n }\n };\n }, [isForceVisible]);\n\n useEffect(() => {\n if (isVisible || isForceVisible) {\n document.body.classList.add('video-controls-visible');\n }\n\n return () => {\n document.body.classList.remove('video-controls-visible');\n };\n }, [isForceVisible, isVisible]);\n\n const lang = useLang();\n\n if (!isVisible && !isForceVisible) {\n return undefined;\n }\n\n return (\n
\n {renderSeekLine(currentTime, duration, bufferedProgress, onSeek)}\n \n \n \n {renderTime(currentTime, duration)}\n {bufferedProgress < 1 && renderFileSize(bufferedProgress, fileSize)}\n {isFullscreenSupported && (\n \n \n \n )}\n
\n );\n};\n\nfunction renderTime(currentTime: number, duration: number) {\n return (\n
\n {`${formatMediaDuration(currentTime)} / ${formatMediaDuration(duration)}`}\n
\n );\n}\n\nfunction renderFileSize(downloadedPercent: number, totalSize: number) {\n return (\n
\n {`${formatFileSize(totalSize * downloadedPercent)} / ${formatFileSize(totalSize)}`}\n
\n );\n}\n\nfunction renderSeekLine(currentTime: number, duration: number, bufferedProgress: number, onSeek: OnChangeHandler) {\n const percentagePlayed = (currentTime / duration) * 100;\n const percentageBuffered = bufferedProgress * 100;\n\n return (\n
\n
\n \n \n \n
\n
\n );\n}\n\nexport default VideoPlayerControls;\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { IS_IOS, IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../util/environment';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useBuffering from '../../hooks/useBuffering';\nimport useFullscreenStatus from '../../hooks/useFullscreen';\nimport useVideoCleanup from '../../hooks/useVideoCleanup';\nimport safePlay from '../../util/safePlay';\n\nimport VideoPlayerControls from './VideoPlayerControls';\nimport ProgressSpinner from '../ui/ProgressSpinner';\n\nimport './VideoPlayer.scss';\nimport { ApiDimensions } from '../../api/types';\n\ntype OwnProps = {\n url?: string;\n isGif?: boolean;\n posterData?: string;\n posterSize?: ApiDimensions;\n downloadProgress?: number;\n fileSize: number;\n isMediaViewerOpen?: boolean;\n noPlay?: boolean;\n onClose: (e: React.MouseEvent) => void;\n};\n\nconst MOBILE_VERSION_CONTROL_WIDTH = 400;\n\nconst VideoPlayer: FC = ({\n url,\n isGif,\n posterData,\n posterSize,\n downloadProgress,\n fileSize,\n isMediaViewerOpen,\n noPlay,\n onClose,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const videoRef = useRef(null);\n const [isPlayed, setIsPlayed] = useState(!IS_TOUCH_ENV || !IS_IOS);\n const [currentTime, setCurrentTime] = useState(0);\n const [isControlsVisible, setIsControlsVisible] = useState(true);\n\n const [isFullscreen, setFullscreen, exitFullscreen] = useFullscreenStatus(videoRef, setIsPlayed);\n\n const { isBuffered, bufferedProgress, bufferingHandlers } = useBuffering();\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(!isBuffered, undefined, undefined, 'slow');\n\n useEffect(() => {\n if (noPlay || !isMediaViewerOpen) {\n videoRef.current!.pause();\n } else if (url && !IS_TOUCH_ENV) {\n // Chrome does not automatically start playing when `url` becomes available (even with `autoPlay`),\n // so we force it here. Contrary, iOS does not allow to call `play` without mouse event,\n // so we need to use `autoPlay` instead to allow pre-buffering.\n safePlay(videoRef.current!);\n }\n }, [noPlay, isMediaViewerOpen, url]);\n\n useEffect(() => {\n if (videoRef.current!.currentTime === videoRef.current!.duration) {\n setCurrentTime(0);\n setIsPlayed(false);\n } else {\n setCurrentTime(videoRef.current!.currentTime);\n }\n }, [currentTime]);\n\n const togglePlayState = useCallback((e: React.MouseEvent | KeyboardEvent) => {\n e.stopPropagation();\n if (isPlayed) {\n videoRef.current!.pause();\n setIsPlayed(false);\n } else {\n videoRef.current!.play();\n setIsPlayed(true);\n }\n }, [isPlayed]);\n\n useVideoCleanup(videoRef, []);\n\n const handleMouseOver = useCallback(() => {\n setIsControlsVisible(true);\n }, []);\n\n const handleMouseOut = useCallback(() => {\n setIsControlsVisible(false);\n }, []);\n\n const handleTimeUpdate = useCallback((e: React.SyntheticEvent) => {\n setCurrentTime(e.currentTarget.currentTime);\n }, []);\n\n const handleEnded = useCallback(() => {\n setCurrentTime(0);\n setIsPlayed(false);\n }, []);\n\n const handleFullscreenChange = useCallback(() => {\n if (isFullscreen && exitFullscreen) {\n exitFullscreen();\n } else if (!isFullscreen && setFullscreen) {\n setFullscreen();\n }\n }, [exitFullscreen, isFullscreen, setFullscreen]);\n\n const handleSeek = useCallback((e: React.ChangeEvent) => {\n e.stopPropagation();\n\n videoRef.current!.currentTime = (Number(e.target.value) * videoRef.current!.duration) / 100;\n }, []);\n\n const toggleControls = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n setIsControlsVisible(!isControlsVisible);\n }, [isControlsVisible]);\n\n useEffect(() => {\n const togglePayingStateBySpace = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n togglePlayState(e);\n }\n };\n\n document.addEventListener('keydown', togglePayingStateBySpace, false);\n\n return () => {\n document.removeEventListener('keydown', togglePayingStateBySpace, false);\n };\n }, [togglePlayState]);\n\n const wrapperStyle = posterSize && `width: ${posterSize.width}px; height: ${posterSize.height}px`;\n const videoStyle = `background-image: url(${posterData})`;\n\n return (\n \n \n {/* eslint-disable-next-line jsx-a11y/media-has-caption */}\n \n {url && }\n \n \n {shouldRenderSpinner && (\n
\n {!isBuffered &&
Buffering...
}\n \n
\n )}\n {!isGif && !shouldRenderSpinner && (\n \n )}\n \n );\n};\n\nexport default memo(VideoPlayer);\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport usePrevious from '../../hooks/usePrevious';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\nimport './ZoomControls.scss';\n\ntype OwnProps = {\n isShown: boolean;\n onChangeZoom: (level: number, canCloseZoom?: boolean) => void;\n};\n\nexport const MAX_ZOOM_LEVEL = 3;\nexport const MIN_ZOOM_LEVEL = 1;\nconst ONE_STEP_PERCENT = 100 / (MAX_ZOOM_LEVEL - MIN_ZOOM_LEVEL);\nconst RESET_ZOOM_LEVEL = 1.5;\n\nconst ZoomControls: FC = ({ isShown, onChangeZoom }) => {\n const { transitionClassNames } = useShowTransition(isShown);\n const prevIsShown = usePrevious(isShown);\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const [zoomLevel, setZoomLevel] = useState(1);\n const isSeeking = useRef(false);\n\n useEffect(() => {\n if (isShown && !prevIsShown) {\n setZoomLevel(RESET_ZOOM_LEVEL);\n }\n }, [isShown, prevIsShown]);\n\n const handleZoomOut = () => {\n if (inputRef.current) {\n setZoomLevel(Math.max(MIN_ZOOM_LEVEL, zoomLevel - 0.5));\n }\n };\n\n const handleZoomIn = () => {\n if (inputRef.current) {\n setZoomLevel(Math.min(MAX_ZOOM_LEVEL, zoomLevel + 0.5));\n }\n };\n\n const handleStartSeek = useCallback(() => {\n isSeeking.current = true;\n }, []);\n\n const handleStopSeek = useCallback(() => {\n isSeeking.current = false;\n if (zoomLevel === 1) {\n onChangeZoom(zoomLevel, !isSeeking.current);\n }\n }, [onChangeZoom, zoomLevel]);\n\n const handleSeeklineChange = (e:React.ChangeEvent) => {\n setZoomLevel(Math.min(MAX_ZOOM_LEVEL, Math.max(Number(e.target.value), MIN_ZOOM_LEVEL)));\n };\n\n useEffect(() => {\n onChangeZoom(zoomLevel, !isSeeking.current);\n }, [zoomLevel, onChangeZoom]);\n\n const lang = useLang();\n\n const className = buildClassName(\n 'ZoomControls',\n transitionClassNames,\n );\n\n return (\n
\n \n \n \n \n \n \n
\n
\n \n \n
\n
\n
\n );\n};\n\nexport default memo(ZoomControls);\n","/*\n @source https://github.com/ajainarayanan/react-pan-zoom\n\n Heavily inspired/lifted from this idea: https://stackoverflow.com/a/39311435/661768\n without jqueryUI or jquery dependency.\n*/\nimport React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { areSortedArraysEqual } from '../../util/iteratees';\n\nimport './PanZoom.scss';\n\nexport interface IDragData {\n x: number;\n y: number;\n dx: number;\n dy: number;\n}\n\nexport interface OwnProps {\n children: any;\n className?: string;\n noWrap: boolean;\n canPan: boolean;\n zoomLevel: number;\n panDeltaX: number;\n panDeltaY: number;\n onPan?: (x: number, y: number) => void;\n}\n\nconst INITIAL_MATRIX = [\n 1, 0, 0, 1, 0, 0,\n];\n\nconst SCALE_VALUES = {\n 1: 1,\n 1.5: 1.5,\n 2: 2.2,\n 2.5: 3.3,\n 3: 5.5,\n};\n\nconst ZOOM_SAFE_AREA = 150;\n\nfunction calculateSafeZoneOnZoom(oldScale: number, matrixData: number[], wrapper: HTMLDivElement | null) {\n const image = wrapper && wrapper.querySelector('.active img');\n if (!wrapper || !image) {\n return matrixData;\n }\n const wrapperRect = wrapper.getBoundingClientRect();\n const imageRect = image.getBoundingClientRect();\n\n const newImgWidth = (imageRect.width / oldScale) * matrixData[0];\n const newImgHeight = (imageRect.height / oldScale) * matrixData[3];\n const newImgX = (wrapperRect.width - newImgWidth) / 2 + matrixData[4];\n const newImgY = (wrapperRect.height - newImgHeight) / 2 + matrixData[5];\n if (wrapperRect.width && wrapperRect.width - ZOOM_SAFE_AREA < newImgX) {\n matrixData[4] -= newImgX + wrapperRect.width - ZOOM_SAFE_AREA;\n } else if (newImgWidth && newImgWidth + newImgX < ZOOM_SAFE_AREA) {\n matrixData[4] -= newImgWidth + newImgX - ZOOM_SAFE_AREA;\n }\n if (wrapperRect.height && wrapperRect.height - ZOOM_SAFE_AREA < newImgY) {\n matrixData[5] -= newImgY + wrapperRect.height - ZOOM_SAFE_AREA;\n } else if (newImgHeight && newImgHeight + newImgY < ZOOM_SAFE_AREA) {\n matrixData[5] -= newImgHeight + newImgY - ZOOM_SAFE_AREA;\n }\n\n return matrixData;\n}\n\nconst PanZoom: FC = ({\n children,\n className,\n noWrap,\n canPan,\n zoomLevel,\n panDeltaX,\n panDeltaY,\n onPan,\n}) => {\n const tunedZoomLevel = SCALE_VALUES[zoomLevel as keyof typeof SCALE_VALUES] || zoomLevel;\n const [isDragging, setIsDragging] = useState(false);\n const [dragData, setDragData] = useState({\n dx: panDeltaX, dy: panDeltaY, x: 0, y: 0,\n });\n // [zoom, skew, skew, zoom, dx, dy] - see https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix()\n const [matrixData, setMatrixData] = useState(INITIAL_MATRIX);\n // Used to set cursor while moving.\n // eslint-disable-next-line no-null/no-null\n const panWrapperRef = useRef(null);\n // Used to set transform for pan.\n // eslint-disable-next-line no-null/no-null\n const panContainerRef = useRef(null);\n\n useEffect(() => {\n const newZoomLevel = tunedZoomLevel || matrixData[0];\n const newPandx = panDeltaX || matrixData[4];\n const newPandy = panDeltaY || matrixData[5];\n\n const newMatrixData = [...matrixData];\n if (matrixData[0] !== newZoomLevel) {\n newMatrixData[0] = newZoomLevel || newMatrixData[0];\n newMatrixData[3] = newZoomLevel || newMatrixData[3];\n }\n if (matrixData[4] !== newPandx) {\n newMatrixData[4] = newPandx;\n }\n if (matrixData[5] !== newPandy) {\n newMatrixData[5] = newPandy;\n }\n\n if (!areSortedArraysEqual(matrixData, newMatrixData)) {\n setMatrixData(calculateSafeZoneOnZoom(matrixData[0], newMatrixData, panWrapperRef.current));\n }\n // eslint-disable-next-line\n }, [panDeltaX, panDeltaY, tunedZoomLevel]);\n\n useEffect(() => {\n if (!canPan) {\n setMatrixData(INITIAL_MATRIX);\n }\n }, [canPan]);\n\n useEffect(() => {\n if (panContainerRef.current) {\n panContainerRef.current.style.transform = `matrix(${matrixData.toString()})`;\n }\n }, [noWrap, matrixData]);\n\n const handleMouseDown = (e: React.MouseEvent) => {\n if (!canPan) {\n return;\n }\n\n e.stopPropagation();\n e.preventDefault();\n\n const offsetX = matrixData[4];\n const offsetY = matrixData[5];\n const newDragData: IDragData = {\n dx: offsetX,\n dy: offsetY,\n x: e.pageX,\n y: e.pageY,\n };\n setDragData(newDragData);\n setIsDragging(true);\n\n if (panWrapperRef.current) {\n panWrapperRef.current.classList.add('move');\n }\n };\n\n const handleMouseUp = () => {\n setIsDragging(false);\n\n if (panWrapperRef.current) {\n panWrapperRef.current.classList.remove('move');\n }\n\n if (onPan) {\n onPan(matrixData[4], matrixData[5]);\n }\n };\n\n function getNewMatrixData(x: number, y: number): number[] {\n const newMatrixData = [...matrixData];\n const deltaX = dragData.x - x;\n const deltaY = dragData.y - y;\n newMatrixData[4] = dragData.dx - deltaX;\n newMatrixData[5] = dragData.dy - deltaY;\n\n return newMatrixData;\n }\n\n const handleMouseMove = (e: React.MouseEvent) => {\n if (isDragging) {\n const newMatrixData = getNewMatrixData(e.pageX, e.pageY);\n setMatrixData(newMatrixData);\n\n if (panContainerRef.current) {\n panContainerRef.current.style.transform = `matrix(${matrixData.toString()})`;\n }\n }\n };\n\n if (noWrap) {\n return children;\n }\n\n return (\n \n \n {children}\n \n \n );\n};\n\nexport default memo(PanZoom);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport {\n ApiChat, ApiMediaFormat, ApiMessage, ApiUser, ApiDimensions,\n} from '../../api/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport { IS_IOS, IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../util/environment';\nimport windowSize from '../../util/windowSize';\nimport {\n AVATAR_FULL_DIMENSIONS,\n MEDIA_VIEWER_MEDIA_QUERY,\n calculateMediaViewerDimensions,\n} from '../common/helpers/mediaDimensions';\nimport {\n selectChat,\n selectChatMessage,\n selectChatMessages,\n selectCurrentMediaSearch,\n selectListedIds,\n selectOutlyingIds,\n selectScheduledMessage,\n selectScheduledMessages,\n selectUser,\n} from '../../modules/selectors';\nimport {\n getChatAvatarHash,\n getChatMediaMessageIds,\n getMessageFileName,\n getMessageMediaFormat,\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n getMessagePhoto,\n getMessageVideo,\n getMessageDocument,\n isMessageDocumentPhoto,\n isMessageDocumentVideo,\n getMessageWebPagePhoto,\n getMessageWebPageVideo,\n getPhotoFullDimensions,\n getVideoDimensions, getMessageFileSize,\n} from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../util/captureEvents';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { stopCurrentAudio } from '../../util/audioPlayer';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport useMedia from '../../hooks/useMedia';\nimport useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress';\nimport useBlurSync from '../../hooks/useBlurSync';\nimport usePrevious from '../../hooks/usePrevious';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport { renderMessageText } from '../common/helpers/renderMessageText';\nimport { animateClosing, animateOpening } from './helpers/ghostAnimation';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Spinner from '../ui/Spinner';\nimport ShowTransition from '../ui/ShowTransition';\nimport Transition from '../ui/Transition';\nimport Button from '../ui/Button';\nimport SenderInfo from './SenderInfo';\nimport MediaViewerActions from './MediaViewerActions';\nimport MediaViewerFooter from './MediaViewerFooter';\nimport VideoPlayer from './VideoPlayer';\nimport ZoomControls from './ZoomControls';\nimport PanZoom from './PanZoom';\n\nimport './MediaViewer.scss';\n\ntype StateProps = {\n chatId?: number;\n threadId?: number;\n messageId?: number;\n senderId?: number;\n origin?: MediaViewerOrigin;\n avatarOwner?: ApiChat | ApiUser;\n profilePhotoIndex?: number;\n message?: ApiMessage;\n chatMessages?: Record;\n collectionIds?: number[];\n animationLevel: 0 | 1 | 2;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_DURATION = 350;\n\nconst MediaViewer: FC = ({\n chatId,\n threadId,\n messageId,\n senderId,\n origin,\n avatarOwner,\n profilePhotoIndex,\n message,\n chatMessages,\n collectionIds,\n openMediaViewer,\n closeMediaViewer,\n openForwardMenu,\n focusMessage,\n animationLevel,\n}) => {\n const isOpen = Boolean(avatarOwner || messageId);\n\n const isFromSharedMedia = origin === MediaViewerOrigin.SharedMedia;\n const isFromSearch = origin === MediaViewerOrigin.SearchResult;\n\n /* Content */\n const photo = message ? getMessagePhoto(message) : undefined;\n const video = message ? getMessageVideo(message) : undefined;\n const webPagePhoto = message ? getMessageWebPagePhoto(message) : undefined;\n const webPageVideo = message ? getMessageWebPageVideo(message) : undefined;\n const isDocumentPhoto = message ? isMessageDocumentPhoto(message) : false;\n const isDocumentVideo = message ? isMessageDocumentVideo(message) : false;\n const isVideo = Boolean(video || webPageVideo || isDocumentVideo);\n const isPhoto = Boolean(!isVideo && (photo || webPagePhoto || isDocumentPhoto));\n const { isGif } = video || webPageVideo || {};\n const isAvatar = Boolean(avatarOwner);\n\n /* Navigation */\n const isSingleSlide = Boolean(webPagePhoto || webPageVideo);\n const messageIds = useMemo(() => {\n return isSingleSlide && messageId\n ? [messageId]\n : getChatMediaMessageIds(chatMessages || {}, collectionIds || [], isFromSharedMedia);\n }, [isSingleSlide, messageId, chatMessages, collectionIds, isFromSharedMedia]);\n\n const selectedMediaMessageIndex = messageId ? messageIds.indexOf(messageId) : -1;\n const isFirst = selectedMediaMessageIndex === 0 || selectedMediaMessageIndex === -1;\n const isLast = selectedMediaMessageIndex === messageIds.length - 1 || selectedMediaMessageIndex === -1;\n\n /* Animation */\n const animationKey = useRef();\n const prevSenderId = usePrevious(senderId);\n if (isOpen && (!prevSenderId || prevSenderId !== senderId || !animationKey.current)) {\n animationKey.current = selectedMediaMessageIndex;\n }\n const slideAnimation = animationLevel >= 1 ? 'mv-slide' : 'none';\n const headerAnimation = animationLevel === 2 ? 'slide-fade' : 'none';\n const isGhostAnimation = animationLevel === 2;\n\n /* Controls */\n const [isFooterHidden, setIsFooterHidden] = useState(false);\n const [canPanZoomWrap, setCanPanZoomWrap] = useState(false);\n const [isZoomed, setIsZoomed] = useState(false);\n const [zoomLevel, setZoomLevel] = useState(1);\n const [panDelta, setPanDelta] = useState({ x: 0, y: 0 });\n\n /* Media data */\n function getMediaHash(isFull?: boolean) {\n if (isAvatar && profilePhotoIndex !== undefined) {\n const { photos } = avatarOwner!;\n return photos && photos[profilePhotoIndex]\n ? `photo${photos[profilePhotoIndex].id}?size=c`\n : getChatAvatarHash(avatarOwner!, isFull ? 'big' : 'normal');\n }\n\n return message && getMessageMediaHash(message, isFull ? 'viewerFull' : 'viewerPreview');\n }\n\n const blobUrlPictogram = useMedia(\n message && (isFromSharedMedia || isFromSearch) && getMessageMediaHash(message, 'pictogram'),\n undefined,\n ApiMediaFormat.BlobUrl,\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n const previewMediaHash = getMediaHash();\n const blobUrlPreview = useMedia(\n previewMediaHash,\n undefined,\n isAvatar && previewMediaHash && previewMediaHash.startsWith('profilePhoto')\n ? ApiMediaFormat.DataUri\n : ApiMediaFormat.BlobUrl,\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n const { mediaData: fullMediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMediaHash(true),\n undefined,\n message && getMessageMediaFormat(message, 'viewerFull'),\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n\n const localBlobUrl = (photo || video) ? (photo || video)!.blobUrl : undefined;\n let bestImageData = (!isVideo && (localBlobUrl || fullMediaData)) || blobUrlPreview || blobUrlPictogram;\n const thumbDataUri = useBlurSync(!bestImageData && message && getMessageMediaThumbDataUri(message));\n if (!bestImageData && origin !== MediaViewerOrigin.SearchResult) {\n bestImageData = thumbDataUri;\n }\n\n const videoSize = message ? getMessageFileSize(message) : undefined;\n const fileName = message\n ? getMessageFileName(message)\n : isAvatar\n ? `avatar${avatarOwner!.id}-${profilePhotoIndex}.jpg`\n : undefined;\n\n let dimensions!: ApiDimensions;\n if (message) {\n if (isDocumentPhoto || isDocumentVideo) {\n dimensions = getMessageDocument(message)!.mediaSize!;\n } else if (photo || webPagePhoto) {\n dimensions = getPhotoFullDimensions((photo || webPagePhoto)!)!;\n } else if (video || webPageVideo) {\n dimensions = getVideoDimensions((video || webPageVideo)!)!;\n }\n } else {\n dimensions = AVATAR_FULL_DIMENSIONS;\n }\n\n useEffect(() => {\n if (!IS_SINGLE_COLUMN_LAYOUT) {\n return;\n }\n\n document.body.classList.toggle('is-media-viewer-open', isOpen);\n }, [isOpen]);\n\n const forceUpdate = useForceUpdate();\n useEffect(() => {\n const mql = window.matchMedia(MEDIA_VIEWER_MEDIA_QUERY);\n if (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', forceUpdate);\n } else if (typeof mql.addListener === 'function') {\n mql.addListener(forceUpdate);\n }\n\n return () => {\n if (typeof mql.removeEventListener === 'function') {\n mql.removeEventListener('change', forceUpdate);\n } else if (typeof mql.removeListener === 'function') {\n mql.removeListener(forceUpdate);\n }\n };\n }, [forceUpdate]);\n\n const prevMessage = usePrevious(message);\n const prevOrigin = usePrevious(origin);\n const prevAvatarOwner = usePrevious(avatarOwner);\n const prevBestImageData = usePrevious(bestImageData);\n useEffect(() => {\n if (isGhostAnimation && isOpen && !prevMessage && !prevAvatarOwner) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY);\n const textParts = message ? renderMessageText(message) : undefined;\n const hasFooter = Boolean(textParts);\n animateOpening(hasFooter, origin!, bestImageData!, dimensions, isVideo, message);\n }\n\n if (isGhostAnimation && !isOpen && (prevMessage || prevAvatarOwner)) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY);\n animateClosing(prevOrigin!, prevBestImageData!, prevMessage || undefined);\n }\n }, [\n isGhostAnimation, isOpen, origin, prevOrigin, message, prevMessage, prevAvatarOwner,\n bestImageData, prevBestImageData, dimensions, isVideo,\n ]);\n\n useEffect(() => {\n let timer: number | undefined;\n\n if (isZoomed) {\n setCanPanZoomWrap(true);\n } else {\n timer = window.setTimeout(() => {\n setCanPanZoomWrap(false);\n }, ANIMATION_DURATION);\n }\n\n return () => {\n if (timer) {\n window.clearTimeout(timer);\n }\n };\n }, [isZoomed]);\n\n const closeZoom = () => {\n setIsZoomed(false);\n setZoomLevel(1);\n setPanDelta({ x: 0, y: 0 });\n };\n\n const handleZoomToggle = useCallback(() => {\n setIsZoomed(!isZoomed);\n setZoomLevel(!isZoomed ? 1.5 : 1);\n if (isZoomed) {\n setPanDelta({ x: 0, y: 0 });\n }\n }, [isZoomed]);\n\n const handleZoomValue = useCallback((level: number, canCloseZoom = false) => {\n setZoomLevel(level);\n if (level === 1 && canCloseZoom) {\n closeZoom();\n }\n }, []);\n\n const close = useCallback(() => {\n closeMediaViewer();\n closeZoom();\n }, [closeMediaViewer]);\n\n const handleFooterClick = useCallback(() => {\n close();\n focusMessage({ chatId, threadId, messageId });\n }, [close, chatId, threadId, focusMessage, messageId]);\n\n const handleForward = useCallback(() => {\n openForwardMenu({ fromChatId: chatId, messageIds: [messageId] });\n closeZoom();\n }, [openForwardMenu, chatId, messageId]);\n\n useEffect(() => (isOpen ? captureEscKeyListener(() => {\n if (isZoomed) {\n closeZoom();\n } else {\n close();\n }\n }) : undefined), [close, isOpen, isZoomed]);\n\n useEffect(() => {\n if (isVideo && !isGif) {\n stopCurrentAudio();\n }\n }, [isGif, isVideo]);\n\n // Prevent refresh when rotating device to watch a video\n useEffect(() => {\n if (!isOpen) {\n return undefined;\n }\n\n windowSize.disableRefresh();\n\n return () => {\n windowSize.enableRefresh();\n };\n }, [isOpen]);\n\n const getMessageId = useCallback((fromId: number, direction: number): number => {\n let index = messageIds.indexOf(fromId);\n if ((direction === -1 && index > 0) || (direction === 1 && index < messageIds.length - 1)) {\n index += direction;\n }\n\n return messageIds[index];\n }, [messageIds]);\n\n const selectPreviousMedia = useCallback(() => {\n if (isFirst) {\n return;\n }\n\n openMediaViewer({\n chatId,\n threadId,\n messageId: messageId ? getMessageId(messageId, -1) : undefined,\n origin,\n });\n }, [chatId, threadId, getMessageId, isFirst, messageId, openMediaViewer, origin]);\n\n const selectNextMedia = useCallback(() => {\n if (isLast) {\n return;\n }\n\n openMediaViewer({\n chatId,\n threadId,\n messageId: messageId ? getMessageId(messageId, 1) : undefined,\n origin,\n });\n }, [chatId, threadId, getMessageId, isLast, messageId, openMediaViewer, origin]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'Left': // IE/Edge specific value\n case 'ArrowLeft':\n selectPreviousMedia();\n break;\n\n case 'Right': // IE/Edge specific value\n case 'ArrowRight':\n selectNextMedia();\n break;\n }\n };\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n });\n\n // Support for swipe gestures and closing on click\n useEffect(() => {\n const element = document.querySelector('.slide-container > .active, .slide-container > .to');\n if (!element) {\n return undefined;\n }\n\n const shouldCloseOnVideo = isGif && !IS_IOS;\n\n return captureEvents(element, {\n // eslint-disable-next-line max-len\n excludedClosestSelector: `.backdrop, .navigation, .media-viewer-head, .media-viewer-footer${!shouldCloseOnVideo ? ', .VideoPlayer' : ''}`,\n onClick: () => {\n if (!isZoomed && !IS_TOUCH_ENV) {\n close();\n }\n },\n onSwipe: IS_TOUCH_ENV ? (e, direction) => {\n if (direction === SwipeDirection.Right) {\n selectPreviousMedia();\n } else if (direction === SwipeDirection.Left) {\n selectNextMedia();\n } else if (!(e.target && (e.target as HTMLElement).closest('.MediaViewerFooter'))) {\n close();\n }\n } : undefined,\n });\n }, [close, isFooterHidden, isGif, isPhoto, isZoomed, selectNextMedia, selectPreviousMedia]);\n\n const handlePan = useCallback((x: number, y: number) => {\n setPanDelta({ x, y });\n }, []);\n\n const handleToggleFooterVisibility = useCallback(() => {\n if (IS_TOUCH_ENV && (isPhoto || isGif)) {\n setIsFooterHidden(!isFooterHidden);\n }\n }, [isFooterHidden, isGif, isPhoto]);\n\n const lang = useLang();\n\n useHistoryBack(isOpen, closeMediaViewer, openMediaViewer, {\n chatId,\n threadId,\n messageId,\n origin,\n avatarOwnerId: avatarOwner && avatarOwner.id,\n });\n\n function renderSlide(isActive: boolean) {\n if (isAvatar) {\n return (\n
\n {renderPhoto(\n fullMediaData || blobUrlPreview,\n calculateMediaViewerDimensions(AVATAR_FULL_DIMENSIONS, false),\n !IS_SINGLE_COLUMN_LAYOUT && !isZoomed,\n )}\n
\n );\n } else if (message) {\n const textParts = renderMessageText(message);\n const hasFooter = Boolean(textParts);\n\n return (\n \n {isPhoto && renderPhoto(\n localBlobUrl || fullMediaData || blobUrlPreview || blobUrlPictogram,\n message && calculateMediaViewerDimensions(dimensions!, hasFooter),\n !IS_SINGLE_COLUMN_LAYOUT && !isZoomed,\n )}\n {isVideo && (\n \n )}\n {textParts && (\n \n )}\n \n );\n }\n\n return undefined;\n }\n\n function renderSenderInfo() {\n return isAvatar ? (\n \n ) : (\n \n );\n }\n\n return (\n \n {() => (\n <>\n
\n {IS_SINGLE_COLUMN_LAYOUT && (\n \n \n \n )}\n \n {renderSenderInfo}\n \n \n
\n \n \n {renderSlide}\n \n \n {!isFirst && (\n \n )}\n {!isLast && (\n \n )}\n \n \n )}\n \n );\n};\n\nfunction renderPhoto(blobUrl?: string, imageSize?: ApiDimensions, canDrag?: boolean) {\n return blobUrl\n ? (\n \n )\n : (\n \n \n \n );\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chatId, threadId, messageId, avatarOwnerId, profilePhotoIndex, origin,\n } = global.mediaViewer;\n const {\n animationLevel,\n } = global.settings.byKey;\n\n if (origin === MediaViewerOrigin.SearchResult) {\n if (!(chatId && messageId)) {\n return { animationLevel };\n }\n\n const message = selectChatMessage(global, chatId, messageId);\n if (!message) {\n return { animationLevel };\n }\n\n return {\n chatId,\n messageId,\n senderId: message.senderId,\n origin,\n message,\n animationLevel,\n };\n }\n\n if (avatarOwnerId) {\n const sender = selectUser(global, avatarOwnerId) || selectChat(global, avatarOwnerId);\n\n return {\n messageId: -1,\n senderId: avatarOwnerId,\n avatarOwner: sender,\n profilePhotoIndex: profilePhotoIndex || 0,\n animationLevel,\n origin,\n };\n }\n\n if (!(chatId && threadId && messageId)) {\n return { animationLevel };\n }\n\n let message: ApiMessage | undefined;\n if (origin && [MediaViewerOrigin.ScheduledAlbum, MediaViewerOrigin.ScheduledInline].includes(origin)) {\n message = selectScheduledMessage(global, chatId, messageId);\n } else {\n message = selectChatMessage(global, chatId, messageId);\n }\n\n if (!message) {\n return { animationLevel };\n }\n\n let chatMessages: Record | undefined;\n\n if (origin && [MediaViewerOrigin.ScheduledAlbum, MediaViewerOrigin.ScheduledInline].includes(origin)) {\n chatMessages = selectScheduledMessages(global, chatId);\n } else {\n chatMessages = selectChatMessages(global, chatId);\n }\n let collectionIds: number[] | undefined;\n\n if (origin === MediaViewerOrigin.Inline || origin === MediaViewerOrigin.Album) {\n collectionIds = selectOutlyingIds(global, chatId, threadId) || selectListedIds(global, chatId, threadId);\n } else if (origin === MediaViewerOrigin.SharedMedia) {\n const currentSearch = selectCurrentMediaSearch(global);\n const { foundIds } = (currentSearch && currentSearch.resultsByType && currentSearch.resultsByType.media) || {};\n collectionIds = foundIds;\n }\n\n return {\n chatId,\n threadId,\n messageId,\n senderId: message.senderId,\n origin,\n message,\n chatMessages,\n collectionIds,\n animationLevel,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openMediaViewer', 'closeMediaViewer', 'openForwardMenu', 'focusMessage',\n ]),\n)(MediaViewer));\n","import React, {\n FC, useMemo, useState, memo, useRef, useEffect, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, MAIN_THREAD_ID } from '../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport {\n getCanPostInChat, getChatTitle, isChatPrivate, sortChatIds,\n} from '../../modules/helpers';\nimport searchWords from '../../util/searchWords';\nimport { pick, unique } from '../../util/iteratees';\nimport useInfiniteScroll from '../../hooks/useInfiniteScroll';\nimport useLang from '../../hooks/useLang';\nimport useKeyboardListNavigation from '../../hooks/useKeyboardListNavigation';\n\nimport Loading from '../ui/Loading';\nimport Modal from '../ui/Modal';\nimport InputText from '../ui/InputText';\nimport Button from '../ui/Button';\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from '../common/PrivateChatInfo';\nimport GroupChatInfo from '../common/GroupChatInfo';\n\nimport './ForwardPicker.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n};\n\ntype StateProps = {\n chatsById: Record;\n pinnedIds?: number[];\n activeListIds?: number[];\n archivedListIds?: number[];\n orderedPinnedIds?: number[];\n currentUserId?: number;\n};\n\ntype DispatchProps = Pick;\n\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 500;\nconst MODAL_HIDE_DELAY_MS = 300;\n\nconst ForwardPicker: FC = ({\n chatsById,\n pinnedIds,\n activeListIds,\n archivedListIds,\n currentUserId,\n isOpen,\n setForwardChatId,\n exitForwardMode,\n loadMoreChats,\n}) => {\n const [filter, setFilter] = useState('');\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const lang = useLang();\n\n useEffect(() => {\n if (isOpen) {\n if (!IS_SINGLE_COLUMN_LAYOUT) {\n setTimeout(() => {\n requestAnimationFrame(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n });\n }, FOCUS_DELAY_MS);\n }\n } else {\n if (inputRef.current) {\n inputRef.current.blur();\n }\n\n setTimeout(() => {\n setFilter('');\n }, MODAL_HIDE_DELAY_MS);\n }\n }, [isOpen]);\n\n const chatIds = useMemo(() => {\n const listIds = [\n ...activeListIds || [],\n ...archivedListIds || [],\n ];\n\n let priorityIds = pinnedIds || [];\n if (currentUserId) {\n priorityIds = unique([currentUserId, ...priorityIds]);\n }\n\n return sortChatIds([\n ...listIds.filter((id) => {\n const chat = chatsById[id];\n if (!chat) {\n return true;\n }\n\n if (!getCanPostInChat(chat, MAIN_THREAD_ID)) {\n return false;\n }\n\n if (!filter) {\n return true;\n }\n\n return searchWords(getChatTitle(lang, chatsById[id], undefined, id === currentUserId), filter);\n }),\n ], chatsById, undefined, priorityIds);\n }, [activeListIds, archivedListIds, chatsById, currentUserId, filter, lang, pinnedIds]);\n\n const [viewportIds, getMore] = useInfiniteScroll(loadMoreChats, chatIds, Boolean(filter));\n\n const handleFilterChange = useCallback((e: React.ChangeEvent) => {\n setFilter(e.currentTarget.value);\n }, []);\n\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const handleKeyDown = useKeyboardListNavigation(containerRef, isOpen, (index) => {\n if (viewportIds) {\n setForwardChatId({ id: viewportIds[index] });\n }\n }, '.ListItem-button', true);\n\n const modalHeader = (\n
\n \n \n \n \n
\n );\n\n return (\n \n {viewportIds && viewportIds.length ? (\n \n {viewportIds.map((id) => (\n setForwardChatId({ id })}\n >\n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n ))}\n \n ) : viewportIds && !viewportIds.length ? (\n

Sorry, nothing found.

\n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: {\n byId: chatsById,\n listIds,\n orderedPinnedIds,\n },\n currentUserId,\n } = global;\n\n return {\n chatsById,\n pinnedIds: orderedPinnedIds.active,\n activeListIds: listIds.active,\n archivedListIds: listIds.archived,\n currentUserId,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setForwardChatId', 'exitForwardMode', 'loadMoreChats']),\n)(ForwardPicker));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiError, ApiInviteInfo } from '../../api/types';\n\nimport getReadableErrorText from '../../util/getReadableErrorText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\nimport renderText from '../common/helpers/renderText';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './Dialogs.scss';\n\ntype StateProps = {\n dialogs: (ApiError | ApiInviteInfo)[];\n};\n\ntype DispatchProps = Pick;\n\nconst Dialogs: FC = ({ dialogs, dismissDialog, acceptInviteConfirmation }) => {\n const lang = useLang();\n\n if (!dialogs.length) {\n return undefined;\n }\n\n const renderInvite = (invite: ApiInviteInfo) => {\n const {\n hash, title, participantsCount, isChannel,\n } = invite;\n\n const handleJoinClick = () => {\n acceptInviteConfirmation({\n hash,\n });\n dismissDialog();\n };\n\n const participantsText = isChannel\n ? lang('Subscribers', participantsCount, 'i')\n : lang('Members', participantsCount, 'i');\n\n const joinText = isChannel ? lang('ChannelJoin') : lang('JoinGroup');\n\n return (\n \n {participantsCount !== undefined &&

{participantsText}

}\n \n \n \n );\n };\n\n const renderError = (error: ApiError) => {\n return (\n \n {error.hasErrorKey ? getReadableErrorText(error) : renderText(error.message!, ['emoji', 'br'])}\n
\n \n
\n \n );\n };\n\n const renderDialog = (dialog: ApiError | ApiInviteInfo) => {\n if ('hash' in dialog) {\n return renderInvite(dialog);\n }\n\n return renderError(dialog);\n };\n\n return (\n
\n {dialogs.map(renderDialog)}\n
\n );\n};\n\nfunction getErrorHeader(error: ApiError) {\n if (error.isSlowMode) {\n return 'Slowmode enabled';\n }\n\n if (!error.hasErrorKey) {\n return 'Telegram';\n }\n\n return 'Something went wrong';\n}\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['dialogs']),\n (setGlobal, actions): DispatchProps => pick(actions, ['dismissDialog', 'acceptInviteConfirmation']),\n)(Dialogs));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiNotification } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\n\nimport Notification from '../ui/Notification';\nimport renderText from '../common/helpers/renderText';\n\ntype StateProps = {\n notifications: ApiNotification[];\n};\n\ntype DispatchProps = Pick;\n\nconst Notifications: FC = ({ notifications, dismissNotification }) => {\n if (!notifications.length) {\n return undefined;\n }\n\n return (\n
\n {notifications.map(({ message }) => (\n \n ))}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['notifications']),\n (setGlobal, actions): DispatchProps => pick(actions, ['dismissNotification']),\n)(Notifications));\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\n\nimport ConfirmDialog from '../ui/ConfirmDialog';\n\nexport type OwnProps = {\n url?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst SafeLinkModal: FC = ({ url, toggleSafeLinkModal }) => {\n const lang = useLang();\n\n const handleOpen = useCallback(() => {\n window.open(url);\n toggleSafeLinkModal({ url: undefined });\n }, [toggleSafeLinkModal, url]);\n\n const handleDismiss = useCallback(() => {\n toggleSafeLinkModal({ url: undefined });\n }, [toggleSafeLinkModal]);\n\n const renderingUrl = useCurrentOrPrev(url);\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['toggleSafeLinkModal']),\n)(SafeLinkModal));\n","import React, {\n FC, memo, useState, useEffect, useMemo, useCallback,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport {\n formatMonthAndYear, formatHumanDate, formatTime,\n} from '../../util/dateFormat';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport useLang, { LangFn } from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './CalendarModal.scss';\n\nexport type OwnProps = {\n selectedAt?: number;\n maxAt?: number;\n isFutureMode?: boolean;\n isPastMode?: boolean;\n isOpen: boolean;\n withTimePicker?: boolean;\n submitButtonLabel?: string;\n secondButtonLabel?: string;\n onClose: () => void;\n onSubmit: (date: Date) => void;\n onSecondButtonClick?: NoneToVoidFunction;\n};\n\nconst WEEKDAY_LETTERS = ['M', 'T', 'W', 'T', 'F', 'S', 'S'];\n\nconst CalendarModal: FC = ({\n selectedAt,\n maxAt,\n isFutureMode,\n isPastMode,\n isOpen,\n withTimePicker,\n submitButtonLabel,\n secondButtonLabel,\n onClose,\n onSubmit,\n onSecondButtonClick,\n}) => {\n const lang = useLang();\n const now = new Date();\n const defaultSelectedDate = useMemo(() => (selectedAt ? new Date(selectedAt) : new Date()), [selectedAt]);\n const maxDate = maxAt ? new Date(maxAt) : undefined;\n\n const [selectedDate, setSelectedDate] = useState(defaultSelectedDate);\n const [selectedHours, setSelectedHours] = useState(\n formatInputTime(defaultSelectedDate.getHours()),\n );\n const [selectedMinutes, setSelectedMinutes] = useState(\n formatInputTime(defaultSelectedDate.getMinutes()),\n );\n\n const currentYear = selectedDate.getFullYear();\n const currentMonth = selectedDate.getMonth();\n const currentDate = selectedDate.getDate();\n\n useEffect(() => {\n if (isOpen) {\n setSelectedDate(defaultSelectedDate);\n }\n }, [isOpen, defaultSelectedDate]);\n\n const shouldDisableNextMonth = (isPastMode && currentYear >= now.getFullYear() && currentMonth >= now.getMonth())\n || (maxDate && currentYear >= maxDate.getFullYear() && currentMonth >= maxDate.getMonth());\n const shouldDisablePrevMonth = isFutureMode && currentYear <= now.getFullYear() && currentMonth <= now.getMonth();\n\n const calendarGrid = useMemo(() => (\n buildCalendarGrid(currentYear, currentMonth)\n ), [currentMonth, currentYear]);\n\n function handlePrevMonth() {\n setSelectedDate((d) => {\n const dateCopy = new Date(d);\n dateCopy.setMonth(dateCopy.getMonth() - 1);\n\n return dateCopy;\n });\n }\n\n function handleNextMonth() {\n setSelectedDate((d) => {\n const dateCopy = new Date(d);\n dateCopy.setMonth(dateCopy.getMonth() + 1);\n\n return dateCopy;\n });\n }\n\n function handleDateSelect(date: number) {\n setSelectedDate((d) => {\n const dateCopy = new Date(d);\n dateCopy.setDate(date);\n\n return dateCopy;\n });\n }\n\n function handleSubmit() {\n onSubmit(selectedDate);\n }\n\n const handleChangeHours = useCallback((e: React.ChangeEvent) => {\n const value = e.target.value.replace(/[^\\d]+/g, '');\n if (!value.length) {\n setSelectedHours('');\n e.target.value = '';\n return;\n }\n\n const hours = Math.max(0, Math.min(Number(value), 23));\n\n const date = new Date(selectedDate.getTime());\n date.setHours(hours);\n setSelectedDate(date);\n\n const hoursStr = formatInputTime(hours);\n setSelectedHours(hoursStr);\n e.target.value = hoursStr;\n }, [selectedDate]);\n\n const handleChangeMinutes = useCallback((e: React.ChangeEvent) => {\n const value = e.target.value.replace(/[^\\d]+/g, '');\n if (!value.length) {\n setSelectedMinutes('');\n e.target.value = '';\n return;\n }\n\n const minutes = Math.max(0, Math.min(Number(value), 59));\n\n const date = new Date(selectedDate.getTime());\n date.setMinutes(minutes);\n setSelectedDate(date);\n\n const minutesStr = formatInputTime(minutes);\n setSelectedMinutes(minutesStr);\n e.target.value = minutesStr;\n }, [selectedDate]);\n\n function renderTimePicker() {\n return (\n
\n \n :\n \n
\n );\n }\n\n return (\n \n
\n
\n \n \n \n\n

\n {formatMonthAndYear(lang, selectedDate, IS_SINGLE_COLUMN_LAYOUT)}\n

\n\n \n \n \n\n \n \n \n
\n
\n\n
\n
\n {WEEKDAY_LETTERS.map((letter) => (\n
\n {letter}\n
\n ))}\n {calendarGrid.map((gridDate) => (\n handleDateSelect(gridDate)}\n className={buildClassName(\n 'day-button',\n isDisabledDay(\n currentYear, currentMonth, gridDate, isFutureMode ? now : undefined, isPastMode ? now : maxDate,\n )\n ? 'disabled'\n : `${gridDate ? 'clickable' : ''}`,\n gridDate === currentDate && 'selected',\n )}\n >\n {!!gridDate && (\n {gridDate}\n )}\n
\n ))}\n
\n \n\n {withTimePicker && renderTimePicker()}\n\n
\n \n {secondButtonLabel && (\n \n )}\n
\n \n );\n};\n\nfunction buildCalendarGrid(year: number, month: number) {\n const grid: number[] = [];\n\n const date = new Date();\n date.setFullYear(year);\n date.setMonth(month);\n date.setDate(1);\n\n const monthStartDay = date.getDay();\n // Fill empty cells\n for (let i = 1; i < monthStartDay; i++) {\n grid.push(0);\n }\n\n while (date.getMonth() === month) {\n const gridDate = date.getDate();\n grid.push(gridDate);\n date.setDate(gridDate + 1);\n }\n\n return grid;\n}\n\nfunction isDisabledDay(year: number, month: number, day: number, minDate?: Date, maxDate?: Date) {\n const selectedDay = new Date(year, month, day, 0, 0, 0, 0);\n const fixedMinDate = minDate && new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate(), 0, 0, 0, 0);\n const fixedMaxDate = maxDate && new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate(), 0, 0, 0, 0);\n\n if (fixedMaxDate && selectedDay > fixedMaxDate) {\n return true;\n } else if (fixedMinDate && selectedDay < fixedMinDate) {\n return true;\n }\n\n return false;\n}\n\nfunction formatInputTime(value: string | number) {\n return String(value).padStart(2, '0');\n}\n\nfunction formatSubmitLabel(lang: LangFn, date: Date) {\n const day = formatHumanDate(lang, date, true);\n\n if (day === 'Today') {\n return lang('Conversation.ScheduleMessage.SendToday', formatTime(date));\n }\n\n return lang('Conversation.ScheduleMessage.SendOn', day).replace('%@', formatTime(date));\n}\n\nexport default memo(CalendarModal);\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport CalendarModal from '../common/CalendarModal';\n\nexport type OwnProps = {\n isOpen: boolean;\n};\n\ntype StateProps = {\n selectedAt?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst HistoryCalendar: FC = ({\n isOpen, selectedAt, searchMessagesByDate, closeHistoryCalendar,\n}) => {\n const handleJumpToDate = useCallback((date: Date) => {\n searchMessagesByDate({ timestamp: date.valueOf() / 1000 });\n closeHistoryCalendar();\n }, [closeHistoryCalendar, searchMessagesByDate]);\n\n const lang = useLang();\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n selectedAt: global.historyCalendarSelectedAt,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesByDate', 'closeHistoryCalendar',\n ]),\n)(HistoryCalendar));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../api/types';\nimport { IAlbum } from '../../types';\n\nimport { GlobalActions } from '../../global/types';\n\nimport {\n selectAllowedMessageActions,\n selectChat,\n selectCurrentMessageList,\n selectUser,\n} from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n} from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n isSchedule: boolean;\n message: ApiMessage;\n album?: IAlbum;\n onClose: () => void;\n};\n\ntype StateProps = {\n canDeleteForAll?: boolean;\n contactName?: string;\n willDeleteForCurrentUserOnly?: boolean;\n willDeleteForAll?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst DeleteMessageModal: FC = ({\n isOpen,\n isSchedule,\n message,\n album,\n canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n onClose,\n deleteMessages,\n deleteScheduledMessages,\n}) => {\n const handleDeleteMessageForAll = useCallback(() => {\n const messageIds = album && album.messages\n ? album.messages.map(({ id }) => id)\n : [message.id];\n deleteMessages({ messageIds, shouldDeleteForAll: true });\n onClose();\n }, [deleteMessages, message.id, onClose, album]);\n\n const handleDeleteMessageForSelf = useCallback(() => {\n const messageIds = album && album.messages\n ? album.messages.map(({ id }) => id)\n : [message.id];\n if (isSchedule) {\n deleteScheduledMessages({ messageIds });\n } else {\n deleteMessages({\n messageIds,\n shouldDeleteForAll: false,\n });\n }\n onClose();\n }, [album, message.id, isSchedule, onClose, deleteScheduledMessages, deleteMessages]);\n\n const lang = useLang();\n\n return (\n \n

{lang('AreYouSureDeleteSingleMessage')}

\n {willDeleteForCurrentUserOnly && (\n

{lang('lng_delete_for_me_chat_hint', 1, 'i')}

\n )}\n {willDeleteForAll && (\n

{lang('lng_delete_for_everyone_hint', 1, 'i')}

\n )}\n {canDeleteForAll && (\n \n )}\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { message, isSchedule }): StateProps => {\n const { threadId } = selectCurrentMessageList(global) || {};\n const { canDeleteForAll } = (threadId && selectAllowedMessageActions(global, message, threadId)) || {};\n const chat = selectChat(global, message.chatId);\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n const willDeleteForCurrentUserOnly = chat && isChatBasicGroup(chat) && !canDeleteForAll;\n const willDeleteForAll = chat && isChatSuperGroup(chat);\n\n return {\n canDeleteForAll: !isSchedule && canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'deleteMessages', 'deleteScheduledMessages',\n ]),\n)(DeleteMessageModal));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { selectChat, selectIsChatWithSelf, selectUser } from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n isChatChannel,\n} from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n chatId: number;\n messageId: number;\n onClose: () => void;\n};\n\ntype StateProps = {\n isChannel: boolean;\n isPrivateChat: boolean;\n isChatWithSelf: boolean;\n isGroup: boolean;\n isSuperGroup: boolean;\n canPinForAll: boolean;\n contactName?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst PinMessageModal: FC = ({\n isOpen,\n messageId,\n chatId,\n isChannel,\n isGroup,\n isSuperGroup,\n canPinForAll,\n contactName,\n onClose,\n pinMessage,\n}) => {\n const handlePinMessageForAll = useCallback(() => {\n pinMessage({\n chatId, messageId, isUnpin: false,\n });\n onClose();\n }, [pinMessage, chatId, messageId, onClose]);\n\n const handlePinMessage = useCallback(() => {\n pinMessage({\n chatId, messageId, isUnpin: false, isOneSide: true, isSilent: true,\n });\n onClose();\n }, [chatId, messageId, onClose, pinMessage]);\n\n const lang = useLang();\n\n function renderMessage() {\n if (isChannel) {\n return lang('PinMessageAlertChannel');\n }\n\n if (isGroup || isSuperGroup) {\n return lang('PinMessageAlert');\n }\n\n return lang('PinMessageAlertChat');\n }\n\n return (\n \n

{renderMessage()}

\n \n {canPinForAll && (\n \n )}\n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const isPrivateChat = isChatPrivate(chatId);\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const chat = selectChat(global, chatId);\n const isChannel = !!chat && isChatChannel(chat);\n const isGroup = !!chat && isChatBasicGroup(chat);\n const isSuperGroup = !!chat && isChatSuperGroup(chat);\n const canPinForAll = (isPrivateChat && !isChatWithSelf) || isSuperGroup || isGroup;\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n return {\n isPrivateChat,\n isChatWithSelf,\n isChannel,\n isGroup,\n isSuperGroup,\n canPinForAll,\n contactName,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['pinMessage']),\n)(PinMessageModal));\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n chatId?: number;\n pinnedMessagesCount?: number;\n onClose: () => void;\n onUnpin: () => void;\n};\n\nconst UnpinAllMessagesModal: FC = ({\n isOpen,\n pinnedMessagesCount = 0,\n onClose,\n onUnpin,\n}) => {\n const lang = useLang();\n\n return (\n \n

{lang('Chat.UnpinAllMessagesConfirmation', pinnedMessagesCount, 'i')}

\n \n \n \n );\n};\n\nexport default memo(UnpinAllMessagesModal);\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { selectCanDeleteSelectedMessages, selectCurrentChat, selectUser } from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n isSchedule: boolean;\n onClose: () => void;\n};\n\ntype StateProps = {\n selectedMessageIds?: number[];\n canDeleteForAll?: boolean;\n contactName?: string;\n willDeleteForCurrentUserOnly?: boolean;\n willDeleteForAll?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst DeleteSelectedMessageModal: FC = ({\n isOpen,\n isSchedule,\n selectedMessageIds,\n canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n onClose,\n deleteMessages,\n deleteScheduledMessages,\n exitMessageSelectMode,\n}) => {\n const handleDeleteMessageForAll = useCallback(() => {\n deleteMessages({ messageIds: selectedMessageIds, shouldDeleteForAll: true });\n exitMessageSelectMode();\n onClose();\n }, [deleteMessages, exitMessageSelectMode, selectedMessageIds, onClose]);\n\n const handleDeleteMessageForSelf = useCallback(() => {\n if (isSchedule) {\n deleteScheduledMessages({ messageIds: selectedMessageIds });\n } else {\n deleteMessages({ messageIds: selectedMessageIds, shouldDeleteForAll: false });\n }\n\n exitMessageSelectMode();\n onClose();\n }, [\n isSchedule, exitMessageSelectMode, onClose, deleteScheduledMessages, selectedMessageIds, deleteMessages,\n ]);\n\n const lang = useLang();\n\n if (!selectedMessageIds) {\n return undefined;\n }\n\n return (\n \n

{lang('AreYouSureDeleteFewMessages')}

\n {willDeleteForCurrentUserOnly && (\n

This will delete them just for you, not for other participants in the chat.

\n )}\n {willDeleteForAll && (\n

This will delete them for everyone in this chat.

\n )}\n {canDeleteForAll && (\n \n )}\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { isSchedule }): StateProps => {\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const { canDeleteForAll } = selectCanDeleteSelectedMessages(global);\n const chat = selectCurrentChat(global);\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n const willDeleteForCurrentUserOnly = chat && isChatBasicGroup(chat) && !canDeleteForAll;\n const willDeleteForAll = chat && isChatSuperGroup(chat);\n\n return {\n selectedMessageIds,\n canDeleteForAll: !isSchedule && canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'deleteMessages',\n 'deleteScheduledMessages',\n 'exitMessageSelectMode',\n ]),\n)(DeleteSelectedMessageModal));\n","import { ChangeEvent } from 'react';\n\nimport React, {\n FC, memo, useCallback, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiReportReason } from '../../api/types';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\nimport RadioGroup from '../ui/RadioGroup';\nimport InputText from '../ui/InputText';\n\nexport type OwnProps = {\n isOpen: boolean;\n messageIds?: number[];\n onClose: () => void;\n};\n\ntype DispatchProps = Pick;\n\nconst ReportMessageModal: FC = ({\n isOpen,\n messageIds,\n reportMessages,\n exitMessageSelectMode,\n onClose,\n}) => {\n const [selectedReason, setSelectedReason] = useState('spam');\n const [description, setDescription] = useState('');\n\n const handleReport = () => {\n reportMessages({ messageIds, reason: selectedReason, description });\n exitMessageSelectMode();\n onClose();\n };\n\n const handleSelectReason = useCallback((value: string) => {\n setSelectedReason(value as ApiReportReason);\n }, []);\n\n const handleDescriptionChange = useCallback((e: ChangeEvent) => {\n setDescription(e.target.value);\n }, []);\n\n const lang = useLang();\n\n const REPORT_OPTIONS: {value: ApiReportReason; label: string}[] = [\n { value: 'spam', label: lang('lng_report_reason_spam') },\n { value: 'violence', label: lang('lng_report_reason_violence') },\n { value: 'pornography', label: lang('lng_report_reason_pornography') },\n { value: 'childAbuse', label: lang('lng_report_reason_child_abuse') },\n { value: 'copyright', label: lang('ReportPeer.ReasonCopyright') },\n { value: 'other', label: lang('lng_report_reason_other') },\n ];\n\n if (!messageIds) {\n return undefined;\n }\n\n return (\n \n \n \n \n \n \n );\n};\n\nexport default memo(withGlobal(\n undefined, (setGlobal, actions): DispatchProps => pick(actions, [\n 'reportMessages', 'exitMessageSelectMode',\n ]),\n)(ReportMessageModal));\n","import React, { FC, memo, useEffect } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\n\nimport {\n selectCanDeleteSelectedMessages,\n selectCanReportSelectedMessages,\n selectCurrentMessageList,\n selectSelectedMessagesCount,\n} from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport useFlag from '../../hooks/useFlag';\nimport captureKeyboardListeners from '../../util/captureKeyboardListeners';\nimport buildClassName from '../../util/buildClassName';\nimport usePrevious from '../../hooks/usePrevious';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport MenuItem from '../ui/MenuItem';\n\nimport DeleteSelectedMessageModal from './DeleteSelectedMessageModal';\nimport ReportMessageModal from '../common/ReportMessageModal';\n\nimport './MessageSelectToolbar.scss';\n\nexport type OwnProps = {\n isActive?: boolean;\n canPost?: boolean;\n messageListType?: MessageListType;\n};\n\ntype StateProps = {\n isSchedule: boolean;\n selectedMessagesCount?: number;\n canDeleteMessages?: boolean;\n canReportMessages?: boolean;\n selectedMessageIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst MessageSelectToolbar: FC = ({\n canPost,\n isActive,\n messageListType,\n isSchedule,\n selectedMessagesCount,\n canDeleteMessages,\n canReportMessages,\n selectedMessageIds,\n exitMessageSelectMode,\n openForwardMenuForSelectedMessages,\n}) => {\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n const [isReportModalOpen, openReportModal, closeReportModal] = useFlag();\n\n useEffect(() => {\n return isActive && !isDeleteModalOpen && !isReportModalOpen\n ? captureKeyboardListeners({\n onBackspace: openDeleteModal,\n onDelete: openDeleteModal,\n onEsc: exitMessageSelectMode,\n })\n : undefined;\n }, [isActive, isDeleteModalOpen, isReportModalOpen, openDeleteModal, exitMessageSelectMode]);\n\n const prevSelectedMessagesCount = usePrevious(selectedMessagesCount || undefined, true);\n const renderingSelectedMessagesCount = isActive ? selectedMessagesCount : prevSelectedMessagesCount;\n\n const lang = useLang();\n\n const formattedMessagesCount = lang('VoiceOver.Chat.MessagesSelected', renderingSelectedMessagesCount);\n\n const className = buildClassName(\n 'MessageSelectToolbar',\n canPost && 'with-composer',\n isActive && 'shown',\n );\n\n return (\n
\n
\n \n \n \n \n {formattedMessagesCount}\n \n\n {!!selectedMessagesCount && (\n
\n {messageListType !== 'scheduled' && (\n \n \n {lang('Forward')}\n \n \n )}\n {canReportMessages && (\n \n \n {lang('Report')}\n \n \n )}\n \n \n {lang('Delete')}\n \n \n
\n )}\n
\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { type: messageListType } = selectCurrentMessageList(global) || {};\n const { canDelete } = selectCanDeleteSelectedMessages(global);\n const canReport = selectCanReportSelectedMessages(global);\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n\n return {\n isSchedule: messageListType === 'scheduled',\n selectedMessagesCount: selectSelectedMessagesCount(global),\n canDeleteMessages: canDelete,\n canReportMessages: canReport,\n selectedMessageIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['exitMessageSelectMode', 'openForwardMenuForSelectedMessages']),\n)(MessageSelectToolbar));\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\n\nexport default (\n onSelect: NoneToVoidFunction,\n) => {\n // eslint-disable-next-line no-null/no-null\n const buttonRef = useRef(null);\n\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n if (e.key !== 'Enter') return;\n const isFocused = buttonRef.current === document.activeElement;\n\n if (isFocused) {\n onSelect();\n }\n }, [onSelect]);\n\n useEffect(() => {\n window.addEventListener('keydown', handleKeyDown, false);\n\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleKeyDown]);\n\n return buttonRef;\n};\n","import React, {\n FC, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport useChatContextActions from '../../../hooks/useChatContextActions';\nimport useFlag from '../../../hooks/useFlag';\nimport { isChatPrivate, getPrivateChatUserId, selectIsChatMuted } from '../../../modules/helpers';\nimport {\n selectChat, selectUser, selectIsChatPinned, selectNotifySettings, selectNotifyExceptions,\n} from '../../../modules/selectors';\nimport useSelectWithEnter from '../../../hooks/useSelectWithEnter';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport GroupChatInfo from '../../common/GroupChatInfo';\nimport DeleteChatModal from '../../common/DeleteChatModal';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n withUsername?: boolean;\n onClick: (id: number) => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n privateChatUser?: ApiUser;\n isPinned?: boolean;\n isMuted?: boolean;\n};\n\nconst LeftSearchResultChat: FC = ({\n chatId,\n chat,\n privateChatUser,\n isPinned,\n isMuted,\n withUsername,\n onClick,\n}) => {\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n\n const contextActions = useChatContextActions({\n chat,\n privateChatUser,\n isPinned,\n isMuted,\n handleDelete: openDeleteModal,\n });\n\n const handleClick = () => {\n onClick(chatId);\n };\n\n const buttonRef = useSelectWithEnter(handleClick);\n\n if (!chat) {\n return undefined;\n }\n\n return (\n \n {isChatPrivate(chatId) ? (\n \n ) : (\n \n )}\n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const privateChatUserId = chat && getPrivateChatUserId(chat);\n const privateChatUser = privateChatUserId ? selectUser(global, privateChatUserId) : undefined;\n const isPinned = selectIsChatPinned(global, chatId);\n const isMuted = chat\n ? selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global))\n : undefined;\n\n return {\n chat,\n privateChatUser,\n isPinned,\n isMuted,\n };\n },\n)(LeftSearchResultChat));\n","import React, {\n FC, useEffect, useCallback, useRef, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiUser } from '../../../api/types';\n\nimport { getUserFirstOrLastName } from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\nimport { throttle } from '../../../util/schedulers';\nimport { pick } from '../../../util/iteratees';\nimport useHorizontalScroll from '../../../hooks/useHorizontalScroll';\nimport useLang from '../../../hooks/useLang';\n\nimport Avatar from '../../common/Avatar';\nimport Button from '../../ui/Button';\nimport LeftSearchResultChat from './LeftSearchResultChat';\n\nimport './RecentContacts.scss';\n\ntype OwnProps = {\n onReset: () => void;\n};\n\ntype StateProps = {\n topUserIds?: number[];\n usersById: Record;\n recentlyFoundChatIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SEARCH_CLOSE_TIMEOUT_MS = 250;\nconst NBSP = '\\u00A0';\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst RecentContacts: FC = ({\n topUserIds, usersById, recentlyFoundChatIds,\n onReset, loadTopUsers, loadContactList, openChat,\n addRecentlyFoundChatId, clearRecentlyFoundChats,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const topUsersRef = useRef(null);\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadTopUsers();\n // Loading full contact list for quick local search before user enters the query\n loadContactList();\n });\n }, [loadTopUsers, loadContactList]);\n\n useHorizontalScroll(topUsersRef.current, !topUserIds);\n\n const handleClick = useCallback(\n (id: number) => {\n openChat({ id });\n onReset();\n setTimeout(() => {\n addRecentlyFoundChatId({ id });\n }, SEARCH_CLOSE_TIMEOUT_MS);\n },\n [openChat, addRecentlyFoundChatId, onReset],\n );\n\n const lang = useLang();\n\n return (\n
\n {topUserIds && (\n
\n
\n {topUserIds.map((userId) => (\n
handleClick(userId)} dir={lang.isRtl ? 'rtl' : undefined}>\n \n
{renderText(getUserFirstOrLastName(usersById[userId]) || NBSP)}
\n
\n ))}\n
\n
\n )}\n {recentlyFoundChatIds && (\n
\n

\n {lang('Recent')}\n\n \n \n \n

\n {recentlyFoundChatIds.map((id) => (\n \n ))}\n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { userIds: topUserIds } = global.topPeers;\n const usersById = global.users.byId;\n const { recentlyFoundChatIds } = global.globalSearch;\n\n return {\n topUserIds,\n usersById,\n recentlyFoundChatIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadTopUsers',\n 'loadContactList',\n 'openChat',\n 'addRecentlyFoundChatId',\n 'clearRecentlyFoundChats',\n ]),\n)(RecentContacts));\n","import React, {\n FC, memo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiChat, ApiUser, ApiMessage, ApiMessageOutgoingStatus,\n} from '../../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport {\n getChatTitle,\n getPrivateChatUserId,\n getMessageMediaHash,\n getMessageSummaryText,\n getMessageMediaThumbDataUri,\n getMessageVideo,\n getMessageRoundVideo,\n} from '../../../modules/helpers';\nimport { selectChat, selectUser } from '../../../modules/selectors';\nimport renderText from '../../common/helpers/renderText';\nimport { pick } from '../../../util/iteratees';\nimport useMedia from '../../../hooks/useMedia';\nimport { formatPastTimeShort } from '../../../util/dateFormat';\nimport useLang, { LangFn } from '../../../hooks/useLang';\nimport useSelectWithEnter from '../../../hooks/useSelectWithEnter';\n\nimport Avatar from '../../common/Avatar';\nimport VerifiedIcon from '../../common/VerifiedIcon';\nimport ListItem from '../../ui/ListItem';\nimport Link from '../../ui/Link';\n\nimport './ChatMessage.scss';\n\ntype OwnProps = {\n searchQuery?: string;\n message: ApiMessage;\n chatId: number;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n privateChatUser?: ApiUser;\n lastMessageOutgoingStatus?: ApiMessageOutgoingStatus;\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst ChatMessage: FC = ({\n message,\n searchQuery,\n chatId,\n chat,\n privateChatUser,\n focusMessage,\n lastSyncTime,\n}) => {\n const mediaThumbnail = getMessageMediaThumbDataUri(message);\n const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'micro'));\n const isRoundVideo = Boolean(getMessageRoundVideo(message));\n\n const handleClick = useCallback(() => {\n focusMessage({ chatId, messageId: message.id });\n }, [chatId, focusMessage, message.id]);\n\n const lang = useLang();\n\n const buttonRef = useSelectWithEnter(handleClick);\n\n if (!chat) {\n return undefined;\n }\n\n return (\n \n \n
\n
\n
\n

{renderText(getChatTitle(lang, chat, privateChatUser))}

\n {chat.isVerified && }\n
\n
\n \n {formatPastTimeShort(lang, message.date * 1000)}\n \n
\n\n
\n
\n
\n {renderMessageSummary(lang, message, mediaBlobUrl || mediaThumbnail, searchQuery, isRoundVideo)}\n
\n
\n
\n \n );\n};\n\nfunction renderMessageSummary(\n lang: LangFn, message: ApiMessage, blobUrl?: string, searchQuery?: string, isRoundVideo?: boolean,\n) {\n if (!blobUrl) {\n return renderText(getMessageSummaryText(lang, message));\n }\n\n return (\n \n \"\"\n {getMessageVideo(message) && }\n {renderText(getMessageSummaryText(lang, message, true), ['emoji', 'highlight'], { highlight: searchQuery })}\n \n );\n}\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return {};\n }\n\n const privateChatUserId = getPrivateChatUserId(chat);\n\n return {\n chat,\n ...(privateChatUserId && { privateChatUser: selectUser(global, privateChatUserId) }),\n lastSyncTime: global.lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'focusMessage',\n ]),\n)(ChatMessage));\n","import React, { FC, memo, useMemo } from '../../../lib/teact/teact';\nimport { formatDateToString } from '../../../util/dateFormat';\n\nimport './DateSuggest.scss';\n\nconst SUGGESTION_COUNT = 8;\n\nexport type OwnProps = {\n searchDate: string;\n onSelect: (value: Date) => void;\n};\n\nconst DateSuggest: FC = ({\n searchDate, onSelect,\n}) => {\n const suggestions = useMemo(() => getSuggestionsFromDate(searchDate), [searchDate]);\n return (\n
\n {suggestions.map(({ date, text }) => {\n return (\n onSelect(date)}\n className=\"date-item\"\n key={text}\n >\n \n {text}\n \n );\n })}\n
\n );\n};\n\nfunction getSuggestionsFromDate(searchDate: string) {\n const hasYear = searchDate.match(/^\\d{2,4}-\\d{2}-\\d{2}$/g);\n if (hasYear) {\n const date = new Date(searchDate);\n return [{ date, text: formatDateToString(date) }];\n }\n\n const suggestion = [];\n const currentDate = new Date();\n const currentYear = currentDate.getFullYear();\n const latestYear = currentDate.getTime() > (new Date(`${currentYear}-${searchDate}`)).getTime()\n ? currentYear\n : currentYear - 1;\n\n for (let i = 0; i < SUGGESTION_COUNT; i++) {\n const date = new Date(`${latestYear - i}-${searchDate}`);\n suggestion.push({ date, text: formatDateToString(date) });\n }\n\n return suggestion;\n}\n\nexport default memo(DateSuggest);\n","import React, {\n FC, memo, useCallback, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUser, ApiChat, ApiMessage } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport searchWords from '../../../util/searchWords';\nimport { unique, pick } from '../../../util/iteratees';\nimport { getUserFullName, getMessageSummaryText, sortChatIds } from '../../../modules/helpers';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { throttle } from '../../../util/schedulers';\nimport useLang from '../../../hooks/useLang';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport LeftSearchResultChat from './LeftSearchResultChat';\nimport RecentContacts from './RecentContacts';\nimport ChatMessage from './ChatMessage';\nimport DateSuggest from './DateSuggest';\nimport Link from '../../ui/Link';\nimport NothingFound from '../../common/NothingFound';\nimport PickerSelectedItem from '../../common/PickerSelectedItem';\n\nexport type OwnProps = {\n searchQuery?: string;\n dateSearchQuery?: string;\n searchDate?: number;\n onReset: () => void;\n onSearchDateSelect: (value: Date) => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n localContactIds?: number[];\n localChatIds?: number[];\n localUserIds?: number[];\n globalChatIds?: number[];\n globalUserIds?: number[];\n foundIds?: string[];\n globalMessagesByChatId?: Record }>;\n chatsById: Record;\n usersById: Record;\n fetchingStatus?: { chats?: boolean; messages?: boolean };\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst MIN_QUERY_LENGTH_FOR_GLOBAL_SEARCH = 4;\nconst LESS_LIST_ITEMS_AMOUNT = 3;\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst ChatResults: FC = ({\n searchQuery, searchDate, dateSearchQuery, currentUserId,\n localContactIds, localChatIds, localUserIds, globalChatIds, globalUserIds,\n foundIds, globalMessagesByChatId, chatsById, usersById, fetchingStatus, lastSyncTime,\n onReset, onSearchDateSelect, openChat, addRecentlyFoundChatId, searchMessagesGlobal, setGlobalSearchChatId,\n}) => {\n const lang = useLang();\n\n const [shouldShowMoreLocal, setShouldShowMoreLocal] = useState(false);\n const [shouldShowMoreGlobal, setShouldShowMoreGlobal] = useState(false);\n\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: 'text',\n query: searchQuery,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery]);\n\n const handleChatClick = useCallback(\n (id: number) => {\n openChat({ id });\n\n if (id !== currentUserId) {\n addRecentlyFoundChatId({ id });\n }\n\n if (!IS_SINGLE_COLUMN_LAYOUT) {\n onReset();\n }\n },\n [currentUserId, openChat, addRecentlyFoundChatId, onReset],\n );\n\n const handlePickerItemClick = useCallback((id: number) => {\n setGlobalSearchChatId({ id });\n }, [setGlobalSearchChatId]);\n\n const localResults = useMemo(() => {\n if (!searchQuery || (searchQuery.startsWith('@') && searchQuery.length < 2)) {\n return MEMO_EMPTY_ARRAY;\n }\n\n const foundContactIds = localContactIds\n ? localContactIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n\n const fullName = getUserFullName(user);\n return (fullName && searchWords(fullName, searchQuery)) || searchWords(user.username, searchQuery);\n })\n : [];\n\n return [\n ...(currentUserId && searchWords(lang('SavedMessages'), searchQuery) ? [currentUserId] : []),\n ...sortChatIds(unique([\n ...foundContactIds,\n ...(localChatIds || []),\n ...(localUserIds || []),\n ]), chatsById),\n ];\n }, [\n searchQuery, localContactIds, currentUserId, lang, localChatIds, localUserIds, chatsById, usersById,\n ]);\n\n const globalResults = useMemo(() => {\n if (!searchQuery || searchQuery.length < MIN_QUERY_LENGTH_FOR_GLOBAL_SEARCH || !globalChatIds || !globalUserIds) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return sortChatIds(unique([...globalChatIds, ...globalUserIds]),\n chatsById, true);\n }, [chatsById, globalChatIds, globalUserIds, searchQuery]);\n\n const foundMessages = useMemo(() => {\n if ((!searchQuery && !searchDate) || !foundIds || foundIds.length === 0) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds\n .map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return (\n globalMessagesByChatId && globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId]\n );\n })\n .filter(Boolean as any)\n .sort((a, b) => b.date - a.date);\n }, [foundIds, globalMessagesByChatId, searchQuery, searchDate]);\n\n const handleClickShowMoreLocal = useCallback(() => {\n setShouldShowMoreLocal(!shouldShowMoreLocal);\n }, [shouldShowMoreLocal]);\n\n const handleClickShowMoreGlobal = useCallback(() => {\n setShouldShowMoreGlobal(!shouldShowMoreGlobal);\n }, [shouldShowMoreGlobal]);\n\n function renderFoundMessage(message: ApiMessage) {\n const text = getMessageSummaryText(lang, message);\n const chat = chatsById[message.chatId];\n\n if (!text || !chat) {\n return undefined;\n }\n\n return (\n \n );\n }\n\n const nothingFound = fetchingStatus && !fetchingStatus.chats && !fetchingStatus.messages\n && !localResults.length && !globalResults.length && !foundMessages.length;\n\n if (!searchQuery && !searchDate) {\n return ;\n }\n\n return (\n \n {dateSearchQuery && (\n
\n \n
\n )}\n {nothingFound && (\n \n )}\n {!!localResults.length && (\n
\n {localResults.map((id) => (\n \n ))}\n
\n )}\n {!!localResults.length && (\n
\n

\n {localResults.length > LESS_LIST_ITEMS_AMOUNT && (\n \n {lang(shouldShowMoreLocal ? 'ChatList.Search.ShowLess' : 'ChatList.Search.ShowMore')}\n \n )}\n {lang('DialogList.SearchSectionDialogs')}\n

\n {localResults.map((id, index) => {\n if (!shouldShowMoreLocal && index >= LESS_LIST_ITEMS_AMOUNT) {\n return undefined;\n }\n\n return (\n \n );\n })}\n
\n )}\n {!!globalResults.length && (\n
\n

\n {globalResults.length > LESS_LIST_ITEMS_AMOUNT && (\n \n {lang(shouldShowMoreGlobal ? 'ChatList.Search.ShowLess' : 'ChatList.Search.ShowMore')}\n \n )}\n {lang('DialogList.SearchSectionGlobal')}\n

\n {globalResults.map((id, index) => {\n if (!shouldShowMoreGlobal && index >= LESS_LIST_ITEMS_AMOUNT) {\n return undefined;\n }\n\n return (\n \n );\n })}\n
\n )}\n {!!foundMessages.length && (\n
\n

{lang('SearchMessages')}

\n {foundMessages.map(renderFoundMessage)}\n
\n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { byId: chatsById } = global.chats;\n const { byId: usersById } = global.users;\n\n const { userIds: localContactIds } = global.contactList || {};\n\n if (!localContactIds) {\n return {\n chatsById,\n usersById,\n };\n }\n\n const {\n currentUserId, messages, lastSyncTime,\n } = global;\n const {\n fetchingStatus, globalResults, localResults, resultsByType,\n } = global.globalSearch;\n const { chatIds: globalChatIds, userIds: globalUserIds } = globalResults || {};\n const { chatIds: localChatIds, userIds: localUserIds } = localResults || {};\n const { byChatId: globalMessagesByChatId } = messages;\n const { foundIds } = (resultsByType && resultsByType.text) || {};\n\n return {\n currentUserId,\n localContactIds,\n localChatIds,\n localUserIds,\n globalChatIds,\n globalUserIds,\n foundIds,\n globalMessagesByChatId,\n chatsById,\n usersById,\n fetchingStatus,\n lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n 'addRecentlyFoundChatId',\n 'searchMessagesGlobal',\n 'setGlobalSearchChatId',\n ]),\n)(ChatResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiMessage } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { getMessageSummaryText } from '../../../modules/helpers';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { throttle } from '../../../util/schedulers';\nimport useLang from '../../../hooks/useLang';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport ChatMessage from './ChatMessage';\nimport NothingFound from '../../common/NothingFound';\nimport DateSuggest from './DateSuggest';\n\nexport type OwnProps = {\n searchQuery?: string;\n dateSearchQuery?: string;\n onReset: () => void;\n onSearchDateSelect: (value: Date) => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n foundIds?: string[];\n globalMessagesByChatId?: Record }>;\n chatsById: Record;\n fetchingStatus?: { chats?: boolean; messages?: boolean };\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst ChatMessageResults: FC = ({\n searchQuery,\n currentUserId,\n dateSearchQuery,\n foundIds,\n globalMessagesByChatId,\n chatsById,\n fetchingStatus,\n lastSyncTime,\n searchMessagesGlobal,\n onSearchDateSelect,\n}) => {\n const lang = useLang();\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: 'text',\n query: searchQuery,\n chatId: currentUserId,\n });\n });\n }\n }, [currentUserId, lastSyncTime, searchMessagesGlobal, searchQuery]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || foundIds.length === 0) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds\n .map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return (\n globalMessagesByChatId && globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId]\n );\n })\n .filter(Boolean as any)\n .sort((a, b) => b.date - a.date);\n }, [foundIds, globalMessagesByChatId]);\n\n function renderFoundMessage(message: ApiMessage) {\n const text = getMessageSummaryText(lang, message);\n const chat = chatsById[message.chatId];\n\n if (!text || !chat) {\n return undefined;\n }\n\n return (\n \n );\n }\n\n const nothingFound = fetchingStatus && !fetchingStatus.chats && !fetchingStatus.messages && !foundMessages.length;\n\n return (\n
\n \n {dateSearchQuery && (\n
\n \n
\n )}\n {nothingFound && (\n \n )}\n {!!foundMessages.length && foundMessages.map(renderFoundMessage)}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { byId: chatsById } = global.chats;\n const { currentUserId, messages: { byChatId: globalMessagesByChatId }, lastSyncTime } = global;\n const { fetchingStatus, resultsByType } = global.globalSearch;\n\n const { foundIds } = (resultsByType && resultsByType.text) || {};\n\n return {\n currentUserId,\n foundIds,\n globalMessagesByChatId,\n chatsById,\n fetchingStatus,\n lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['searchMessagesGlobal']),\n)(ChatMessageResults));\n","import { GlobalState } from '../../../../global/types';\nimport {\n ApiChat, ApiGlobalMessageSearchType, ApiMessage, ApiUser,\n} from '../../../../api/types';\nimport { ISettings } from '../../../../types';\n\nimport { selectTheme } from '../../../../modules/selectors';\n\nexport type StateProps = {\n theme: ISettings['theme'];\n isLoading?: boolean;\n chatsById: Record;\n usersById: Record;\n globalMessagesByChatId?: Record }>;\n foundIds?: string[];\n lastSyncTime?: number;\n searchChatId?: number;\n};\n\nexport function createMapStateToProps(type: ApiGlobalMessageSearchType) {\n return (global: GlobalState, props: any) => {\n const { byId: chatsById } = global.chats;\n const { byId: usersById } = global.users;\n const {\n fetchingStatus, resultsByType, chatId,\n } = global.globalSearch;\n\n // One component is used for two different types of results.\n // The differences between them are only in the isVoice property.\n // The rest of the search results use their own personal components.\n const currentType = type !== 'audio' ? type : (props && props.isVoice ? 'voice' : 'audio');\n\n const { byChatId: globalMessagesByChatId } = global.messages;\n const { foundIds } = (resultsByType && resultsByType[currentType]) || {};\n\n return {\n theme: selectTheme(global),\n isLoading: foundIds === undefined\n || (fetchingStatus ? Boolean(fetchingStatus.chats || fetchingStatus.messages) : false),\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n searchChatId: chatId,\n lastSyncTime: global.lastSyncTime,\n };\n };\n}\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection, MediaViewerOrigin } from '../../../types';\n\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\nimport { throttle } from '../../../util/schedulers';\nimport useLang from '../../../hooks/useLang';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport Media from '../../common/Media';\nimport ChatMessage from './ChatMessage';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst CURRENT_TYPE = 'media';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst MediaResults: FC = ({\n searchQuery,\n searchChatId,\n isLoading,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n openMediaViewer,\n}) => {\n const lang = useLang();\n\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: CURRENT_TYPE,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleSelectMedia = useCallback((messageId: number, chatId: number) => {\n openMediaViewer({\n chatId,\n messageId,\n origin: MediaViewerOrigin.SearchResult,\n });\n }, [openMediaViewer]);\n\n function renderGallery() {\n return (\n
\n {foundMessages.map((message) => (\n \n ))}\n
\n );\n }\n\n function renderSearchResult() {\n return foundMessages.map((message) => (\n \n ));\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n const isMediaGrid = canRenderContents && foundIds && foundIds.length > 0 && !searchQuery;\n const isMessageList = canRenderContents && foundIds && foundIds.length > 0 && searchQuery;\n\n const classNames = buildClassName(\n 'search-content custom-scroll',\n isMessageList && 'chat-list',\n );\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && (\n \n )}\n {isMediaGrid && renderGallery()}\n {isMessageList && renderSearchResult()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps(CURRENT_TYPE),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'openMediaViewer',\n ]),\n)(MediaResults));\n","import { ApiChat, ApiMessage, ApiUser } from '../../../../api/types';\nimport {\n getChatTitle,\n getSenderTitle,\n isChatPrivate,\n isChatGroup,\n} from '../../../../modules/helpers';\nimport { LangFn } from '../../../../hooks/useLang';\n\nexport function getSenderName(\n lang: LangFn, message: ApiMessage, chatsById: Record, usersById: Record,\n) {\n const { senderId } = message;\n if (!senderId) {\n return undefined;\n }\n\n const sender = isChatPrivate(senderId) ? usersById[senderId] : chatsById[senderId];\n\n let senderName = getSenderTitle(lang, sender);\n\n const chat = chatsById[message.chatId];\n if (chat) {\n if (isChatPrivate(senderId) && (sender as ApiUser).isSelf) {\n senderName = `${lang('FromYou')} → ${getChatTitle(lang, chat)}`;\n } else if (isChatGroup(chat)) {\n senderName += ` → ${getChatTitle(lang, chat)}`;\n }\n }\n\n return senderName;\n}\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat';\nimport { getSenderName } from './helpers/getSenderName';\nimport { throttle } from '../../../util/schedulers';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport useLang from '../../../hooks/useLang';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport WebLink from '../../common/WebLink';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst CURRENT_TYPE = 'links';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst LinkResults: FC = ({\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\n}) => {\n const lang = useLang();\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: CURRENT_TYPE,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: number) => {\n focusMessage({ chatId, messageId });\n }, [focusMessage]);\n\n function renderList() {\n return foundMessages.map((message, index) => {\n const shouldDrawDateDivider = index === 0\n || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date);\n return (\n \n {shouldDrawDateDivider && (\n

\n {formatMonthAndYear(lang, new Date(message.date * 1000))}\n

\n )}\n \n \n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && (\n \n )}\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps(CURRENT_TYPE),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'focusMessage',\n ]),\n)(LinkResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat';\nimport { getSenderName } from './helpers/getSenderName';\nimport { throttle } from '../../../util/schedulers';\nimport { getMessageDocument } from '../../../modules/helpers';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport useLang from '../../../hooks/useLang';\n\nimport Document from '../../common/Document';\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst CURRENT_TYPE = 'documents';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst FileResults: FC = ({\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\n}) => {\n const lang = useLang();\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: CURRENT_TYPE,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n const message = globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n\n return message && getMessageDocument(message) ? message : undefined;\n }).filter(Boolean) as ApiMessage[];\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: number) => {\n focusMessage({ chatId, messageId });\n }, [focusMessage]);\n\n function renderList() {\n return foundMessages.map((message, index) => {\n const shouldDrawDateDivider = index === 0\n || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date);\n return (\n \n {shouldDrawDateDivider && (\n

{formatMonthAndYear(lang, new Date(message.date * 1000))}

\n )}\n \n \n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && (\n \n )}\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps(CURRENT_TYPE),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'focusMessage',\n ]),\n)(FileResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat';\nimport { getSenderName } from './helpers/getSenderName';\nimport { throttle } from '../../../util/schedulers';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport useLang from '../../../hooks/useLang';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport Audio from '../../common/Audio';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n isVoice?: boolean;\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst AudioResults: FC = ({\n theme,\n isVoice,\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\n openAudioPlayer,\n}) => {\n const lang = useLang();\n const currentType = isVoice ? 'voice' : 'audio';\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: currentType,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [currentType, lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: number) => {\n focusMessage({ chatId, messageId });\n }, [focusMessage]);\n\n const handlePlayAudio = useCallback((messageId: number, chatId: number) => {\n openAudioPlayer({ chatId, messageId });\n }, [openAudioPlayer]);\n\n function renderList() {\n return foundMessages.map((message, index) => {\n const shouldDrawDateDivider = index === 0\n || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date);\n return (\n \n {shouldDrawDateDivider && (\n

\n {formatMonthAndYear(lang, new Date(message.date * 1000))}\n

\n )}\n \n \n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && (\n \n )}\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps('audio'),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'focusMessage',\n 'openAudioPlayer',\n ]),\n)(AudioResults));\n","import React, {\n FC, memo, useCallback, useState, useMemo, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { GlobalSearchContent } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { parseDateString } from '../../../util/dateFormat';\nimport useKeyboardListNavigation from '../../../hooks/useKeyboardListNavigation';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport TabList from '../../ui/TabList';\nimport Transition from '../../ui/Transition';\nimport ChatResults from './ChatResults';\nimport UserChatResults from './ChatMessageResults';\nimport MediaResults from './MediaResults';\nimport LinkResults from './LinkResults';\nimport FileResults from './FileResults';\nimport AudioResults from './AudioResults';\n\nimport './LeftSearch.scss';\n\nexport type OwnProps = {\n searchQuery?: string;\n searchDate?: number;\n isActive: boolean;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentContent?: GlobalSearchContent;\n chatId?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst TABS = [\n { type: GlobalSearchContent.ChatList, title: 'SearchAllChatsShort' },\n { type: GlobalSearchContent.Media, title: 'SharedMediaTab2' },\n { type: GlobalSearchContent.Links, title: 'SharedLinksTab2' },\n { type: GlobalSearchContent.Files, title: 'SharedFilesTab2' },\n { type: GlobalSearchContent.Music, title: 'SharedMusicTab2' },\n { type: GlobalSearchContent.Voice, title: 'SharedVoiceTab2' },\n];\n\nconst CHAT_TABS = [\n { type: GlobalSearchContent.ChatList, title: 'All Messages' },\n ...TABS.slice(1),\n];\n\nconst TRANSITION_RENDER_COUNT = Object.keys(GlobalSearchContent).length / 2;\n\nconst LeftSearch: FC = ({\n searchQuery,\n searchDate,\n isActive,\n currentContent = GlobalSearchContent.ChatList,\n chatId,\n setGlobalSearchContent,\n setGlobalSearchDate,\n onReset,\n}) => {\n const lang = useLang();\n const [activeTab, setActiveTab] = useState(currentContent);\n const dateSearchQuery = useMemo(() => parseDateString(searchQuery), [searchQuery]);\n\n const handleSwitchTab = useCallback((index: number) => {\n const tab = TABS[index];\n setGlobalSearchContent({ content: tab.type });\n setActiveTab(index);\n }, [setGlobalSearchContent]);\n\n const handleSearchDateSelect = useCallback((value: Date) => {\n setGlobalSearchDate({ date: value.getTime() / 1000 });\n }, [setGlobalSearchDate]);\n\n useHistoryBack(isActive, onReset, undefined, undefined, true);\n\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const handleKeyDown = useKeyboardListNavigation(containerRef, isActive, undefined, '.ListItem-button', true);\n\n return (\n
\n \n \n {() => {\n switch (currentContent) {\n case GlobalSearchContent.ChatList:\n if (chatId) {\n return (\n \n );\n }\n return (\n \n );\n case GlobalSearchContent.Media:\n return ;\n case GlobalSearchContent.Links:\n return ;\n case GlobalSearchContent.Files:\n return ;\n case GlobalSearchContent.Music:\n return (\n \n );\n case GlobalSearchContent.Voice:\n return (\n \n );\n default:\n return undefined;\n }\n }}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { currentContent, chatId } = global.globalSearch;\n\n return { currentContent, chatId };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setGlobalSearchContent', 'setGlobalSearchDate']),\n)(LeftSearch));\n","import { useState, useCallback, useRef } from '../lib/teact/teact';\n\nexport type ReducerAction = { type: Actions; payload?: any };\nexport type StateReducer = (state: State, action: ReducerAction) => State;\nexport type Dispatch = (action: ReducerAction) => void;\n\nexport default function useReducer(\n reducer: StateReducer,\n initialState: State,\n) {\n const reducerRef = useRef(reducer);\n const [state, setState] = useState(initialState);\n\n const dispatch = useCallback((action: ReducerAction) => {\n setState((currentState) => reducerRef.current(currentState, action));\n }, []);\n\n return [\n state,\n dispatch,\n ] as [State, Dispatch];\n}\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\nimport { ApiChatFolder } from '../../api/types';\nimport { pick, omit } from '../../util/iteratees';\n\nexport type FolderChatType = {\n icon: string;\n title: string;\n key: keyof Pick;\n};\n\nexport const INCLUDED_CHAT_TYPES: FolderChatType[] = [\n { icon: 'user', title: 'FilterContacts', key: 'contacts' },\n { icon: 'non-contacts', title: 'FilterNonContacts', key: 'nonContacts' },\n { icon: 'group', title: 'FilterGroups', key: 'groups' },\n { icon: 'channel', title: 'FilterChannels', key: 'channels' },\n { icon: 'bots', title: 'FilterBots', key: 'bots' },\n];\n\nexport const EXCLUDED_CHAT_TYPES: FolderChatType[] = [\n { icon: 'mute', title: 'FilterMuted', key: 'excludeMuted' },\n { icon: 'archive', title: 'FilterArchived', key: 'excludeArchived' },\n { icon: 'readchats', title: 'FilterRead', key: 'excludeRead' },\n];\n\nconst INCLUDE_FILTER_FIELDS: Array = [\n 'includedChatIds', 'bots', 'channels', 'groups', 'contacts', 'nonContacts',\n];\nconst EXCLUDE_FILTER_FIELDS: Array = [\n 'excludedChatIds', 'excludeArchived', 'excludeMuted', 'excludeRead',\n];\n\nexport function selectChatFilters(state: FoldersState, mode: 'included' | 'excluded', selectTemp?: boolean) {\n let selectedChatIds: number[] = [];\n let selectedChatTypes: FolderChatType['key'][] = [];\n\n if (mode === 'included') {\n const {\n includedChatIds,\n ...includeFilters\n } = selectTemp\n ? state.includeFilters || {}\n : pick(\n state.folder,\n INCLUDE_FILTER_FIELDS,\n );\n\n selectedChatIds = includedChatIds || [];\n selectedChatTypes = (Object.keys(includeFilters) as Array)\n .filter((key) => Boolean(includeFilters[key]));\n } else {\n const {\n excludedChatIds,\n ...excludeFilters\n } = selectTemp\n ? state.excludeFilters || {}\n : pick(\n state.folder,\n EXCLUDE_FILTER_FIELDS,\n );\n\n selectedChatIds = excludedChatIds || [];\n selectedChatTypes = (Object.keys(excludeFilters) as Array)\n .filter((key) => Boolean(excludeFilters[key]));\n }\n\n return {\n selectedChatIds,\n selectedChatTypes,\n };\n}\n\nfunction getSuggestedFolderName(includeFilters?: FolderIncludeFilters) {\n if (includeFilters) {\n const {\n includedChatIds,\n ...filters\n } = includeFilters;\n\n if (\n Object.values(filters).filter(Boolean).length > 1\n || (includedChatIds && includedChatIds.length)\n ) {\n return '';\n }\n\n if (filters.bots) {\n return 'Bots';\n } else if (filters.groups) {\n return 'Groups';\n } else if (filters.channels) {\n return 'Channels';\n } else if (filters.contacts) {\n return 'Contacts';\n } else if (filters.nonContacts) {\n return 'Non-Contacts';\n }\n }\n\n return '';\n}\n\ntype FolderIncludeFilters = Pick;\ntype FolderExcludeFilters = Pick;\n\nexport type FoldersState = {\n mode: 'create' | 'edit';\n isLoading?: boolean;\n isTouched?: boolean;\n error?: string;\n folderId?: number;\n chatFilter: string;\n folder: Omit;\n includeFilters?: FolderIncludeFilters;\n excludeFilters?: FolderExcludeFilters;\n};\nexport type FoldersActions = (\n 'setTitle' | 'saveFilters' | 'editFolder' | 'reset' | 'setChatFilter' | 'setIsLoading' | 'setError' |\n 'editIncludeFilters' | 'editExcludeFilters' | 'setIncludeFilters' | 'setExcludeFilters'\n);\nexport type FolderEditDispatch = Dispatch;\n\nconst INITIAL_STATE: FoldersState = {\n mode: 'create',\n chatFilter: '',\n folder: {\n title: '',\n includedChatIds: [],\n excludedChatIds: [],\n },\n};\n\nconst foldersReducer: StateReducer = (\n state,\n action,\n) => {\n switch (action.type) {\n case 'setTitle':\n return {\n ...state,\n folder: {\n ...state.folder,\n title: action.payload,\n },\n isTouched: true,\n };\n case 'editIncludeFilters':\n return {\n ...state,\n includeFilters: pick(\n state.folder,\n INCLUDE_FILTER_FIELDS,\n ),\n };\n case 'editExcludeFilters':\n return {\n ...state,\n excludeFilters: pick(\n state.folder,\n EXCLUDE_FILTER_FIELDS,\n ),\n };\n case 'setIncludeFilters':\n return {\n ...state,\n includeFilters: action.payload,\n chatFilter: '',\n };\n case 'setExcludeFilters':\n return {\n ...state,\n excludeFilters: action.payload,\n chatFilter: '',\n };\n case 'saveFilters':\n if (state.includeFilters) {\n return {\n ...state,\n folder: {\n ...omit(state.folder, INCLUDE_FILTER_FIELDS),\n title: state.folder.title ? state.folder.title : getSuggestedFolderName(state.includeFilters),\n ...state.includeFilters,\n },\n includeFilters: undefined,\n chatFilter: '',\n isTouched: true,\n };\n } else if (state.excludeFilters) {\n return {\n ...state,\n folder: {\n ...omit(state.folder, EXCLUDE_FILTER_FIELDS),\n ...state.excludeFilters,\n },\n excludeFilters: undefined,\n chatFilter: '',\n isTouched: true,\n };\n } else {\n return state;\n }\n case 'editFolder': {\n const { id: folderId, description, ...folder } = action.payload;\n\n return {\n mode: 'edit',\n folderId,\n folder,\n chatFilter: '',\n };\n }\n case 'setChatFilter': {\n return {\n ...state,\n chatFilter: action.payload,\n };\n }\n case 'setIsLoading': {\n return {\n ...state,\n isLoading: action.payload,\n };\n }\n case 'setError': {\n return {\n ...state,\n error: action.payload,\n };\n }\n case 'reset':\n return INITIAL_STATE;\n default:\n return state;\n }\n};\n\nexport default () => {\n return useReducer(foldersReducer, INITIAL_STATE);\n};\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\n\nexport type TwoFaActions = (\n 'setCurrentPassword' | 'setPassword' | 'setHint' | 'setEmail' | 'reset'\n);\nexport type TwoFaDispatch = Dispatch;\n\nexport type TwoFaState = {\n currentPassword: string;\n password: string;\n hint: string;\n email: string;\n};\n\nconst INITIAL_STATE: TwoFaState = {\n currentPassword: '',\n password: '',\n hint: '',\n email: '',\n};\n\nconst twoFaReducer: StateReducer = (\n state,\n action,\n) => {\n switch (action.type) {\n case 'setCurrentPassword':\n return {\n ...state,\n currentPassword: action.payload,\n };\n\n case 'setPassword':\n return {\n ...state,\n password: action.payload,\n };\n\n case 'setHint':\n return {\n ...state,\n hint: action.payload,\n };\n\n case 'setEmail':\n return {\n ...state,\n email: action.payload,\n };\n\n case 'reset':\n return INITIAL_STATE;\n\n default:\n return state;\n }\n};\n\nexport default () => {\n return useReducer(twoFaReducer, INITIAL_STATE);\n};\n","import React, {\n FC, useCallback, useMemo, memo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens } from '../../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport DropdownMenu from '../../ui/DropdownMenu';\nimport MenuItem from '../../ui/MenuItem';\nimport Button from '../../ui/Button';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype OwnProps = {\n currentScreen: SettingsScreens;\n editedFolderId?: number;\n onReset: () => void;\n onSaveFilter: () => void;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsHeader: FC = ({\n currentScreen,\n editedFolderId,\n onReset,\n onSaveFilter,\n signOut,\n deleteChatFolder,\n}) => {\n const [isSignOutDialogOpen, setIsSignOutDialogOpen] = useState(false);\n const [isDeleteFolderDialogOpen, setIsDeleteFolderDialogOpen] = useState(false);\n\n const openSignOutConfirmation = useCallback(() => {\n setIsSignOutDialogOpen(true);\n }, []);\n\n const closeSignOutConfirmation = useCallback(() => {\n setIsSignOutDialogOpen(false);\n }, []);\n\n const openDeleteFolderConfirmation = useCallback(() => {\n setIsDeleteFolderDialogOpen(true);\n }, []);\n\n const closeDeleteFolderConfirmation = useCallback(() => {\n setIsDeleteFolderDialogOpen(false);\n }, []);\n\n const handleSignOutMessage = useCallback(() => {\n closeSignOutConfirmation();\n signOut();\n }, [closeSignOutConfirmation, signOut]);\n\n const handleDeleteFolderMessage = useCallback(() => {\n closeDeleteFolderConfirmation();\n deleteChatFolder({ id: editedFolderId });\n onReset();\n }, [editedFolderId, closeDeleteFolderConfirmation, deleteChatFolder, onReset]);\n\n const SettingsMenuButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n \n \n \n );\n }, []);\n\n const lang = useLang();\n\n function renderHeaderContent() {\n switch (currentScreen) {\n case SettingsScreens.EditProfile:\n return

{lang('lng_settings_information')}

;\n case SettingsScreens.General:\n return

{lang('General')}

;\n case SettingsScreens.Notifications:\n return

{lang('Notifications')}

;\n case SettingsScreens.Privacy:\n return

{lang('PrivacySettings')}

;\n case SettingsScreens.Language:\n return

{lang('Language')}

;\n\n case SettingsScreens.GeneralChatBackground:\n return

{lang('ChatBackground')}

;\n case SettingsScreens.GeneralChatBackgroundColor:\n return

{lang('SetColor')}

;\n\n case SettingsScreens.PrivacyPhoneNumber:\n return

{lang('PrivacyPhone')}

;\n case SettingsScreens.PrivacyLastSeen:\n return

{lang('PrivacyLastSeen')}

;\n case SettingsScreens.PrivacyProfilePhoto:\n return

{lang('Privacy.ProfilePhoto')}

;\n case SettingsScreens.PrivacyForwarding:\n return

{lang('PrivacyForwards')}

;\n case SettingsScreens.PrivacyGroupChats:\n return

{lang('AutodownloadGroupChats')}

;\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n return

{lang('AlwaysShareWith')}

;\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n return

{lang('NeverShareWith')}

;\n\n case SettingsScreens.PrivacyActiveSessions:\n return

{lang('SessionsTitle')}

;\n case SettingsScreens.PrivacyBlockedUsers:\n return

{lang('BlockedUsers')}

;\n\n case SettingsScreens.TwoFaDisabled:\n case SettingsScreens.TwoFaEnabled:\n return

{lang('TwoStepVerification')}

;\n case SettingsScreens.TwoFaNewPassword:\n case SettingsScreens.TwoFaChangePasswordNew:\n case SettingsScreens.TwoFaChangePasswordConfirm:\n return

{lang('PleaseEnterCurrentPassword')}

;\n case SettingsScreens.TwoFaNewPasswordConfirm:\n return

{lang('PleaseReEnterPassword')}

;\n case SettingsScreens.TwoFaNewPasswordHint:\n case SettingsScreens.TwoFaChangePasswordHint:\n return

{lang('PasswordHint')}

;\n case SettingsScreens.TwoFaNewPasswordEmail:\n case SettingsScreens.TwoFaRecoveryEmail:\n return

{lang('RecoveryEmailTitle')}

;\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n case SettingsScreens.TwoFaRecoveryEmailCode:\n return

Recovery Email Code

;\n case SettingsScreens.TwoFaCongratulations:\n return

{lang('TwoStepVerificationPasswordSet')}

;\n case SettingsScreens.TwoFaChangePasswordCurrent:\n case SettingsScreens.TwoFaTurnOff:\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n return

{lang('PleaseEnterCurrentPassword')}

;\n\n case SettingsScreens.Folders:\n return

{lang('Filters')}

;\n case SettingsScreens.FoldersCreateFolder:\n return

{lang('FilterNew')}

;\n case SettingsScreens.FoldersEditFolder:\n return (\n
\n

{lang('FilterEdit')}

\n\n {editedFolderId && (\n \n \n Delete Folder\n \n \n )}\n
\n );\n case SettingsScreens.FoldersIncludedChats:\n case SettingsScreens.FoldersExcludedChats:\n return (\n
\n {currentScreen === SettingsScreens.FoldersIncludedChats ? (\n

{lang('FilterInclude')}

\n ) : (\n

{lang('FilterExclude')}

\n )}\n\n \n \n \n
\n );\n\n default:\n return (\n
\n

{lang('SETTINGS')}

\n\n \n {lang('LogOutTitle')}\n \n
\n );\n }\n }\n\n return (\n
\n \n \n \n {renderHeaderContent()}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['signOut', 'deleteChatFolder']),\n)(SettingsHeader));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { SettingsScreens } from '../../../types';\nimport { ApiUser } from '../../../api/types';\n\nimport { selectUser } from '../../../modules/selectors';\nimport { getUserFullName } from '../../../modules/helpers';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport Avatar from '../../common/Avatar';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentUser?: ApiUser;\n};\n\nconst SettingsMain: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n currentUser,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Main);\n\n return (\n
\n
\n {currentUser && (\n
\n \n

{getUserFullName(currentUser)}

\n

{formatPhoneNumberWithCode(currentUser.phoneNumber)}

\n
\n )}\n onScreenSelect(SettingsScreens.EditProfile)}\n >\n {lang('lng_settings_information')}\n \n onScreenSelect(SettingsScreens.Folders)}\n >\n {lang('Filters')}\n \n onScreenSelect(SettingsScreens.General)}\n >\n {lang('Telegram.GeneralSettingsViewController')}\n \n onScreenSelect(SettingsScreens.Notifications)}\n >\n {lang('Notifications')}\n \n onScreenSelect(SettingsScreens.Privacy)}\n >\n {lang('PrivacySettings')}\n \n onScreenSelect(SettingsScreens.Language)}\n >\n {lang('Language')}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { currentUserId } = global;\n\n return {\n currentUser: currentUserId ? selectUser(global, currentUserId) : undefined,\n };\n },\n)(SettingsMain));\n","import React, { FC } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Button, { OwnProps as ButtonProps } from './Button';\n\nimport './FloatingActionButton.scss';\n\ntype OwnProps = {\n isShown: boolean;\n className?: string;\n color?: ButtonProps['color'];\n ariaLabel?: ButtonProps['ariaLabel'];\n disabled?: boolean;\n onClick: () => void;\n children: any;\n};\n\nconst FloatingActionButton: FC = ({\n isShown,\n className,\n color = 'primary',\n ariaLabel,\n disabled,\n onClick,\n children,\n}) => {\n const buttonClassName = buildClassName(\n 'FloatingActionButton',\n isShown && 'revealed',\n className,\n );\n\n return (\n \n {children}\n \n );\n};\n\nexport default FloatingActionButton;\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useCallback, memo, useEffect, useMemo,\n} from '../../lib/teact/teact';\n\nimport { debounce } from '../../util/schedulers';\nimport useLang from '../../hooks/useLang';\n\nimport InputText from '../ui/InputText';\n\ntype OwnProps = {\n currentUsername?: string;\n asLink?: boolean;\n isLoading?: boolean;\n isUsernameAvailable?: boolean;\n checkUsername: AnyToVoidFunction;\n onChange: (value: string | false) => void;\n};\n\nconst MIN_USERNAME_LENGTH = 5;\nconst MAX_USERNAME_LENGTH = 32;\nconst LINK_PREFIX = 'https://t.me/';\nconst LINK_PREFIX_REGEX = /https:\\/\\/t\\.me\\/?/i;\nconst USERNAME_REGEX = /^([a-zA-Z0-9_]+)$/;\n\nconst runDebouncedForCheckUsername = debounce((cb) => cb(), 250, false);\n\nfunction isUsernameValid(username: string) {\n return username.length >= MIN_USERNAME_LENGTH\n && username.length <= MAX_USERNAME_LENGTH\n && USERNAME_REGEX.test(username);\n}\n\nconst SettingsEditProfile: FC = ({\n currentUsername,\n asLink,\n isLoading,\n isUsernameAvailable,\n checkUsername,\n onChange,\n}) => {\n const [username, setUsername] = useState(currentUsername || '');\n\n const lang = useLang();\n const langPrefix = asLink ? 'SetUrl' : 'Username';\n const label = asLink ? lang('SetUrlPlaceholder') : lang('Username');\n\n const [usernameSuccess, usernameError] = useMemo(() => {\n if (!username.length) {\n return [];\n }\n\n if (username.length < MIN_USERNAME_LENGTH) {\n return [undefined, `${label} is too short`];\n }\n if (username.length > MAX_USERNAME_LENGTH) {\n return [undefined, `${label} is too long`];\n }\n if (!USERNAME_REGEX.test(username)) {\n return [undefined, `${label} contains invalid characters`];\n }\n\n if (isUsernameAvailable === undefined) {\n return [];\n }\n\n // Variable `isUsernameAvailable` is initialized with `undefined`, so a strict false check is required\n return [\n isUsernameAvailable ? lang(`${langPrefix}Available`, 'Username') : undefined,\n isUsernameAvailable === false ? lang(`${langPrefix}InUse`) : undefined,\n ];\n }, [username, isUsernameAvailable, lang, langPrefix, label]);\n\n useEffect(() => {\n setUsername(currentUsername || '');\n }, [asLink, currentUsername]);\n\n const handleUsernameChange = useCallback((e: ChangeEvent) => {\n const newUsername = e.target.value.trim().replace(LINK_PREFIX_REGEX, '');\n setUsername(newUsername);\n e.target.value = `${asLink ? LINK_PREFIX : ''}${newUsername}`;\n\n const isValid = isUsernameValid(newUsername);\n\n if (isValid) {\n runDebouncedForCheckUsername(() => {\n checkUsername({ username: newUsername });\n });\n }\n\n if (onChange) {\n onChange(isValid ? newUsername : false);\n }\n }, [asLink, checkUsername, onChange]);\n\n return (\n \n );\n};\n\nexport default memo(SettingsEditProfile);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useCallback, memo, useEffect, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiMediaFormat } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { ProfileEditProgress, SettingsScreens } from '../../../types';\n\nimport { throttle } from '../../../util/schedulers';\nimport { pick } from '../../../util/iteratees';\nimport { selectUser } from '../../../modules/selectors';\nimport { getChatAvatarHash } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useLang from '../../../hooks/useLang';\n\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport InputText from '../../ui/InputText';\nimport renderText from '../../common/helpers/renderText';\nimport UsernameInput from '../../common/UsernameInput';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\ntype OwnProps = {\n isActive: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentAvatarHash?: string;\n currentFirstName?: string;\n currentLastName?: string;\n currentBio?: string;\n currentUsername?: string;\n progress?: ProfileEditProgress;\n isUsernameAvailable?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst MAX_BIO_LENGTH = 70;\n\nconst ERROR_FIRST_NAME_MISSING = 'Please provide your first name';\nconst ERROR_BIO_TOO_LONG = 'Bio can\\' be longer than 70 characters';\n\nconst SettingsEditProfile: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n currentAvatarHash,\n currentFirstName,\n currentLastName,\n currentBio,\n currentUsername,\n progress,\n isUsernameAvailable,\n loadCurrentUser,\n updateProfile,\n checkUsername,\n}) => {\n const lang = useLang();\n\n const [isUsernameTouched, setIsUsernameTouched] = useState(false);\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [error, setError] = useState();\n\n const [photo, setPhoto] = useState();\n const [firstName, setFirstName] = useState(currentFirstName || '');\n const [lastName, setLastName] = useState(currentLastName || '');\n const [bio, setBio] = useState(currentBio || '');\n const [username, setUsername] = useState(currentUsername || '');\n\n const currentAvatarBlobUrl = useMedia(currentAvatarHash, false, ApiMediaFormat.BlobUrl);\n\n const isLoading = progress === ProfileEditProgress.InProgress;\n const isUsernameError = username === false;\n\n const isSaveButtonShown = useMemo(() => {\n if (isUsernameError) {\n return false;\n }\n\n return Boolean(photo) || isProfileFieldsTouched || isUsernameAvailable === true;\n }, [photo, isProfileFieldsTouched, isUsernameError, isUsernameAvailable]);\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.EditProfile);\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadCurrentUser();\n });\n }, [loadCurrentUser]);\n\n useEffect(() => {\n setPhoto(undefined);\n }, [currentAvatarBlobUrl]);\n\n useEffect(() => {\n setFirstName(currentFirstName || '');\n setLastName(currentLastName || '');\n setBio(currentBio || '');\n }, [currentFirstName, currentLastName, currentBio]);\n\n useEffect(() => {\n setUsername(currentUsername || '');\n }, [currentUsername]);\n\n useEffect(() => {\n if (progress === ProfileEditProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setIsUsernameTouched(false);\n setError(undefined);\n }\n }, [progress]);\n\n const handlePhotoChange = useCallback((newPhoto: File) => {\n setPhoto(newPhoto);\n }, []);\n\n const handleFirstNameChange = useCallback((e: ChangeEvent) => {\n setFirstName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleLastNameChange = useCallback((e: ChangeEvent) => {\n setLastName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleBioChange = useCallback((e: ChangeEvent) => {\n setBio(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleUsernameChange = useCallback((value: string | false) => {\n setUsername(value);\n setIsUsernameTouched(true);\n }, []);\n\n const handleProfileSave = useCallback(() => {\n const trimmedFirstName = firstName.trim();\n const trimmedLastName = lastName.trim();\n const trimmedBio = bio.trim();\n\n if (!trimmedFirstName.length) {\n setError(ERROR_FIRST_NAME_MISSING);\n return;\n }\n\n if (trimmedBio.length > MAX_BIO_LENGTH) {\n setError(ERROR_BIO_TOO_LONG);\n return;\n }\n\n updateProfile({\n photo,\n ...(isProfileFieldsTouched && {\n firstName: trimmedFirstName,\n lastName: trimmedLastName,\n bio: trimmedBio,\n }),\n ...(isUsernameTouched && {\n username,\n }),\n });\n }, [\n photo,\n firstName, lastName, bio, isProfileFieldsTouched,\n username, isUsernameTouched,\n updateProfile,\n ]);\n\n return (\n
\n
\n
\n \n \n \n \n\n

\n {renderText(lang('lng_settings_about_bio'), ['br', 'simple_markdown'])}\n

\n
\n\n
\n

{lang('Username')}

\n\n \n\n

\n {renderText(lang('UsernameHelp'), ['br', 'simple_markdown'])}\n

\n {username && (\n

\n {lang('lng_username_link')}
\n https://t.me/{username}\n

\n )}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { currentUserId } = global;\n const { progress, isUsernameAvailable } = global.profileEdit || {};\n const currentUser = currentUserId ? selectUser(global, currentUserId) : undefined;\n\n if (!currentUser) {\n return {\n progress,\n isUsernameAvailable,\n };\n }\n\n const {\n firstName: currentFirstName,\n lastName: currentLastName,\n username: currentUsername,\n fullInfo,\n } = currentUser;\n const { bio: currentBio } = fullInfo || {};\n const currentAvatarHash = getChatAvatarHash(currentUser);\n\n return {\n currentAvatarHash,\n currentFirstName,\n currentLastName,\n currentBio,\n currentUsername,\n progress,\n isUsernameAvailable,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadCurrentUser',\n 'updateProfile',\n 'checkUsername',\n ]),\n)(SettingsEditProfile));\n","import React, {\n FC, memo, useMemo, useCallback, useState, useEffect,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\nimport { ApiChatFolder, ApiChat, ApiUser } from '../../../../api/types';\nimport { NotifyException, NotifySettings, SettingsScreens } from '../../../../types';\n\nimport { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config';\nimport { pick } from '../../../../util/iteratees';\nimport { selectNotifyExceptions, selectNotifySettings } from '../../../../modules/selectors';\nimport { throttle } from '../../../../util/schedulers';\nimport getAnimationData from '../../../common/helpers/animatedAssets';\nimport { getFolderDescriptionText } from '../../../../modules/helpers';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport ListItem from '../../../ui/ListItem';\nimport Button from '../../../ui/Button';\nimport Loading from '../../../ui/Loading';\nimport AnimatedSticker from '../../../common/AnimatedSticker';\n\ntype OwnProps = {\n onCreateFolder: () => void;\n onEditFolder: (folder: ApiChatFolder) => void;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n chatsById: Record;\n usersById: Record;\n orderedFolderIds?: number[];\n foldersById: Record;\n recommendedChatFolders?: ApiChatFolder[];\n notifySettings: NotifySettings;\n notifyExceptions?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottledForLoadRecommended = throttle((cb) => cb(), 60000, true);\n\nconst MAX_ALLOWED_FOLDERS = 10;\n\nconst SettingsFoldersMain: FC = ({\n onCreateFolder,\n onEditFolder,\n isActive,\n onScreenSelect,\n onReset,\n chatsById,\n usersById,\n orderedFolderIds,\n foldersById,\n recommendedChatFolders,\n notifySettings,\n notifyExceptions,\n loadRecommendedChatFolders,\n addChatFolder,\n showDialog,\n}) => {\n const [animationData, setAnimationData] = useState>();\n const [isAnimationLoaded, setIsAnimationLoaded] = useState(false);\n const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []);\n\n useEffect(() => {\n if (!animationData) {\n getAnimationData('FoldersAll').then(setAnimationData);\n }\n }, [animationData]);\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottledForLoadRecommended(() => {\n loadRecommendedChatFolders();\n });\n }, [loadRecommendedChatFolders]);\n\n const handleCreateFolder = useCallback(() => {\n if (Object.keys(foldersById).length >= MAX_ALLOWED_FOLDERS) {\n showDialog({\n data: {\n message: 'DIALOG_FILTERS_TOO_MUCH',\n hasErrorKey: true,\n },\n });\n\n return;\n }\n\n onCreateFolder();\n }, [foldersById, showDialog, onCreateFolder]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Folders);\n\n const userFolders = useMemo(() => {\n if (!orderedFolderIds) {\n return undefined;\n }\n\n const chatIds = Object.keys(chatsById).map(Number);\n\n return orderedFolderIds.map((id) => {\n const folder = foldersById[id];\n\n return {\n id: folder.id,\n title: folder.title,\n subtitle: getFolderDescriptionText(\n lang, chatsById, usersById, folder, chatIds, notifySettings, notifyExceptions,\n ),\n };\n });\n }, [orderedFolderIds, chatsById, foldersById, usersById, notifySettings, notifyExceptions, lang]);\n\n const handleCreateFolderFromRecommended = useCallback((folder: ApiChatFolder) => {\n if (Object.keys(foldersById).length >= MAX_ALLOWED_FOLDERS) {\n showDialog({\n data: {\n message: 'DIALOG_FILTERS_TOO_MUCH',\n hasErrorKey: true,\n },\n });\n\n return;\n }\n\n addChatFolder({ folder });\n }, [foldersById, addChatFolder, showDialog]);\n\n return (\n
\n
\n
\n {animationData && (\n \n )}\n
\n\n

\n {lang('CreateNewFilterInfo')}\n

\n\n \n \n {lang('CreateNewFilter')}\n \n
\n\n
\n

{lang('Filters')}

\n\n {userFolders && userFolders.length ? userFolders.map((folder) => (\n onEditFolder(foldersById[folder.id])}\n >\n {folder.title}\n {folder.subtitle}\n \n )) : userFolders && !userFolders.length ? (\n

\n You have no folders yet.\n

\n ) : }\n
\n\n {(recommendedChatFolders && !!recommendedChatFolders.length) && (\n
\n

\n {lang('FilterRecommended')}\n

\n\n {recommendedChatFolders.map((folder) => (\n handleCreateFolderFromRecommended(folder)}\n >\n
\n
\n {folder.title}\n {folder.description}\n
\n\n \n {lang('Add')}\n \n
\n \n ))}\n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: { byId: chatsById },\n users: { byId: usersById },\n } = global;\n\n const {\n orderedIds: orderedFolderIds,\n byId: foldersById,\n recommended: recommendedChatFolders,\n } = global.chatFolders;\n\n return {\n chatsById,\n usersById,\n orderedFolderIds,\n foldersById,\n recommendedChatFolders,\n notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadRecommendedChatFolders', 'addChatFolder', 'showDialog']),\n)(SettingsFoldersMain));\n","import React, { FC } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\n\nimport './ShowMoreButton.scss';\n\ntype OwnProps = {\n count: number;\n itemName: string;\n itemPluralName?: string;\n isLoading?: boolean;\n onClick: () => void;\n};\n\nconst ShowMoreButton: FC = ({\n count,\n itemName,\n itemPluralName,\n isLoading,\n onClick,\n}) => {\n const lang = useLang();\n\n return (\n \n \n Show {count} more {count > 1 ? itemPluralName || `${itemName}s` : itemName}\n \n );\n};\n\nexport default ShowMoreButton;\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config';\nimport { findIntersectionWithSet, pick } from '../../../../util/iteratees';\nimport { isChatPrivate } from '../../../../modules/helpers';\nimport getAnimationData from '../../../common/helpers/animatedAssets';\nimport {\n EXCLUDED_CHAT_TYPES,\n FolderEditDispatch,\n FoldersState,\n INCLUDED_CHAT_TYPES,\n selectChatFilters,\n} from '../../../../hooks/reducers/useFoldersReducer';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport ListItem from '../../../ui/ListItem';\nimport AnimatedSticker from '../../../common/AnimatedSticker';\nimport InputText from '../../../ui/InputText';\nimport PrivateChatInfo from '../../../common/PrivateChatInfo';\nimport GroupChatInfo from '../../../common/GroupChatInfo';\nimport FloatingActionButton from '../../../ui/FloatingActionButton';\nimport Spinner from '../../../ui/Spinner';\nimport ShowMoreButton from '../../../ui/ShowMoreButton';\n\ntype OwnProps = {\n state: FoldersState;\n dispatch: FolderEditDispatch;\n onAddIncludedChats: () => void;\n onAddExcludedChats: () => void;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n onBack: () => void;\n};\n\ntype StateProps = {\n loadedActiveChatIds?: number[];\n loadedArchivedChatIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SUBMIT_TIMEOUT = 500;\n\nconst INITIAL_CHATS_LIMIT = 5;\n\nconst ERROR_NO_TITLE = 'Please provide a title for this folder.';\nconst ERROR_NO_CHATS = 'Please select at least one chat for this folder.';\n\nconst SettingsFoldersEdit: FC = ({\n state,\n dispatch,\n onAddIncludedChats,\n onAddExcludedChats,\n isActive,\n onScreenSelect,\n onReset,\n onBack,\n loadedActiveChatIds,\n loadedArchivedChatIds,\n editChatFolder,\n addChatFolder,\n loadMoreChats,\n}) => {\n const [animationData, setAnimationData] = useState>();\n const [isAnimationLoaded, setIsAnimationLoaded] = useState(false);\n const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []);\n\n const [isIncludedChatsListExpanded, setIsIncludedChatsListExpanded] = useState(false);\n const [isExcludedChatsListExpanded, setIsExcludedChatsListExpanded] = useState(false);\n\n const {\n selectedChatIds: includedChatIds,\n selectedChatTypes: includedChatTypes,\n } = selectChatFilters(state, 'included');\n const {\n selectedChatIds: excludedChatIds,\n selectedChatTypes: excludedChatTypes,\n } = selectChatFilters(state, 'excluded');\n\n useEffect(() => {\n if (!animationData) {\n getAnimationData('FoldersNew').then(setAnimationData);\n }\n }, [animationData]);\n\n useEffect(() => {\n setIsIncludedChatsListExpanded(false);\n setIsExcludedChatsListExpanded(false);\n }, [state.folderId]);\n\n const [visibleIncludedChatIds, visibleExcludedChatIds] = useMemo(() => {\n const allLoadedChatsSet = new Set([\n ...loadedActiveChatIds || [],\n ...loadedArchivedChatIds || [],\n ]);\n\n const loadedIncludedChatIds = findIntersectionWithSet(includedChatIds, allLoadedChatsSet);\n const loadedExcludedChatIds = findIntersectionWithSet(excludedChatIds, allLoadedChatsSet);\n\n return [\n isIncludedChatsListExpanded\n ? loadedIncludedChatIds\n : loadedIncludedChatIds.slice(0, INITIAL_CHATS_LIMIT - includedChatTypes.length),\n isExcludedChatsListExpanded\n ? loadedExcludedChatIds\n : loadedExcludedChatIds.slice(0, INITIAL_CHATS_LIMIT - excludedChatTypes.length),\n ];\n }, [\n excludedChatIds, includedChatIds, includedChatTypes, excludedChatTypes,\n isExcludedChatsListExpanded, isIncludedChatsListExpanded,\n loadedActiveChatIds, loadedArchivedChatIds,\n ]);\n\n useEffect(() => {\n if (\n visibleIncludedChatIds.length < includedChatIds.length\n || visibleExcludedChatIds.length < excludedChatIds.length\n ) {\n loadMoreChats({ listType: 'active' });\n }\n }, [\n loadMoreChats,\n excludedChatIds.length,\n includedChatIds.length,\n visibleExcludedChatIds.length,\n visibleIncludedChatIds.length,\n ]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onBack, onScreenSelect, state.mode === 'edit'\n ? SettingsScreens.FoldersEditFolder\n : SettingsScreens.FoldersCreateFolder);\n\n function handleChange(event: React.ChangeEvent) {\n const { currentTarget } = event;\n dispatch({ type: 'setTitle', payload: currentTarget.value.trim() });\n }\n\n function handleSubmit() {\n const { title } = state.folder;\n\n if (!title) {\n dispatch({ type: 'setError', payload: ERROR_NO_TITLE });\n return;\n }\n\n if (!includedChatIds.length && !Object.keys(includedChatTypes).length) {\n dispatch({ type: 'setError', payload: ERROR_NO_CHATS });\n return;\n }\n\n dispatch({ type: 'setIsLoading', payload: true });\n if (state.mode === 'edit') {\n editChatFolder({ id: state.folderId, folderUpdate: state.folder });\n } else {\n addChatFolder({ folder: state.folder });\n }\n\n setTimeout(() => {\n onReset();\n }, SUBMIT_TIMEOUT);\n }\n\n function renderChatType(key: string, mode: 'included' | 'excluded') {\n const chatType = mode === 'included'\n ? INCLUDED_CHAT_TYPES.find(({ key: typeKey }) => typeKey === key)\n : EXCLUDED_CHAT_TYPES.find(({ key: typeKey }) => typeKey === key);\n\n if (!chatType) {\n return undefined;\n }\n\n return (\n \n {lang(chatType.title)}\n \n );\n }\n\n function renderChats(mode: 'included' | 'excluded') {\n const selectedChatTypes = mode === 'included' ? includedChatTypes : excludedChatTypes;\n const visibleChatIds = mode === 'included' ? visibleIncludedChatIds : visibleExcludedChatIds;\n\n const isExpanded = mode === 'included' ? isIncludedChatsListExpanded : isExcludedChatsListExpanded;\n const allChatIds = mode === 'included' ? includedChatIds : excludedChatIds;\n const leftChatsCount = allChatIds.length - selectedChatTypes.length - visibleChatIds.length;\n const clickHandler = mode === 'included'\n ? () => setIsIncludedChatsListExpanded(true)\n : () => setIsExcludedChatsListExpanded(true);\n\n return (\n <>\n {selectedChatTypes.map((key) => renderChatType(key, mode))}\n {visibleChatIds.map((id) => (\n \n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n ))}\n {(!isExpanded && leftChatsCount > 0) && (\n \n )}\n \n );\n }\n\n return (\n
\n
\n
\n
\n {animationData && (\n \n )}\n
\n\n {state.mode === 'create' && (\n

\n {lang('FilterIncludeInfo')}\n

\n )}\n\n \n
\n\n
\n {state.error && state.error === ERROR_NO_CHATS && (\n

\n {state.error}\n

\n )}\n\n

{lang('FilterInclude')}

\n\n \n {lang('FilterAddChats')}\n \n\n {renderChats('included')}\n
\n\n
\n

{lang('FilterExclude')}

\n\n \n {lang('FilterAddChats')}\n \n\n {renderChats('excluded')}\n
\n
\n\n \n {state.isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { listIds } = global.chats;\n\n return {\n loadedActiveChatIds: listIds.active,\n loadedArchivedChatIds: listIds.archived,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['editChatFolder', 'addChatFolder', 'loadMoreChats']),\n)(SettingsFoldersEdit));\n","import React, {\n FC, useCallback, useRef, useEffect, memo,\n} from '../../../../lib/teact/teact';\n\nimport { isChatPrivate } from '../../../../modules/helpers';\nimport {\n INCLUDED_CHAT_TYPES,\n EXCLUDED_CHAT_TYPES,\n FolderChatType,\n} from '../../../../hooks/reducers/useFoldersReducer';\nimport useInfiniteScroll from '../../../../hooks/useInfiniteScroll';\nimport useLang from '../../../../hooks/useLang';\n\nimport Checkbox from '../../../ui/Checkbox';\nimport InputText from '../../../ui/InputText';\nimport ListItem from '../../../ui/ListItem';\nimport PrivateChatInfo from '../../../common/PrivateChatInfo';\nimport GroupChatInfo from '../../../common/GroupChatInfo';\nimport PickerSelectedItem from '../../../common/PickerSelectedItem';\nimport InfiniteScroll from '../../../ui/InfiniteScroll';\nimport Loading from '../../../ui/Loading';\n\nimport '../../../common/Picker.scss';\nimport './SettingsFoldersChatsPicker.scss';\n\ntype OwnProps = {\n mode: 'included' | 'excluded';\n chatIds: number[];\n selectedIds: number[];\n selectedChatTypes: string[];\n filterValue?: string;\n onSelectedIdsChange: (ids: number[]) => void;\n onSelectedChatTypesChange: (types: string[]) => void;\n onFilterChange: (value: string) => void;\n onLoadMore: () => void;\n};\n\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 500;\n\nconst MAX_CHATS = 100;\nconst MAX_FULL_ITEMS = 10;\nconst ALWAYS_FULL_ITEMS_COUNT = 5;\n\nconst SettingsFoldersChatsPicker: FC = ({\n mode,\n chatIds,\n selectedIds,\n selectedChatTypes,\n filterValue,\n onSelectedIdsChange,\n onSelectedChatTypesChange,\n onFilterChange,\n onLoadMore,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const chatTypes = mode === 'included' ? INCLUDED_CHAT_TYPES : EXCLUDED_CHAT_TYPES;\n const shouldMinimize = selectedIds.length + selectedChatTypes.length > MAX_FULL_ITEMS;\n const hasMaxChats = selectedIds.length >= MAX_CHATS;\n\n useEffect(() => {\n setTimeout(() => {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n });\n }, FOCUS_DELAY_MS);\n }, []);\n\n const handleItemClick = useCallback((id: number) => {\n const newSelectedIds = [...selectedIds];\n if (newSelectedIds.includes(id)) {\n newSelectedIds.splice(newSelectedIds.indexOf(id), 1);\n } else {\n newSelectedIds.push(id);\n }\n onSelectedIdsChange(newSelectedIds);\n }, [selectedIds, onSelectedIdsChange]);\n\n const handleChatTypeClick = useCallback((key: FolderChatType['key']) => {\n const newSelectedChatTypes = [...selectedChatTypes];\n if (newSelectedChatTypes.includes(key)) {\n newSelectedChatTypes.splice(newSelectedChatTypes.indexOf(key), 1);\n } else {\n newSelectedChatTypes.push(key);\n }\n onSelectedChatTypesChange(newSelectedChatTypes);\n }, [selectedChatTypes, onSelectedChatTypesChange]);\n\n const handleFilterChange = useCallback((e: React.ChangeEvent) => {\n const { value } = e.currentTarget;\n onFilterChange(value);\n }, [onFilterChange]);\n\n const lang = useLang();\n\n function renderSelectedChatType(key: string) {\n const selectedType = chatTypes.find(({ key: typeKey }) => key === typeKey);\n if (!selectedType) {\n return undefined;\n }\n\n return (\n \n );\n }\n\n function renderChatType(type: FolderChatType) {\n return (\n handleChatTypeClick(type.key)}\n ripple\n >\n \n

{lang(type.title)}

\n \n \n );\n }\n\n function renderItem(id: number) {\n const isSelected = selectedIds.includes(id);\n\n return (\n handleItemClick(id)}\n ripple\n disabled={!isSelected && hasMaxChats}\n >\n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n \n );\n }\n\n const [viewportIds, getMore] = useInfiniteScroll(onLoadMore, chatIds, Boolean(filterValue));\n\n return (\n
\n
\n {selectedChatTypes.map(renderSelectedChatType)}\n {selectedIds.map((id, i) => (\n \n ))}\n {!hasMaxChats ? (\n \n ) : (\n

\n {`Sorry, you can't add more than ${MAX_CHATS} chats.`}\n

\n )}\n
\n \n {(!viewportIds || !viewportIds.length || viewportIds.includes(chatIds[0])) && (\n <>\n

\n {lang('FilterChatTypes')}\n

\n {chatTypes.map(renderChatType)}\n
\n

\n {lang('FilterChats')}\n

\n \n )}\n\n {viewportIds && viewportIds.length ? (\n viewportIds.map(renderItem)\n ) : viewportIds && !viewportIds.length ? (\n

Sorry, nothing found.

\n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(SettingsFoldersChatsPicker);\n","import React, {\n FC, memo, useMemo, useCallback,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\nimport { ApiChat } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport useLang from '../../../../hooks/useLang';\nimport { pick } from '../../../../util/iteratees';\nimport searchWords from '../../../../util/searchWords';\nimport { prepareChatList, getChatTitle } from '../../../../modules/helpers';\nimport {\n FoldersState,\n FolderEditDispatch,\n selectChatFilters,\n} from '../../../../hooks/reducers/useFoldersReducer';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport SettingsFoldersChatsPicker from './SettingsFoldersChatsPicker';\n\nimport Loading from '../../../ui/Loading';\n\ntype OwnProps = {\n mode: 'included' | 'excluded';\n state: FoldersState;\n dispatch: FolderEditDispatch;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n chatsById: Record;\n listIds?: number[];\n orderedPinnedIds?: number[];\n archivedListIds?: number[];\n archivedPinnedIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsFoldersChatFilters: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n mode,\n state,\n dispatch,\n chatsById,\n listIds,\n orderedPinnedIds,\n archivedListIds,\n archivedPinnedIds,\n loadMoreChats,\n}) => {\n const { chatFilter } = state;\n const { selectedChatIds, selectedChatTypes } = selectChatFilters(state, mode, true);\n\n const lang = useLang();\n const chats = useMemo(() => {\n const activeChatArrays = listIds\n ? prepareChatList(chatsById, listIds, orderedPinnedIds, 'all')\n : undefined;\n const archivedChatArrays = archivedListIds\n ? prepareChatList(chatsById, archivedListIds, archivedPinnedIds, 'archived')\n : undefined;\n\n if (!activeChatArrays && !archivedChatArrays) {\n return undefined;\n }\n\n return [\n ...(activeChatArrays\n ? [...activeChatArrays.pinnedChats, ...activeChatArrays.otherChats]\n : []\n ),\n ...(archivedChatArrays ? archivedChatArrays.otherChats : []),\n ];\n }, [chatsById, listIds, orderedPinnedIds, archivedListIds, archivedPinnedIds]);\n\n const displayedIds = useMemo(() => {\n if (!chats) {\n return undefined;\n }\n\n return chats\n .filter((chat) => (\n !chatFilter\n || searchWords(getChatTitle(lang, chat), chatFilter)\n || selectedChatIds.includes(chat.id)\n ))\n .map(({ id }) => id);\n }, [chats, chatFilter, lang, selectedChatIds]);\n\n const handleFilterChange = useCallback((newFilter: string) => {\n dispatch({\n type: 'setChatFilter',\n payload: newFilter,\n });\n }, [dispatch]);\n\n const handleSelectedIdsChange = useCallback((ids: number[]) => {\n if (mode === 'included') {\n dispatch({\n type: 'setIncludeFilters',\n payload: { ...state.includeFilters, includedChatIds: ids },\n });\n } else {\n dispatch({\n type: 'setExcludeFilters',\n payload: { ...state.excludeFilters, excludedChatIds: ids },\n });\n }\n }, [mode, state, dispatch]);\n\n const handleSelectedChatTypesChange = useCallback((keys: string[]) => {\n const newFilters: Record = {};\n keys.forEach((key) => {\n newFilters[key] = true;\n });\n\n if (mode === 'included') {\n dispatch({\n type: 'setIncludeFilters',\n payload: {\n includedChatIds: selectedChatIds,\n ...newFilters,\n },\n });\n } else {\n dispatch({\n type: 'setExcludeFilters',\n payload: {\n excludedChatIds: selectedChatIds,\n ...newFilters,\n },\n });\n }\n }, [mode, selectedChatIds, dispatch]);\n\n useHistoryBack(isActive, onReset, onScreenSelect,\n mode === 'included' ? SettingsScreens.FoldersIncludedChats : SettingsScreens.FoldersExcludedChats);\n\n if (!displayedIds) {\n return ;\n }\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: {\n byId: chatsById,\n listIds,\n orderedPinnedIds,\n },\n } = global;\n\n return {\n chatsById,\n listIds: listIds.active,\n orderedPinnedIds: orderedPinnedIds.active,\n archivedPinnedIds: orderedPinnedIds.archived,\n archivedListIds: listIds.archived,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadMoreChats']),\n)(SettingsFoldersChatFilters));\n","import React, { FC, memo, useCallback } from '../../../../lib/teact/teact';\n\nimport { ApiChatFolder } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { FolderEditDispatch, FoldersState } from '../../../../hooks/reducers/useFoldersReducer';\n\nimport SettingsFoldersMain from './SettingsFoldersMain';\nimport SettingsFoldersEdit from './SettingsFoldersEdit';\nimport SettingsFoldersChatFilters from './SettingsFoldersChatFilters';\n\nimport './SettingsFolders.scss';\n\nconst TRANSITION_DURATION = 200;\n\nexport type OwnProps = {\n currentScreen: SettingsScreens;\n shownScreen: SettingsScreens;\n state: FoldersState;\n dispatch: FolderEditDispatch;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\nconst SettingsFolders: FC = ({\n currentScreen,\n shownScreen,\n state,\n dispatch,\n isActive,\n onScreenSelect,\n onReset,\n}) => {\n const handleReset = useCallback(() => {\n if (\n currentScreen === SettingsScreens.FoldersCreateFolder\n || currentScreen === SettingsScreens.FoldersEditFolder\n ) {\n setTimeout(() => {\n dispatch({ type: 'reset' });\n }, TRANSITION_DURATION);\n }\n\n if (\n currentScreen === SettingsScreens.FoldersIncludedChats\n || currentScreen === SettingsScreens.FoldersExcludedChats\n ) {\n if (state.mode === 'create') {\n onScreenSelect(SettingsScreens.FoldersCreateFolder);\n } else {\n onScreenSelect(SettingsScreens.FoldersEditFolder);\n }\n return;\n }\n\n onReset();\n }, [\n state.mode, dispatch,\n currentScreen, onReset, onScreenSelect,\n ]);\n\n const handleCreateFolder = useCallback(() => {\n dispatch({ type: 'reset' });\n onScreenSelect(SettingsScreens.FoldersCreateFolder);\n }, [onScreenSelect, dispatch]);\n\n const handleEditFolder = useCallback((folder: ApiChatFolder) => {\n dispatch({ type: 'editFolder', payload: folder });\n onScreenSelect(SettingsScreens.FoldersEditFolder);\n }, [dispatch, onScreenSelect]);\n\n const handleAddIncludedChats = useCallback(() => {\n dispatch({ type: 'editIncludeFilters' });\n onScreenSelect(SettingsScreens.FoldersIncludedChats);\n }, [dispatch, onScreenSelect]);\n\n const handleAddExcludedChats = useCallback(() => {\n dispatch({ type: 'editExcludeFilters' });\n onScreenSelect(SettingsScreens.FoldersExcludedChats);\n }, [dispatch, onScreenSelect]);\n\n switch (currentScreen) {\n case SettingsScreens.Folders:\n return (\n \n );\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n return (\n \n );\n case SettingsScreens.FoldersIncludedChats:\n return (\n \n );\n case SettingsScreens.FoldersExcludedChats:\n return (\n \n );\n\n default:\n return undefined;\n }\n};\n\nexport default memo(SettingsFolders);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useCallback, useMemo, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport './RangeSlider.scss';\n\ntype OwnProps = {\n options?: string[];\n range?: { min: number; max: number; step?: number };\n label?: string;\n value: number;\n disabled?: boolean;\n onChange: (value: number) => void;\n};\n\nconst RangeSlider: FC = ({\n options,\n range,\n label,\n value,\n disabled,\n onChange,\n}) => {\n const lang = useLang();\n const handleChange = useCallback((event: ChangeEvent) => {\n onChange(Number(event.currentTarget.value));\n }, [onChange]);\n\n const className = buildClassName(\n 'RangeSlider',\n disabled && 'disabled',\n );\n\n const trackWidth = useMemo(() => {\n if (options) {\n return (value / (options.length - 1)) * 100;\n } else if (range) {\n const possibleValuesLength = (range.max - range.min) / (range.step || 1);\n return ((value - range.min) / possibleValuesLength) * 100;\n }\n return 0;\n }, [value, options, range]);\n\n const [min, max, step] = useMemo(() => {\n if (options) {\n return [0, options.length - 1, 1];\n } else if (range) {\n return [range.min, range.max, range.step || 1];\n }\n\n return [0, 0, 0];\n }, [range, options]);\n\n return (\n
\n {label && (\n
\n {label}\n {range && (\n {value}\n )}\n
\n )}\n
\n \n \n {options && (\n
\n {options.map((option, index) => (\n onChange(index)}\n >\n {option}\n
\n ))}\n
\n )}\n
\n
\n );\n};\n\nexport default memo(RangeSlider);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiStickerSet } from '../../../api/types';\n\nimport { STICKER_SIZE_PICKER_HEADER } from '../../../config';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMedia from '../../../hooks/useMedia';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport { getFirstLetters } from '../../../util/textFormat';\n\nimport AnimatedSticker from '../../common/AnimatedSticker';\n\ntype OwnProps = {\n size?: number;\n stickerSet: ApiStickerSet;\n observeIntersection: ObserveFn;\n};\n\nconst StickerSetCoverAnimated: FC = ({\n size = STICKER_SIZE_PICKER_HEADER,\n stickerSet,\n observeIntersection,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const mediaHash = `stickerSet${stickerSet.id}`;\n const lottieData = useMedia(mediaHash, !isIntersecting, ApiMediaFormat.Lottie);\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(lottieData, 'slow');\n\n return (\n
\n {!shouldRenderFullMedia && getFirstLetters(stickerSet.title, 2)}\n {shouldRenderFullMedia && lottieData && (\n \n )}\n
\n );\n};\n\nexport default memo(StickerSetCoverAnimated);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiStickerSet } from '../../../api/types';\n\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMedia from '../../../hooks/useMedia';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport { getFirstLetters } from '../../../util/textFormat';\n\ntype OwnProps = {\n stickerSet: ApiStickerSet;\n observeIntersection: ObserveFn;\n};\n\nconst StickerSetCover: FC = ({ stickerSet, observeIntersection }) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const mediaData = useMedia(stickerSet.hasThumbnail && `stickerSet${stickerSet.id}`, !isIntersecting);\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(mediaData, 'slow');\n\n return (\n
\n {!shouldRenderFullMedia && getFirstLetters(stickerSet.title, 2)}\n {shouldRenderFullMedia && (\n \"\"\n )}\n
\n );\n};\n\nexport default memo(StickerSetCover);\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC, memo, useEffect, useRef,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiSticker } from '../../api/types';\n\nimport { useIsIntersecting, ObserveFn } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport useFlag from '../../hooks/useFlag';\nimport buildClassName from '../../util/buildClassName';\n\nimport AnimatedSticker from './AnimatedSticker';\nimport Button from '../ui/Button';\n\nimport './StickerButton.scss';\n\ntype OwnProps = {\n sticker: ApiSticker;\n size: number;\n observeIntersection: ObserveFn;\n noAnimate?: boolean;\n title?: string;\n className?: string;\n onClick?: (arg: any) => void;\n clickArg?: any;\n onUnfaveClick?: (sticker: ApiSticker) => void;\n};\n\nconst StickerButton: FC = ({\n sticker, size, observeIntersection, noAnimate, title, className, onClick, clickArg, onUnfaveClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const localMediaHash = `sticker${sticker.id}`;\n const stickerSelector = `sticker-button-${sticker.id}`;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const thumbDataUri = sticker.thumbnail ? sticker.thumbnail.dataUri : undefined;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !isIntersecting, ApiMediaFormat.BlobUrl);\n\n const shouldPlay = isIntersecting && !noAnimate;\n const lottieData = useMedia(sticker.isAnimated && localMediaHash, !shouldPlay, ApiMediaFormat.Lottie);\n const [isAnimationLoaded, markLoaded, unmarkLoaded] = useFlag(Boolean(lottieData));\n const canAnimatedPlay = isAnimationLoaded && shouldPlay;\n\n const {\n shouldRenderThumb,\n shouldRenderFullMedia: shouldRenderPreview,\n transitionClassNames: previewTransitionClassNames,\n } = useTransitionForMedia(previewBlobUrl || canAnimatedPlay, 'slow');\n\n // To avoid flickering\n useEffect(() => {\n if (!shouldPlay) {\n unmarkLoaded();\n }\n }, [unmarkLoaded, shouldPlay]);\n\n function handleClick() {\n if (onClick) {\n onClick(clickArg);\n }\n }\n\n function handleUnfaveClick(e: ReactMouseEvent) {\n e.stopPropagation();\n e.preventDefault();\n\n onUnfaveClick!(sticker);\n }\n\n const fullClassName = buildClassName(\n 'StickerButton',\n sticker.isAnimated && 'animated',\n stickerSelector,\n className,\n );\n\n const style = shouldRenderThumb && thumbDataUri ? `background-image: url('${thumbDataUri}');` : '';\n\n return (\n \n {shouldRenderPreview && !canAnimatedPlay && (\n // eslint-disable-next-line jsx-a11y/alt-text\n \n )}\n {shouldPlay && lottieData && (\n \n )}\n {onUnfaveClick && (\n \n \n \n )}\n \n );\n};\n\nexport default memo(StickerButton);\n","import React, {\n FC, memo,\n} from '../../../lib/teact/teact';\nimport { ApiSticker, ApiStickerSet } from '../../../api/types';\n\nimport { STICKER_SIZE_GENERAL_SETTINGS } from '../../../config';\nimport { ObserveFn } from '../../../hooks/useIntersectionObserver';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport Button from '../../ui/Button';\nimport StickerSetCoverAnimated from '../../middle/composer/StickerSetCoverAnimated';\nimport StickerSetCover from '../../middle/composer/StickerSetCover';\nimport StickerButton from '../../common/StickerButton';\n\nimport './SettingsStickerSet.scss';\n\ntype OwnProps = {\n stickerSet?: ApiStickerSet;\n observeIntersection: ObserveFn;\n onClick: (value: ApiSticker) => void;\n};\n\nconst SettingsStickerSet: FC = ({\n stickerSet,\n observeIntersection,\n onClick,\n}) => {\n const lang = useLang();\n\n if (!stickerSet || !stickerSet.stickers) {\n return undefined;\n }\n\n const firstSticker = stickerSet.stickers && stickerSet.stickers[0];\n\n if (stickerSet.hasThumbnail || !firstSticker) {\n return (\n firstSticker && onClick(firstSticker)}\n >\n \n {stickerSet.isAnimated ? (\n \n ) : (\n \n )}\n \n
\n
{stickerSet.title}
\n
{lang('StickerPack.StickerCount', stickerSet.count, 'i')}
\n
\n \n );\n } else {\n return (\n onClick(firstSticker)}\n >\n \n
\n
{stickerSet.title}
\n
{lang('StickerPack.StickerCount', stickerSet.count, 'i')}
\n
\n \n );\n }\n};\n\nexport default memo(SettingsStickerSet);\n","import React, {\n FC, useCallback, memo, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, ISettings } from '../../../types';\nimport { ApiSticker, ApiStickerSet } from '../../../api/types';\n\nimport { IS_MAC_OS, IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport RangeSlider from '../../ui/RangeSlider';\nimport Checkbox from '../../ui/Checkbox';\nimport RadioGroup from '../../ui/RadioGroup';\nimport SettingsStickerSet from './SettingsStickerSet';\nimport StickerSetModal from '../../common/StickerSetModal.async';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = Pick & {\n stickerSetIds?: string[];\n stickerSetsById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_LEVEL_OPTIONS = [\n 'Solid and Steady',\n 'Nice and Fast',\n 'Lots of Stuff',\n];\n\nconst SettingsGeneral: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n stickerSetIds,\n stickerSetsById,\n messageTextSize,\n animationLevel,\n messageSendKeyCombo,\n shouldAutoDownloadMediaFromContacts,\n shouldAutoDownloadMediaInPrivateChats,\n shouldAutoDownloadMediaInGroups,\n shouldAutoDownloadMediaInChannels,\n shouldAutoPlayGifs,\n shouldAutoPlayVideos,\n shouldSuggestStickers,\n shouldLoopStickers,\n setSettingOption,\n loadStickerSets,\n loadAddedStickers,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const stickerSettingsRef = useRef(null);\n const { observe: observeIntersectionForCovers } = useIntersectionObserver({ rootRef: stickerSettingsRef });\n const [isModalOpen, openModal, closeModal] = useFlag();\n const [sticker, setSticker] = useState();\n\n const lang = useLang();\n\n const KEYBOARD_SEND_OPTIONS = !IS_TOUCH_ENV ? [\n { value: 'enter', label: lang('lng_settings_send_enter'), subLabel: 'New line by Shift + Enter' },\n {\n value: 'ctrl-enter',\n label: lang(IS_MAC_OS ? 'lng_settings_send_cmdenter' : 'lng_settings_send_ctrlenter'),\n subLabel: 'New line by Enter',\n },\n ] : undefined;\n\n useEffect(() => {\n loadStickerSets();\n }, [loadStickerSets]);\n\n useEffect(() => {\n if (stickerSetIds && stickerSetIds.length) {\n loadAddedStickers();\n }\n }, [stickerSetIds, loadAddedStickers]);\n\n const handleAnimationLevelChange = useCallback((newLevel: number) => {\n ANIMATION_LEVEL_OPTIONS.forEach((_, i) => {\n document.body.classList.toggle(`animation-level-${i}`, newLevel === i);\n });\n\n setSettingOption({ animationLevel: newLevel });\n }, [setSettingOption]);\n\n const handleMessageTextSizeChange = useCallback((newSize: number) => {\n document.documentElement.style.setProperty('--message-text-size', `${newSize}px`);\n\n setSettingOption({ messageTextSize: newSize });\n }, [setSettingOption]);\n\n const handleStickerSetClick = useCallback((value: ApiSticker) => {\n setSticker(value);\n openModal();\n }, [openModal]);\n\n const stickerSets = stickerSetIds && stickerSetIds.map((id: string) => {\n return stickerSetsById && stickerSetsById[id] && stickerSetsById[id].installedDate ? stickerSetsById[id] : false;\n }).filter(Boolean as any);\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.General);\n\n return (\n
\n
\n

{lang('SETTINGS')}

\n\n \n\n onScreenSelect(SettingsScreens.GeneralChatBackground)}\n >\n {lang('ChatBackground')}\n \n
\n\n
\n

\n Animation Level\n

\n

\n Choose the desired animations amount.\n

\n\n \n
\n\n {KEYBOARD_SEND_OPTIONS && (\n
\n

{lang('VoiceOver.Keyboard')}

\n\n setSettingOption({ messageSendKeyCombo: value })}\n selected={messageSendKeyCombo}\n />\n
\n )}\n\n
\n

{lang('AutoDownloadMedia')}

\n\n setSettingOption({ shouldAutoDownloadMediaFromContacts: isChecked })}\n />\n setSettingOption({ shouldAutoDownloadMediaInPrivateChats: isChecked })}\n />\n setSettingOption({ shouldAutoDownloadMediaInGroups: isChecked })}\n />\n setSettingOption({ shouldAutoDownloadMediaInChannels: isChecked })}\n />\n
\n\n
\n

{lang('AutoplayMedia')}

\n\n setSettingOption({ shouldAutoPlayGifs: isChecked })}\n />\n setSettingOption({ shouldAutoPlayVideos: isChecked })}\n />\n
\n\n
\n

{lang('AccDescrStickers')}

\n\n setSettingOption({ shouldSuggestStickers: isChecked })}\n />\n setSettingOption({ shouldLoopStickers: isChecked })}\n />\n\n
\n {stickerSets && stickerSets.map((stickerSet: ApiStickerSet) => (\n \n ))}\n
\n {sticker && (\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n ...pick(global.settings.byKey, [\n 'messageTextSize',\n 'animationLevel',\n 'messageSendKeyCombo',\n 'shouldAutoDownloadMediaFromContacts',\n 'shouldAutoDownloadMediaInPrivateChats',\n 'shouldAutoDownloadMediaInGroups',\n 'shouldAutoDownloadMediaInChannels',\n 'shouldAutoPlayGifs',\n 'shouldAutoPlayVideos',\n 'shouldSuggestStickers',\n 'shouldLoopStickers',\n 'isSensitiveEnabled',\n 'canChangeSensitive',\n ]),\n stickerSetIds: global.stickers.added.setIds,\n stickerSetsById: global.stickers.setsById,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setSettingOption', 'loadStickerSets', 'loadAddedStickers',\n ]),\n)(SettingsGeneral));\n","let fileSelector: HTMLInputElement;\n\nexport function openSystemFilesDialog(accept = '*', callback: (e: Event) => void, noMultiple = false) {\n if (!fileSelector) {\n fileSelector = document.createElement('input');\n fileSelector.setAttribute('type', 'file');\n }\n\n fileSelector.setAttribute('accept', accept);\n\n if (noMultiple) {\n fileSelector.removeAttribute('multiple');\n } else {\n fileSelector.setAttribute('multiple', 'multiple');\n }\n\n // eslint-disable-next-line no-null/no-null\n fileSelector.onchange = null;\n fileSelector.value = '';\n fileSelector.onchange = callback;\n\n fileSelector.click();\n}\n","/* eslint-disable eqeqeq */\n/* eslint-disable prefer-template */\n/* eslint-disable prefer-const */\n/* eslint-disable prefer-destructuring */\n/* eslint-disable one-var */\n/* eslint-disable one-var-declaration-per-line */\n\nimport { preloadImage } from './files';\n\n/**\n * HEX > RGB\n * input: 'xxxxxx' (ex. 'ed15fa') case-insensitive\n * output: [r, g, b] ([0-255, 0-255, 0-255])\n */\nexport function hex2rgb(param: string): [number, number, number] {\n return [\n parseInt(param.substring(0, 2), 16),\n parseInt(param.substring(2, 4), 16),\n parseInt(param.substring(4, 6), 16),\n ];\n}\n\n/**\n * RGB > HEX\n * input: [r, g, b] ([0-255, 0-255, 0-255])\n * output: 'xxxxxx' (ex. 'ff0000')\n */\nexport function rgb2hex(param: [number, number, number]) {\n const p0 = param[0].toString(16);\n const p1 = param[1].toString(16);\n const p2 = param[2].toString(16);\n return (p0.length == 1 ? '0' + p0 : p0) + (p1.length == 1 ? '0' + p1 : p1) + (p2.length == 1 ? '0' + p2 : p2);\n}\n\n/**\n * Converts an RGB color value to HSV. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSV_color_space.\n * Assumes r, g, and b are contained in the set [0, 255] and\n * returns h, s, and v in the set [0, 1].\n *\n * @param Number r The red color value\n * @param Number g The green color value\n * @param Number b The blue color value\n * @return Array The HSV representation\n */\nexport function rgb2hsb([r, g, b]: [number, number, number]): [number, number, number] {\n r /= 255;\n g /= 255;\n b /= 255;\n\n let max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h!: number, s: number, v: number = max;\n\n let d = max - min;\n s = max == 0 ? 0 : d / max;\n\n if (max == min) {\n h = 0; // achromatic\n } else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n\n h /= 6;\n }\n\n return [h, s, v];\n}\n\n/**\n * Converts an HSV color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSV_color_space.\n * Assumes h, s, and v are contained in the set [0, 1] and\n * returns r, g, and b in the set [0, 255].\n *\n * @param Number h The hue\n * @param Number s The saturation\n * @param Number v The value\n * @return Array The RGB representation\n */\nexport function hsb2rgb([h, s, v]: [number, number, number]): [number, number, number] {\n let r!: number, g!: number, b!: number;\n\n let i = Math.floor(h * 6);\n let f = h * 6 - i;\n let p = v * (1 - s);\n let q = v * (1 - f * s);\n let t = v * (1 - (1 - f) * s);\n\n switch (i % 6) {\n case 0:\n r = v;\n g = t;\n b = p;\n break;\n case 1:\n r = q;\n g = v;\n b = p;\n break;\n case 2:\n r = p;\n g = v;\n b = t;\n break;\n case 3:\n r = p;\n g = q;\n b = v;\n break;\n case 4:\n r = t;\n g = p;\n b = v;\n break;\n case 5:\n r = v;\n g = p;\n b = q;\n break;\n }\n\n return [\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n ];\n}\n\nexport async function getAverageColor(url: string): Promise<[number, number, number]> {\n // Only visit every 5 pixels\n const blockSize = 5;\n const defaultRGB: [number, number, number] = [0, 0, 0];\n let data;\n let width;\n let height;\n let i = -4;\n let length;\n let rgb: [number, number, number] = [0, 0, 0];\n let count = 0;\n\n const canvas = document.createElement('canvas');\n const context = canvas.getContext && canvas.getContext('2d');\n if (!context) {\n return defaultRGB;\n }\n\n const image = await preloadImage(url);\n height = image.naturalHeight || image.offsetHeight || image.height;\n width = image.naturalWidth || image.offsetWidth || image.width;\n canvas.height = height;\n canvas.width = width;\n\n context.drawImage(image, 0, 0);\n\n try {\n data = context.getImageData(0, 0, width, height);\n } catch (e) {\n return defaultRGB;\n }\n\n length = data.data.length;\n\n // eslint-disable-next-line no-cond-assign\n while ((i += blockSize * 4) < length) {\n ++count;\n rgb[0] += data.data[i];\n rgb[1] += data.data[i + 1];\n rgb[2] += data.data[i + 2];\n }\n\n rgb[0] = Math.floor(rgb[0] / count);\n rgb[1] = Math.floor(rgb[1] / count);\n rgb[2] = Math.floor(rgb[2] / count);\n\n return rgb;\n}\n\n// eslint-disable-next-line max-len\n// Function was adapted from https://github.com/telegramdesktop/tdesktop/blob/35ff621b5b52f7e3553fb0f990ea13ade7101b8e/Telegram/SourceFiles/data/data_wall_paper.cpp#L518\nexport function getPatternColor(rgbColor: [number, number, number]) {\n let [hue, saturation, value] = rgb2hsb(rgbColor);\n\n saturation = Math.min(1, saturation + 0.05 + 0.1 * (1 - saturation));\n value = value > 0.5\n ? Math.max(0, value * 0.65)\n : Math.max(0, Math.min(1, 1 - value * 0.65));\n\n return `hsla(${hue * 360}, ${saturation * 100}%, ${value * 100}%, .4)`;\n}\n","import React, {\n FC, memo, useCallback, useEffect, useState, useRef,\n} from '../../../lib/teact/teact';\nimport { ApiWallpaper } from '../../../api/types';\nimport { ThemeKey, UPLOADING_WALLPAPER_SLUG } from '../../../types';\n\nimport { CUSTOM_BG_CACHE_NAME } from '../../../config';\nimport * as cacheApi from '../../../util/cacheApi';\nimport { fetchBlob } from '../../../util/files';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport buildClassName from '../../../util/buildClassName';\nimport useMedia from '../../../hooks/useMedia';\nimport useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useCanvasBlur from '../../../hooks/useCanvasBlur';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nimport './WallpaperTile.scss';\n\ntype OwnProps = {\n wallpaper: ApiWallpaper;\n theme: ThemeKey;\n isSelected: boolean;\n onClick: (slug: string) => void;\n};\n\nconst WallpaperTile: FC = ({\n wallpaper,\n theme,\n isSelected,\n onClick,\n}) => {\n const { slug, document } = wallpaper;\n const localMediaHash = `wallpaper${document.id!}`;\n const localBlobUrl = document.previewBlobUrl;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`);\n const thumbRef = useCanvasBlur(\n document.thumbnail && document.thumbnail.dataUri,\n Boolean(previewBlobUrl),\n true,\n );\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(previewBlobUrl || localBlobUrl, 'slow');\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(false);\n const {\n mediaData: fullMedia, downloadProgress,\n } = useMediaWithDownloadProgress(localMediaHash, !isDownloadAllowed);\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const { shouldRender: shouldRenderSpinner, transitionClassNames: spinnerClassNames } = useShowTransition(\n (isDownloadAllowed && !fullMedia) || slug === UPLOADING_WALLPAPER_SLUG,\n undefined,\n wasDownloadDisabled,\n 'slow',\n );\n // To prevent triggering of the effect for useCallback\n const cacheKeyRef = useRef();\n cacheKeyRef.current = theme;\n\n const handleSelect = useCallback(() => {\n (async () => {\n const blob = await fetchBlob(fullMedia!);\n await cacheApi.save(CUSTOM_BG_CACHE_NAME, cacheKeyRef.current!, blob);\n onClick(slug);\n })();\n }, [fullMedia, onClick, slug]);\n\n useEffect(() => {\n if (fullMedia) {\n handleSelect();\n }\n }, [fullMedia, handleSelect]);\n\n const handleClick = useCallback(() => {\n if (fullMedia) {\n handleSelect();\n } else {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n }\n }, [fullMedia, handleSelect]);\n\n const className = buildClassName(\n 'WallpaperTile',\n isSelected && 'selected',\n );\n\n return (\n
\n
\n {shouldRenderThumb && (\n \n )}\n {shouldRenderFullMedia && (\n \n )}\n {shouldRenderSpinner && (\n
\n \n
\n )}\n
\n
\n );\n};\n\nexport default memo(WallpaperTile);\n","import React, {\n FC, memo, useEffect, useCallback, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, ThemeKey, UPLOADING_WALLPAPER_SLUG } from '../../../types';\nimport { ApiWallpaper } from '../../../api/types';\n\nimport { DARK_THEME_PATTERN_COLOR, DEFAULT_PATTERN_COLOR } from '../../../config';\nimport { pick } from '../../../util/iteratees';\nimport { throttle } from '../../../util/schedulers';\nimport { openSystemFilesDialog } from '../../../util/systemFilesDialog';\nimport { getAverageColor, getPatternColor, rgb2hex } from '../../../util/colors';\nimport { selectTheme } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport Loading from '../../ui/Loading';\nimport WallpaperTile from './WallpaperTile';\n\nimport './SettingsGeneralBackground.scss';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n background?: string;\n isBlurred?: boolean;\n loadedWallpapers?: ApiWallpaper[];\n theme: ThemeKey;\n};\n\ntype DispatchProps = Pick;\n\nconst SUPPORTED_TYPES = 'image/jpeg';\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst SettingsGeneralBackground: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n background,\n isBlurred,\n loadedWallpapers,\n theme,\n loadWallpapers,\n uploadWallpaper,\n setThemeSettings,\n}) => {\n const themeRef = useRef();\n themeRef.current = theme;\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadWallpapers();\n });\n }, [loadWallpapers]);\n\n const handleFileSelect = useCallback((e: Event) => {\n const { files } = e.target as HTMLInputElement;\n\n if (files && files.length > 0) {\n uploadWallpaper(files[0]);\n }\n }, [uploadWallpaper]);\n\n const handleUploadWallpaper = useCallback(() => {\n openSystemFilesDialog(SUPPORTED_TYPES, handleFileSelect, true);\n }, [handleFileSelect]);\n\n const handleSetColor = useCallback(() => {\n onScreenSelect(SettingsScreens.GeneralChatBackgroundColor);\n }, [onScreenSelect]);\n\n const handleResetToDefault = useCallback(() => {\n setThemeSettings({\n theme,\n background: undefined,\n backgroundColor: undefined,\n isBlurred: true,\n patternColor: theme === 'dark' ? DARK_THEME_PATTERN_COLOR : DEFAULT_PATTERN_COLOR,\n });\n }, [setThemeSettings, theme]);\n\n const handleWallPaperSelect = useCallback((slug: string) => {\n setThemeSettings({ theme: themeRef.current, background: slug });\n const currentWallpaper = loadedWallpapers && loadedWallpapers.find((wallpaper) => wallpaper.slug === slug);\n if (currentWallpaper && currentWallpaper.document.thumbnail) {\n getAverageColor(currentWallpaper.document.thumbnail.dataUri)\n .then((color) => {\n const patternColor = getPatternColor(color);\n const rgbColor = `#${rgb2hex(color)}`;\n setThemeSettings({ theme: themeRef.current, backgroundColor: rgbColor, patternColor });\n });\n }\n }, [loadedWallpapers, setThemeSettings]);\n\n const handleWallPaperBlurChange = useCallback((e: React.ChangeEvent) => {\n setThemeSettings({ theme: themeRef.current, isBlurred: e.target.checked });\n }, [setThemeSettings]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.GeneralChatBackground);\n\n const isUploading = loadedWallpapers && loadedWallpapers[0] && loadedWallpapers[0].slug === UPLOADING_WALLPAPER_SLUG;\n\n return (\n
\n
\n \n {lang('UploadImage')}\n \n\n \n {lang('SetColor')}\n \n\n \n {lang('ThemeResetToDefaults')}\n \n\n \n
\n\n {loadedWallpapers ? (\n
\n {loadedWallpapers.map((wallpaper) => (\n \n ))}\n
\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const theme = selectTheme(global);\n const { background, isBlurred } = global.settings.themes[theme] || {};\n const { loadedWallpapers } = global.settings;\n\n return {\n background,\n isBlurred,\n loadedWallpapers,\n theme,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadWallpapers', 'uploadWallpaper', 'setThemeSettings',\n ]),\n)(SettingsGeneralBackground));\n","import { ChangeEvent, MutableRefObject, RefObject } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, ThemeKey } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport {\n getPatternColor, hex2rgb, hsb2rgb, rgb2hex, rgb2hsb,\n} from '../../../util/colors';\nimport { captureEvents, RealTouchEvent } from '../../../util/captureEvents';\nimport { selectTheme } from '../../../modules/selectors';\nimport useFlag from '../../../hooks/useFlag';\nimport buildClassName from '../../../util/buildClassName';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport InputText from '../../ui/InputText';\n\nimport './SettingsGeneralBackgroundColor.scss';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n backgroundColor?: string;\n theme: ThemeKey;\n};\n\ntype DispatchProps = Pick;\n\ninterface CanvasRects {\n colorRect: {\n offsetLeft: number;\n top: number;\n width: number;\n height: number;\n };\n hueRect: {\n offsetLeft: number;\n width: number;\n };\n}\n\nconst DEFAULT_HSB = rgb2hsb(hex2rgb('e6ebee'));\nconst PREDEFINED_COLORS = [\n '#e6ebee', '#b2cee1', '#008dd0', '#c6e7cb', '#c4e1a6', '#60b16e',\n '#ccd0af', '#a6a997', '#7a7072', '#fdd7af', '#fdb76e', '#dd8851',\n];\n\nconst SettingsGeneralBackground: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n theme,\n backgroundColor,\n setThemeSettings,\n}) => {\n const themeRef = useRef();\n themeRef.current = theme;\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const colorPickerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const huePickerRef = useRef(null);\n const isFirstRunRef = useRef(true);\n\n const [hsb, setHsb] = useState(getInitialHsb(backgroundColor));\n // Cache for drag handlers\n const hsbRef = useRef(hsb);\n useEffect(() => {\n hsbRef.current = hsb;\n }, [hsb]);\n\n const [isDragging, markIsDragging, unmarkIsDragging] = useFlag();\n const [rgbInput, setRgbInput] = useState('');\n const [hexInput, setHexInput] = useState('');\n\n const rectsRef = useRef();\n const colorCtxRef = useRef();\n\n // Setup: cache rects, subscribe for drag events\n useEffect(() => {\n // We use `offsetLeft` instead of `left` to support screen transition\n const colorRect = {\n offsetLeft: colorPickerRef.current!.offsetLeft,\n ...pick(colorPickerRef.current!.getBoundingClientRect(), ['top', 'width', 'height']),\n };\n const hueRect = {\n offsetLeft: huePickerRef.current!.offsetLeft,\n ...pick(huePickerRef.current!.getBoundingClientRect(), ['width']),\n };\n\n rectsRef.current = { colorRect, hueRect };\n\n function handleColorDrag(e: MouseEvent | RealTouchEvent) {\n const colorPosition = [\n Math.min(Math.max(0, e.pageX! - colorRect.offsetLeft), colorRect.width - 1),\n Math.min(Math.max(0, e.pageY! - colorRect.top + containerRef.current!.scrollTop), colorRect.height - 1),\n ];\n\n const { huePosition } = hsb2positions(hsbRef.current, rectsRef.current!);\n\n setHsb(positions2hsb({ colorPosition, huePosition }, rectsRef.current!));\n markIsDragging();\n }\n\n captureEvents(colorPickerRef.current!, {\n onCapture: handleColorDrag,\n onDrag: handleColorDrag,\n onRelease: unmarkIsDragging,\n onClick: unmarkIsDragging,\n withCursor: true,\n });\n\n function handleHueDrag(e: MouseEvent | RealTouchEvent) {\n const { colorPosition } = hsb2positions(hsbRef.current, rectsRef.current!);\n const huePosition = Math.min(Math.max(0, e.pageX! - hueRect.offsetLeft), hueRect.width - 1);\n\n setHsb(positions2hsb({ colorPosition, huePosition }, rectsRef.current!));\n markIsDragging();\n }\n\n captureEvents(huePickerRef.current!, {\n onCapture: handleHueDrag,\n onDrag: handleHueDrag,\n onRelease: unmarkIsDragging,\n onClick: unmarkIsDragging,\n withCursor: true,\n });\n }, [markIsDragging, unmarkIsDragging]);\n\n const { colorPosition = [0, 0], huePosition = 0 } = rectsRef.current ? hsb2positions(hsb, rectsRef.current) : {};\n const hex = rgb2hex(hsb2rgb(hsb));\n const hue = hsb[0];\n const hueHex = rgb2hex(hsb2rgb([hue, 1, 1]));\n\n // Save value and update inputs when HSL changes\n useEffect(() => {\n const rgb = hsb2rgb(hsb);\n const color = `#${rgb2hex(rgb)}`;\n\n setRgbInput(rgb.join(', '));\n setHexInput(color);\n\n if (!isFirstRunRef.current) {\n const patternColor = getPatternColor(rgb);\n setThemeSettings({\n theme: themeRef.current,\n background: undefined,\n backgroundColor: color,\n patternColor,\n });\n }\n isFirstRunRef.current = false;\n }, [hsb, setThemeSettings]);\n\n // Redraw color picker when hue changes\n useEffect(() => {\n drawColor(colorPickerRef.current!.firstChild as HTMLCanvasElement, hue, colorCtxRef, rectsRef);\n }, [hue]);\n\n // Initially draw hue picker\n useEffect(() => {\n drawHue(huePickerRef.current!.firstChild as HTMLCanvasElement);\n }, []);\n\n const handleRgbChange = useCallback((e: ChangeEvent) => {\n const rgbValue = e.currentTarget.value.replace(/[^\\d, ]/g, '').slice(0, 13);\n\n if (rgbValue.match(/^\\d{1,3},\\s?\\d{1,3},\\s?\\d{1,3}$/)) {\n const rgb = rgbValue.split(',').map((channel) => Number(channel.trim())) as [number, number, number];\n setHsb(rgb2hsb(rgb));\n }\n\n e.currentTarget.value = rgbValue;\n }, []);\n\n const handleHexChange = useCallback((e: ChangeEvent) => {\n const hexValue = e.currentTarget.value.replace(/[^0-9a-fA-F]/g, '').slice(0, 6);\n\n if (hexValue.match(/^#?[0-9a-fA-F]{6}$/)) {\n setHsb(rgb2hsb(hex2rgb(hexValue.replace('#', ''))));\n }\n\n e.currentTarget.value = hexValue;\n }, []);\n\n const handlePredefinedColorClick = useCallback((e: React.MouseEvent) => {\n setHsb(rgb2hsb(hex2rgb(e.currentTarget.dataset.color!.replace('#', ''))));\n }, []);\n\n const className = buildClassName(\n 'SettingsGeneralBackgroundColor settings-content custom-scroll',\n isDragging && 'is-dragging',\n );\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.GeneralChatBackgroundColor);\n\n return (\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n {PREDEFINED_COLORS.map((color) => (\n \n ))}\n
\n
\n );\n};\n\nfunction getInitialHsb(backgroundColor?: string) {\n return backgroundColor && backgroundColor.startsWith('#')\n ? rgb2hsb(hex2rgb(backgroundColor.replace('#', '')))\n : DEFAULT_HSB;\n}\n\nfunction hsb2positions(hsb: [number, number, number], rects: CanvasRects) {\n return {\n colorPosition: [\n Math.round((hsb[1]) * (rects.colorRect.width - 1)),\n Math.round((1 - hsb[2]) * (rects.colorRect.height - 1)),\n ],\n huePosition: Math.round(hsb[0] * (rects.hueRect.width - 1)),\n };\n}\n\nfunction positions2hsb(\n { colorPosition, huePosition }: { colorPosition: number[]; huePosition: number },\n rects: CanvasRects,\n): [number, number, number] {\n return [\n huePosition / (rects.hueRect.width - 1),\n colorPosition[0] / (rects.colorRect.width - 1),\n 1 - colorPosition[1] / (rects.colorRect.height - 1),\n ];\n}\n\nfunction drawColor(\n canvas: HTMLCanvasElement,\n hue: number,\n colorCtxRef: MutableRefObject,\n rectsRef: RefObject,\n) {\n let w: number;\n let h: number;\n let ctx: CanvasRenderingContext2D;\n\n if (!colorCtxRef.current || !rectsRef.current) {\n // First run\n w = canvas.offsetWidth;\n h = canvas.offsetHeight;\n ctx = canvas.getContext('2d')!;\n\n canvas.width = w;\n canvas.height = h;\n\n colorCtxRef.current = ctx;\n } else {\n w = rectsRef.current.colorRect.width;\n h = rectsRef.current.colorRect.height;\n ctx = colorCtxRef.current;\n }\n\n const imgData = ctx!.createImageData(w, h);\n const pixels = imgData.data;\n const col = hsb2rgb([hue, 1, 1]);\n\n let index = 0;\n\n for (let y = 0; y < h; y++) {\n const perY = 1 - y / (h - 1);\n const st = [255 * perY, 255 * perY, 255 * perY];\n const ed = [col[0] * perY, col[1] * perY, col[2] * perY];\n for (let x = 0; x < w; x++) {\n const perX = x / (w - 1);\n pixels[index++] = st[0] + (ed[0] - st[0]) * perX;\n pixels[index++] = st[1] + (ed[1] - st[1]) * perX;\n pixels[index++] = st[2] + (ed[2] - st[2]) * perX;\n pixels[index++] = 255;\n }\n }\n\n ctx!.putImageData(imgData, 0, 0);\n}\n\nfunction drawHue(canvas: HTMLCanvasElement) {\n const w = canvas.offsetWidth;\n const h = 1;\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d')!;\n\n const imgData = ctx.createImageData(w, h);\n const pixels = imgData.data;\n\n let index = 0;\n\n for (let x = 0; x < w; x++) {\n const hue = x / (w - 1);\n const rgb = hsb2rgb([hue, 1, 1]);\n /* eslint-disable prefer-destructuring */\n pixels[index++] = rgb[0];\n pixels[index++] = rgb[1];\n pixels[index++] = rgb[2];\n /* eslint-enable prefer-destructuring */\n pixels[index++] = 255;\n }\n\n ctx.putImageData(imgData, 0, 0);\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const theme = selectTheme(global);\n const { backgroundColor } = global.settings.themes[theme] || {};\n return {\n backgroundColor,\n theme,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setThemeSettings']),\n)(SettingsGeneralBackground));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport Checkbox from '../../ui/Checkbox';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n hasPrivateChatsNotifications: boolean;\n hasPrivateChatsMessagePreview: boolean;\n hasGroupNotifications: boolean;\n hasGroupMessagePreview: boolean;\n hasBroadcastNotifications: boolean;\n hasBroadcastMessagePreview: boolean;\n hasContactJoinedNotifications: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsNotifications: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n hasPrivateChatsNotifications,\n hasPrivateChatsMessagePreview,\n hasGroupNotifications,\n hasGroupMessagePreview,\n hasBroadcastNotifications,\n hasBroadcastMessagePreview,\n hasContactJoinedNotifications,\n loadNotificationSettings,\n updateContactSignUpNotification,\n updateNotificationSettings,\n}) => {\n useEffect(() => {\n loadNotificationSettings();\n }, [loadNotificationSettings]);\n\n const handleSettingsChange = useCallback((\n e: ChangeEvent,\n peerType: 'contact' | 'group' | 'broadcast',\n setting: 'silent' | 'showPreviews',\n ) => {\n const currentIsSilent = peerType === 'contact'\n ? !hasPrivateChatsNotifications\n : !(peerType === 'group' ? hasGroupNotifications : hasBroadcastNotifications);\n const currentShouldShowPreviews = peerType === 'contact'\n ? hasPrivateChatsMessagePreview\n : (peerType === 'group' ? hasGroupMessagePreview : hasBroadcastMessagePreview);\n\n updateNotificationSettings({\n peerType,\n ...(setting === 'silent' && { isSilent: !e.target.checked, shouldShowPreviews: currentShouldShowPreviews }),\n ...(setting === 'showPreviews' && { shouldShowPreviews: e.target.checked, isSilent: currentIsSilent }),\n });\n }, [\n hasBroadcastMessagePreview, hasBroadcastNotifications,\n hasGroupMessagePreview, hasGroupNotifications,\n hasPrivateChatsMessagePreview, hasPrivateChatsNotifications,\n updateNotificationSettings,\n ]);\n\n const handleContactNotificationChange = useCallback((e: ChangeEvent) => {\n updateContactSignUpNotification({\n isSilent: !e.target.checked,\n });\n }, [updateContactSignUpNotification]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Notifications);\n\n return (\n
\n
\n

\n {lang('AutodownloadPrivateChats')}\n

\n\n { handleSettingsChange(e, 'contact', 'silent'); }}\n />\n { handleSettingsChange(e, 'contact', 'showPreviews'); }}\n />\n
\n\n
\n

{lang('FilterGroups')}

\n\n { handleSettingsChange(e, 'group', 'silent'); }}\n />\n { handleSettingsChange(e, 'group', 'showPreviews'); }}\n />\n
\n\n
\n

{lang('FilterChannels')}

\n\n { handleSettingsChange(e, 'broadcast', 'silent'); }}\n />\n { handleSettingsChange(e, 'broadcast', 'showPreviews'); }}\n />\n
\n\n
\n

{lang('PhoneOther')}

\n\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global): StateProps => {\n return {\n hasPrivateChatsNotifications: Boolean(global.settings.byKey.hasPrivateChatsNotifications),\n hasPrivateChatsMessagePreview: Boolean(global.settings.byKey.hasPrivateChatsMessagePreview),\n hasGroupNotifications: Boolean(global.settings.byKey.hasGroupNotifications),\n hasGroupMessagePreview: Boolean(global.settings.byKey.hasGroupMessagePreview),\n hasBroadcastNotifications: Boolean(global.settings.byKey.hasBroadcastNotifications),\n hasBroadcastMessagePreview: Boolean(global.settings.byKey.hasBroadcastMessagePreview),\n hasContactJoinedNotifications: Boolean(global.settings.byKey.hasContactJoinedNotifications),\n };\n},\n(setGlobal, actions): DispatchProps => pick(actions, [\n 'loadNotificationSettings',\n 'updateContactSignUpNotification',\n 'updateNotificationSettings',\n]))(SettingsNotifications));\n","import React, { FC, memo, useEffect } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { PrivacyVisibility, SettingsScreens } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n hasPassword?: boolean;\n blockedCount: number;\n sessionsCount: number;\n isSensitiveEnabled?: boolean;\n canChangeSensitive?: boolean;\n visibilityPrivacyPhoneNumber?: PrivacyVisibility;\n visibilityPrivacyLastSeen?: PrivacyVisibility;\n visibilityPrivacyProfilePhoto?: PrivacyVisibility;\n visibilityPrivacyForwarding?: PrivacyVisibility;\n visibilityPrivacyGroupChats?: PrivacyVisibility;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacy: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n hasPassword,\n blockedCount,\n sessionsCount,\n isSensitiveEnabled,\n canChangeSensitive,\n visibilityPrivacyPhoneNumber,\n visibilityPrivacyLastSeen,\n visibilityPrivacyProfilePhoto,\n visibilityPrivacyForwarding,\n visibilityPrivacyGroupChats,\n loadPrivacySettings,\n loadBlockedContacts,\n loadAuthorizations,\n loadContentSettings,\n updateContentSettings,\n}) => {\n useEffect(() => {\n loadBlockedContacts();\n loadAuthorizations();\n loadPrivacySettings();\n loadContentSettings();\n }, [loadBlockedContacts, loadAuthorizations, loadPrivacySettings, loadContentSettings]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Privacy);\n\n function getVisibilityValue(visibility?: PrivacyVisibility) {\n switch (visibility) {\n case 'everybody':\n return lang('P2PEverybody');\n\n case 'contacts':\n return lang('P2PContacts');\n\n case 'nobody':\n return lang('P2PNobody');\n }\n\n return undefined;\n }\n\n return (\n
\n
\n onScreenSelect(SettingsScreens.PrivacyBlockedUsers)}\n >\n
\n {lang('BlockedUsers')}\n {blockedCount > 0 && (\n \n {lang('Users', blockedCount)}\n \n )}\n
\n \n onScreenSelect(\n hasPassword ? SettingsScreens.TwoFaEnabled : SettingsScreens.TwoFaDisabled,\n )}\n >\n
\n {lang('TwoStepVerification')}\n \n {lang(hasPassword ? 'PasswordOn' : 'PasswordOff')}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyActiveSessions)}\n >\n
\n {lang('SessionsTitle')}\n {sessionsCount > 0 && (\n \n {sessionsCount === 1 ? '1 session' : `${sessionsCount} sessions`}\n \n )}\n
\n \n
\n\n
\n

{lang('PrivacyTitle')}

\n\n onScreenSelect(SettingsScreens.PrivacyPhoneNumber)}\n >\n
\n {lang('PrivacyPhoneTitle')}\n \n {getVisibilityValue(visibilityPrivacyPhoneNumber)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyLastSeen)}\n >\n
\n {lang('LastSeenTitle')}\n \n {getVisibilityValue(visibilityPrivacyLastSeen)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyProfilePhoto)}\n >\n
\n {lang('PrivacyProfilePhotoTitle')}\n \n {getVisibilityValue(visibilityPrivacyProfilePhoto)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyForwarding)}\n >\n
\n {lang('PrivacyForwardsTitle')}\n \n {getVisibilityValue(visibilityPrivacyForwarding)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyGroupChats)}\n >\n
\n {lang('WhoCanAddMe')}\n \n {getVisibilityValue(visibilityPrivacyGroupChats)}\n \n
\n \n
\n\n {canChangeSensitive && (\n
\n

\n {lang('lng_settings_sensitive_title')}\n

\n \n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n settings: {\n byKey: { hasPassword, isSensitiveEnabled, canChangeSensitive },\n privacy,\n },\n blocked,\n activeSessions,\n } = global;\n\n return {\n hasPassword,\n blockedCount: blocked.totalCount,\n sessionsCount: activeSessions.length,\n isSensitiveEnabled,\n canChangeSensitive,\n visibilityPrivacyPhoneNumber: privacy.phoneNumber && privacy.phoneNumber.visibility,\n visibilityPrivacyLastSeen: privacy.lastSeen && privacy.lastSeen.visibility,\n visibilityPrivacyProfilePhoto: privacy.profilePhoto && privacy.profilePhoto.visibility,\n visibilityPrivacyForwarding: privacy.forwards && privacy.forwards.visibility,\n visibilityPrivacyGroupChats: privacy.chatInvite && privacy.chatInvite.visibility,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadBlockedContacts', 'loadAuthorizations', 'loadPrivacySettings', 'loadContentSettings', 'updateContentSettings',\n ]),\n)(SettingsPrivacy));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ISettings, SettingsScreens } from '../../../types';\nimport { ApiLanguage } from '../../../api/types';\n\nimport { setLanguage } from '../../../util/langProvider';\nimport { pick } from '../../../util/iteratees';\n\nimport RadioGroup from '../../ui/RadioGroup';\nimport Loading from '../../ui/Loading';\nimport useFlag from '../../../hooks/useFlag';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = Pick;\n\ntype DispatchProps = Pick;\n\nconst SettingsLanguage: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n languages,\n language,\n loadLanguages,\n setSettingOption,\n}) => {\n const [selectedLanguage, setSelectedLanguage] = useState(language);\n const [isLoading, markIsLoading, unmarkIsLoading] = useFlag();\n\n // TODO Throttle\n useEffect(() => {\n loadLanguages();\n }, [loadLanguages]);\n\n const handleChange = useCallback((langCode: string) => {\n setSelectedLanguage(langCode);\n markIsLoading();\n\n setLanguage(langCode, () => {\n unmarkIsLoading();\n\n setSettingOption({ language: langCode });\n });\n }, [markIsLoading, unmarkIsLoading, setSettingOption]);\n\n const options = useMemo(() => {\n return languages ? buildOptions(languages) : undefined;\n }, [languages]);\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Language);\n\n return (\n
\n {options ? (\n \n ) : (\n \n )}\n
\n );\n};\n\nfunction buildOptions(languages: ApiLanguage[]) {\n const currentLangCode = (window.navigator.language || 'en').toLowerCase();\n const shortLangCode = currentLangCode.substr(0, 2);\n\n return languages.map(({ langCode, nativeName, name }) => ({\n value: langCode,\n label: nativeName,\n subLabel: name,\n })).sort((a) => {\n return currentLangCode && (a.value === currentLangCode || a.value === shortLangCode) ? -1 : 0;\n });\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n languages: global.settings.byKey.languages,\n language: global.settings.byKey.language,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadLanguages', 'setSettingOption',\n ]),\n)(SettingsLanguage));\n","import { ApiPrivacyKey, SettingsScreens } from '../../../../types';\n\nexport function getPrivacyKey(screen: SettingsScreens): ApiPrivacyKey | undefined {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n return 'phoneNumber';\n case SettingsScreens.PrivacyLastSeen:\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n return 'lastSeen';\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n return 'profilePhoto';\n case SettingsScreens.PrivacyForwarding:\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n return 'forwards';\n case SettingsScreens.PrivacyGroupChats:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n return 'chatInvite';\n }\n\n return undefined;\n}\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\nimport { ApiPrivacySettings, SettingsScreens } from '../../../types';\n\nimport useLang from '../../../hooks/useLang';\nimport { pick } from '../../../util/iteratees';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport RadioGroup from '../../ui/RadioGroup';\nimport { getPrivacyKey } from './helper/privacy';\n\ntype OwnProps = {\n screen: SettingsScreens;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = Partial & {\n chatsById?: Record;\n usersById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyVisibility: FC = ({\n screen,\n isActive,\n onScreenSelect,\n onReset,\n visibility,\n allowUserIds,\n allowChatIds,\n blockUserIds,\n blockChatIds,\n chatsById,\n setPrivacyVisibility,\n}) => {\n const lang = useLang();\n\n const visibilityOptions = useMemo(() => {\n switch (screen) {\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyGroupChats:\n return [\n { value: 'everybody', label: lang('P2PEverybody') },\n { value: 'contacts', label: lang('P2PContacts') },\n ];\n\n default:\n return [\n { value: 'everybody', label: lang('P2PEverybody') },\n { value: 'contacts', label: lang('P2PContacts') },\n { value: 'nobody', label: lang('P2PNobody') },\n ];\n }\n }, [lang, screen]);\n\n const exceptionLists = {\n shouldShowDenied: visibility !== 'nobody',\n shouldShowAllowed: visibility !== 'everybody',\n };\n\n const privacyKey = getPrivacyKey(screen);\n\n const headerText = useMemo(() => {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n return lang('PrivacyPhoneTitle');\n case SettingsScreens.PrivacyLastSeen:\n return lang('LastSeenTitle');\n case SettingsScreens.PrivacyProfilePhoto:\n return lang('PrivacyProfilePhotoTitle');\n case SettingsScreens.PrivacyForwarding:\n return lang('PrivacyForwardsTitle');\n case SettingsScreens.PrivacyGroupChats:\n return lang('WhoCanAddMe');\n default:\n return undefined;\n }\n }, [lang, screen]);\n\n useHistoryBack(isActive, onReset, onScreenSelect, screen);\n\n const descriptionText = useMemo(() => {\n switch (screen) {\n case SettingsScreens.PrivacyLastSeen:\n return lang('CustomHelp');\n default:\n return undefined;\n }\n }, [lang, screen]);\n\n const allowedContactsScreen = (() => {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n return SettingsScreens.PrivacyPhoneNumberAllowedContacts;\n case SettingsScreens.PrivacyLastSeen:\n return SettingsScreens.PrivacyLastSeenAllowedContacts;\n case SettingsScreens.PrivacyProfilePhoto:\n return SettingsScreens.PrivacyProfilePhotoAllowedContacts;\n case SettingsScreens.PrivacyForwarding:\n return SettingsScreens.PrivacyForwardingAllowedContacts;\n default:\n return SettingsScreens.PrivacyGroupChatsAllowedContacts;\n }\n })();\n\n const deniedContactsScreen = (() => {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n return SettingsScreens.PrivacyPhoneNumberDeniedContacts;\n case SettingsScreens.PrivacyLastSeen:\n return SettingsScreens.PrivacyLastSeenDeniedContacts;\n case SettingsScreens.PrivacyProfilePhoto:\n return SettingsScreens.PrivacyProfilePhotoDeniedContacts;\n case SettingsScreens.PrivacyForwarding:\n return SettingsScreens.PrivacyForwardingDeniedContacts;\n default:\n return SettingsScreens.PrivacyGroupChatsDeniedContacts;\n }\n })();\n\n const allowedCount = useMemo(() => {\n if (!allowUserIds || !allowChatIds || !chatsById) {\n return 0;\n }\n\n return allowChatIds.reduce((result, chatId) => {\n return result + (chatsById[chatId] ? chatsById[chatId].membersCount! : 0);\n }, allowUserIds.length);\n }, [allowChatIds, allowUserIds, chatsById]);\n\n const blockCount = useMemo(() => {\n if (!blockUserIds || !blockChatIds || !chatsById) {\n return 0;\n }\n\n return blockChatIds.reduce((result, chatId) => {\n return result + (chatsById[chatId] ? chatsById[chatId].membersCount! : 0);\n }, blockUserIds.length);\n }, [blockChatIds, blockUserIds, chatsById]);\n\n const handleVisibilityChange = useCallback((value) => {\n setPrivacyVisibility({\n privacyKey,\n visibility: value,\n });\n }, [privacyKey, setPrivacyVisibility]);\n\n return (\n
\n
\n

{headerText}

\n\n \n\n {descriptionText && (\n

{descriptionText}

\n )}\n
\n\n
\n

{lang('PrivacyExceptions')}

\n\n {exceptionLists.shouldShowAllowed && (\n { onScreenSelect(allowedContactsScreen); }}\n >\n
\n {allowedCount > 0 && +{allowedCount}}\n {lang('AlwaysShareWith')}\n {lang('EditAdminAddUsers')}\n
\n \n )}\n {exceptionLists.shouldShowDenied && (\n { onScreenSelect(deniedContactsScreen); }}\n >\n
\n {blockCount > 0 && −{blockCount}}\n {lang('NeverShareWith')}\n {lang('EditAdminAddUsers')}\n
\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { screen }): StateProps => {\n let privacySettings: ApiPrivacySettings | undefined;\n\n const {\n chats: { byId: chatsById },\n settings: { privacy },\n } = global;\n\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n privacySettings = privacy.phoneNumber;\n break;\n\n case SettingsScreens.PrivacyLastSeen:\n privacySettings = privacy.lastSeen;\n break;\n\n case SettingsScreens.PrivacyProfilePhoto:\n privacySettings = privacy.profilePhoto;\n break;\n\n case SettingsScreens.PrivacyForwarding:\n privacySettings = privacy.forwards;\n break;\n\n case SettingsScreens.PrivacyGroupChats:\n privacySettings = privacy.chatInvite;\n break;\n }\n\n if (!privacySettings) {\n return {};\n }\n\n return {\n ...privacySettings,\n chatsById,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setPrivacyVisibility']),\n)(SettingsPrivacyVisibility));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiSession } from '../../../api/types';\nimport { SettingsScreens } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { formatPastTimeShort } from '../../../util/dateFormat';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n activeSessions: ApiSession[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyActiveSessions: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n activeSessions,\n loadAuthorizations,\n terminateAuthorization,\n terminateAllAuthorizations,\n}) => {\n const [isConfirmTerminateAllDialogOpen, openConfirmTerminateAllDialog, closeConfirmTerminateAllDialog] = useFlag();\n useEffect(() => {\n loadAuthorizations();\n }, [loadAuthorizations]);\n\n const handleTerminateSessionClick = useCallback((hash: string) => {\n terminateAuthorization({ hash });\n }, [terminateAuthorization]);\n\n const handleTerminateAllSessions = useCallback(() => {\n closeConfirmTerminateAllDialog();\n terminateAllAuthorizations();\n }, [closeConfirmTerminateAllDialog, terminateAllAuthorizations]);\n\n const currentSession = useMemo(() => {\n return activeSessions.find((session) => session.isCurrent);\n }, [activeSessions]);\n\n const otherSessions = useMemo(() => {\n return activeSessions.filter((session) => !session.isCurrent);\n }, [activeSessions]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.PrivacyActiveSessions);\n\n function renderCurrentSession(session: ApiSession) {\n return (\n
\n

\n {lang('AuthSessions.CurrentSession')}\n

\n\n \n
\n {session.appName}\n {getDeviceEnvironment(session)}\n {session.ip} - {getLocation(session)}\n
\n
\n\n \n {lang('TerminateAllSessions')}\n \n
\n );\n }\n\n function renderOtherSessions(sessions: ApiSession[]) {\n return (\n
\n

Other Sessions

\n\n {sessions.map(renderSession)}\n
\n );\n }\n\n function renderSession(session: ApiSession) {\n return (\n {\n handleTerminateSessionClick(session.hash);\n },\n }]}\n >\n
\n {formatPastTimeShort(lang, session.dateActive * 1000)}\n {session.appName}\n {getDeviceEnvironment(session)}\n {session.ip} - {getLocation(session)}\n
\n \n );\n }\n\n return (\n
\n {currentSession && renderCurrentSession(currentSession)}\n {otherSessions && renderOtherSessions(otherSessions)}\n {otherSessions && (\n \n )}\n
\n );\n};\n\nfunction getLocation(session: ApiSession) {\n return [session.region, session.country].filter(Boolean).join(', ');\n}\n\nfunction getDeviceEnvironment(session: ApiSession) {\n return `${session.deviceModel}${session.deviceModel ? ', ' : ''} ${session.platform} ${session.systemVersion}`;\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n activeSessions: global.activeSessions,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadAuthorizations', 'terminateAuthorization', 'terminateAllAuthorizations',\n ]),\n)(SettingsPrivacyActiveSessions));\n","import React, {\n FC, memo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\nimport { SettingsScreens } from '../../../types';\n\nimport { CHAT_HEIGHT_PX } from '../../../config';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\nimport { pick } from '../../../util/iteratees';\nimport {\n getChatTitle, getUserFullName, isChatPrivate,\n} from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\nimport buildClassName from '../../../util/buildClassName';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Avatar from '../../common/Avatar';\nimport Loading from '../../ui/Loading';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n chatsByIds: Record;\n usersByIds: Record;\n blockedIds: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyBlockedUsers: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n chatsByIds,\n usersByIds,\n blockedIds,\n unblockContact,\n}) => {\n const handleUnblockClick = useCallback((contactId: number) => {\n unblockContact({ contactId });\n }, [unblockContact]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.PrivacyBlockedUsers);\n\n function renderContact(contactId: number, i: number, viewportOffset: number) {\n const isPrivate = isChatPrivate(contactId);\n const user = isPrivate ? usersByIds[contactId] : undefined;\n const chat = !isPrivate ? chatsByIds[contactId] : undefined;\n\n const className = buildClassName(\n 'Chat chat-item-clickable blocked-list-item',\n isPrivate ? 'private' : 'group',\n );\n\n return (\n {\n handleUnblockClick(contactId);\n },\n }]}\n style={`top: ${(viewportOffset + i) * CHAT_HEIGHT_PX}px;`}\n >\n \n
\n

{renderText((isPrivate ? getUserFullName(user) : getChatTitle(lang, chat!)) || '')}

\n {user && user.phoneNumber && (\n
{formatPhoneNumberWithCode(user.phoneNumber)}
\n )}\n {user && !user.phoneNumber && user.username && (\n
@{user.username}
\n )}\n
\n \n );\n }\n\n return (\n
\n
\n
\n

\n {lang('BlockedUsersInfo')}\n

\n
\n\n
\n {blockedIds && blockedIds.length ? (\n
\n {blockedIds!.map((contactId, i) => renderContact(contactId, i, 0))}\n
\n ) : blockedIds && !blockedIds.length ? (\n
\n List is empty\n
\n ) : (\n \n )}\n
\n
\n\n {\n }}\n className=\"not-implemented\"\n ariaLabel=\"Add a blocked user\"\n >\n \n \n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: {\n byId: chatsByIds,\n },\n users: {\n byId: usersByIds,\n },\n blocked: {\n ids,\n },\n } = global;\n\n return {\n chatsByIds,\n usersByIds,\n blockedIds: ids,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['unblockContact']),\n)(SettingsPrivacyBlockedUsers));\n","import React, { FC, memo } from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport ListItem from '../../../ui/ListItem';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport renderText from '../../../common/helpers/renderText';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaEnabled: FC = ({\n isActive, onReset, animatedEmoji, onScreenSelect,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.TwoFaEnabled);\n\n return (\n
\n
\n \n\n

\n {renderText(lang('EnabledPasswordText'), ['br'])}\n

\n
\n\n
\n onScreenSelect(SettingsScreens.TwoFaChangePasswordCurrent)}\n >\n {lang('ChangePassword')}\n \n onScreenSelect(SettingsScreens.TwoFaTurnOff)}\n >\n {lang('TurnPasswordOff')}\n \n onScreenSelect(SettingsScreens.TwoFaRecoveryEmailCurrentPassword)}\n >\n {lang('SetRecoveryEmail')}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '🔐'),\n };\n})(SettingsTwoFaEnabled));\n","import React, {\n FC, memo, useCallback, useState,\n} from '../../../../lib/teact/teact';\n\nimport { SettingsScreens } from '../../../../types';\n\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport PasswordMonkey from '../../../common/PasswordMonkey';\nimport PasswordForm from '../../../common/PasswordForm';\n\ntype OwnProps = {\n screen: SettingsScreens;\n error?: string;\n isLoading?: boolean;\n expectedPassword?: string;\n placeholder?: string;\n hint?: string;\n submitLabel?: string;\n clearError?: NoneToVoidFunction;\n onSubmit: (password: string) => void;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\nconst EQUAL_PASSWORD_ERROR = 'Passwords Should Be Equal';\n\nconst SettingsTwoFaPassword: FC = ({\n screen,\n isActive,\n onScreenSelect,\n onReset,\n error,\n isLoading,\n expectedPassword,\n placeholder = 'Current Password',\n hint,\n submitLabel,\n clearError,\n onSubmit,\n}) => {\n const [validationError, setValidationError] = useState('');\n const [shouldShowPassword, setShouldShowPassword] = useState(false);\n\n const handleSubmit = useCallback((newPassword) => {\n if (expectedPassword && newPassword !== expectedPassword) {\n setValidationError(EQUAL_PASSWORD_ERROR);\n } else {\n onSubmit(newPassword);\n }\n }, [onSubmit, expectedPassword]);\n\n const handleClearError = useCallback(() => {\n if (clearError) {\n clearError();\n }\n setValidationError('');\n }, [clearError]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, screen);\n\n return (\n
\n
\n \n
\n\n
\n \n
\n
\n );\n};\n\nexport default memo(SettingsTwoFaPassword);\n","import React, { FC, memo } from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport Button from '../../../ui/Button';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\n\ntype OwnProps = {\n onStart: NoneToVoidFunction;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaStart: FC = ({\n isActive, onScreenSelect, onReset, animatedEmoji, onStart,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.TwoFaDisabled);\n\n return (\n
\n
\n \n\n

\n {lang('SetAdditionalPasswordInfo')}\n

\n
\n\n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '🔐'),\n };\n})(SettingsTwoFaStart));\n","import React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../../util/environment';\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useFlag from '../../../../hooks/useFlag';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport Button from '../../../ui/Button';\nimport Modal from '../../../ui/Modal';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport InputText from '../../../ui/InputText';\nimport renderText from '../../../common/helpers/renderText';\n\ntype OwnProps = {\n icon: 'hint' | 'email';\n type?: 'text' | 'email';\n isLoading?: boolean;\n error?: string;\n placeholder: string;\n shouldConfirm?: boolean;\n clearError?: NoneToVoidFunction;\n onSubmit: (value?: string) => void;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n screen: SettingsScreens;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_SINGLE_COLUMN_LAYOUT ? 550 : 400;\n\nconst SettingsTwoFaSkippableForm: FC = ({\n animatedEmoji,\n type = 'text',\n isLoading,\n error,\n placeholder,\n shouldConfirm,\n clearError,\n onSubmit,\n isActive,\n onScreenSelect,\n onReset,\n screen,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [value, setValue] = useState('');\n const [isConfirmShown, markIsConfirmShown, unmarkIsConfirmShown] = useFlag(false);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n const handleInputChange = (e: React.ChangeEvent) => {\n if (error && clearError) {\n clearError();\n }\n\n setValue(e.target.value);\n };\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!inputRef.current) {\n return;\n }\n\n onSubmit(value);\n };\n\n const handleSkip = () => {\n onSubmit();\n };\n\n const handleSkipConfirm = () => {\n unmarkIsConfirmShown();\n onSubmit();\n };\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, screen);\n\n return (\n
\n
\n \n
\n\n
\n
\n \n\n {value ? (\n \n ) : (\n \n {lang('YourEmailSkip')}\n \n )}\n \n {shouldConfirm && (\n \n {renderText(lang('YourEmailSkipWarningText'), ['br', 'simple_markdown'])}\n
\n \n {lang('YourEmailSkip')}\n \n \n {lang('Cancel')}\n \n
\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal((global, { icon }) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, icon === 'email' ? '💌' : '💡'),\n };\n})(SettingsTwoFaSkippableForm));\n","import React, { FC, memo } from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport Button from '../../../ui/Button';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaCongratulations: FC = ({\n isActive, onReset, animatedEmoji, onScreenSelect,\n}) => {\n const lang = useLang();\n\n const handleClick = () => {\n onScreenSelect(SettingsScreens.Privacy);\n };\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.TwoFaCongratulations);\n\n return (\n
\n
\n \n\n

\n {lang('TwoStepVerificationPasswordSetInfo')}\n

\n
\n\n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '🥳'),\n };\n})(SettingsTwoFaCongratulations));\n","import React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../../util/environment';\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport InputText from '../../../ui/InputText';\nimport Loading from '../../../ui/Loading';\n\ntype OwnProps = {\n isLoading?: boolean;\n error?: string;\n clearError: NoneToVoidFunction;\n onSubmit: (hint: string) => void;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n screen: SettingsScreens;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n codeLength: number;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_SINGLE_COLUMN_LAYOUT ? 550 : 400;\n\nconst SettingsTwoFaEmailCode: FC = ({\n animatedEmoji,\n codeLength,\n isLoading,\n error,\n clearError,\n onSubmit,\n isActive,\n onScreenSelect,\n onReset,\n screen,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [value, setValue] = useState('');\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, screen);\n\n const handleInputChange = (e: React.ChangeEvent) => {\n if (error && clearError) {\n clearError();\n }\n\n const newValue = e.target.value.slice(0, codeLength);\n\n if (newValue.length === codeLength) {\n onSubmit(newValue);\n }\n\n setValue(newValue);\n e.target.value = newValue;\n };\n\n return (\n
\n
\n \n
\n\n
\n \n {isLoading && }\n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '💌'),\n codeLength: global.twoFaSettings.waitingEmailCodeLength,\n };\n})(SettingsTwoFaEmailCode));\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../../../global/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { pick } from '../../../../util/iteratees';\nimport { TwoFaDispatch, TwoFaState } from '../../../../hooks/reducers/useTwoFaReducer';\nimport useLang from '../../../../hooks/useLang';\n\nimport SettingsTwoFaEnabled from './SettingsTwoFaEnabled';\nimport SettingsTwoFaPassword from './SettingsTwoFaPassword';\nimport SettingsTwoFaStart from './SettingsTwoFaStart';\nimport SettingsTwoFaSkippableForm from './SettingsTwoFaSkippableForm';\nimport SettingsTwoFaCongratulations from './SettingsTwoFaCongratulations';\nimport SettingsTwoFaEmailCode from './SettingsTwoFaEmailCode';\n\nexport type OwnProps = {\n state: TwoFaState;\n currentScreen: SettingsScreens;\n shownScreen: SettingsScreens;\n dispatch: TwoFaDispatch;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = GlobalState['twoFaSettings'];\n\ntype DispatchProps = Pick;\n\nconst SettingsTwoFa: FC = ({\n currentScreen,\n shownScreen,\n state,\n hint,\n isLoading,\n error,\n waitingEmailCodeLength,\n dispatch,\n isActive,\n onScreenSelect,\n onReset,\n updatePassword,\n checkPassword,\n clearTwoFaError,\n updateRecoveryEmail,\n provideTwoFaEmailCode,\n clearPassword,\n}) => {\n useEffect(() => {\n if (waitingEmailCodeLength) {\n if (currentScreen === SettingsScreens.TwoFaNewPasswordEmail) {\n onScreenSelect(SettingsScreens.TwoFaNewPasswordEmailCode);\n } else if (currentScreen === SettingsScreens.TwoFaRecoveryEmail) {\n onScreenSelect(SettingsScreens.TwoFaRecoveryEmailCode);\n }\n }\n }, [currentScreen, onScreenSelect, waitingEmailCodeLength]);\n\n const handleStartWizard = useCallback(() => {\n dispatch({ type: 'reset' });\n onScreenSelect(SettingsScreens.TwoFaNewPassword);\n }, [dispatch, onScreenSelect]);\n\n const handleNewPassword = useCallback((value: string) => {\n dispatch({ type: 'setPassword', payload: value });\n onScreenSelect(SettingsScreens.TwoFaNewPasswordConfirm);\n }, [dispatch, onScreenSelect]);\n\n const handleNewPasswordConfirm = useCallback(() => {\n onScreenSelect(SettingsScreens.TwoFaNewPasswordHint);\n }, [onScreenSelect]);\n\n const handleNewPasswordHint = useCallback((value?: string) => {\n dispatch({ type: 'setHint', payload: value });\n onScreenSelect(SettingsScreens.TwoFaNewPasswordEmail);\n }, [dispatch, onScreenSelect]);\n\n const handleNewPasswordEmail = useCallback((value?: string) => {\n dispatch({ type: 'setEmail', payload: value });\n updatePassword({\n ...state,\n email: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaCongratulations);\n },\n });\n }, [dispatch, onScreenSelect, state, updatePassword]);\n\n const handleChangePasswordCurrent = useCallback((value: string) => {\n dispatch({ type: 'setCurrentPassword', payload: value });\n checkPassword({\n currentPassword: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaChangePasswordNew);\n },\n });\n }, [checkPassword, dispatch, onScreenSelect]);\n\n const handleChangePasswordNew = useCallback((value: string) => {\n dispatch({ type: 'setPassword', payload: value });\n onScreenSelect(SettingsScreens.TwoFaChangePasswordConfirm);\n }, [dispatch, onScreenSelect]);\n\n const handleChangePasswordConfirm = useCallback(() => {\n onScreenSelect(SettingsScreens.TwoFaChangePasswordHint);\n }, [onScreenSelect]);\n\n const handleChangePasswordHint = useCallback((value?: string) => {\n dispatch({ type: 'setHint', payload: value });\n updatePassword({\n ...state,\n hint: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaCongratulations);\n },\n });\n }, [dispatch, onScreenSelect, state, updatePassword]);\n\n const handleTurnOff = useCallback((value: string) => {\n clearPassword({\n currentPassword: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.Privacy);\n },\n });\n }, [clearPassword, onScreenSelect]);\n\n const handleRecoveryEmailCurrentPassword = useCallback((value: string) => {\n dispatch({ type: 'setCurrentPassword', payload: value });\n checkPassword({\n currentPassword: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaRecoveryEmail);\n },\n });\n }, [checkPassword, dispatch, onScreenSelect]);\n\n const handleRecoveryEmail = useCallback((value?: string) => {\n dispatch({ type: 'setEmail', payload: value });\n updateRecoveryEmail({\n ...state,\n email: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaCongratulations);\n },\n });\n }, [dispatch, onScreenSelect, state, updateRecoveryEmail]);\n\n const handleEmailCode = useCallback((code: string) => {\n provideTwoFaEmailCode({ code });\n }, [provideTwoFaEmailCode]);\n\n const lang = useLang();\n\n switch (currentScreen) {\n case SettingsScreens.TwoFaDisabled:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPassword:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordConfirm:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordHint:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordEmail:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n return (\n \n );\n\n case SettingsScreens.TwoFaCongratulations:\n return (\n \n );\n\n case SettingsScreens.TwoFaEnabled:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordCurrent:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordNew:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordConfirm:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordHint:\n return (\n \n );\n\n case SettingsScreens.TwoFaTurnOff:\n return (\n \n );\n\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n return (\n \n );\n\n case SettingsScreens.TwoFaRecoveryEmail:\n return (\n \n );\n\n case SettingsScreens.TwoFaRecoveryEmailCode:\n return (\n \n );\n\n default:\n return undefined;\n }\n};\n\nexport default memo(withGlobal(\n (global): StateProps => ({ ...global.twoFaSettings }),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'updatePassword', 'updateRecoveryEmail', 'clearPassword', 'provideTwoFaEmailCode',\n 'checkPassword', 'clearTwoFaError',\n ]),\n)(SettingsTwoFa));\n","import React, {\n FC, useCallback, useRef, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport { isChatPrivate } from '../../modules/helpers';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport Checkbox from '../ui/Checkbox';\nimport InputText from '../ui/InputText';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from './PrivateChatInfo';\nimport GroupChatInfo from './GroupChatInfo';\nimport PickerSelectedItem from './PickerSelectedItem';\nimport useInfiniteScroll from '../../hooks/useInfiniteScroll';\nimport useLang from '../../hooks/useLang';\n\nimport Loading from '../ui/Loading';\n\nimport './Picker.scss';\n\ntype OwnProps = {\n itemIds: number[];\n selectedIds: number[];\n filterValue?: string;\n filterPlaceholder?: string;\n notFoundText?: string;\n searchInputId?: string;\n isLoading?: boolean;\n onSelectedIdsChange: (ids: number[]) => void;\n onFilterChange: (value: string) => void;\n onLoadMore?: () => void;\n};\n\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 500;\n\nconst MAX_FULL_ITEMS = 10;\nconst ALWAYS_FULL_ITEMS_COUNT = 5;\n\nconst Picker: FC = ({\n itemIds,\n selectedIds,\n filterValue,\n filterPlaceholder,\n notFoundText,\n searchInputId,\n isLoading,\n onSelectedIdsChange,\n onFilterChange,\n onLoadMore,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const shouldMinimize = selectedIds.length > MAX_FULL_ITEMS;\n\n useEffect(() => {\n setTimeout(() => {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n });\n }, FOCUS_DELAY_MS);\n }, []);\n\n const handleItemClick = useCallback((id: number) => {\n const newSelectedIds = [...selectedIds];\n if (newSelectedIds.includes(id)) {\n newSelectedIds.splice(newSelectedIds.indexOf(id), 1);\n } else {\n newSelectedIds.push(id);\n }\n onSelectedIdsChange(newSelectedIds);\n onFilterChange('');\n }, [selectedIds, onSelectedIdsChange, onFilterChange]);\n\n const handleFilterChange = useCallback((e: React.ChangeEvent) => {\n const { value } = e.currentTarget;\n onFilterChange(value);\n }, [onFilterChange]);\n\n const [viewportIds, getMore] = useInfiniteScroll(onLoadMore, itemIds, Boolean(filterValue));\n\n const lang = useLang();\n\n return (\n
\n
\n {selectedIds.map((id, i) => (\n \n ))}\n \n
\n\n {viewportIds && viewportIds.length ? (\n \n {viewportIds.map((id) => (\n handleItemClick(id)}\n ripple\n >\n \n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n ))}\n \n ) : !isLoading && viewportIds && !viewportIds.length ? (\n

{notFoundText || 'Sorry, nothing found.'}

\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(Picker);\n","import React, {\n FC, memo, useCallback, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\nimport { ApiPrivacySettings, SettingsScreens } from '../../../types';\n\nimport useLang from '../../../hooks/useLang';\nimport { pick } from '../../../util/iteratees';\nimport searchWords from '../../../util/searchWords';\nimport { getPrivacyKey } from './helper/privacy';\nimport {\n getChatTitle, isChatGroup, isChatPrivate, prepareChatList,\n} from '../../../modules/helpers';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport Picker from '../../common/Picker';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\n\nexport type OwnProps = {\n isAllowList?: boolean;\n screen: SettingsScreens;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n chatsById: Record;\n listIds?: number[];\n orderedPinnedIds?: number[];\n archivedListIds?: number[];\n archivedPinnedIds?: number[];\n settings?: ApiPrivacySettings;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyVisibilityExceptionList: FC = ({\n currentUserId,\n isAllowList,\n screen,\n settings,\n chatsById,\n listIds,\n orderedPinnedIds,\n archivedListIds,\n archivedPinnedIds,\n setPrivacySettings,\n isActive,\n onScreenSelect,\n onReset,\n}) => {\n const lang = useLang();\n\n const selectedContactIds = useMemo(() => {\n if (!settings) {\n return [];\n }\n\n if (isAllowList) {\n return [...settings.allowUserIds, ...settings.allowChatIds];\n } else {\n return [...settings.blockUserIds, ...settings.blockChatIds];\n }\n }, [isAllowList, settings]);\n const [searchQuery, setSearchQuery] = useState('');\n const [isSubmitShown, setIsSubmitShown] = useState(false);\n const [newSelectedContactIds, setNewSelectedContactIds] = useState(selectedContactIds);\n\n const chats = useMemo(() => {\n const activeChatArrays = listIds\n ? prepareChatList(chatsById, listIds, orderedPinnedIds, 'all')\n : undefined;\n const archivedChatArrays = archivedListIds\n ? prepareChatList(chatsById, archivedListIds, archivedPinnedIds, 'archived')\n : undefined;\n\n if (!activeChatArrays && !archivedChatArrays) {\n return undefined;\n }\n\n return [\n ...(activeChatArrays\n ? [\n ...activeChatArrays.pinnedChats,\n ...activeChatArrays.otherChats,\n ]\n : []\n ),\n ...(archivedChatArrays ? archivedChatArrays.otherChats : []),\n ];\n }, [chatsById, listIds, orderedPinnedIds, archivedListIds, archivedPinnedIds]);\n\n const displayedIds = useMemo(() => {\n if (!chats) {\n return undefined;\n }\n\n return chats\n .filter((chat) => (\n ((isChatPrivate(chat.id) && chat.id !== currentUserId) || isChatGroup(chat))\n && (\n !searchQuery\n || searchWords(getChatTitle(lang, chat), searchQuery)\n || selectedContactIds.includes(chat.id)\n )\n ))\n .map(({ id }) => id);\n }, [chats, currentUserId, lang, searchQuery, selectedContactIds]);\n\n const handleSelectedContactIdsChange = useCallback((value: number[]) => {\n setNewSelectedContactIds(value);\n setIsSubmitShown(true);\n }, []);\n\n const handleSubmit = useCallback(() => {\n setPrivacySettings({\n privacyKey: getPrivacyKey(screen),\n isAllowList: Boolean(isAllowList),\n contactsIds: newSelectedContactIds,\n });\n\n onScreenSelect(SettingsScreens.Privacy);\n }, [isAllowList, newSelectedContactIds, onScreenSelect, screen, setPrivacySettings]);\n\n useHistoryBack(isActive, onReset, onScreenSelect, screen);\n\n\n return (\n
\n \n\n \n \n \n
\n );\n};\n\nfunction getCurrentPrivacySettings(global: GlobalState, screen: SettingsScreens) {\n const { privacy } = global.settings;\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n return privacy.phoneNumber;\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n return privacy.lastSeen;\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n return privacy.profilePhoto;\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n return privacy.forwards;\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n return privacy.chatInvite;\n }\n\n return undefined;\n}\n\nexport default memo(withGlobal(\n (global, { screen }): StateProps => {\n const {\n chats: {\n byId: chatsById,\n listIds,\n orderedPinnedIds,\n },\n currentUserId,\n } = global;\n\n return {\n currentUserId,\n chatsById,\n listIds: listIds.active,\n orderedPinnedIds: orderedPinnedIds.active,\n archivedPinnedIds: orderedPinnedIds.archived,\n archivedListIds: listIds.archived,\n settings: getCurrentPrivacySettings(global, screen),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setPrivacySettings']),\n)(SettingsPrivacyVisibilityExceptionList));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { SettingsScreens } from '../../../types';\n\nimport { LAYERS_ANIMATION_NAME } from '../../../util/environment';\nimport useFoldersReducer from '../../../hooks/reducers/useFoldersReducer';\nimport useTwoFaReducer from '../../../hooks/reducers/useTwoFaReducer';\n\nimport Transition from '../../ui/Transition';\nimport SettingsHeader from './SettingsHeader';\nimport SettingsMain from './SettingsMain';\nimport SettingsEditProfile from './SettingsEditProfile';\nimport SettingsFolders from './folders/SettingsFolders';\nimport SettingsGeneral from './SettingsGeneral';\nimport SettingsGeneralBackground from './SettingsGeneralBackground';\nimport SettingsGeneralBackgroundColor from './SettingsGeneralBackgroundColor';\nimport SettingsNotifications from './SettingsNotifications';\nimport SettingsPrivacy from './SettingsPrivacy';\nimport SettingsLanguage from './SettingsLanguage';\nimport SettingsPrivacyVisibility from './SettingsPrivacyVisibility';\nimport SettingsPrivacyActiveSessions from './SettingsPrivacyActiveSessions';\nimport SettingsPrivacyBlockedUsers from './SettingsPrivacyBlockedUsers';\nimport SettingsTwoFa from './twoFa/SettingsTwoFa';\nimport SettingsPrivacyVisibilityExceptionList from './SettingsPrivacyVisibilityExceptionList';\n\nimport './Settings.scss';\n\nconst TRANSITION_RENDER_COUNT = Object.keys(SettingsScreens).length / 2;\nconst TRANSITION_DURATION = 200;\n\nconst TWO_FA_SCREENS = [\n SettingsScreens.TwoFaDisabled,\n SettingsScreens.TwoFaNewPassword,\n SettingsScreens.TwoFaNewPasswordConfirm,\n SettingsScreens.TwoFaNewPasswordHint,\n SettingsScreens.TwoFaNewPasswordEmail,\n SettingsScreens.TwoFaNewPasswordEmailCode,\n SettingsScreens.TwoFaCongratulations,\n SettingsScreens.TwoFaEnabled,\n SettingsScreens.TwoFaChangePasswordCurrent,\n SettingsScreens.TwoFaChangePasswordNew,\n SettingsScreens.TwoFaChangePasswordConfirm,\n SettingsScreens.TwoFaChangePasswordHint,\n SettingsScreens.TwoFaTurnOff,\n SettingsScreens.TwoFaRecoveryEmailCurrentPassword,\n SettingsScreens.TwoFaRecoveryEmail,\n SettingsScreens.TwoFaRecoveryEmailCode,\n];\n\nconst FOLDERS_SCREENS = [\n SettingsScreens.Folders,\n SettingsScreens.FoldersCreateFolder,\n SettingsScreens.FoldersEditFolder,\n SettingsScreens.FoldersIncludedChats,\n SettingsScreens.FoldersExcludedChats,\n];\n\nconst PRIVACY_SCREENS = [\n SettingsScreens.PrivacyBlockedUsers,\n SettingsScreens.PrivacyActiveSessions,\n];\n\nconst PRIVACY_PHONE_NUMBER_SCREENS = [\n SettingsScreens.PrivacyPhoneNumberAllowedContacts,\n SettingsScreens.PrivacyPhoneNumberDeniedContacts,\n];\n\nconst PRIVACY_LAST_SEEN_PHONE_SCREENS = [\n SettingsScreens.PrivacyLastSeenAllowedContacts,\n SettingsScreens.PrivacyLastSeenDeniedContacts,\n];\n\nconst PRIVACY_PROFILE_PHOTO_SCREENS = [\n SettingsScreens.PrivacyProfilePhotoAllowedContacts,\n SettingsScreens.PrivacyProfilePhotoDeniedContacts,\n];\n\nconst PRIVACY_FORWARDING_SCREENS = [\n SettingsScreens.PrivacyForwardingAllowedContacts,\n SettingsScreens.PrivacyForwardingDeniedContacts,\n];\n\nconst PRIVACY_GROUP_CHATS_SCREENS = [\n SettingsScreens.PrivacyGroupChatsAllowedContacts,\n SettingsScreens.PrivacyGroupChatsDeniedContacts,\n];\n\nexport type OwnProps = {\n isActive: boolean;\n currentScreen: SettingsScreens;\n onScreenSelect: (screen: SettingsScreens) => void;\n shouldSkipTransition?: boolean;\n onReset: () => void;\n};\n\nconst Settings: FC = ({\n isActive,\n currentScreen,\n onScreenSelect,\n onReset,\n shouldSkipTransition,\n}) => {\n const [foldersState, foldersDispatch] = useFoldersReducer();\n const [twoFaState, twoFaDispatch] = useTwoFaReducer();\n\n const handleReset = useCallback(() => {\n if (\n currentScreen === SettingsScreens.FoldersCreateFolder\n || currentScreen === SettingsScreens.FoldersEditFolder\n ) {\n setTimeout(() => {\n foldersDispatch({ type: 'reset' });\n }, TRANSITION_DURATION);\n }\n\n if (\n currentScreen === SettingsScreens.FoldersIncludedChats\n || currentScreen === SettingsScreens.FoldersExcludedChats\n ) {\n if (foldersState.mode === 'create') {\n onScreenSelect(SettingsScreens.FoldersCreateFolder);\n } else {\n onScreenSelect(SettingsScreens.FoldersEditFolder);\n }\n return;\n }\n\n onReset();\n }, [\n foldersState.mode, foldersDispatch,\n currentScreen, onReset, onScreenSelect,\n ]);\n\n const handleSaveFilter = useCallback(() => {\n foldersDispatch({ type: 'saveFilters' });\n handleReset();\n }, [foldersDispatch, handleReset]);\n\n function renderCurrentSectionContent(isScreenActive: boolean, screen: SettingsScreens) {\n const privacyAllowScreens: Record = {\n [SettingsScreens.PrivacyPhoneNumber]: PRIVACY_PHONE_NUMBER_SCREENS.includes(screen),\n [SettingsScreens.PrivacyLastSeen]: PRIVACY_LAST_SEEN_PHONE_SCREENS.includes(screen),\n [SettingsScreens.PrivacyProfilePhoto]: PRIVACY_PROFILE_PHOTO_SCREENS.includes(screen),\n [SettingsScreens.PrivacyForwarding]: PRIVACY_FORWARDING_SCREENS.includes(screen),\n [SettingsScreens.PrivacyGroupChats]: PRIVACY_GROUP_CHATS_SCREENS.includes(screen),\n };\n\n const isTwoFaScreen = TWO_FA_SCREENS.includes(screen);\n const isFoldersScreen = FOLDERS_SCREENS.includes(screen);\n const isPrivacyScreen = PRIVACY_SCREENS.includes(screen)\n || isTwoFaScreen\n || Object.keys(privacyAllowScreens).includes(screen.toString())\n || Object.values(privacyAllowScreens).find((key) => key === true);\n\n switch (currentScreen) {\n case SettingsScreens.Main:\n return (\n \n );\n case SettingsScreens.EditProfile:\n return (\n \n );\n case SettingsScreens.General:\n return (\n \n );\n case SettingsScreens.Notifications:\n return (\n \n );\n case SettingsScreens.Privacy:\n return (\n \n );\n case SettingsScreens.Language:\n return (\n \n );\n case SettingsScreens.GeneralChatBackground:\n return (\n \n );\n case SettingsScreens.GeneralChatBackgroundColor:\n return (\n \n );\n case SettingsScreens.PrivacyActiveSessions:\n return (\n \n );\n case SettingsScreens.PrivacyBlockedUsers:\n return (\n \n );\n case SettingsScreens.PrivacyPhoneNumber:\n case SettingsScreens.PrivacyLastSeen:\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyForwarding:\n case SettingsScreens.PrivacyGroupChats:\n return (\n \n );\n\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n return (\n \n );\n\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n return (\n \n );\n\n case SettingsScreens.Folders:\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n case SettingsScreens.FoldersIncludedChats:\n case SettingsScreens.FoldersExcludedChats:\n return (\n \n );\n\n case SettingsScreens.TwoFaDisabled:\n case SettingsScreens.TwoFaNewPassword:\n case SettingsScreens.TwoFaNewPasswordConfirm:\n case SettingsScreens.TwoFaNewPasswordHint:\n case SettingsScreens.TwoFaNewPasswordEmail:\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n case SettingsScreens.TwoFaCongratulations:\n case SettingsScreens.TwoFaEnabled:\n case SettingsScreens.TwoFaChangePasswordCurrent:\n case SettingsScreens.TwoFaChangePasswordNew:\n case SettingsScreens.TwoFaChangePasswordConfirm:\n case SettingsScreens.TwoFaChangePasswordHint:\n case SettingsScreens.TwoFaTurnOff:\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n case SettingsScreens.TwoFaRecoveryEmail:\n case SettingsScreens.TwoFaRecoveryEmailCode:\n return (\n \n );\n\n default:\n return undefined;\n }\n }\n\n function renderCurrentSection(isScreenActive: boolean, isFrom: boolean, currentKey: SettingsScreens) {\n return (\n <>\n \n {renderCurrentSectionContent(isScreenActive, currentKey)}\n \n );\n }\n\n return (\n \n {renderCurrentSection}\n \n );\n};\n\nexport default memo(Settings);\n","import React, {\n FC, useEffect, useCallback, useMemo, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiUser } from '../../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { throttle } from '../../../util/schedulers';\nimport searchWords from '../../../util/searchWords';\nimport { pick } from '../../../util/iteratees';\nimport { getUserFullName, sortUserIds } from '../../../modules/helpers';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport ListItem from '../../ui/ListItem';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n filter: string;\n isActive: boolean;\n onReset: () => void;\n};\n\ntype StateProps = {\n usersById: Record;\n contactIds?: number[];\n serverTimeOffset: number;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst ContactList: FC = ({\n isActive, onReset,\n filter, usersById, contactIds, loadContactList, openChat, serverTimeOffset,\n}) => {\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadContactList();\n });\n });\n\n useHistoryBack(isActive, onReset);\n\n const handleClick = useCallback(\n (id: number) => {\n openChat({ id });\n },\n [openChat],\n );\n\n const listIds = useMemo(() => {\n if (!contactIds) {\n return undefined;\n }\n\n const resultIds = filter ? contactIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n const fullName = getUserFullName(user);\n return fullName && searchWords(fullName, filter);\n }) : contactIds;\n\n return sortUserIds(resultIds, usersById, undefined, serverTimeOffset);\n }, [contactIds, filter, usersById, serverTimeOffset]);\n\n const [viewportIds, getMore] = useInfiniteScroll(undefined, listIds, Boolean(filter));\n\n return (\n \n {viewportIds && viewportIds.length ? (\n viewportIds.map((id) => (\n handleClick(id)}\n ripple={!IS_SINGLE_COLUMN_LAYOUT}\n >\n \n \n ))\n ) : viewportIds && !viewportIds.length ? (\n

\n {filter.length ? 'No contacts matched your search.' : 'Contact list is empty.'}\n

\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { userIds: contactIds } = global.contactList || {};\n const { byId: usersById } = global.users;\n\n return {\n usersById,\n contactIds,\n serverTimeOffset: global.serverTimeOffset,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadContactList', 'openChat']),\n)(ContactList));\n","import React, {\n FC, useCallback, useEffect, useMemo, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport { pick, unique } from '../../../util/iteratees';\nimport { throttle } from '../../../util/schedulers';\nimport searchWords from '../../../util/searchWords';\nimport { getUserFullName, sortChatIds } from '../../../modules/helpers';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport Picker from '../../common/Picker';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Button from '../../ui/Button';\n\nexport type OwnProps = {\n isChannel?: boolean;\n isActive: boolean;\n selectedMemberIds: number[];\n onSelectedMemberIdsChange: (ids: number[]) => void;\n onNextStep: () => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n usersById: Record;\n chatsById: Record;\n localContactIds?: number[];\n searchQuery?: string;\n isSearching?: boolean;\n localUserIds?: number[];\n globalUserIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst NewChatStep1: FC = ({\n isChannel,\n isActive,\n selectedMemberIds,\n onSelectedMemberIdsChange,\n onNextStep,\n onReset,\n currentUserId,\n usersById,\n chatsById,\n localContactIds,\n searchQuery,\n isSearching,\n localUserIds,\n globalUserIds,\n loadContactList,\n setGlobalSearchQuery,\n}) => {\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadContactList();\n });\n });\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset);\n\n const handleFilterChange = useCallback((query: string) => {\n setGlobalSearchQuery({ query });\n }, [setGlobalSearchQuery]);\n\n const displayedIds = useMemo(() => {\n const contactIds = localContactIds\n ? sortChatIds(localContactIds.filter((id) => id !== currentUserId), chatsById)\n : [];\n\n if (!searchQuery) {\n return contactIds;\n }\n\n const foundContactIds = contactIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n const fullName = getUserFullName(user);\n return fullName && searchWords(fullName, searchQuery);\n });\n\n return sortChatIds(\n unique([\n ...foundContactIds,\n ...(localUserIds || []),\n ...(globalUserIds || []),\n ]),\n chatsById,\n false,\n selectedMemberIds,\n );\n }, [\n localContactIds, chatsById, searchQuery, localUserIds, globalUserIds, selectedMemberIds,\n currentUserId, usersById,\n ]);\n\n const handleNextStep = useCallback(() => {\n if (selectedMemberIds.length || isChannel) {\n setGlobalSearchQuery({ query: '' });\n onNextStep();\n }\n }, [selectedMemberIds.length, isChannel, setGlobalSearchQuery, onNextStep]);\n\n return (\n
\n
\n \n \n \n

{lang('GroupAddMembers')}

\n
\n
\n \n\n \n \n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { userIds: localContactIds } = global.contactList || {};\n const { byId: usersById } = global.users;\n const { byId: chatsById } = global.chats;\n const { currentUserId } = global;\n\n const {\n query: searchQuery,\n fetchingStatus,\n globalResults,\n localResults,\n } = global.globalSearch;\n const { userIds: globalUserIds } = globalResults || {};\n const { userIds: localUserIds } = localResults || {};\n\n return {\n currentUserId,\n usersById,\n chatsById,\n localContactIds,\n searchQuery,\n isSearching: fetchingStatus && fetchingStatus.chats,\n globalUserIds,\n localUserIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadContactList', 'setGlobalSearchQuery']),\n)(NewChatStep1));\n","import React, {\n FC, useState, useCallback, useEffect, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ChatCreationProgress } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport InputText from '../../ui/InputText';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport Button from '../../ui/Button';\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\nexport type OwnProps = {\n isChannel?: boolean;\n isActive: boolean;\n memberIds: number[];\n onReset: (forceReturnToChatList?: boolean) => void;\n};\n\ntype StateProps = {\n creationProgress?: ChatCreationProgress;\n creationError?: string;\n};\n\ntype DispatchProps = Pick;\n\n// TODO @implement\nconst MAX_USERS_FOR_LEGACY_CHAT = 199; // Accounting for current user\n\nconst NewChatStep2: FC = ({\n isChannel,\n isActive,\n memberIds,\n onReset,\n creationProgress,\n creationError,\n createGroupChat,\n createChannel,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset);\n\n const [title, setTitle] = useState('');\n const [about, setAbout] = useState('');\n const [photo, setPhoto] = useState();\n const [error, setError] = useState();\n\n const chatTitleEmptyError = 'Chat title can\\'t be empty';\n const channelTitleEmptyError = 'Channel title can\\'t be empty';\n const chatTooManyUsersError = 'Sorry, creating supergroups is not yet supported';\n\n const isLoading = creationProgress === ChatCreationProgress.InProgress;\n\n const handleTitleChange = useCallback((e: React.ChangeEvent) => {\n const { value } = e.currentTarget;\n const newValue = value.replace(/^\\s+/, '');\n\n setTitle(newValue);\n\n if (newValue !== value) {\n e.currentTarget.value = newValue;\n }\n }, []);\n\n const handleDescriptionChange = useCallback((e: React.ChangeEvent) => {\n setAbout(e.currentTarget.value);\n }, []);\n\n const handleCreateGroup = useCallback(() => {\n if (!title.length) {\n setError(chatTitleEmptyError);\n return;\n }\n\n if (memberIds.length > MAX_USERS_FOR_LEGACY_CHAT) {\n setError(chatTooManyUsersError);\n return;\n }\n\n createGroupChat({\n title,\n photo,\n memberIds,\n });\n }, [title, memberIds, createGroupChat, photo, chatTitleEmptyError, chatTooManyUsersError]);\n\n const handleCreateChannel = useCallback(() => {\n if (!title.length) {\n setError(channelTitleEmptyError);\n return;\n }\n\n createChannel({\n title,\n about,\n photo,\n memberIds,\n });\n }, [title, createChannel, about, photo, memberIds, channelTitleEmptyError]);\n\n useEffect(() => {\n if (creationProgress === ChatCreationProgress.Complete) {\n onReset(true);\n }\n }, [creationProgress, onReset]);\n\n const renderedError = creationError || (\n error !== chatTitleEmptyError && error !== channelTitleEmptyError\n ? error\n : undefined\n );\n\n return (\n
\n
\n onReset()}\n ariaLabel=\"Return to member selection\"\n >\n \n \n

{lang(isChannel ? 'NewChannel' : 'NewGroup')}

\n
\n
\n \n \n {isChannel && (\n <>\n \n

{lang('DescriptionInfo')}

\n \n )}\n\n {renderedError && (\n

{renderedError}

\n )}\n\n {memberIds.length > 0 && (\n <>\n

{lang('GroupInfo.ParticipantCount', memberIds.length, 'i')}

\n\n
\n {memberIds.map((id) => (\n \n \n \n ))}\n
\n \n )}\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n progress: creationProgress,\n error: creationError,\n } = global.chatCreation || {};\n\n return {\n creationProgress,\n creationError,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'createGroupChat', 'createChannel',\n ]),\n)(NewChatStep2));\n","import React, {\n FC, memo, useCallback, useState,\n} from '../../../lib/teact/teact';\n\nimport { LeftColumnContent } from '../../../types';\n\nimport { LAYERS_ANIMATION_NAME } from '../../../util/environment';\n\nimport Transition from '../../ui/Transition';\nimport NewChatStep1 from './NewChatStep1';\nimport NewChatStep2 from './NewChatStep2';\n\nimport './NewChat.scss';\n\nexport type OwnProps = {\n isActive: boolean;\n isChannel?: boolean;\n content: LeftColumnContent;\n onContentChange: (content: LeftColumnContent) => void;\n onReset: () => void;\n};\n\nconst RENDER_COUNT = Object.keys(LeftColumnContent).length / 2;\n\nconst NewChat: FC = ({\n isActive,\n isChannel = false,\n content,\n onContentChange,\n onReset,\n}) => {\n const [newChatMemberIds, setNewChatMemberIds] = useState([]);\n\n const handleNextStep = useCallback(() => {\n onContentChange(isChannel ? LeftColumnContent.NewChannelStep2 : LeftColumnContent.NewGroupStep2);\n }, [isChannel, onContentChange]);\n\n return (\n \n {(isStepActive) => {\n switch (content) {\n case LeftColumnContent.NewChannelStep1:\n case LeftColumnContent.NewGroupStep1:\n return (\n \n );\n case LeftColumnContent.NewChannelStep2:\n case LeftColumnContent.NewGroupStep2:\n return (\n \n );\n default:\n return undefined;\n }\n }}\n \n );\n};\n\nexport default memo(NewChat);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Button from '../ui/Button';\nimport ChatList from './main/ChatList';\nimport { LeftColumnContent } from '../../types';\n\nimport './ArchivedChats.scss';\n\nexport type OwnProps = {\n isActive: boolean;\n onReset: () => void;\n onContentChange: (content: LeftColumnContent) => void;\n};\n\nconst ArchivedChats: FC = ({ isActive, onReset, onContentChange }) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onContentChange, LeftColumnContent.Archived);\n\n return (\n
\n
\n \n \n \n

{lang('ArchivedChats')}

\n
\n \n
\n );\n};\n\nexport default memo(ArchivedChats);\n","const IGNORED_KEYS: Record = {\n Down: true,\n ArrowDown: true,\n Up: true,\n ArrowUp: true,\n Left: true,\n ArrowLeft: true,\n Right: true,\n ArrowRight: true,\n ' ': true,\n PageUp: true,\n PageDown: true,\n End: true,\n Home: true,\n Tab: true,\n};\n\nfunction isTextBox(target: EventTarget | null) {\n if (!target || !(target instanceof HTMLElement)) return false;\n const element = target;\n const tagName = element.tagName.toLowerCase();\n if (tagName === 'textarea') return true;\n if (tagName !== 'input') return false;\n const type = element.getAttribute('type');\n if (!type) return false;\n const inputTypes = [\n 'text', 'password', 'number', 'email', 'tel', 'url',\n 'search', 'date', 'datetime', 'datetime-local', 'time', 'month', 'week',\n ];\n return inputTypes.indexOf(type.toLowerCase()) > -1;\n}\n\nconst preventDefault = (e: Event) => {\n e.preventDefault();\n};\n\nfunction preventDefaultForScrollKeys(e: KeyboardEvent) {\n if (IGNORED_KEYS[e.key] && !isTextBox(e.target)) {\n preventDefault(e);\n }\n}\n\nexport function disableScrolling() {\n // Disable scrolling in Chrome\n document.addEventListener('wheel', preventDefault, { passive: false });\n window.ontouchmove = preventDefault; // mobile\n document.onkeydown = preventDefaultForScrollKeys;\n}\n\nexport function enableScrolling() {\n document.removeEventListener('wheel', preventDefault); // Enable scrolling in Chrome\n // eslint-disable-next-line no-null/no-null\n window.ontouchmove = null;\n // eslint-disable-next-line no-null/no-null\n document.onkeydown = null;\n}\n","import { ApiMediaFormat, ApiMessage } from '../../../../api/types';\n\nimport * as mediaLoader from '../../../../util/mediaLoader';\nimport { getMessageMediaHash, getMessagePhoto, getMessageText } from '../../../../modules/helpers';\nimport { CLIPBOARD_ITEM_SUPPORTED, copyImageToClipboard, copyTextToClipboard } from '../../../../util/clipboard';\n\ntype ICopyOptions = {\n label: string;\n handler: () => void;\n}[];\n\nexport function getMessageCopyOptions(\n message: ApiMessage, afterEffect?: () => void, onCopyLink?: () => void,\n): ICopyOptions {\n const options: ICopyOptions = [];\n const text = getMessageText(message);\n const photo = getMessagePhoto(message);\n const mediaHash = getMessageMediaHash(message, 'inline')!;\n const canImageBeCopied = photo && mediaHash && CLIPBOARD_ITEM_SUPPORTED;\n const selection = window.getSelection();\n\n if (canImageBeCopied) {\n options.push({\n label: 'lng_context_copy_image',\n handler: () => {\n mediaLoader.fetch(mediaHash, ApiMediaFormat.BlobUrl).then(copyImageToClipboard);\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n if (text) {\n // Detect if the user has selection in the current message\n const hasSelection = Boolean((\n selection\n && selection.anchorNode\n && selection.anchorNode.parentNode\n && (selection.anchorNode.parentNode as HTMLElement).closest('.Message .content-inner')\n && selection.toString().replace(/(?:\\r\\n|\\r|\\n)/g, '') !== ''\n ));\n\n options.push({\n label: getCopyLabel(hasSelection),\n handler: () => {\n const clipboardText = hasSelection && selection ? selection.toString() : text;\n copyTextToClipboard(clipboardText);\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n if (onCopyLink) {\n options.push({\n label: 'lng_context_copy_message_link',\n handler: () => {\n onCopyLink();\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n return options;\n}\n\nfunction getCopyLabel(hasSelection: boolean): string {\n if (hasSelection) {\n return 'lng_context_copy_selected';\n }\n return 'lng_context_copy_text';\n}\n","import React, { FC, useCallback } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { IAnchorPosition } from '../../../types';\n\nimport { getMessageCopyOptions } from './helpers/copyOptions';\nimport useContextMenuPosition from '../../../hooks/useContextMenuPosition';\nimport useLang from '../../../hooks/useLang';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\n\nimport './MessageContextMenu.scss';\n\ntype OwnProps = {\n isOpen: boolean;\n anchor: IAnchorPosition;\n message: ApiMessage;\n canSendNow?: boolean;\n canReschedule?: boolean;\n canReply?: boolean;\n canPin?: boolean;\n canUnpin?: boolean;\n canDelete?: boolean;\n canReport?: boolean;\n canEdit?: boolean;\n canForward?: boolean;\n canFaveSticker?: boolean;\n canUnfaveSticker?: boolean;\n canCopy?: boolean;\n canCopyLink?: boolean;\n canSelect?: boolean;\n onReply: () => void;\n onEdit: () => void;\n onPin: () => void;\n onUnpin: () => void;\n onForward: () => void;\n onDelete: () => void;\n onReport: () => void;\n onFaveSticker: () => void;\n onUnfaveSticker: () => void;\n onSelect: () => void;\n onSend: () => void;\n onReschedule: () => void;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onCopyLink?: () => void;\n};\n\nconst SCROLLBAR_WIDTH = 10;\n\nconst MessageContextMenu: FC = ({\n isOpen,\n message,\n anchor,\n canSendNow,\n canReschedule,\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canDelete,\n canReport,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n onReply,\n onEdit,\n onPin,\n onUnpin,\n onForward,\n onDelete,\n onReport,\n onFaveSticker,\n onUnfaveSticker,\n onSelect,\n onSend,\n onReschedule,\n onClose,\n onCloseAnimationEnd,\n onCopyLink,\n}) => {\n const copyOptions = getMessageCopyOptions(message, onClose, canCopyLink ? onCopyLink : undefined);\n\n const getTriggerElement = useCallback(() => {\n return document.querySelector(`.active > .MessageList div[data-message-id=\"${message.id}\"]`);\n }, [message.id]);\n\n const getRootElement = useCallback(\n () => document.querySelector('.active > .MessageList'),\n [],\n );\n\n const getMenuElement = useCallback(\n () => document.querySelector('.MessageContextMenu .bubble'),\n [],\n );\n\n const { positionX, positionY, style } = useContextMenuPosition(\n anchor,\n getTriggerElement,\n getRootElement,\n getMenuElement,\n SCROLLBAR_WIDTH,\n (document.querySelector('.MiddleHeader') as HTMLElement).offsetHeight,\n );\n\n const lang = useLang();\n\n return (\n \n {canSendNow && {lang('MessageScheduleSend')}}\n {canReschedule && (\n {lang('MessageScheduleEditTime')}\n )}\n {canReply && {lang('Reply')}}\n {canEdit && {lang('Edit')}}\n {canFaveSticker && (\n {lang('AddToFavorites')}\n )}\n {canUnfaveSticker && (\n {lang('Stickers.RemoveFromFavorites')}\n )}\n {canCopy && copyOptions.map((options) => (\n {lang(options.label)}\n ))}\n {canPin && {lang('DialogPin')}}\n {canUnpin && {lang('DialogUnpin')}}\n {canForward && {lang('Forward')}}\n {canSelect && {lang('Common.Select')}}\n {canReport && {lang('lng_context_report_msg')}}\n {canDelete && {lang('Delete')}}\n \n );\n};\n\nexport default MessageContextMenu;\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../../global/types';\nimport { ApiMessage } from '../../../api/types';\nimport { IAlbum, IAnchorPosition } from '../../../types';\nimport { selectAllowedMessageActions, selectCurrentMessageList } from '../../../modules/selectors';\nimport { disableScrolling, enableScrolling } from '../../../util/scrollLock';\nimport { pick } from '../../../util/iteratees';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useFlag from '../../../hooks/useFlag';\n\nimport DeleteMessageModal from '../../common/DeleteMessageModal';\nimport ReportMessageModal from '../../common/ReportMessageModal';\nimport PinMessageModal from '../../common/PinMessageModal';\nimport MessageContextMenu from './MessageContextMenu';\nimport CalendarModal from '../../common/CalendarModal';\nimport { getDayStartAt } from '../../../util/dateFormat';\n\nexport type OwnProps = {\n isOpen: boolean;\n message: ApiMessage;\n album?: IAlbum;\n anchor: IAnchorPosition;\n messageListType: MessageListType;\n onClose: () => void;\n onCloseAnimationEnd: () => void;\n};\n\ntype StateProps = {\n noOptions?: boolean;\n canSendNow?: boolean;\n canReschedule?: boolean;\n canReply?: boolean;\n canPin?: boolean;\n canUnpin?: boolean;\n canDelete?: boolean;\n canReport?: boolean;\n canEdit?: boolean;\n canForward?: boolean;\n canFaveSticker?: boolean;\n canUnfaveSticker?: boolean;\n canCopy?: boolean;\n canCopyLink?: boolean;\n canSelect?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ContextMenuContainer: FC = ({\n isOpen,\n messageListType,\n message,\n album,\n anchor,\n onClose,\n onCloseAnimationEnd,\n noOptions,\n canSendNow,\n canReschedule,\n canReply,\n canPin,\n canUnpin,\n canDelete,\n canReport,\n canEdit,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n setReplyingToId,\n setEditingId,\n pinMessage,\n openForwardMenu,\n faveSticker,\n unfaveSticker,\n toggleMessageSelection,\n sendScheduledMessages,\n rescheduleMessage,\n loadMessageLink,\n}) => {\n const { transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd, undefined, false);\n const [isMenuOpen, setIsMenuOpen] = useState(true);\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);\n const [isReportModalOpen, setIsReportModalOpen] = useState(false);\n const [isPinModalOpen, setIsPinModalOpen] = useState(false);\n const [isCalendarOpen, openCalendar, closeCalendar] = useFlag();\n\n const handleDelete = useCallback(() => {\n setIsMenuOpen(false);\n setIsDeleteModalOpen(true);\n }, []);\n\n const handleReport = useCallback(() => {\n setIsMenuOpen(false);\n setIsReportModalOpen(true);\n }, []);\n\n const closeMenu = useCallback(() => {\n setIsMenuOpen(false);\n onClose();\n }, [onClose]);\n\n const closeDeleteModal = useCallback(() => {\n setIsDeleteModalOpen(false);\n onClose();\n }, [onClose]);\n\n const closeReportModal = useCallback(() => {\n setIsReportModalOpen(false);\n onClose();\n }, [onClose]);\n\n const closePinModal = useCallback(() => {\n setIsPinModalOpen(false);\n onClose();\n }, [onClose]);\n\n const handleCloseCalendar = useCallback(() => {\n closeCalendar();\n onClose();\n }, [closeCalendar, onClose]);\n\n const handleReply = useCallback(() => {\n setReplyingToId({ messageId: message.id });\n closeMenu();\n }, [setReplyingToId, message.id, closeMenu]);\n\n const handleEdit = useCallback(() => {\n setEditingId({ messageId: message.id });\n closeMenu();\n }, [setEditingId, message.id, closeMenu]);\n\n const handlePin = useCallback(() => {\n setIsMenuOpen(false);\n setIsPinModalOpen(true);\n }, []);\n\n const handleUnpin = useCallback(() => {\n pinMessage({ messageId: message.id, isUnpin: true });\n closeMenu();\n }, [pinMessage, message.id, closeMenu]);\n\n const handleForward = useCallback(() => {\n closeMenu();\n if (album && album.messages) {\n const messageIds = album.messages.map(({ id }) => id);\n openForwardMenu({ fromChatId: message.chatId, messageIds });\n } else {\n openForwardMenu({ fromChatId: message.chatId, messageIds: [message.id] });\n }\n }, [openForwardMenu, message, closeMenu, album]);\n\n const handleFaveSticker = useCallback(() => {\n closeMenu();\n faveSticker({ sticker: message.content.sticker });\n }, [closeMenu, message.content.sticker, faveSticker]);\n\n const handleUnfaveSticker = useCallback(() => {\n closeMenu();\n unfaveSticker({ sticker: message.content.sticker });\n }, [closeMenu, message.content.sticker, unfaveSticker]);\n\n const handleSelectMessage = useCallback(() => {\n const params = album && album.messages\n ? {\n messageId: message.id,\n childMessageIds: album.messages.map(({ id }) => id),\n withShift: false,\n }\n : { messageId: message.id, withShift: false };\n\n toggleMessageSelection(params);\n closeMenu();\n }, [closeMenu, message.id, toggleMessageSelection, album]);\n\n const handleScheduledMessageSend = useCallback(() => {\n sendScheduledMessages({ chatId: message.chatId, id: message.id });\n closeMenu();\n }, [closeMenu, message.chatId, message.id, sendScheduledMessages]);\n\n const handleOpenCalendar = useCallback(() => {\n setIsMenuOpen(false);\n openCalendar();\n }, [openCalendar]);\n\n const handleRescheduleMessage = useCallback((date: Date) => {\n rescheduleMessage({\n chatId: message.chatId,\n messageId: message.id,\n scheduledAt: Math.round(date.getTime() / 1000),\n });\n }, [message.chatId, message.id, rescheduleMessage]);\n\n const handleCopyLink = useCallback(() => {\n loadMessageLink({\n messageId: message.id,\n chatId: message.chatId,\n });\n closeMenu();\n }, [closeMenu, loadMessageLink, message.chatId, message.id]);\n\n useEffect(() => {\n disableScrolling();\n\n return enableScrolling;\n }, []);\n\n const reportMessageIds = useMemo(() => (album ? album.messages : [message]).map(({ id }) => id), [album, message]);\n\n if (noOptions) {\n closeMenu();\n\n return undefined;\n }\n\n const scheduledMaxDate = new Date();\n scheduledMaxDate.setFullYear(scheduledMaxDate.getFullYear() + 1);\n\n return (\n
\n \n \n \n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { message, messageListType }): StateProps => {\n const { threadId } = selectCurrentMessageList(global) || {};\n const {\n noOptions,\n canReply,\n canPin,\n canUnpin,\n canDelete,\n canReport,\n canEdit,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n } = (threadId && selectAllowedMessageActions(global, message, threadId)) || {};\n const isPinned = messageListType === 'pinned';\n const isScheduled = messageListType === 'scheduled';\n\n return {\n noOptions,\n canSendNow: isScheduled,\n canReschedule: isScheduled,\n canReply: !isPinned && !isScheduled && canReply,\n canPin: !isScheduled && canPin,\n canUnpin: !isScheduled && canUnpin,\n canDelete,\n canReport,\n canEdit: !isPinned && canEdit,\n canForward: !isScheduled && canForward,\n canFaveSticker: !isScheduled && canFaveSticker,\n canUnfaveSticker: !isScheduled && canUnfaveSticker,\n canCopy,\n canCopyLink: !isScheduled && canCopyLink,\n canSelect,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setReplyingToId',\n 'setEditingId',\n 'pinMessage',\n 'openForwardMenu',\n 'faveSticker',\n 'unfaveSticker',\n 'toggleMessageSelection',\n 'sendScheduledMessages',\n 'rescheduleMessage',\n 'loadMessageLink',\n ]),\n)(ContextMenuContainer));\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiSticker, ApiStickerSet } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport { STICKER_SIZE_MODAL } from '../../config';\nimport { pick } from '../../util/iteratees';\nimport { selectStickerSet } from '../../modules/selectors';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\nimport Loading from '../ui/Loading';\nimport StickerButton from './StickerButton';\n\nimport './StickerSetModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n fromSticker: ApiSticker;\n onClose: () => void;\n};\n\ntype StateProps = {\n stickerSet?: ApiStickerSet;\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst StickerSetModal: FC = ({\n isOpen,\n fromSticker,\n stickerSet,\n onClose,\n loadStickers,\n toggleStickerSet,\n sendMessage,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const lang = useLang();\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE, isDisabled: !isOpen });\n\n useEffect(() => {\n if (isOpen) {\n const { stickerSetId, stickerSetAccessHash } = fromSticker;\n loadStickers({ stickerSetId, stickerSetAccessHash });\n }\n }, [isOpen, fromSticker, loadStickers]);\n\n const handleSelect = useCallback((sticker: ApiSticker) => {\n sticker = {\n ...sticker,\n isPreloadedGlobally: true,\n };\n\n sendMessage({ sticker });\n onClose();\n }, [onClose, sendMessage]);\n\n const handleButtonClick = useCallback(() => {\n toggleStickerSet({ stickerSetId: fromSticker.stickerSetId });\n onClose();\n }, [fromSticker.stickerSetId, onClose, toggleStickerSet]);\n\n return (\n \n {stickerSet && stickerSet.stickers ? (\n <>\n
\n {stickerSet.stickers.map((sticker) => (\n \n ))}\n
\n
\n \n {lang(\n stickerSet.installedDate ? 'StickerPack.RemoveStickerCount' : 'StickerPack.AddStickerCount',\n stickerSet.count,\n 'i',\n )}\n \n
\n \n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { fromSticker }: OwnProps) => {\n return { stickerSet: selectStickerSet(global, fromSticker.stickerSetId) };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadStickers',\n 'toggleStickerSet',\n 'sendMessage',\n ]),\n)(StickerSetModal));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat } from '../../api/types';\nimport { IAnchorPosition } from '../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { disableScrolling, enableScrolling } from '../../util/scrollLock';\nimport { selectChat, selectNotifySettings, selectNotifyExceptions } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport { isChatPrivate, getCanDeleteChat, selectIsChatMuted } from '../../modules/helpers';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useLang from '../../hooks/useLang';\n\nimport Portal from '../ui/Portal';\nimport Menu from '../ui/Menu';\nimport MenuItem from '../ui/MenuItem';\nimport DeleteChatModal from '../common/DeleteChatModal';\n\nimport './HeaderMenuContainer.scss';\n\ntype DispatchProps = Pick;\n\nexport type OwnProps = {\n chatId: number;\n threadId: number;\n isOpen: boolean;\n anchor: IAnchorPosition;\n isChannel?: boolean;\n canSubscribe?: boolean;\n canSearch?: boolean;\n canMute?: boolean;\n canSelect?: boolean;\n canLeave?: boolean;\n onSubscribeChannel: () => void;\n onSearchClick: () => void;\n onClose: () => void;\n onCloseAnimationEnd: () => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n isPrivate?: boolean;\n isMuted?: boolean;\n canDeleteChat?: boolean;\n};\n\nconst HeaderMenuContainer: FC = ({\n chatId,\n isOpen,\n anchor,\n isChannel,\n canSubscribe,\n canSearch,\n canMute,\n canSelect,\n canLeave,\n chat,\n isPrivate,\n isMuted,\n canDeleteChat,\n onSubscribeChannel,\n onSearchClick,\n onClose,\n onCloseAnimationEnd,\n updateChatMutedState,\n enterMessageSelectMode,\n}) => {\n const [isMenuOpen, setIsMenuOpen] = useState(true);\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);\n const { x, y } = anchor;\n\n useShowTransition(isOpen, onCloseAnimationEnd, undefined, false);\n\n const handleDelete = useCallback(() => {\n setIsMenuOpen(false);\n setIsDeleteModalOpen(true);\n }, []);\n\n const closeMenu = useCallback(() => {\n setIsMenuOpen(false);\n onClose();\n }, [onClose]);\n\n const closeDeleteModal = useCallback(() => {\n setIsDeleteModalOpen(false);\n onClose();\n }, [onClose]);\n\n const handleToggleMuteClick = useCallback(() => {\n updateChatMutedState({ chatId, isMuted: !isMuted });\n closeMenu();\n }, [chatId, closeMenu, isMuted, updateChatMutedState]);\n\n const handleSubscribe = useCallback(() => {\n onSubscribeChannel();\n closeMenu();\n }, [closeMenu, onSubscribeChannel]);\n\n const handleSearch = useCallback(() => {\n onSearchClick();\n closeMenu();\n }, [closeMenu, onSearchClick]);\n\n const handleSelectMessages = useCallback(() => {\n enterMessageSelectMode();\n closeMenu();\n }, [closeMenu, enterMessageSelectMode]);\n\n useEffect(() => {\n disableScrolling();\n\n return enableScrolling;\n }, []);\n\n const lang = useLang();\n\n return (\n \n
\n \n {IS_SINGLE_COLUMN_LAYOUT && canSubscribe && (\n \n {lang(isChannel ? 'Subscribe' : 'Join Group')}\n \n )}\n {IS_SINGLE_COLUMN_LAYOUT && canSearch && (\n \n {lang('Search')}\n \n )}\n {canMute && (\n \n {lang(isMuted ? 'ChatsUnmute' : 'ChatsMute')}\n \n )}\n {canSelect && (\n \n {lang('ReportSelectMessages')}\n \n )}\n {canLeave && (\n \n {lang(isPrivate\n ? 'Delete'\n : (canDeleteChat ? 'GroupInfo.DeleteAndExit' : (isChannel ? 'LeaveChannel' : 'Group.LeaveGroup')))}\n \n )}\n \n {chat && (\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat || chat.isRestricted) {\n return {};\n }\n\n return {\n chat,\n isMuted: selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global)),\n isPrivate: isChatPrivate(chat.id),\n canDeleteChat: getCanDeleteChat(chat),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'updateChatMutedState',\n 'enterMessageSelectMode',\n ]),\n)(HeaderMenuContainer));\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState, useLayoutEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport { debounce } from '../../util/schedulers';\nimport { selectCurrentTextSearch, selectCurrentChat } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport { getDayStartAt } from '../../util/dateFormat';\n\nimport Button from '../ui/Button';\nimport SearchInput from '../ui/SearchInput';\n\nimport './MobileSearch.scss';\n\nexport type OwnProps = {\n isActive: boolean;\n};\n\ntype StateProps = {\n isActive?: boolean;\n chat?: ApiChat;\n query?: string;\n totalCount?: number;\n foundIds?: number[];\n isHistoryCalendarOpen?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst runDebouncedForSearch = debounce((cb) => cb(), 200, false);\n\nconst MobileSearchFooter: FC = ({\n isActive,\n chat,\n query,\n totalCount,\n foundIds,\n isHistoryCalendarOpen,\n setLocalTextSearchQuery,\n searchTextMessagesLocal,\n focusMessage,\n closeLocalTextSearch,\n openHistoryCalendar,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const [focusedIndex, setFocusedIndex] = useState(0);\n\n // Fix for iOS keyboard\n useEffect(() => {\n const { visualViewport } = window as any;\n if (!visualViewport) {\n return undefined;\n }\n\n const mainEl = document.getElementById('Main') as HTMLDivElement;\n const handleResize = () => {\n const { activeElement } = document;\n if (activeElement && (activeElement === inputRef.current)) {\n const { pageTop, height } = visualViewport;\n mainEl.style.transform = `translateY(${pageTop}px)`;\n mainEl.style.height = `${height}px`;\n document.documentElement.scrollTop = pageTop;\n } else {\n mainEl.style.transform = '';\n mainEl.style.height = '';\n }\n };\n\n visualViewport.addEventListener('resize', handleResize);\n\n return () => {\n visualViewport.removeEventListener('resize', handleResize);\n };\n }, []);\n\n // Focus message\n useEffect(() => {\n if (chat && foundIds && foundIds.length) {\n focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1] });\n setFocusedIndex(0);\n } else {\n setFocusedIndex(-1);\n }\n }, [chat, focusMessage, foundIds]);\n\n // Disable native up/down buttons on iOS\n useEffect(() => {\n Array.from(document.querySelectorAll('input')).forEach((input) => {\n input.disabled = Boolean(isActive && input !== inputRef.current);\n });\n\n Array.from(document.querySelectorAll('div[contenteditable]')).forEach((div) => {\n div.contentEditable = isActive ? 'false' : 'true';\n });\n }, [isActive]);\n\n // Blur on exit\n useEffect(() => {\n if (!isActive) {\n inputRef.current!.blur();\n }\n }, [isActive]);\n\n useLayoutEffect(() => {\n const searchInput = document.querySelector('#MobileSearch input')!;\n searchInput.blur();\n }, [isHistoryCalendarOpen]);\n\n const handleMessageSearchQueryChange = useCallback((newQuery: string) => {\n setLocalTextSearchQuery({ query: newQuery });\n\n if (newQuery.length) {\n runDebouncedForSearch(searchTextMessagesLocal);\n }\n }, [searchTextMessagesLocal, setLocalTextSearchQuery]);\n\n const handleUp = useCallback(() => {\n if (chat && foundIds) {\n const newFocusIndex = focusedIndex + 1;\n focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1 - newFocusIndex] });\n setFocusedIndex(newFocusIndex);\n }\n }, [chat, focusedIndex, focusMessage, foundIds]);\n\n const handleDown = useCallback(() => {\n if (chat && foundIds) {\n const newFocusIndex = focusedIndex - 1;\n focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1 - newFocusIndex] });\n setFocusedIndex(newFocusIndex);\n }\n }, [chat, focusedIndex, focusMessage, foundIds]);\n\n return (\n
\n
\n \n \n \n \n
\n
\n
\n {query ? (\n foundIds && foundIds.length ? (\n `${focusedIndex + 1} of ${totalCount}`\n ) : foundIds && !foundIds.length ? (\n 'No results'\n ) : (\n ''\n )\n ) : (\n openHistoryCalendar({ selectedAt: getDayStartAt(Date.now()) })}\n ariaLabel=\"Search messages by date\"\n >\n \n \n )}\n
\n \n \n \n \n \n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return {};\n }\n\n const { query, results } = selectCurrentTextSearch(global) || {};\n const { totalCount, foundIds } = results || {};\n\n return {\n chat,\n query,\n totalCount,\n foundIds,\n isHistoryCalendarOpen: Boolean(global.historyCalendarSelectedAt),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalTextSearchQuery',\n 'searchTextMessagesLocal',\n 'focusMessage',\n 'closeLocalTextSearch',\n 'openHistoryCalendar',\n ]),\n)(MobileSearchFooter));\n","export default function findInViewport(\n container: HTMLElement,\n selectorOrElements: string | NodeListOf,\n margin = 0,\n isDense = false,\n shouldContainBottom = false,\n isHorizontal = false,\n) {\n const viewportY1 = container[isHorizontal ? 'scrollLeft' : 'scrollTop'];\n const viewportY2 = viewportY1 + container[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n const allElements = typeof selectorOrElements === 'string'\n ? container.querySelectorAll(selectorOrElements)\n : selectorOrElements;\n const { length } = allElements;\n const visibleIndexes: number[] = [];\n let isFound = false;\n\n for (let i = 0; i < length; i++) {\n const element = allElements[i];\n const y1 = element[isHorizontal ? 'offsetLeft' : 'offsetTop'];\n const y2 = y1 + element[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n const isVisible = shouldContainBottom\n ? y2 >= viewportY1 - margin && y2 <= viewportY2 + margin\n : y1 <= viewportY2 + margin && y2 >= viewportY1 - margin;\n\n if (isVisible) {\n visibleIndexes.push(i);\n isFound = true;\n } else if (isFound && !isDense) {\n break;\n }\n }\n\n return { allElements, visibleIndexes };\n}\n","function isFullyVisible(container: HTMLElement, element: HTMLElement, isHorizontal = false) {\n const viewportY1 = container[isHorizontal ? 'scrollLeft' : 'scrollTop'];\n const viewportY2 = viewportY1 + container[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n const y1 = element[isHorizontal ? 'offsetLeft' : 'offsetTop'];\n const y2 = y1 + element[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n return y1 > viewportY1 && y2 < viewportY2;\n}\n\nexport default isFullyVisible;\n","import React, {\n FC, useCallback, useEffect, useState, useRef, memo,\n} from '../../../lib/teact/teact';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport { ApiChatMember, ApiUser } from '../../../api/types';\n\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport captureKeyboardListeners from '../../../util/captureKeyboardListeners';\nimport findInViewport from '../../../util/findInViewport';\nimport isFullyVisible from '../../../util/isFullyVisible';\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport cycleRestrict from '../../../util/cycleRestrict';\n\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\nimport './MentionTooltip.scss';\n\nconst VIEWPORT_MARGIN = 8;\nconst SCROLL_MARGIN = 10;\n\nfunction setItemVisible(index: number, containerRef: Record) {\n const container = containerRef.current!;\n if (!container || index < 0) {\n return;\n }\n const { visibleIndexes, allElements } = findInViewport(\n container,\n '.chat-item-clickable',\n VIEWPORT_MARGIN,\n true,\n true,\n );\n if (!allElements.length || !allElements[index]) {\n return;\n }\n const first = visibleIndexes[0];\n if (!visibleIndexes.includes(index)\n || (index === first && !isFullyVisible(container, allElements[first]))) {\n const position = index > visibleIndexes[visibleIndexes.length - 1] ? 'start' : 'end';\n fastSmoothScroll(container, allElements[index], position, SCROLL_MARGIN);\n }\n}\n\nexport type OwnProps = {\n isOpen: boolean;\n filter: string;\n onClose: () => void;\n onInsertUserName: (user: ApiUser, forceFocus?: boolean) => void;\n filteredChatMembers?: ApiChatMember[];\n usersById?: Record;\n};\n\nconst MentionTooltip: FC = ({\n isOpen,\n filter,\n onClose,\n onInsertUserName,\n usersById,\n filteredChatMembers,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n\n const getSelectedIndex = useCallback((newIndex: number) => {\n if (!filteredChatMembers) {\n return -1;\n }\n const membersCount = filteredChatMembers!.length;\n return cycleRestrict(membersCount, newIndex);\n }, [filteredChatMembers]);\n\n const [selectedMentionIndex, setSelectedMentionIndex] = useState(-1);\n\n const handleArrowKey = useCallback((value: number, e: KeyboardEvent) => {\n e.preventDefault();\n setSelectedMentionIndex((index) => (getSelectedIndex(index + value)));\n }, [setSelectedMentionIndex, getSelectedIndex]);\n\n const handleUserSelect = useCallback((userId: number, forceFocus = false) => {\n const user = usersById && usersById[userId];\n if (!user) {\n return;\n }\n\n onInsertUserName(user, forceFocus);\n }, [usersById, onInsertUserName]);\n\n const handleSelectMention = useCallback((e: KeyboardEvent) => {\n if (filteredChatMembers && filteredChatMembers.length && selectedMentionIndex > -1) {\n const member = filteredChatMembers[selectedMentionIndex];\n if (member) {\n e.preventDefault();\n handleUserSelect(member.userId, true);\n }\n }\n }, [filteredChatMembers, selectedMentionIndex, handleUserSelect]);\n\n useEffect(() => (isOpen ? captureKeyboardListeners({\n onEsc: onClose,\n onUp: (e: KeyboardEvent) => handleArrowKey(-1, e),\n onDown: (e: KeyboardEvent) => handleArrowKey(1, e),\n onEnter: handleSelectMention,\n onTab: handleSelectMention,\n }) : undefined), [isOpen, onClose, handleArrowKey, handleSelectMention]);\n\n useEffect(() => {\n if (filteredChatMembers && !filteredChatMembers.length) {\n onClose();\n }\n }, [filteredChatMembers, onClose]);\n\n useEffect(() => {\n setSelectedMentionIndex(0);\n }, [filter]);\n\n useEffect(() => {\n setItemVisible(selectedMentionIndex, containerRef);\n }, [selectedMentionIndex]);\n\n const prevChatMembers = usePrevious(\n filteredChatMembers && filteredChatMembers.length\n ? filteredChatMembers\n : undefined,\n shouldRender,\n );\n const renderedChatMembers = filteredChatMembers && !filteredChatMembers.length\n ? prevChatMembers\n : filteredChatMembers;\n\n if (!shouldRender || (renderedChatMembers && !renderedChatMembers.length)) {\n return undefined;\n }\n\n const className = buildClassName(\n 'MentionTooltip composer-tooltip custom-scroll',\n transitionClassNames,\n );\n\n return (\n
\n {renderedChatMembers && renderedChatMembers.map(({ userId }, index) => (\n handleUserSelect(userId)}\n focus={selectedMentionIndex === index}\n >\n \n \n ))}\n
\n );\n};\n\nexport default memo(MentionTooltip);\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { ApiAttachment, ApiChatMember, ApiUser } from '../../../api/types';\nimport { LangCode } from '../../../types';\n\nimport { CONTENT_TYPES_FOR_QUICK_UPLOAD, EDITABLE_INPUT_MODAL_ID } from '../../../config';\nimport { getFileExtension } from '../../common/helpers/documentInfo';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useMentionTooltip from './hooks/useMentionTooltip';\nimport useEmojiTooltip from './hooks/useEmojiTooltip';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\n\nimport Button from '../../ui/Button';\nimport Modal from '../../ui/Modal';\nimport File from '../../common/File';\nimport MessageInput from './MessageInput';\nimport MentionTooltip from './MentionTooltip';\nimport EmojiTooltip from './EmojiTooltip.async';\n\nimport './AttachmentModal.scss';\n\nexport type OwnProps = {\n attachments: ApiAttachment[];\n caption: string;\n canSuggestMembers?: boolean;\n canSuggestEmoji?: boolean;\n currentUserId?: number;\n groupChatMembers?: ApiChatMember[];\n usersById?: Record;\n recentEmojis: string[];\n language: LangCode;\n emojiKeywords?: Record;\n addRecentEmoji: AnyToVoidFunction;\n loadEmojiKeywords: AnyToVoidFunction;\n onCaptionUpdate: (html: string) => void;\n onSend: () => void;\n onFileAppend: (files: File[], isQuick: boolean) => void;\n onClear: () => void;\n};\n\nconst DROP_LEAVE_TIMEOUT_MS = 150;\n\nconst AttachmentModal: FC = ({\n attachments,\n caption,\n canSuggestMembers,\n groupChatMembers,\n currentUserId,\n usersById,\n recentEmojis,\n language,\n emojiKeywords,\n onCaptionUpdate,\n addRecentEmoji,\n loadEmojiKeywords,\n onSend,\n onFileAppend,\n onClear,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const hideTimeoutRef = useRef(null);\n const prevAttachments = usePrevious(attachments);\n const renderingAttachments = attachments.length ? attachments : prevAttachments;\n const isOpen = Boolean(attachments.length);\n const [isHovered, markHovered, unmarkHovered] = useFlag();\n const isQuick = renderingAttachments && renderingAttachments.every((a) => a.quick);\n const lang = useLang();\n\n const {\n isMentionTooltipOpen, mentionFilter,\n closeMentionTooltip, insertMention,\n mentionFilteredMembers,\n } = useMentionTooltip(\n canSuggestMembers && isOpen,\n caption,\n onCaptionUpdate,\n EDITABLE_INPUT_MODAL_ID,\n groupChatMembers,\n currentUserId,\n usersById,\n );\n const {\n isEmojiTooltipOpen, closeEmojiTooltip, filteredEmojis, insertEmoji,\n } = useEmojiTooltip(\n isOpen,\n caption,\n recentEmojis,\n EDITABLE_INPUT_MODAL_ID,\n onCaptionUpdate,\n emojiKeywords,\n );\n\n useEffect(() => (isOpen ? captureEscKeyListener(onClear) : undefined), [isOpen, onClear]);\n\n const sendAttachments = useCallback(() => {\n if (isOpen) {\n onSend();\n }\n }, [isOpen, onSend]);\n\n const handleDragLeave = (e: React.DragEvent) => {\n const { relatedTarget: toTarget, target: fromTarget } = e;\n\n // Esc button pressed during drag event\n if ((fromTarget as HTMLDivElement).matches('.drop-target') && !toTarget) {\n hideTimeoutRef.current = window.setTimeout(unmarkHovered, DROP_LEAVE_TIMEOUT_MS);\n }\n\n // Prevent DragLeave event from firing when the pointer moves inside the AttachmentModal drop target\n if (fromTarget && (fromTarget as HTMLElement).closest('.AttachmentModal.hovered')) {\n return;\n }\n\n if (toTarget) {\n e.stopPropagation();\n }\n\n unmarkHovered();\n };\n\n const handleFilesDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n unmarkHovered();\n\n const { dataTransfer: { files } } = e;\n\n if (files && files.length) {\n const newFiles = isQuick\n ? Array.from(files).filter((file) => {\n return file.type && CONTENT_TYPES_FOR_QUICK_UPLOAD.includes(file.type);\n })\n : Array.from(files);\n\n onFileAppend(newFiles, false);\n }\n }, [isQuick, onFileAppend, unmarkHovered]);\n\n function handleDragOver(e: React.MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n\n if (hideTimeoutRef.current) {\n window.clearTimeout(hideTimeoutRef.current);\n }\n }\n\n if (!renderingAttachments) {\n return undefined;\n }\n\n const areAllPhotos = renderingAttachments.every((a) => a.mimeType.startsWith('image/'));\n const areAllVideos = renderingAttachments.every((a) => a.mimeType.startsWith('video/'));\n\n let title = '';\n if (areAllPhotos) {\n title = lang('PreviewSender.SendPhoto', renderingAttachments.length, 'i');\n } else if (areAllVideos) {\n title = lang('PreviewSender.SendVideo', renderingAttachments.length, 'i');\n } else {\n title = lang('PreviewSender.SendFile', renderingAttachments.length, 'i');\n }\n\n function renderHeader() {\n if (!renderingAttachments) {\n return undefined;\n }\n\n return (\n
\n \n
{title}
\n \n {lang('Send')}\n \n
\n );\n }\n\n return (\n \n \n {isQuick ? (\n
\n {renderingAttachments.map((attachment) => (\n attachment.mimeType.startsWith('image/')\n ? \"\"\n :
\n ) : (\n
\n {renderingAttachments.map((attachment) => (\n \n ))}\n
\n )}\n\n
\n \n \n \n
\n \n \n );\n};\n\nexport default memo(AttachmentModal);\n","import { ChangeEvent, RefObject } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiNewPoll } from '../../../api/types';\n\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport parseMessageInput from './helpers/parseMessageInput';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Modal from '../../ui/Modal';\nimport InputText from '../../ui/InputText';\nimport Checkbox from '../../ui/Checkbox';\nimport RadioGroup from '../../ui/RadioGroup';\n\nimport './PollModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onSend: (pollSummary: ApiNewPoll) => void;\n onClear: () => void;\n};\n\nconst MAX_LIST_HEIGHT = 320;\nconst MAX_OPTIONS_COUNT = 10;\nconst MAX_OPTION_LENGTH = 100;\nconst MAX_QUESTION_LENGTH = 255;\nconst MAX_SOLUTION_LENGTH = 200;\n\nconst PollModal: FC = ({ isOpen, onSend, onClear }) => {\n // eslint-disable-next-line no-null/no-null\n const questionInputRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const optionsListRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const solutionRef = useRef(null);\n\n const [question, setQuestion] = useState('');\n const [options, setOptions] = useState(['']);\n const [isAnonymous, setIsAnonymous] = useState(true);\n const [isMultipleAnswers, setIsMultipleAnswers] = useState(false);\n const [isQuizMode, setIsQuizMode] = useState(false);\n const [solution, setSolution] = useState();\n const [correctOption, setCorrectOption] = useState();\n const [hasErrors, setHasErrors] = useState(false);\n\n const lang = useLang();\n\n const focusInput = useCallback((ref: RefObject) => {\n if (isOpen && ref.current) {\n ref.current.focus();\n }\n }, [isOpen]);\n\n useEffect(() => (isOpen ? captureEscKeyListener(onClear) : undefined), [isOpen, onClear]);\n useEffect(() => {\n if (!isOpen) {\n setQuestion('');\n setOptions(['']);\n setIsAnonymous(true);\n setIsMultipleAnswers(false);\n setIsQuizMode(false);\n setSolution('');\n setCorrectOption('');\n setHasErrors(false);\n }\n }, [isOpen]);\n\n useEffect(() => focusInput(questionInputRef), [focusInput, isOpen]);\n\n useLayoutEffect(() => {\n const solutionEl = solutionRef.current;\n\n if (solutionEl && solution !== solutionEl.innerHTML) {\n solutionEl.innerHTML = solution;\n }\n }, [solution]);\n\n const addNewOption = useCallback((newOptions: string[] = []) => {\n setOptions([...newOptions, '']);\n requestAnimationFrame(() => {\n const list = optionsListRef.current;\n if (!list) {\n return;\n }\n\n list.classList.toggle('overflown', list.scrollHeight > MAX_LIST_HEIGHT);\n list.scrollTo({ top: list.scrollHeight, behavior: 'smooth' });\n });\n }, []);\n\n const handleCreate = useCallback(() => {\n setHasErrors(false);\n if (!isOpen) {\n return;\n }\n\n const questionTrimmed = question.trim().substring(0, MAX_QUESTION_LENGTH);\n const optionsTrimmed = options.map((o) => o.trim().substring(0, MAX_OPTION_LENGTH)).filter((o) => o.length);\n\n if (!questionTrimmed || optionsTrimmed.length < 2) {\n setQuestion(questionTrimmed);\n if (optionsTrimmed.length) {\n if (optionsTrimmed.length < 2) {\n addNewOption(optionsTrimmed);\n } else {\n setOptions(optionsTrimmed);\n }\n } else {\n addNewOption();\n }\n setHasErrors(true);\n return;\n }\n\n if (isQuizMode && (!correctOption || !optionsTrimmed[Number(correctOption)])) {\n setHasErrors(true);\n return;\n }\n\n const answers = optionsTrimmed\n .map((text, index) => ({\n text: text.trim(),\n option: String(index),\n ...(String(index) === correctOption && { correct: true }),\n }));\n\n const payload: ApiNewPoll = {\n summary: {\n question: questionTrimmed,\n answers,\n ...(!isAnonymous && { isPublic: true }),\n ...(isMultipleAnswers && { multipleChoice: true }),\n ...(isQuizMode && { quiz: true }),\n },\n };\n\n if (isQuizMode) {\n const { text, entities } = (solution && parseMessageInput(solution.substring(0, MAX_SOLUTION_LENGTH))) || {};\n\n payload.quiz = {\n correctAnswers: [correctOption],\n ...(text && { solution: text }),\n ...(entities && { solutionEntities: entities }),\n };\n }\n\n onSend(payload);\n }, [\n isOpen,\n question,\n options,\n isQuizMode,\n correctOption,\n isAnonymous,\n isMultipleAnswers,\n onSend,\n addNewOption,\n solution,\n ]);\n\n const updateOption = useCallback((index: number, text: string) => {\n const newOptions = [...options];\n newOptions[index] = text;\n if (newOptions[newOptions.length - 1].trim().length && newOptions.length < MAX_OPTIONS_COUNT) {\n addNewOption(newOptions);\n } else {\n setOptions(newOptions);\n }\n }, [options, addNewOption]);\n\n const removeOption = useCallback((index: number) => {\n const newOptions = [...options];\n newOptions.splice(index, 1);\n setOptions(newOptions);\n requestAnimationFrame(() => {\n if (!optionsListRef.current) {\n return;\n }\n\n optionsListRef.current.classList.toggle('overflown', optionsListRef.current.scrollHeight > MAX_LIST_HEIGHT);\n });\n }, [options]);\n\n const handleCorrectOptionChange = useCallback((newValue: string) => {\n setCorrectOption(newValue);\n }, [setCorrectOption]);\n\n const handleIsAnonymousChange = useCallback((e: ChangeEvent) => {\n setIsAnonymous(e.target.checked);\n }, []);\n\n const handleMultipleAnswersChange = useCallback((e: ChangeEvent) => {\n setIsMultipleAnswers(e.target.checked);\n }, []);\n\n const handleQuizModeChange = useCallback((e: ChangeEvent) => {\n setIsQuizMode(e.target.checked);\n }, []);\n\n const handleKeyPress = useCallback((e: React.KeyboardEvent) => {\n if (e.keyCode === 13) {\n handleCreate();\n }\n }, [handleCreate]);\n\n const getQuestionError = useCallback(() => {\n if (hasErrors && !question.trim().length) {\n return lang('lng_polls_choose_question');\n }\n\n return undefined;\n }, [hasErrors, lang, question]);\n\n const getOptionsError = useCallback((index: number) => {\n const optionsTrimmed = options.map((o) => o.trim()).filter((o) => o.length);\n if (hasErrors && optionsTrimmed.length < 2 && !options[index].trim().length) {\n return lang('lng_polls_choose_answers');\n }\n return undefined;\n }, [hasErrors, lang, options]);\n\n function renderHeader() {\n return (\n
\n \n
{lang('NewPoll')}
\n \n {lang('Create')}\n \n
\n );\n }\n\n function renderOptions() {\n return options.map((option, index) => (\n
\n updateOption(index, e.currentTarget.value)}\n onKeyPress={handleKeyPress}\n />\n {index !== options.length - 1 && (\n removeOption(index)}\n >\n \n \n )}\n
\n ));\n }\n\n function renderRadioOptions() {\n return renderOptions()\n .map((label, index) => ({ value: String(index), label, hidden: index === options.length - 1 }));\n }\n\n function renderQuizNoOptionError() {\n const optionsTrimmed = options.map((o) => o.trim()).filter((o) => o.length);\n\n return isQuizMode && (!correctOption || !optionsTrimmed[Number(correctOption)]) && (\n

{lang('lng_polls_choose_correct')}

\n );\n }\n\n return (\n \n setQuestion(e.currentTarget.value)}\n onKeyPress={handleKeyPress}\n />\n
\n\n
\n

{lang('PollOptions')}

\n\n {hasErrors && renderQuizNoOptionError()}\n {isQuizMode ? (\n \n ) : (\n renderOptions()\n )}\n\n
\n\n
\n\n
\n \n \n \n {isQuizMode && (\n <>\n

{lang('lng_polls_solution_title')}

\n setSolution(e.currentTarget.innerHTML)}\n />\n
{lang('CreatePoll.ExplanationInfo')}
\n \n )}\n
\n \n );\n};\n\nexport default memo(PollModal);\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../util/environment';\n\nconst MENU_CLOSE_TIMEOUT = 250;\nlet closeTimeout: number | undefined;\n\nexport default function useMouseInside(\n isOpen: boolean, onClose: NoneToVoidFunction, menuCloseTimeout = MENU_CLOSE_TIMEOUT, isDisabled = false,\n) {\n const isMouseInside = useRef(false);\n\n useEffect(() => {\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n if (isOpen && !IS_TOUCH_ENV && !isDisabled) {\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n onClose();\n }\n }, menuCloseTimeout * 2);\n }\n }, [isDisabled, isOpen, menuCloseTimeout, onClose]);\n\n const handleMouseEnter = useCallback(() => {\n isMouseInside.current = true;\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n isMouseInside.current = false;\n\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n onClose();\n }\n }, menuCloseTimeout);\n }, [menuCloseTimeout, onClose]);\n\n return [handleMouseEnter, handleMouseLeave];\n}\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { IS_EMOJI_SUPPORTED } from '../../../util/environment';\n\nimport './EmojiButton.scss';\n\ntype OwnProps = {\n emoji: Emoji;\n focus?: boolean;\n onClick: (emoji: string, name: string) => void;\n};\n\nconst EmojiButton: FC = ({ emoji, focus, onClick }) => {\n const handleClick = useCallback((e: React.MouseEvent) => {\n // Preventing safari from losing focus on Composer MessageInput\n e.preventDefault();\n\n onClick(emoji.native, emoji.id);\n }, [emoji, onClick]);\n\n return (\n \n {IS_EMOJI_SUPPORTED ? emoji.native : \"\"}\n
\n );\n};\n\nexport default memo(EmojiButton);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport windowSize from '../../../util/windowSize';\nimport { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useLang from '../../../hooks/useLang';\n\nimport EmojiButton from './EmojiButton';\n\nconst EMOJIS_PER_ROW_ON_DESKTOP = 9;\nconst EMOJI_MARGIN = 4;\nconst MOBILE_CONTAINER_PADDING = 8;\nconst EMOJI_SIZE = 40;\n\ntype OwnProps = {\n category: EmojiCategory;\n index: number;\n allEmojis: AllEmojis;\n observeIntersection: ObserveFn;\n shouldRender: boolean;\n onEmojiSelect: (emoji: string, name: string) => void;\n};\n\nconst EmojiCategory: FC = ({\n category, index, allEmojis, observeIntersection, shouldRender, onEmojiSelect,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n useOnIntersect(ref, observeIntersection);\n\n const { transitionClassNames } = useShowTransition(shouldRender, undefined, undefined, 'slow');\n\n const lang = useLang();\n\n const emojisPerRow = IS_SINGLE_COLUMN_LAYOUT\n ? Math.floor((windowSize.get().width - MOBILE_CONTAINER_PADDING) / (EMOJI_SIZE + EMOJI_MARGIN))\n : EMOJIS_PER_ROW_ON_DESKTOP;\n const height = Math.ceil(category.emojis.length / emojisPerRow) * (EMOJI_SIZE + EMOJI_MARGIN);\n\n return (\n \n

\n {lang(category.id === 'recent' ? 'RecentStickers' : `Emoji${index}`)}\n

\n \n {shouldRender && category.emojis.map((name) => {\n const emoji = allEmojis[name];\n // Some emojis have multiple skins and are represented as an Object with emojis for all skins.\n // For now, we select only the first emoji with 'neutral' skin.\n const displayedEmoji = 'id' in emoji ? emoji : emoji[1];\n\n return (\n \n );\n })}\n
\n \n );\n};\n\nexport default memo(EmojiCategory);\n","import React, {\n FC, useState, useEffect, memo, useRef, useMemo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport { MENU_TRANSITION_DURATION } from '../../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../util/environment';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport {\n EmojiModule,\n EmojiRawData,\n EmojiData,\n uncompressEmoji,\n} from '../../../util/emoji';\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport fastSmoothScrollHorizontal from '../../../util/fastSmoothScrollHorizontal';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useHorizontalScroll from '../../../hooks/useHorizontalScroll';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Loading from '../../ui/Loading';\nimport EmojiCategory from './EmojiCategory';\n\nimport './EmojiPicker.scss';\n\ntype OwnProps = {\n className?: string;\n onEmojiSelect: (emoji: string, name: string) => void;\n};\n\ntype StateProps = Pick;\ntype EmojiCategoryData = { id: string; name: string; emojis: string[] };\n\nconst ICONS_BY_CATEGORY: Record = {\n recent: 'icon-recent',\n people: 'icon-smile',\n nature: 'icon-animals',\n foods: 'icon-eats',\n activity: 'icon-sport',\n places: 'icon-car',\n objects: 'icon-lamp',\n symbols: 'icon-language',\n flags: 'icon-flag',\n};\n\nconst OPEN_ANIMATION_DELAY = 200;\n// Only a few categories are above this height.\nconst SMOOTH_SCROLL_DISTANCE = 800;\nconst FOCUS_MARGIN = 50;\nconst HEADER_BUTTON_WIDTH = 42; // px. Includes margins\nconst INTERSECTION_THROTTLE = 200;\n\nconst categoryIntersections: boolean[] = [];\n\nlet emojiDataPromise: Promise;\nlet emojiRawData: EmojiRawData;\nlet emojiData: EmojiData;\n\nconst EmojiPicker: FC = ({\n className, onEmojiSelect, recentEmojis,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const headerRef = useRef(null);\n\n const [categories, setCategories] = useState();\n const [emojis, setEmojis] = useState();\n const [activeCategoryIndex, setActiveCategoryIndex] = useState(0);\n\n const { observe: observeIntersection } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: INTERSECTION_THROTTLE,\n }, (entries) => {\n entries.forEach((entry) => {\n const { id } = entry.target as HTMLDivElement;\n if (!id || !id.startsWith('emoji-category-')) {\n return;\n }\n\n const index = Number(id.replace('emoji-category-', ''));\n categoryIntersections[index] = entry.isIntersecting;\n });\n\n const intersectingWithIndexes = categoryIntersections\n .map((isIntersecting, index) => ({ index, isIntersecting }))\n .filter(({ isIntersecting }) => isIntersecting);\n\n if (!intersectingWithIndexes.length) {\n return;\n }\n\n setActiveCategoryIndex(intersectingWithIndexes[Math.floor(intersectingWithIndexes.length / 2)].index);\n });\n\n useHorizontalScroll(headerRef.current, !IS_SINGLE_COLUMN_LAYOUT);\n\n // Scroll header when active set updates\n useEffect(() => {\n if (!categories) {\n return;\n }\n\n const header = headerRef.current;\n if (!header) {\n return;\n }\n\n const newLeft = activeCategoryIndex * HEADER_BUTTON_WIDTH - header.offsetWidth / 2 + HEADER_BUTTON_WIDTH / 2;\n\n fastSmoothScrollHorizontal(header, newLeft);\n }, [categories, activeCategoryIndex]);\n\n const lang = useLang();\n\n const allCategories = useMemo(() => {\n if (!categories) {\n return MEMO_EMPTY_ARRAY;\n }\n const themeCategories = [...categories];\n if (recentEmojis && recentEmojis.length) {\n themeCategories.unshift({\n id: 'recent',\n name: lang('RecentStickers'),\n emojis: recentEmojis,\n });\n }\n\n return themeCategories;\n }, [categories, lang, recentEmojis]);\n\n // Initialize data on first render.\n useEffect(() => {\n setTimeout(() => {\n const exec = () => {\n setCategories(emojiData.categories);\n\n setEmojis(emojiData.emojis as AllEmojis);\n };\n\n if (emojiData) {\n exec();\n } else {\n ensureEmojiData()\n .then(exec);\n }\n }, OPEN_ANIMATION_DELAY);\n }, []);\n\n const selectCategory = useCallback((index: number) => {\n setActiveCategoryIndex(index);\n const categoryEl = document.getElementById(`emoji-category-${index}`)!;\n fastSmoothScroll(containerRef.current!, categoryEl, 'start', FOCUS_MARGIN, SMOOTH_SCROLL_DISTANCE);\n }, []);\n\n const handleEmojiSelect = useCallback((emoji: string, name: string) => {\n onEmojiSelect(emoji, name);\n }, [onEmojiSelect]);\n\n const canRenderContents = useAsyncRendering([], MENU_TRANSITION_DURATION);\n\n function renderCategoryButton(category: EmojiCategoryData, index: number) {\n const icon = ICONS_BY_CATEGORY[category.id];\n\n return icon && (\n selectCategory(index)}\n ariaLabel={category.name}\n >\n \n \n );\n }\n\n const containerClassName = buildClassName('EmojiPicker', className);\n\n if (!emojis || !canRenderContents) {\n return (\n
\n \n
\n );\n }\n\n return (\n
\n
\n {allCategories.map(renderCategoryButton)}\n
\n \n {allCategories.map((category, i) => (\n = i - 1 && activeCategoryIndex <= i + 1}\n onEmojiSelect={handleEmojiSelect}\n />\n ))}\n
\n \n );\n};\n\nasync function ensureEmojiData() {\n if (!emojiDataPromise) {\n emojiDataPromise = import('emoji-data-ios/emoji-data.json') as unknown as Promise;\n emojiRawData = (await emojiDataPromise).default;\n\n emojiData = uncompressEmoji(emojiRawData);\n }\n\n return emojiDataPromise;\n}\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['recentEmojis']),\n)(EmojiPicker));\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiSticker } from '../../../api/types';\nimport { StickerSetOrRecent } from '../../../types';\nimport { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver';\n\nimport { STICKER_SIZE_PICKER } from '../../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport windowSize from '../../../util/windowSize';\nimport StickerButton from '../../common/StickerButton';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\n\ntype OwnProps = {\n stickerSet: StickerSetOrRecent;\n loadAndPlay: boolean;\n index: number;\n observeIntersection: ObserveFn;\n shouldRender: boolean;\n onStickerSelect: (sticker: ApiSticker) => void;\n onStickerUnfave: (sticker: ApiSticker) => void;\n};\n\nconst STICKERS_PER_ROW_ON_DESKTOP = 5;\nconst STICKER_MARGIN = IS_SINGLE_COLUMN_LAYOUT ? 8 : 16;\nconst MOBILE_CONTAINER_PADDING = 8;\n\nconst StickerSet: FC = ({\n stickerSet,\n loadAndPlay,\n index,\n observeIntersection,\n shouldRender,\n onStickerSelect,\n onStickerUnfave,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n useOnIntersect(ref, observeIntersection);\n\n const { transitionClassNames } = useShowTransition(shouldRender, undefined, undefined, 'slow');\n\n const stickersPerRow = IS_SINGLE_COLUMN_LAYOUT\n ? Math.floor((windowSize.get().width - MOBILE_CONTAINER_PADDING) / (STICKER_SIZE_PICKER + STICKER_MARGIN))\n : STICKERS_PER_ROW_ON_DESKTOP;\n const height = Math.ceil(stickerSet.count / stickersPerRow) * (STICKER_SIZE_PICKER + STICKER_MARGIN);\n\n return (\n \n

{stickerSet.title}

\n \n {shouldRender && stickerSet.stickers && stickerSet.stickers.map((sticker) => (\n \n ))}\n \n \n );\n};\n\nexport default memo(StickerSet);\n","import React, {\n FC, useState, useEffect, memo, useRef, useMemo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiStickerSet, ApiSticker } from '../../../api/types';\nimport { StickerSetOrRecent } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION, STICKER_SIZE_PICKER_HEADER } from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport fastSmoothScrollHorizontal from '../../../util/fastSmoothScrollHorizontal';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useHorizontalScroll from '../../../hooks/useHorizontalScroll';\nimport useLang from '../../../hooks/useLang';\n\nimport Loading from '../../ui/Loading';\nimport Button from '../../ui/Button';\nimport StickerButton from '../../common/StickerButton';\nimport StickerSet from './StickerSet';\nimport StickerSetCover from './StickerSetCover';\nimport StickerSetCoverAnimated from './StickerSetCoverAnimated';\n\nimport './StickerPicker.scss';\n\ntype OwnProps = {\n className: string;\n loadAndPlay: boolean;\n canSendStickers: boolean;\n onStickerSelect: (sticker: ApiSticker) => void;\n};\n\ntype StateProps = {\n recentStickers: ApiSticker[];\n favoriteStickers: ApiSticker[];\n stickerSetsById: Record;\n addedSetIds?: string[];\n shouldPlay?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst SMOOTH_SCROLL_DISTANCE = 500;\nconst HEADER_BUTTON_WIDTH = 52; // px (including margin)\nconst STICKER_INTERSECTION_THROTTLE = 200;\n\nconst stickerSetIntersections: boolean[] = [];\n\nconst StickerPicker: FC = ({\n className,\n loadAndPlay,\n canSendStickers,\n recentStickers,\n favoriteStickers,\n addedSetIds,\n stickerSetsById,\n shouldPlay,\n onStickerSelect,\n loadStickerSets,\n loadRecentStickers,\n loadFavoriteStickers,\n loadAddedStickers,\n addRecentSticker,\n unfaveSticker,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const headerRef = useRef(null);\n const [activeSetIndex, setActiveSetIndex] = useState(0);\n\n const { observe: observeIntersection } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: STICKER_INTERSECTION_THROTTLE,\n }, (entries) => {\n entries.forEach((entry) => {\n const { id } = entry.target as HTMLDivElement;\n if (!id || !id.startsWith('sticker-set-')) {\n return;\n }\n\n const index = Number(id.replace('sticker-set-', ''));\n stickerSetIntersections[index] = entry.isIntersecting;\n });\n\n const intersectingWithIndexes = stickerSetIntersections\n .map((isIntersecting, index) => ({ index, isIntersecting }))\n .filter(({ isIntersecting }) => isIntersecting);\n\n if (!intersectingWithIndexes.length) {\n return;\n }\n\n setActiveSetIndex(intersectingWithIndexes[Math.floor(intersectingWithIndexes.length / 2)].index);\n });\n const { observe: observeIntersectionForCovers } = useIntersectionObserver({ rootRef: headerRef });\n\n const lang = useLang();\n\n const areAddedLoaded = Boolean(addedSetIds);\n\n const allSets = useMemo(() => {\n if (!addedSetIds) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return [\n {\n id: 'recent',\n title: lang('RecentStickers'),\n stickers: recentStickers,\n count: recentStickers.length,\n },\n {\n id: 'favorite',\n title: lang('FavoriteStickers'),\n stickers: favoriteStickers,\n count: favoriteStickers.length,\n },\n ...addedSetIds.map((id) => stickerSetsById[id]).filter(Boolean),\n ];\n }, [addedSetIds, lang, recentStickers, favoriteStickers, stickerSetsById]);\n\n const noPopulatedSets = useMemo(() => (\n areAddedLoaded\n && allSets.filter((set) => set.stickers && set.stickers.length).length === 0\n ), [allSets, areAddedLoaded]);\n\n useEffect(() => {\n if (loadAndPlay) {\n loadStickerSets();\n loadRecentStickers();\n loadFavoriteStickers();\n }\n }, [loadAndPlay, loadFavoriteStickers, loadRecentStickers, loadStickerSets]);\n\n useEffect(() => {\n if (addedSetIds && addedSetIds.length) {\n loadAddedStickers();\n }\n }, [addedSetIds, loadAddedStickers]);\n\n useHorizontalScroll(headerRef.current);\n\n // Scroll container and header when active set changes\n useEffect(() => {\n if (!areAddedLoaded) {\n return;\n }\n\n const header = headerRef.current;\n if (!header) {\n return;\n }\n\n const newLeft = activeSetIndex * HEADER_BUTTON_WIDTH - (header.offsetWidth / 2 - HEADER_BUTTON_WIDTH / 2);\n\n fastSmoothScrollHorizontal(header, newLeft);\n }, [areAddedLoaded, activeSetIndex]);\n\n const selectStickerSet = useCallback((index: number) => {\n setActiveSetIndex(index);\n const stickerSetEl = document.getElementById(`sticker-set-${index}`)!;\n fastSmoothScroll(containerRef.current!, stickerSetEl, 'start', undefined, SMOOTH_SCROLL_DISTANCE);\n }, []);\n\n const handleStickerSelect = useCallback((sticker: ApiSticker) => {\n onStickerSelect(sticker);\n addRecentSticker({ sticker });\n }, [addRecentSticker, onStickerSelect]);\n\n const handleStickerUnfave = useCallback((sticker: ApiSticker) => {\n unfaveSticker({ sticker });\n }, [unfaveSticker]);\n\n const canRenderContents = useAsyncRendering([], SLIDE_TRANSITION_DURATION);\n\n function renderCover(stickerSet: StickerSetOrRecent, index: number) {\n const firstSticker = stickerSet.stickers && stickerSet.stickers[0];\n const buttonClassName = buildClassName(\n 'symbol-set-button sticker-set-button',\n index === activeSetIndex && 'activated',\n );\n\n if (stickerSet.id === 'recent' || stickerSet.id === 'favorite' || stickerSet.hasThumbnail || !firstSticker) {\n return (\n selectStickerSet(index)}\n >\n {stickerSet.id === 'recent' ? (\n \n ) : stickerSet.id === 'favorite' ? (\n \n ) : stickerSet.isAnimated ? (\n \n ) : (\n \n )}\n \n );\n } else {\n return (\n \n );\n }\n }\n\n const fullClassName = buildClassName('StickerPicker', className);\n\n if (!areAddedLoaded || !canRenderContents || noPopulatedSets || !canSendStickers) {\n return (\n
\n {!canSendStickers ? (\n
Sending stickers is not allowed in this chat.
\n ) : noPopulatedSets ? (\n
You have no saved Stickers.
\n ) : (\n \n )}\n
\n );\n }\n\n return (\n
\n \n {allSets.map(renderCover)}\n
\n \n {allSets.map((stickerSet, i) => (\n = i - 1 && activeSetIndex <= i + 1}\n onStickerSelect={handleStickerSelect}\n onStickerUnfave={handleStickerUnfave}\n />\n ))}\n \n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n setsById,\n added,\n recent,\n favorite,\n } = global.stickers;\n\n return {\n recentStickers: recent.stickers,\n favoriteStickers: favorite.stickers,\n stickerSetsById: setsById,\n addedSetIds: added.setIds,\n shouldPlay: global.settings.byKey.shouldLoopStickers,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadStickerSets',\n 'loadRecentStickers',\n 'loadFavoriteStickers',\n 'loadAddedStickers',\n 'addRecentSticker',\n 'unfaveSticker',\n ]),\n)(StickerPicker));\n","import React, {\n FC, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiVideo } from '../../api/types';\n\nimport buildClassName from '../../util/buildClassName';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport useVideoCleanup from '../../hooks/useVideoCleanup';\nimport useBuffering from '../../hooks/useBuffering';\nimport useCanvasBlur from '../../hooks/useCanvasBlur';\n\nimport Spinner from '../ui/Spinner';\n\nimport './GifButton.scss';\n\ntype OwnProps = {\n gif: ApiVideo;\n observeIntersection: ObserveFn;\n isDisabled?: boolean;\n onClick: (gif: ApiVideo) => void;\n};\n\nconst GifButton: FC = ({\n gif, observeIntersection, isDisabled, onClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const videoRef = useRef(null);\n\n const hasThumbnail = gif.thumbnail && !!gif.thumbnail.dataUri;\n const localMediaHash = `gif${gif.id}`;\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n const loadAndPlay = isIntersecting && !isDisabled;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !loadAndPlay, ApiMediaFormat.BlobUrl);\n const thumbRef = useCanvasBlur(gif.thumbnail && gif.thumbnail.dataUri, Boolean(previewBlobUrl));\n const videoData = useMedia(localMediaHash, !loadAndPlay, ApiMediaFormat.BlobUrl);\n const shouldRenderVideo = Boolean(loadAndPlay && videoData);\n const { transitionClassNames } = useTransitionForMedia(hasThumbnail || previewBlobUrl || videoData, 'slow');\n const { isBuffered, bufferingHandlers } = useBuffering(true);\n const shouldRenderSpinner = loadAndPlay && !isBuffered;\n\n useVideoCleanup(videoRef, [shouldRenderVideo]);\n\n const handleClick = useCallback(\n () => onClick({\n ...gif,\n blobUrl: videoData,\n }),\n [onClick, gif, videoData],\n );\n\n const className = buildClassName(\n 'GifButton',\n gif.width && gif.height && gif.width < gif.height ? 'vertical' : 'horizontal',\n transitionClassNames,\n localMediaHash,\n );\n\n return (\n \n {hasThumbnail && (\n \n )}\n {!hasThumbnail && previewBlobUrl && (\n \n )}\n {(shouldRenderVideo || previewBlobUrl) && (\n \n \n \n )}\n {shouldRenderSpinner && (\n \n )}\n \n );\n};\n\nexport default memo(GifButton);\n","import React, {\n FC, useEffect, memo, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiVideo } from '../../../api/types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\n\nimport Loading from '../../ui/Loading';\nimport GifButton from '../../common/GifButton';\n\nimport './GifPicker.scss';\n\ntype OwnProps = {\n className: string;\n loadAndPlay: boolean;\n canSendGifs: boolean;\n onGifSelect: (gif: ApiVideo) => void;\n};\n\ntype StateProps = {\n savedGifs?: ApiVideo[];\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_DEBOUNCE = 300;\n\nconst GifPicker: FC = ({\n className,\n loadAndPlay,\n canSendGifs,\n savedGifs,\n onGifSelect,\n loadSavedGifs,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, debounceMs: INTERSECTION_DEBOUNCE });\n\n useEffect(() => {\n if (loadAndPlay) {\n loadSavedGifs();\n }\n }, [loadAndPlay, loadSavedGifs]);\n\n const canRenderContents = useAsyncRendering([], SLIDE_TRANSITION_DURATION);\n\n return (\n \n {!canSendGifs ? (\n
Sending GIFs is not allowed in this chat.
\n ) : canRenderContents && savedGifs && savedGifs.length ? (\n savedGifs.map((gif) => (\n \n ))\n ) : canRenderContents && savedGifs ? (\n
No saved GIFs.
\n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n savedGifs: global.gifs.saved.gifs,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadSavedGifs']),\n)(GifPicker));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\n\ntype OwnProps = {\n activeTab: SymbolMenuTabs;\n onSwitchTab: (tab: SymbolMenuTabs) => void;\n onRemoveSymbol: () => void;\n onSearchOpen: (type: 'stickers' | 'gifs') => void;\n};\n\nexport enum SymbolMenuTabs {\n 'Emoji',\n 'Stickers',\n 'GIFs',\n}\n\n// Getting enum string values for display in Tabs.\n// See: https://www.typescriptlang.org/docs/handbook/enums.html#reverse-mappings\nexport const SYMBOL_MENU_TAB_TITLES = Object.values(SymbolMenuTabs)\n .filter((value): value is string => typeof value === 'string');\n\nconst SYMBOL_MENU_TAB_ICONS = {\n [SymbolMenuTabs.Emoji]: 'icon-smile',\n [SymbolMenuTabs.Stickers]: 'icon-stickers',\n [SymbolMenuTabs.GIFs]: 'icon-gifs',\n};\n\nconst SymbolMenuFooter: FC = ({\n activeTab, onSwitchTab, onRemoveSymbol, onSearchOpen,\n}) => {\n const lang = useLang();\n\n function renderTabButton(tab: SymbolMenuTabs) {\n return (\n onSwitchTab(tab)}\n ariaLabel={SYMBOL_MENU_TAB_TITLES[tab]}\n round\n faded\n color=\"translucent\"\n >\n \n \n );\n }\n\n const handleSearchOpen = useCallback(() => {\n onSearchOpen(activeTab === SymbolMenuTabs.Stickers ? 'stickers' : 'gifs');\n }, [activeTab, onSearchOpen]);\n\n function stopPropagation(event: any) {\n event.stopPropagation();\n }\n\n return (\n
\n {activeTab !== SymbolMenuTabs.Emoji && (\n \n \n \n )}\n\n {renderTabButton(SymbolMenuTabs.Emoji)}\n {renderTabButton(SymbolMenuTabs.Stickers)}\n {renderTabButton(SymbolMenuTabs.GIFs)}\n\n {activeTab === SymbolMenuTabs.Emoji && (\n \n \n \n )}\n
\n );\n};\n\nexport default memo(SymbolMenuFooter);\n","import React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiSticker, ApiVideo } from '../../../api/types';\n\nimport { IAllowedAttachmentOptions } from '../../../modules/helpers';\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../util/environment';\nimport { fastRaf } from '../../../util/schedulers';\nimport buildClassName from '../../../util/buildClassName';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useMouseInside from '../../../hooks/useMouseInside';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Menu from '../../ui/Menu';\nimport Transition from '../../ui/Transition';\nimport EmojiPicker from './EmojiPicker';\nimport StickerPicker from './StickerPicker';\nimport GifPicker from './GifPicker';\nimport SymbolMenuFooter, { SYMBOL_MENU_TAB_TITLES, SymbolMenuTabs } from './SymbolMenuFooter';\nimport Portal from '../../ui/Portal';\n\nimport './SymbolMenu.scss';\n\nconst ANIMATION_DURATION = 350;\n\nexport type OwnProps = {\n isOpen: boolean;\n allowedAttachmentOptions: IAllowedAttachmentOptions;\n onLoad: () => void;\n onClose: () => void;\n onEmojiSelect: (emoji: string) => void;\n onStickerSelect: (sticker: ApiSticker) => void;\n onGifSelect: (gif: ApiVideo) => void;\n onRemoveSymbol: () => void;\n onSearchOpen: (type: 'stickers' | 'gifs') => void;\n addRecentEmoji: AnyToVoidFunction;\n};\n\ntype StateProps = {\n isLeftColumnShown: boolean;\n};\n\nlet isActivated = false;\n\nconst SymbolMenu: FC = ({\n isOpen, allowedAttachmentOptions, isLeftColumnShown,\n onLoad, onClose,\n onEmojiSelect, onStickerSelect, onGifSelect,\n onRemoveSymbol, onSearchOpen, addRecentEmoji,\n}) => {\n const [activeTab, setActiveTab] = useState(0);\n const [recentEmojis, setRecentEmojis] = useState([]);\n\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose, undefined, IS_SINGLE_COLUMN_LAYOUT);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, onClose, false, false);\n\n if (!isActivated && isOpen) {\n isActivated = true;\n }\n\n useEffect(() => {\n onLoad();\n }, [onLoad]);\n\n useLayoutEffect(() => {\n if (!IS_SINGLE_COLUMN_LAYOUT) {\n return undefined;\n }\n\n if (isOpen) {\n document.body.classList.add('enable-symbol-menu-transforms');\n document.body.classList.add('is-symbol-menu-open');\n }\n\n return () => {\n if (isOpen) {\n fastRaf(() => {\n document.body.classList.remove('is-symbol-menu-open');\n setTimeout(() => {\n document.body.classList.remove('enable-symbol-menu-transforms');\n }, ANIMATION_DURATION);\n });\n }\n };\n }, [isOpen]);\n\n const recentEmojisRef = useRef(recentEmojis);\n recentEmojisRef.current = recentEmojis;\n useEffect(() => {\n if (!recentEmojisRef.current.length) {\n return;\n }\n\n recentEmojisRef.current.forEach((name) => {\n addRecentEmoji({ emoji: name });\n });\n\n setRecentEmojis([]);\n }, [isOpen, activeTab, addRecentEmoji]);\n\n const handleEmojiSelect = useCallback((emoji: string, name: string) => {\n setRecentEmojis((emojis) => {\n return [...emojis, name];\n });\n\n onEmojiSelect(emoji);\n }, [onEmojiSelect]);\n\n const handleSearch = useCallback((type: 'stickers' | 'gifs') => {\n onClose();\n onSearchOpen(type);\n }, [onClose, onSearchOpen]);\n\n const lang = useLang();\n\n const { canSendStickers, canSendGifs } = allowedAttachmentOptions;\n\n function renderContent(isActive: boolean, isFrom: boolean) {\n switch (activeTab) {\n case SymbolMenuTabs.Emoji:\n return (\n \n );\n case SymbolMenuTabs.Stickers:\n return (\n \n );\n case SymbolMenuTabs.GIFs:\n return (\n \n );\n }\n\n return undefined;\n }\n\n function stopPropagation(event: any) {\n event.stopPropagation();\n }\n\n const content = (\n <>\n
\n {isActivated && (\n \n {renderContent}\n \n )}\n
\n {IS_SINGLE_COLUMN_LAYOUT && (\n \n \n \n )}\n \n \n );\n\n if (IS_SINGLE_COLUMN_LAYOUT) {\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'SymbolMenu mobile-menu',\n transitionClassNames,\n !isLeftColumnShown && 'middle-column-open',\n );\n\n return (\n \n
\n {content}\n
\n
\n );\n }\n\n return (\n \n {content}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n isLeftColumnShown: global.isLeftColumnShown,\n };\n },\n)(SymbolMenu));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { CONTENT_TYPES_FOR_QUICK_UPLOAD } from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { openSystemFilesDialog } from '../../../util/systemFilesDialog';\nimport { IAllowedAttachmentOptions } from '../../../modules/helpers';\nimport useMouseInside from '../../../hooks/useMouseInside';\nimport useLang from '../../../hooks/useLang';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\n\nimport './AttachMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n allowedAttachmentOptions: IAllowedAttachmentOptions;\n onFileSelect: (files: File[], isQuick: boolean) => void;\n onPollCreate: () => void;\n onClose: () => void;\n};\n\nconst AttachMenu: FC = ({\n isOpen, allowedAttachmentOptions, onFileSelect, onPollCreate, onClose,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n\n const handleFileSelect = useCallback((e: Event, isQuick: boolean) => {\n const { files } = e.target as HTMLInputElement;\n\n if (files && files.length > 0) {\n onFileSelect(Array.from(files), isQuick);\n }\n }, [onFileSelect]);\n\n const handleQuickSelect = useCallback(() => {\n openSystemFilesDialog(\n CONTENT_TYPES_FOR_QUICK_UPLOAD,\n (e) => handleFileSelect(e, true),\n );\n }, [handleFileSelect]);\n\n const handleDocumentSelect = useCallback(() => {\n openSystemFilesDialog('*', (e) => handleFileSelect(e, false));\n }, [handleFileSelect]);\n\n const lang = useLang();\n\n const { canAttachMedia, canAttachPolls } = allowedAttachmentOptions;\n\n return (\n \n {/*\n ** Using ternary operator here causes some attributes from first clause\n ** transferring to the fragment content in the second clause\n */}\n {!canAttachMedia && (\n Posting media content is not allowed in this group.\n )}\n {canAttachMedia && (\n <>\n \n {lang('AttachmentMenu.PhotoOrVideo')}\n \n {lang('AttachDocument')}\n \n )}\n {canAttachPolls && (\n {lang('Poll')}\n )}\n \n );\n};\n\nexport default memo(AttachMenu);\n","import React, {\n FC, memo, useEffect, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { STICKER_SIZE_PICKER } from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport { pick } from '../../../util/iteratees';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport Loading from '../../ui/Loading';\nimport StickerButton from '../../common/StickerButton';\n\nimport './StickerTooltip.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onStickerSelect: (sticker: ApiSticker) => void;\n};\n\ntype StateProps = {\n stickers?: ApiSticker[];\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst StickerTooltip: FC = ({\n isOpen,\n onStickerSelect,\n stickers,\n clearStickersForEmoji,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n const prevStickers = usePrevious(stickers, true);\n const displayedStickers = stickers || prevStickers;\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE });\n\n useEffect(() => (isOpen ? captureEscKeyListener(clearStickersForEmoji) : undefined), [isOpen, clearStickersForEmoji]);\n\n const handleMouseEnter = () => {\n document.body.classList.add('no-select');\n };\n\n const handleMouseLeave = () => {\n document.body.classList.remove('no-select');\n };\n\n const className = buildClassName(\n 'StickerTooltip composer-tooltip custom-scroll',\n transitionClassNames,\n !(displayedStickers && displayedStickers.length) && 'hidden',\n );\n\n return (\n \n {shouldRender && displayedStickers ? (\n displayedStickers.map((sticker) => (\n \n ))\n ) : shouldRender ? (\n \n ) : undefined}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { stickers } = global.stickers.forEmoji;\n\n return { stickers };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['clearStickersForEmoji']),\n)(StickerTooltip));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiMessage } from '../../../api/types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport { selectChatMessage, selectCurrentMessageList } from '../../../modules/selectors';\nimport useMouseInside from '../../../hooks/useMouseInside';\n\nimport Menu from '../../ui/Menu';\nimport Button from '../../ui/Button';\n\nimport './BotKeyboardMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n messageId: number;\n onClose: NoneToVoidFunction;\n};\n\ntype StateProps = {\n message?: ApiMessage;\n};\n\ntype DispatchProps = Pick;\n\nconst BotKeyboardMenu: FC = ({\n isOpen, message, onClose, clickInlineButton,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n\n if (!message || !message.keyboardButtons) {\n return undefined;\n }\n\n return (\n \n
\n {message.keyboardButtons.map((row) => (\n
\n {row.map((button) => (\n clickInlineButton({ button })}\n >\n {button.text}\n \n ))}\n
\n ))}\n
\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { messageId }): StateProps => {\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return {};\n }\n\n return { message: selectChatMessage(global, chatId, messageId) };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'clickInlineButton',\n ]),\n)(BotKeyboardMenu));\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport useMouseInside from '../../../hooks/useMouseInside';\nimport useLang from '../../../hooks/useLang';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\n\nimport './CustomSendMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onSilentSend?: NoneToVoidFunction;\n onScheduleSend?: NoneToVoidFunction;\n onClose: NoneToVoidFunction;\n onCloseAnimationEnd?: NoneToVoidFunction;\n};\n\nconst CustomSendMenu: FC = ({\n isOpen, onSilentSend, onScheduleSend, onClose, onCloseAnimationEnd,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n\n const lang = useLang();\n\n return (\n \n {onSilentSend && {lang('SendWithoutSound')}}\n {onScheduleSend && {lang('ScheduleMessage')}}\n \n );\n};\n\nexport default memo(CustomSendMenu);\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { LangCode } from '../../../types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport cycleRestrict from '../../../util/cycleRestrict';\nimport captureKeyboardListeners from '../../../util/captureKeyboardListeners';\nimport findInViewport from '../../../util/findInViewport';\nimport isFullyVisible from '../../../util/isFullyVisible';\nimport fastSmoothScrollHorizontal from '../../../util/fastSmoothScrollHorizontal';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevDuringAnimation from '../../../hooks/usePrevDuringAnimation';\n\nimport Loading from '../../ui/Loading';\nimport EmojiButton from './EmojiButton';\n\nimport './EmojiTooltip.scss';\n\nconst VIEWPORT_MARGIN = 8;\nconst EMOJI_BUTTON_WIDTH = 44;\nconst CLOSE_DURATION = 350;\nconst NO_EMOJI_SELECTED_INDEX = -1;\n\nfunction setItemVisible(index: number, containerRef: Record) {\n const container = containerRef.current!;\n if (!container) {\n return;\n }\n\n const { visibleIndexes, allElements } = findInViewport(\n container,\n '.EmojiButton',\n VIEWPORT_MARGIN,\n true,\n true,\n true,\n );\n\n if (!allElements.length || !allElements[index]) {\n return;\n }\n const first = visibleIndexes[0];\n if (!visibleIndexes.includes(index)\n || (index === first && !isFullyVisible(container, allElements[first], true))) {\n const position = index > visibleIndexes[visibleIndexes.length - 1] ? 'start' : 'end';\n const newLeft = position === 'start' ? index * EMOJI_BUTTON_WIDTH : 0;\n\n fastSmoothScrollHorizontal(container, newLeft);\n }\n}\n\nexport type OwnProps = {\n isOpen: boolean;\n language: LangCode;\n onEmojiSelect: (text: string) => void;\n onClose: NoneToVoidFunction;\n addRecentEmoji: AnyToVoidFunction;\n loadEmojiKeywords: AnyToVoidFunction;\n emojis: Emoji[];\n};\n\nconst EmojiTooltip: FC = ({\n isOpen,\n language,\n emojis,\n onClose,\n onEmojiSelect,\n addRecentEmoji,\n loadEmojiKeywords,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n const listEmojis: Emoji[] = usePrevDuringAnimation(emojis.length ? emojis : undefined, CLOSE_DURATION) || [];\n\n const [selectedIndex, setSelectedIndex] = useState(NO_EMOJI_SELECTED_INDEX);\n\n useEffect(() => {\n loadEmojiKeywords({ language: 'en' });\n if (language !== 'en') {\n loadEmojiKeywords({ language });\n }\n }, [loadEmojiKeywords, language]);\n\n useEffect(() => {\n setSelectedIndex(0);\n }, [emojis]);\n\n useEffect(() => {\n setItemVisible(selectedIndex, containerRef);\n }, [selectedIndex]);\n\n const getSelectedIndex = useCallback((newIndex: number) => {\n if (!emojis.length) {\n return NO_EMOJI_SELECTED_INDEX;\n }\n\n const emojisCount = emojis.length;\n return cycleRestrict(emojisCount, newIndex);\n }, [emojis]);\n\n const handleArrowKey = useCallback((value: number, e: KeyboardEvent) => {\n e.preventDefault();\n setSelectedIndex((index) => (getSelectedIndex(index + value)));\n }, [setSelectedIndex, getSelectedIndex]);\n\n const handleSelectEmoji = useCallback((e: KeyboardEvent) => {\n if (emojis.length && selectedIndex > NO_EMOJI_SELECTED_INDEX) {\n const emoji = emojis[selectedIndex];\n if (emoji) {\n e.preventDefault();\n onEmojiSelect(emoji.native);\n addRecentEmoji({ emoji: emoji.id });\n }\n }\n }, [addRecentEmoji, emojis, onEmojiSelect, selectedIndex]);\n\n useEffect(() => (isOpen ? captureKeyboardListeners({\n onEsc: onClose,\n onLeft: (e: KeyboardEvent) => handleArrowKey(-1, e),\n onRight: (e: KeyboardEvent) => handleArrowKey(1, e),\n onEnter: handleSelectEmoji,\n }) : undefined), [handleArrowKey, handleSelectEmoji, isOpen, onClose]);\n\n const handleMouseEnter = () => {\n document.body.classList.add('no-select');\n };\n\n const handleMouseLeave = () => {\n document.body.classList.remove('no-select');\n };\n\n const className = buildClassName(\n 'EmojiTooltip composer-tooltip custom-scroll-x',\n transitionClassNames,\n );\n\n return (\n \n {shouldRender && listEmojis ? (\n listEmojis.map((emoji, index) => (\n \n ))\n ) : shouldRender ? (\n \n ) : undefined}\n \n );\n};\n\nexport default memo(EmojiTooltip);\n","import React, {\n FC, useMemo, memo, useRef,\n} from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage, ApiUser, ApiChat } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport {\n selectUser,\n selectChatMessages,\n selectChat,\n selectCurrentTextSearch,\n} from '../../modules/selectors';\nimport {\n getMessageSummaryText,\n getChatTitle,\n getUserFullName,\n isChatChannel,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport { orderBy, pick } from '../../util/iteratees';\nimport { MEMO_EMPTY_ARRAY } from '../../util/memo';\nimport useKeyboardListNavigation from '../../hooks/useKeyboardListNavigation';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport ListItem from '../ui/ListItem';\nimport LastMessageMeta from '../common/LastMessageMeta';\nimport Avatar from '../common/Avatar';\n\nimport './RightSearch.scss';\n\nexport type OwnProps = {\n chatId: number;\n threadId: number;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n messagesById?: Record;\n query?: string;\n totalCount?: number;\n foundIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\ninterface Result {\n message: ApiMessage;\n senderUser?: ApiUser;\n senderChat?: ApiChat;\n onClick: NoneToVoidFunction;\n}\n\nconst RightSearch: FC = ({\n chatId,\n threadId,\n onClose,\n isActive,\n chat,\n messagesById,\n query,\n totalCount,\n foundIds,\n searchTextMessagesLocal,\n focusMessage,\n}) => {\n const lang = useLang();\n\n const foundResults = useMemo(() => {\n if (!query || !foundIds || !foundIds.length || !messagesById) {\n return MEMO_EMPTY_ARRAY;\n }\n\n const results = foundIds.map((id) => {\n const message = messagesById[id];\n if (!message) {\n return undefined;\n }\n\n const senderUser = message.senderId ? selectUser(getGlobal(), message.senderId) : undefined;\n\n let senderChat;\n if (chat && isChatChannel(chat)) {\n senderChat = chat;\n } else if (message.forwardInfo) {\n const { isChannelPost, fromChatId } = message.forwardInfo;\n senderChat = isChannelPost && fromChatId ? selectChat(getGlobal(), fromChatId) : undefined;\n } else {\n senderChat = message.senderId ? selectChat(getGlobal(), message.senderId) : undefined;\n }\n\n return {\n message,\n senderUser,\n senderChat,\n onClick: () => focusMessage({ chatId, threadId, messageId: id }),\n };\n }).filter(Boolean) as Result[];\n\n return orderBy(results, ({ message }) => message.date, 'desc');\n }, [chatId, threadId, focusMessage, foundIds, chat, messagesById, query]);\n\n const renderSearchResult = ({\n message, senderUser, senderChat, onClick,\n }: Result) => {\n const title = senderChat ? getChatTitle(lang, senderChat) : getUserFullName(senderUser);\n const text = getMessageSummaryText(lang, message);\n\n return (\n \n \n
\n
\n

{title && renderText(title)}

\n \n
\n
\n {renderText(text, ['emoji', 'highlight'], { highlight: query })}\n
\n
\n \n );\n };\n\n useHistoryBack(isActive, onClose);\n\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const handleKeyDown = useKeyboardListNavigation(containerRef, true, (index) => {\n if (foundResults && foundResults[index]) {\n foundResults[index].onClick();\n }\n }, '.ListItem-button', true);\n\n return (\n \n

\n {!query ? (\n lang('lng_dlg_search_for_messages')\n ) : (totalCount === 0 || !foundResults.length) ? (\n lang('lng_search_no_results')\n ) : totalCount === 1 ? (\n '1 message found'\n ) : (\n `${(foundResults.length && (totalCount || foundResults.length))} messages found`\n )}\n

\n {foundResults.map(renderSearchResult)}\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const messagesById = chat && selectChatMessages(global, chat.id);\n if (!chat || !messagesById) {\n return {};\n }\n\n const { query, results } = selectCurrentTextSearch(global) || {};\n const { totalCount, foundIds } = results || {};\n\n return {\n chat,\n messagesById,\n query,\n totalCount,\n foundIds,\n };\n },\n (global, actions): DispatchProps => pick(actions, ['searchTextMessagesLocal', 'focusMessage']),\n)(RightSearch));\n","import React, {\n FC, useEffect, memo, useMemo, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiStickerSet } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\nimport { ObserveFn } from '../../hooks/useIntersectionObserver';\n\nimport { STICKER_SIZE_SEARCH } from '../../config';\nimport { pick } from '../../util/iteratees';\nimport { selectShouldLoopStickers, selectStickerSet } from '../../modules/selectors';\nimport useFlag from '../../hooks/useFlag';\nimport useOnChange from '../../hooks/useOnChange';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport StickerButton from '../common/StickerButton';\nimport StickerSetModal from '../common/StickerSetModal.async';\nimport Spinner from '../ui/Spinner';\n\ntype OwnProps = {\n stickerSetId: string;\n observeIntersection: ObserveFn;\n isSomeModalOpen: boolean;\n onModalToggle: (isOpen: boolean) => void;\n};\n\ntype StateProps = {\n set?: ApiStickerSet;\n shouldPlay?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst STICKERS_TO_DISPLAY = 5;\n\nconst StickerSetResult: FC = ({\n stickerSetId, observeIntersection, set, shouldPlay,\n loadStickers, toggleStickerSet, isSomeModalOpen, onModalToggle,\n}) => {\n const lang = useLang();\n const isAdded = set && Boolean(set.installedDate);\n const areStickersLoaded = Boolean(set && set.stickers);\n\n const [isModalOpen, openModal, closeModal] = useFlag();\n\n useOnChange(() => {\n onModalToggle(isModalOpen);\n }, [isModalOpen, onModalToggle]);\n\n const displayedStickers = useMemo(() => {\n if (!set) {\n return [];\n }\n\n const coverStickerIds = (set.covers || []).map(({ id }) => id);\n const otherStickers = set.stickers ? set.stickers.filter(({ id }) => !coverStickerIds.includes(id)) : [];\n\n return [...set.covers || [], ...otherStickers].slice(0, STICKERS_TO_DISPLAY);\n }, [set]);\n\n useEffect(() => {\n // Featured stickers are initialized with one sticker in collection (cover of SickerSet)\n if (!areStickersLoaded && displayedStickers.length < STICKERS_TO_DISPLAY) {\n loadStickers({ stickerSetId });\n }\n }, [areStickersLoaded, displayedStickers.length, loadStickers, stickerSetId]);\n\n const handleAddClick = useCallback(() => {\n toggleStickerSet({ stickerSetId });\n }, [toggleStickerSet, stickerSetId]);\n\n if (!set) {\n return undefined;\n }\n\n const canRenderStickers = displayedStickers.length > 0;\n\n return (\n
\n
\n
\n

{set.title}

\n

{lang('Stickers', set.count, 'i')}

\n
\n \n {lang(isAdded ? 'Stickers.Installed' : 'Stickers.Install')}\n \n
\n
\n {!canRenderStickers && }\n {canRenderStickers && displayedStickers.map((sticker) => (\n \n ))}\n
\n {canRenderStickers && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { stickerSetId }): StateProps => {\n return {\n set: selectStickerSet(global, stickerSetId),\n shouldPlay: selectShouldLoopStickers(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadStickers', 'toggleStickerSet']),\n)(StickerSetResult));\n","import React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport { throttle } from '../../util/schedulers';\nimport { selectCurrentStickerSearch } from '../../modules/selectors';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Loading from '../ui/Loading';\nimport StickerSetResult from './StickerSetResult';\n\nimport './StickerSearch.scss';\n\ntype OwnProps = {\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n query?: string;\n featuredIds?: string[];\n resultIds?: string[];\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst StickerSearch: FC = ({\n onClose,\n isActive,\n query,\n featuredIds,\n resultIds,\n loadFeaturedStickers,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const lang = useLang();\n\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE });\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadFeaturedStickers();\n });\n });\n\n useHistoryBack(isActive, onClose);\n\n function renderContent() {\n if (query === undefined) {\n return undefined;\n }\n\n if (!query && featuredIds) {\n return featuredIds.map((id) => (\n \n ));\n }\n\n if (resultIds) {\n if (!resultIds.length) {\n return

Nothing found.

;\n }\n\n return resultIds.map((id) => (\n \n ));\n }\n\n return ;\n }\n\n return (\n
\n {renderContent()}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const currentSearch = selectCurrentStickerSearch(global);\n const { query, resultIds } = currentSearch || {};\n const { featured } = global.stickers;\n\n return {\n query,\n featuredIds: featured.setIds,\n resultIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFeaturedStickers']),\n)(StickerSearch));\n","import React, {\n FC, memo, useRef, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, ApiVideo } from '../../api/types';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport {\n selectCurrentGifSearch,\n selectChat,\n selectIsChatWithBot,\n selectCurrentMessageList,\n} from '../../modules/selectors';\nimport { getAllowedAttachmentOptions } from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport GifButton from '../common/GifButton';\nimport Loading from '../ui/Loading';\n\nimport './GifSearch.scss';\n\ntype OwnProps = {\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n query?: string;\n results?: ApiVideo[];\n chat?: ApiChat;\n isChatWithBot?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst PRELOAD_BACKWARDS = 96; // GIF Search bot results are multiplied by 24\nconst INTERSECTION_DEBOUNCE = 300;\n\nconst GifSearch: FC = ({\n onClose,\n isActive,\n query,\n results,\n chat,\n isChatWithBot,\n searchMoreGifs,\n sendMessage,\n setGifSearchQuery,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, debounceMs: INTERSECTION_DEBOUNCE });\n\n const { canSendGifs } = getAllowedAttachmentOptions(chat, isChatWithBot);\n\n const handleGifClick = useCallback((gif: ApiVideo) => {\n if (canSendGifs) {\n sendMessage({ gif });\n }\n\n if (IS_TOUCH_ENV) {\n setGifSearchQuery({ query: undefined });\n }\n }, [canSendGifs, sendMessage, setGifSearchQuery]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n function renderContent() {\n if (query === undefined) {\n return undefined;\n }\n\n if (!results) {\n return (\n \n );\n }\n\n if (!results.length) {\n return (\n

{lang('NoGIFsFound')}

\n );\n }\n\n return results.map((gif) => (\n \n ));\n }\n\n const hasResults = Boolean(query !== undefined && results && results.length);\n\n return (\n
\n \n {renderContent()}\n \n\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const currentSearch = selectCurrentGifSearch(global);\n const { query, results } = currentSearch || {};\n const { chatId } = selectCurrentMessageList(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n const isChatWithBot = chat ? selectIsChatWithBot(global, chat) : undefined;\n\n return {\n query,\n results,\n chat,\n isChatWithBot,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['searchMoreGifs', 'sendMessage', 'setGifSearchQuery']),\n)(GifSearch));\n","import React, {\n FC, useCallback, useState, memo, useEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiChat,\n ApiMessage,\n ApiPollAnswer,\n ApiPollResult,\n} from '../../api/types';\nimport { GlobalActions } from '../../global/types';\nimport { pick } from '../../util/iteratees';\nimport usePrevious from '../../hooks/usePrevious';\nimport useLang from '../../hooks/useLang';\n\nimport ShowMoreButton from '../ui/ShowMoreButton';\nimport Loading from '../ui/Loading';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from '../common/PrivateChatInfo';\n\nimport './PollAnswerResults.scss';\n\ntype OwnProps = {\n chat: ApiChat;\n message: ApiMessage;\n answer: ApiPollAnswer;\n answerVote: ApiPollResult;\n totalVoters: number;\n};\n\ntype StateProps = {\n voters?: number[];\n offset: string;\n};\n\ntype DispatchProps = Pick;\n\nconst INITIAL_LIMIT = 4;\nconst VIEW_MORE_LIMIT = 50;\n\nconst PollAnswerResults: FC = ({\n chat,\n message,\n answer,\n answerVote,\n totalVoters,\n voters,\n offset,\n loadPollOptionResults,\n openChat,\n closePollResults,\n}) => {\n const prevVotersCount = usePrevious(answerVote.votersCount);\n const [isLoading, setIsLoading] = useState(true);\n const areVotersLoaded = Boolean(voters);\n const { option, text } = answer;\n const lang = useLang();\n\n useEffect(() => {\n // For update when new votes arrive or when the user takes back his vote\n if (!areVotersLoaded || prevVotersCount !== answerVote.votersCount) {\n loadPollOptionResults({\n chat, messageId: message.id, option, offset, limit: INITIAL_LIMIT, shouldResetVoters: true,\n });\n }\n // eslint-disable-next-line\n }, [answerVote.votersCount, areVotersLoaded]);\n\n const handleViewMoreClick = useCallback(() => {\n setIsLoading(true);\n loadPollOptionResults({\n chat, messageId: message.id, option, offset, limit: VIEW_MORE_LIMIT,\n });\n }, [chat, loadPollOptionResults, message.id, offset, option]);\n\n useEffect(() => {\n setIsLoading(false);\n }, [voters]);\n\n const handleMemberClick = useCallback((id: number) => {\n openChat({ id });\n closePollResults();\n }, [closePollResults, openChat]);\n\n function renderViewMoreButton() {\n const leftVotersCount = answerVote.votersCount - voters!.length;\n\n return answerVote.votersCount > INITIAL_LIMIT && leftVotersCount > 0 && (\n \n );\n }\n\n return (\n
\n
\n {voters\n ? voters.map((id) => (\n handleMemberClick(id)}\n >\n \n \n ))\n : }\n {voters && renderViewMoreButton()}\n
\n
\n {text}\n \n {getPercentage(answerVote.votersCount, totalVoters)}%\n \n
\n
\n );\n};\n\nfunction getPercentage(value: number, total: number) {\n return total > 0 ? ((value / total) * 100).toFixed() : 0;\n}\n\nexport default memo(withGlobal(\n (global, { answer }: OwnProps): StateProps => {\n const { voters, offsets } = global.pollResults;\n\n return {\n voters: voters && voters[answer.option],\n offset: (offsets && offsets[answer.option]) || '',\n };\n },\n (global, actions): DispatchProps => pick(actions, ['loadPollOptionResults', 'openChat', 'closePollResults']),\n)(PollAnswerResults));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage, ApiChat } from '../../api/types';\nimport { selectChat, selectChatMessage } from '../../modules/selectors';\nimport { buildCollectionByKey } from '../../util/iteratees';\nimport { getMessagePoll } from '../../modules/helpers';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport PollAnswerResults from './PollAnswerResults';\nimport Loading from '../ui/Loading';\n\nimport './PollResults.scss';\n\ntype OwnProps = {\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n message?: ApiMessage;\n lastSyncTime?: number;\n};\n\nconst PollResults: FC = ({\n onClose,\n isActive,\n chat,\n message,\n lastSyncTime,\n}) => {\n const lang = useLang();\n useHistoryBack(isActive, onClose);\n\n if (!message || !chat) {\n return ;\n }\n\n const { summary, results } = getMessagePoll(message)!;\n if (!results.results) {\n return undefined;\n }\n\n const resultsByOption = buildCollectionByKey(results.results, 'option');\n\n return (\n
\n

{summary.question}

\n
\n {lastSyncTime && summary.answers.map((answer) => (\n \n ))}\n {!lastSyncTime && }\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n pollResults: { chatId, messageId },\n lastSyncTime,\n } = global;\n\n if (!chatId || !messageId) {\n return {};\n }\n\n const chat = selectChat(global, chatId);\n const message = selectChatMessage(global, chatId, messageId);\n\n return {\n chat,\n message,\n lastSyncTime,\n };\n },\n)(PollResults));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport {\n selectChat, selectNotifyExceptions, selectNotifySettings, selectUser,\n} from '../../../modules/selectors';\nimport { selectIsChatMuted } from '../../../modules/helpers';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport InputText from '../../ui/InputText';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\nimport './Management.scss';\n\ntype OwnProps = {\n userId: number;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n user?: ApiUser;\n chat: ApiChat;\n progress?: ManagementProgress;\n isMuted?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ERROR_FIRST_NAME_MISSING = 'Please provide first name';\n\nconst ManageUser: FC = ({\n userId,\n user,\n chat,\n progress,\n isMuted,\n updateContact,\n deleteUser,\n deleteHistory,\n closeManagement,\n openChat,\n onClose,\n isActive,\n}) => {\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [error, setError] = useState();\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n const currentFirstName = user ? (user.firstName || '') : '';\n const currentLastName = user ? (user.lastName || '') : '';\n\n const [firstName, setFirstName] = useState(currentFirstName);\n const [lastName, setLastName] = useState(currentLastName);\n const [isNotificationsEnabled, setIsNotificationsEnabled] = useState(!isMuted);\n\n useEffect(() => {\n setIsNotificationsEnabled(!isMuted);\n }, [isMuted]);\n\n useEffect(() => {\n setIsProfileFieldsTouched(false);\n closeDeleteDialog();\n }, [closeDeleteDialog, userId]);\n\n useEffect(() => {\n setFirstName(currentFirstName);\n setLastName(currentLastName);\n }, [currentFirstName, currentLastName, user]);\n\n useEffect(() => {\n if (progress === ManagementProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setError(undefined);\n closeDeleteDialog();\n }\n }, [closeDeleteDialog, progress]);\n\n const handleFirstNameChange = useCallback((e: ChangeEvent) => {\n setFirstName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleLastNameChange = useCallback((e: ChangeEvent) => {\n setLastName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleNotificationChange = useCallback((e: ChangeEvent) => {\n setIsNotificationsEnabled(e.target.checked);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleProfileSave = useCallback(() => {\n const trimmedFirstName = firstName.trim();\n const trimmedLastName = lastName.trim();\n\n if (!trimmedFirstName.length) {\n setError(ERROR_FIRST_NAME_MISSING);\n }\n\n updateContact({\n userId,\n isMuted: !isNotificationsEnabled,\n firstName: trimmedFirstName,\n lastName: trimmedLastName,\n });\n }, [firstName, lastName, updateContact, userId, isNotificationsEnabled]);\n\n const handleDeleteContact = useCallback(() => {\n deleteHistory({\n chatId: chat.id,\n shouldDeleteForAll: false,\n });\n deleteUser({ userId });\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [chat.id, closeDeleteDialog, closeManagement, deleteHistory, deleteUser, openChat, userId]);\n\n if (!user) {\n return undefined;\n }\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n \n \n \n
\n \n
\n
\n
\n \n {lang('DeleteContact')}\n \n
\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { userId }): StateProps => {\n const user = selectUser(global, userId);\n const chat = selectChat(global, userId)!;\n const { progress } = global.management;\n const isMuted = selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global));\n\n return {\n user, chat, progress, isMuted,\n };\n },\n (global, actions): DispatchProps => pick(actions, [\n 'updateContact', 'deleteUser', 'closeManagement', 'openChat', 'deleteHistory',\n ]),\n)(ManageUser));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens, ManagementProgress } from '../../../types';\nimport { ApiChat, ApiChatBannedRights, ApiMediaFormat } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { getChatAvatarHash, getHasAdminRight, isChatBasicGroup } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport { selectChat } from '../../../modules/selectors';\nimport { formatInteger } from '../../../util/textFormat';\nimport { pick } from '../../../util/iteratees';\nimport renderText from '../../common/helpers/renderText';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport InputText from '../../ui/InputText';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport Spinner from '../../ui/Spinner';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\nimport './Management.scss';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat: ApiChat;\n progress?: ManagementProgress;\n isBasicGroup: boolean;\n hasLinkedChannel: boolean;\n canChangeInfo?: boolean;\n canBanUsers?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst GROUP_TITLE_EMPTY = 'Group title can\\'t be empty';\n\n// Some checkboxes control multiple rights, and some rights are not controlled from Permissions screen,\n// so we need to define the amount manually\nconst TOTAL_PERMISSIONS_COUNT = 8;\n\nconst ManageGroup: FC = ({\n chatId,\n chat,\n progress,\n isBasicGroup,\n hasLinkedChannel,\n canChangeInfo,\n canBanUsers,\n onScreenSelect,\n togglePreHistoryHidden,\n updateChat,\n deleteChat,\n leaveChannel,\n deleteChannel,\n closeManagement,\n openChat,\n onClose,\n isActive,\n}) => {\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const currentTitle = chat.title;\n const currentAbout = chat.fullInfo ? (chat.fullInfo.about || '') : '';\n\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [title, setTitle] = useState(currentTitle);\n const [about, setAbout] = useState(currentAbout);\n const [photo, setPhoto] = useState();\n const [error, setError] = useState();\n const imageHash = getChatAvatarHash(chat);\n const currentAvatarBlobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl);\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n useEffect(() => {\n if (progress === ManagementProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setError(undefined);\n }\n }, [progress]);\n\n const handleClickEditType = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatPrivacyType);\n }, [onScreenSelect]);\n\n const handleClickDiscussion = useCallback(() => {\n onScreenSelect(ManagementScreens.Discussion);\n }, [onScreenSelect]);\n\n const handleClickPermissions = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupPermissions);\n }, [onScreenSelect]);\n\n const handleClickAdministrators = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }, [onScreenSelect]);\n\n const handleSetPhoto = useCallback((file: File) => {\n setPhoto(file);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleTitleChange = useCallback((e: ChangeEvent) => {\n setTitle(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleAboutChange = useCallback((e: ChangeEvent) => {\n setAbout(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleUpdateGroup = useCallback(() => {\n const trimmedTitle = title.trim();\n const trimmedAbout = about.trim();\n\n if (!trimmedTitle.length) {\n setError(GROUP_TITLE_EMPTY);\n return;\n }\n\n updateChat({\n chatId,\n title: trimmedTitle,\n about: trimmedAbout,\n photo,\n });\n }, [about, chatId, photo, title, updateChat]);\n\n const handleClickMembers = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupMembers);\n }, [onScreenSelect]);\n\n const handleTogglePreHistory = useCallback(() => {\n if (!chat.fullInfo) {\n return;\n }\n\n const { isPreHistoryHidden } = chat.fullInfo;\n\n togglePreHistoryHidden({ chatId: chat.id, isEnabled: !isPreHistoryHidden });\n }, [chat, togglePreHistoryHidden]);\n\n const enabledPermissionsCount = useMemo(() => {\n if (!chat.defaultBannedRights) {\n return 0;\n }\n\n let totalCount = [\n 'sendMessages',\n 'sendMedia',\n 'embedLinks',\n 'sendPolls',\n 'changeInfo',\n 'inviteUsers',\n 'pinMessages',\n ].filter(\n (key) => !chat.defaultBannedRights![key as keyof ApiChatBannedRights],\n ).length;\n\n const { sendStickers, sendGifs } = chat.defaultBannedRights;\n\n // These two rights are controlled with a single checkbox\n if (!sendStickers && !sendGifs) {\n totalCount += 1;\n }\n\n return totalCount;\n }, [chat]);\n\n const adminsCount = (chat.fullInfo && chat.fullInfo.adminMembers && chat.fullInfo.adminMembers.length) || 0;\n\n const handleDeleteGroup = useCallback(() => {\n if (isBasicGroup) {\n deleteChat({ chatId: chat.id });\n } else if (!chat.isCreator) {\n leaveChannel({ chatId: chat.id });\n } else {\n deleteChannel({ chatId: chat.id });\n }\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [\n isBasicGroup, chat.isCreator, chat.id,\n closeDeleteDialog, closeManagement, leaveChannel, deleteChannel, deleteChat, openChat,\n ]);\n\n if (chat.isRestricted) {\n return undefined;\n }\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n \n \n \n {chat.isCreator && (\n \n {lang('GroupType')}\n {chat.username ? lang('TypePublic') : lang('TypePrivate')}\n \n )}\n {hasLinkedChannel && (\n \n {lang('LinkedChannel')}\n {lang('DiscussionUnlink')}\n \n )}\n \n {lang('ChannelPermissions')}\n \n {enabledPermissionsCount}/{TOTAL_PERMISSIONS_COUNT}\n \n \n \n {lang('ChannelAdministrators')}\n {formatInteger(adminsCount)}\n \n
\n
\n \n {lang('GroupMembers')}\n {formatInteger(chat.membersCount!)}\n \n\n {chat.fullInfo && (\n
\n \n
\n )}\n
\n
\n \n {lang('DeleteMega')}\n \n
\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { progress } = global.management;\n const hasLinkedChannel = Boolean(chat.fullInfo && chat.fullInfo.linkedChatId);\n\n return {\n chat,\n progress,\n isBasicGroup: isChatBasicGroup(chat),\n hasLinkedChannel,\n canChangeInfo: getHasAdminRight(chat, 'changeInfo'),\n canBanUsers: getHasAdminRight(chat, 'banUsers'),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'togglePreHistoryHidden', 'updateChat', 'closeManagement',\n 'leaveChannel', 'deleteChannel', 'deleteChat', 'openChat',\n ]),\n)(ManageGroup));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens } from '../../../types';\nimport { ApiChat, ApiChatBannedRights, ApiChatMember } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport useLang from '../../../hooks/useLang';\nimport { selectChat } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n currentUserId?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst FLOATING_BUTTON_ANIMATION_TIMEOUT_MS = 250;\n\nfunction getLangKeyForBannedRightKey(key: string) {\n switch (key) {\n case 'sendMessages':\n return 'UserRestrictionsNoSend';\n case 'sendMedia':\n return 'UserRestrictionsNoSendMedia';\n case 'sendStickers':\n return 'UserRestrictionsNoSendStickers';\n case 'embedLinks':\n return 'UserRestrictionsNoEmbedLinks';\n case 'sendPolls':\n return 'UserRestrictionsNoSendPolls';\n case 'changeInfo':\n return 'UserRestrictionsNoChangeInfo';\n case 'inviteUsers':\n return 'UserRestrictionsInviteUsers';\n case 'pinMessages':\n return 'UserRestrictionsPinMessages';\n default:\n return undefined;\n }\n}\n\nconst ManageGroupPermissions: FC = ({\n onScreenSelect,\n onChatMemberSelect,\n chat,\n currentUserId,\n updateChatDefaultBannedRights,\n onClose,\n isActive,\n}) => {\n const [permissions, setPermissions] = useState({});\n const [havePermissionChanged, setHavePermissionChanged] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n const handleRemovedUsersClick = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupRemovedUsers);\n }, [onScreenSelect]);\n\n const handleAddExceptionClick = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupUserPermissionsCreate);\n }, [onScreenSelect]);\n\n const handleExceptionMemberClick = useCallback((member: ApiChatMember) => {\n onChatMemberSelect(member.userId, member.promotedByUserId === currentUserId);\n onScreenSelect(ManagementScreens.GroupUserPermissions);\n }, [currentUserId, onChatMemberSelect, onScreenSelect]);\n\n useEffect(() => {\n setPermissions((chat && chat.defaultBannedRights) || {});\n setHavePermissionChanged(false);\n setTimeout(() => {\n setIsLoading(false);\n }, FLOATING_BUTTON_ANIMATION_TIMEOUT_MS);\n }, [chat]);\n\n const handlePermissionChange = useCallback((e: React.ChangeEvent) => {\n const { name } = e.target;\n\n function getUpdatedPermissionValue(value: true | undefined) {\n return value ? undefined : true;\n }\n\n setPermissions((p) => ({\n ...p,\n [name]: getUpdatedPermissionValue(p[name as keyof ApiChatBannedRights]),\n ...(name === 'sendStickers' && {\n sendGifs: getUpdatedPermissionValue(p[name]),\n }),\n }));\n setHavePermissionChanged(true);\n }, []);\n\n const handleSavePermissions = useCallback(() => {\n if (!chat) {\n return;\n }\n\n setIsLoading(true);\n updateChatDefaultBannedRights({ chatId: chat.id, bannedRights: permissions });\n }, [chat, permissions, updateChatDefaultBannedRights]);\n\n const removedUsersCount = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.kickedMembers) {\n return 0;\n }\n\n return chat.fullInfo.kickedMembers.length;\n }, [chat]);\n\n const exceptionMembers = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.members) {\n return [];\n }\n\n return chat.fullInfo.members.filter(({ bannedRights }) => !!bannedRights);\n }, [chat]);\n\n const getMemberExceptions = useCallback((member: ApiChatMember) => {\n const { bannedRights } = member;\n if (!bannedRights || !chat) {\n return undefined;\n }\n\n const { defaultBannedRights } = chat;\n\n return Object.keys(bannedRights).reduce((result, key) => {\n if (\n !bannedRights[key as keyof ApiChatBannedRights]\n || (defaultBannedRights && defaultBannedRights[key as keyof ApiChatBannedRights])\n || key === 'sendInline' || key === 'viewMessages' || key === 'sendGames'\n ) {\n return result;\n }\n\n const langKey = getLangKeyForBannedRightKey(key);\n\n if (!langKey) {\n return result;\n }\n\n const translatedString = lang(langKey);\n\n return `${result}${!result.length ? translatedString : `, ${translatedString}`}`;\n }, '');\n }, [chat, lang]);\n\n return (\n
\n
\n
\n

{lang('ChannelPermissionsHeader')}

\n\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n
\n \n {lang('ChannelBlockedUsers')}\n {removedUsersCount}\n \n
\n\n
\n

{lang('PrivacyExceptions')}

\n\n \n {lang('ChannelAddException')}\n \n\n {exceptionMembers.map((member) => (\n handleExceptionMemberClick(member)}\n >\n \n \n ))}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n\n return { chat, currentUserId: global.currentUserId };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatDefaultBannedRights']),\n)(ManageGroupPermissions));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatMember, ApiUser } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { selectChat } from '../../../modules/selectors';\nimport { getUserFullName } from '../../../modules/helpers';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n usersById: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupRemovedUsers: FC = ({\n chat,\n usersById,\n updateChatMemberBannedRights,\n onClose,\n isActive,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n const removedMembers = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.kickedMembers) {\n return [];\n }\n\n return chat.fullInfo.kickedMembers;\n }, [chat]);\n\n const getRemovedBy = useCallback((member: ApiChatMember) => {\n if (!member.kickedByUserId) {\n return undefined;\n }\n\n const kickedByUser = usersById[member.kickedByUserId];\n if (!kickedByUser) {\n return undefined;\n }\n\n return lang('UserRemovedBy', getUserFullName(kickedByUser));\n }, [lang, usersById]);\n\n const getContextActions = useCallback((member: ApiChatMember) => {\n if (!chat) {\n return undefined;\n }\n\n return [{\n title: lang('Unblock'),\n icon: 'delete',\n destructive: true,\n handler: () => updateChatMemberBannedRights({\n chatId: chat.id,\n userId: member.userId,\n bannedRights: {},\n }),\n }];\n }, [lang, chat, updateChatMemberBannedRights]);\n\n return (\n
\n
\n
\n

{lang('NoBlockedGroup2')}

\n\n {removedMembers.map((member) => (\n \n \n \n ))}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { byId: usersById } = global.users;\n\n return { chat, usersById };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatMemberBannedRights']),\n)(ManageGroupRemovedUsers));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ManagementScreens, ManagementProgress } from '../../../types';\nimport { ApiChat, ApiMediaFormat } from '../../../api/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { getChatAvatarHash, getHasAdminRight } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useLang from '../../../hooks/useLang';\nimport { selectChat } from '../../../modules/selectors';\n\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport InputText from '../../ui/InputText';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport Spinner from '../../ui/Spinner';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\nimport useFlag from '../../../hooks/useFlag';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport './Management.scss';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat: ApiChat;\n progress?: ManagementProgress;\n isSignaturesShown: boolean;\n canChangeInfo?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst CHANNEL_TITLE_EMPTY = 'Channel title can\\'t be empty';\n\nconst ManageChannel: FC = ({\n chatId,\n chat,\n progress,\n isSignaturesShown,\n canChangeInfo,\n onScreenSelect,\n updateChat,\n toggleSignatures,\n closeManagement,\n leaveChannel,\n deleteChannel,\n openChat,\n onClose,\n isActive,\n}) => {\n const currentTitle = chat ? (chat.title || '') : '';\n const currentAbout = chat && chat.fullInfo ? (chat.fullInfo.about || '') : '';\n const hasLinkedChat = chat && chat.fullInfo && chat.fullInfo.linkedChatId;\n\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [title, setTitle] = useState(currentTitle);\n const [about, setAbout] = useState(currentAbout);\n const [photo, setPhoto] = useState();\n const [error, setError] = useState();\n const imageHash = chat && getChatAvatarHash(chat);\n const currentAvatarBlobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl);\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n useEffect(() => {\n if (progress === ManagementProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setError(undefined);\n }\n }, [progress]);\n\n const adminsCount = (chat && chat.fullInfo && chat.fullInfo.adminMembers && chat.fullInfo.adminMembers.length) || 0;\n\n const handleClickEditType = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatPrivacyType);\n }, [onScreenSelect]);\n\n const handleClickDiscussion = useCallback(() => {\n onScreenSelect(ManagementScreens.Discussion);\n }, [onScreenSelect]);\n\n const handleClickAdministrators = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }, [onScreenSelect]);\n\n const handleSetPhoto = useCallback((file: File) => {\n setPhoto(file);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleTitleChange = useCallback((e: ChangeEvent) => {\n setTitle(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleAboutChange = useCallback((e: ChangeEvent) => {\n setAbout(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleUpdateChannel = useCallback(() => {\n const trimmedTitle = title.trim();\n const trimmedAbout = about.trim();\n\n if (!trimmedTitle.length) {\n setError(CHANNEL_TITLE_EMPTY);\n return;\n }\n\n updateChat({\n chatId,\n title: trimmedTitle,\n about: trimmedAbout,\n photo,\n });\n }, [about, chatId, photo, title, updateChat]);\n\n const handleToggleSignatures = useCallback(() => {\n toggleSignatures({ chatId, isEnabled: !isSignaturesShown });\n }, [chatId, isSignaturesShown, toggleSignatures]);\n\n const handleClickSubscribers = useCallback(() => {\n onScreenSelect(ManagementScreens.ChannelSubscribers);\n }, [onScreenSelect]);\n\n\n const handleDeleteChannel = useCallback(() => {\n if (chat.isCreator) {\n deleteChannel({ chatId: chat.id });\n } else {\n leaveChannel({ chatId: chat.id });\n }\n\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [chat.isCreator, chat.id, closeDeleteDialog, closeManagement, leaveChannel, deleteChannel, openChat]);\n\n if (chat.isRestricted) {\n return undefined;\n }\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n \n \n \n {chat.isCreator && (\n \n {lang('ChannelType')}\n {chat.username ? lang('TypePublic') : lang('TypePrivate')}\n \n )}\n \n {lang('Discussion')}\n {hasLinkedChat ? lang('DiscussionUnlink') : lang('Add')}\n \n \n {lang('ChannelAdministrators')}\n {adminsCount}\n \n
\n \n
\n
\n
\n \n {lang('ChannelSubscribers')}\n {lang('Subscribers', chat.membersCount!, 'i')}\n \n
\n
\n \n {chat.isCreator ? lang('ChannelDelete') : lang('LeaveChannel')}\n \n
\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { progress } = global.management;\n const isSignaturesShown = Boolean(chat && chat.isSignaturesShown);\n\n return {\n chat,\n progress,\n isSignaturesShown,\n canChangeInfo: getHasAdminRight(chat, 'changeInfo'),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'toggleSignatures', 'updateChat', 'closeManagement', 'leaveChannel', 'deleteChannel', 'openChat',\n ]),\n)(ManageChannel));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\nimport { selectChat, selectManagement } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport { isChatChannel } from '../../../modules/helpers';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport SafeLink from '../../common/SafeLink';\nimport ListItem from '../../ui/ListItem';\nimport RadioGroup from '../../ui/RadioGroup';\nimport Loading from '../../ui/Loading';\nimport Spinner from '../../ui/Spinner';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport UsernameInput from '../../common/UsernameInput';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype PrivacyType = 'private' | 'public';\n\ntype OwnProps = {\n chatId: number;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat: ApiChat;\n isChannel: boolean;\n progress?: ManagementProgress;\n isUsernameAvailable?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageChatPrivacyType: FC = ({\n chat,\n onClose,\n isActive,\n isChannel,\n progress,\n isUsernameAvailable,\n checkPublicLink,\n updatePublicLink,\n updatePrivateLink,\n}) => {\n const isPublic = Boolean(chat.username);\n const privateLink = chat.fullInfo && chat.fullInfo.inviteLink;\n\n const [privacyType, setPrivacyType] = useState(isPublic ? 'public' : 'private');\n const [username, setUsername] = useState();\n const [isRevokeConfirmDialogOpen, openRevokeConfirmDialog, closeRevokeConfirmDialog] = useFlag();\n\n const canUpdate = (\n (privacyType === 'public' && username && isUsernameAvailable)\n || (privacyType === 'private' && isPublic)\n );\n\n useHistoryBack(isActive, onClose);\n\n useEffect(() => {\n if (privacyType && !privateLink) {\n updatePrivateLink();\n }\n }, [privacyType, privateLink, updatePrivateLink]);\n\n const handleOptionChange = useCallback((value: string) => {\n setPrivacyType(value as PrivacyType);\n }, []);\n\n const handleSave = useCallback(() => {\n updatePublicLink({ username: privacyType === 'public' ? username : '' });\n }, [privacyType, updatePublicLink, username]);\n\n const handleRevokePrivateLink = useCallback(() => {\n closeRevokeConfirmDialog();\n updatePrivateLink();\n }, [closeRevokeConfirmDialog, updatePrivateLink]);\n\n const lang = useLang();\n const langPrefix1 = isChannel ? 'Channel' : 'Mega';\n const langPrefix2 = isChannel ? 'Channel' : 'Group';\n\n const options = [\n { value: 'private', label: lang(`${langPrefix1}Private`), subLabel: lang(`${langPrefix1}PrivateInfo`) },\n { value: 'public', label: lang(`${langPrefix1}Public`), subLabel: lang(`${langPrefix1}PublicInfo`) },\n ];\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n

{lang(`${langPrefix2}Type`)}

\n \n
\n {privacyType === 'private' ? (\n
\n {privateLink ? (\n <>\n \n

\n {lang(`${langPrefix1}PrivateLinkHelp`)}\n

\n\n \n {lang('RevokeLink')}\n \n \n \n ) : (\n \n )}\n
\n ) : (\n
\n \n

\n {lang(`${langPrefix2}.Username.CreatePublicLinkHelp`)}\n

\n
\n )}\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { isUsernameAvailable } = selectManagement(global, chatId)!;\n\n return {\n chat,\n isChannel: isChatChannel(chat),\n progress: global.management.progress,\n isUsernameAvailable,\n };\n },\n (setGlobal, actions) => pick(actions, [\n 'checkPublicLink', 'updatePublicLink', 'updatePrivateLink',\n ]),\n)(ManageChatPrivacyType));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\n\nimport { STICKER_SIZE_DISCUSSION_GROUPS } from '../../../config';\nimport { selectChat } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport getAnimationData from '../../common/helpers/animatedAssets';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport NothingFound from '../../common/NothingFound';\nimport GroupChatInfo from '../../common/GroupChatInfo';\nimport AnimatedSticker from '../../common/AnimatedSticker';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\nimport useFlag from '../../../hooks/useFlag';\nimport renderText from '../../common/helpers/renderText';\nimport Avatar from '../../common/Avatar';\nimport { isChatChannel } from '../../../modules/helpers';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n chatsByIds: Record;\n linkedChat?: ApiChat;\n forDiscussionIds?: number[];\n isChannel?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageDiscussion: FC = ({\n chat,\n onClose,\n isActive,\n chatId,\n chatsByIds,\n linkedChat,\n forDiscussionIds,\n isChannel,\n onScreenSelect,\n loadGroupsForDiscussion,\n linkDiscussionGroup,\n unlinkDiscussionGroup,\n}) => {\n const [linkedGroupId, setLinkedGroupId] = useState();\n const [animationData, setAnimationData] = useState>();\n const [isAnimationLoaded, setIsAnimationLoaded] = useState(false);\n const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []);\n const [isConfirmUnlinkGroupDialogOpen, openConfirmUnlinkGroupDialog, closeConfirmUnlinkGroupDialog] = useFlag();\n const [isConfirmLinkGroupDialogOpen, openConfirmLinkGroupDialog, closeConfirmLinkGroupDialog] = useFlag();\n const lang = useLang();\n const linkedChatId = linkedChat && linkedChat.id;\n\n useHistoryBack(isActive, onClose);\n\n useEffect(() => {\n loadGroupsForDiscussion();\n }, [loadGroupsForDiscussion]);\n\n useEffect(() => {\n if (!animationData) {\n getAnimationData('DiscussionGroups').then(setAnimationData);\n }\n }, [animationData]);\n\n const handleUnlinkGroupSessions = useCallback(() => {\n closeConfirmUnlinkGroupDialog();\n unlinkDiscussionGroup({ channelId: isChannel ? chatId : linkedChatId });\n if (!isChannel) {\n onScreenSelect(ManagementScreens.Initial);\n }\n }, [closeConfirmUnlinkGroupDialog, unlinkDiscussionGroup, isChannel, chatId, linkedChatId, onScreenSelect]);\n\n const handleLinkGroupSessions = useCallback(() => {\n closeConfirmLinkGroupDialog();\n linkDiscussionGroup({ channelId: chatId, chatId: linkedGroupId });\n }, [closeConfirmLinkGroupDialog, linkDiscussionGroup, chatId, linkedGroupId]);\n\n const onDiscussionClick = (groupId: number) => {\n setLinkedGroupId(groupId);\n openConfirmLinkGroupDialog();\n };\n\n function renderUnlinkGroupHeader() {\n return (\n
\n \n
\n {lang(isChannel ? 'DiscussionUnlinkGroup' : 'DiscussionUnlinkChannel')}\n
\n
\n );\n }\n function renderLinkGroupHeader() {\n const linkedGroup = chatsByIds[linkedGroupId];\n\n if (!linkedGroup) {\n return undefined;\n }\n\n return (\n
\n \n
\n {lang('Channel.DiscussionGroup.LinkGroup')}\n
\n
\n );\n }\n\n function renderLinkGroupConfirmText() {\n const linkedGroup = chatsByIds[linkedGroupId];\n\n if (!linkedGroup) {\n return undefined;\n }\n\n if (linkedGroup.hasPrivateLink) {\n return renderText(\n `Do you want to make **${linkedGroup.title}** the discussion board for **${chat!.title}**?`,\n ['br', 'simple_markdown'],\n );\n // return renderText(\n // lang('DiscussionLinkGroupPublicAlert', linkedChat.title, chat!.title),\n // ['br', 'simple_markdown'],\n // );\n }\n\n return renderText(\n // eslint-disable-next-line max-len\n `Do you want to make **${linkedGroup.title}** the discussion board for **${chat!.title}**?\\n\\nAnyone from the channel will be able to see messages in this group.`,\n ['br', 'simple_markdown'],\n );\n // return renderText(\n // lang('DiscussionLinkGroupPrivateAlert', linkedChat.title, chat!.title),\n // ['br', 'simple_markdown'],\n // );\n }\n\n function renderLinkedGroup() {\n return (\n
\n \n \n \n \n {lang(isChannel ? 'DiscussionUnlinkGroup' : 'DiscussionUnlinkChannel')}\n \n \n
\n );\n }\n\n function renderDiscussionGroups() {\n return (\n
\n

{lang('DiscussionChannelHelp')}

\n\n
\n \n {lang('DiscussionCreateGroup')}\n \n {forDiscussionIds ? (\n forDiscussionIds.map((id, i) => (\n { onDiscussionClick(id); }}\n >\n \n \n ))\n ) : (\n \n )}\n
\n

{lang('DiscussionChannelHelp2')}

\n \n
\n );\n }\n\n return (\n
\n
\n
\n
\n {animationData && (\n \n )}\n
\n {linkedChat && renderLinkedGroup()}\n {!linkedChat && renderDiscussionGroups()}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { forDiscussionIds, byId: chatsByIds } = global.chats;\n const linkedChat = chat && chat.fullInfo && chat.fullInfo.linkedChatId\n ? selectChat(global, chat.fullInfo.linkedChatId)\n : undefined;\n\n return {\n chat,\n chatsByIds,\n forDiscussionIds,\n linkedChat,\n isChannel: chat && isChatChannel(chat),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadGroupsForDiscussion', 'linkDiscussionGroup', 'unlinkDiscussionGroup',\n ]),\n)(ManageDiscussion));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatBannedRights } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype OwnProps = {\n chatId: number;\n selectedChatMemberId?: number;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n isFormFullyDisabled?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupUserPermissions: FC = ({\n chat,\n selectedChatMemberId,\n onScreenSelect,\n updateChatMemberBannedRights,\n isFormFullyDisabled,\n onClose,\n isActive,\n}) => {\n const [permissions, setPermissions] = useState({});\n const [havePermissionChanged, setHavePermissionChanged] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [isBanConfirmationDialogOpen, openBanConfirmationDialog, closeBanConfirmationDialog] = useFlag();\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n const selectedChatMember = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.members) {\n return undefined;\n }\n\n return chat.fullInfo.members.find(({ userId }) => userId === selectedChatMemberId);\n }, [chat, selectedChatMemberId]);\n\n useEffect(() => {\n if (chat && chat.fullInfo && selectedChatMemberId && !selectedChatMember) {\n onScreenSelect(ManagementScreens.GroupPermissions);\n }\n }, [chat, onScreenSelect, selectedChatMember, selectedChatMemberId]);\n\n useEffect(() => {\n setPermissions((selectedChatMember && selectedChatMember.bannedRights) || (chat && chat.defaultBannedRights) || {});\n setHavePermissionChanged(false);\n setIsLoading(false);\n }, [chat, selectedChatMember]);\n\n const handlePermissionChange = useCallback((e: React.ChangeEvent) => {\n const { name } = e.target;\n\n function getUpdatedPermissionValue(value: true | undefined) {\n return value ? undefined : true;\n }\n\n setPermissions((p) => ({\n ...p,\n [name]: getUpdatedPermissionValue(p[name as keyof ApiChatBannedRights]),\n ...(name === 'sendStickers' && {\n sendGifs: getUpdatedPermissionValue(p[name]),\n }),\n }));\n setHavePermissionChanged(true);\n }, []);\n\n const handleSavePermissions = useCallback(() => {\n if (!chat || !selectedChatMemberId) {\n return;\n }\n\n setIsLoading(true);\n updateChatMemberBannedRights({\n chatId: chat.id,\n userId: selectedChatMemberId,\n bannedRights: permissions,\n });\n }, [chat, selectedChatMemberId, permissions, updateChatMemberBannedRights]);\n\n const handleBanFromGroup = useCallback(() => {\n if (!chat || !selectedChatMemberId) {\n return;\n }\n\n updateChatMemberBannedRights({\n chatId: chat.id,\n userId: selectedChatMemberId,\n bannedRights: {\n viewMessages: true,\n },\n });\n }, [chat, selectedChatMemberId, updateChatMemberBannedRights]);\n\n const getControlIsDisabled = useCallback((key: keyof ApiChatBannedRights) => {\n if (isFormFullyDisabled) {\n return true;\n }\n\n if (!chat || !chat.defaultBannedRights) {\n return false;\n }\n\n return chat.defaultBannedRights[key];\n }, [chat, isFormFullyDisabled]);\n\n if (!selectedChatMember) {\n return undefined;\n }\n\n return (\n
\n
\n
\n \n \n \n\n

{lang('UserRestrictionsCanDo')}

\n\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n {!isFormFullyDisabled && (\n
\n \n {lang('UserRestrictionsBlock')}\n \n
\n )}\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n\n \n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global, { chatId, isPromotedByCurrentUser }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const isFormFullyDisabled = !(chat.isCreator || isPromotedByCurrentUser);\n\n return { chat, isFormFullyDisabled };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatMemberBannedRights']),\n)(ManageGroupUserPermissions));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens } from '../../../types';\nimport { ApiChat, ApiChatMember, ApiUser } from '../../../api/types';\nimport { getUserFullName, isChatChannel } from '../../../modules/helpers';\n\nimport { selectChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat: ApiChat;\n currentUserId?: number;\n isChannel: boolean;\n usersById: Record;\n};\n\nconst ManageChatAdministrators: FC = ({\n chat,\n isChannel,\n currentUserId,\n usersById,\n onScreenSelect,\n onChatMemberSelect,\n onClose,\n isActive,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n function handleRecentActionsClick() {\n onScreenSelect(ManagementScreens.GroupRecentActions);\n }\n\n const adminMembers = useMemo(() => {\n if (!chat.fullInfo || !chat.fullInfo.adminMembers) {\n return [];\n }\n\n return chat.fullInfo.adminMembers.sort((a, b) => {\n if (a.isOwner) {\n return -1;\n } else if (b.isOwner) {\n return 1;\n }\n\n return 0;\n });\n }, [chat]);\n\n const handleAdminMemberClick = useCallback((member: ApiChatMember) => {\n onChatMemberSelect(member.userId, member.promotedByUserId === currentUserId);\n onScreenSelect(ManagementScreens.ChatAdminRights);\n }, [currentUserId, onChatMemberSelect, onScreenSelect]);\n\n const getMemberStatus = useCallback((member: ApiChatMember) => {\n if (member.isOwner) {\n return lang('ChannelCreator');\n }\n\n const promotedByUser = member.promotedByUserId ? usersById[member.promotedByUserId] : undefined;\n\n if (promotedByUser) {\n return lang('EditAdminPromotedBy', getUserFullName(promotedByUser));\n }\n\n return lang('ChannelAdmin');\n }, [lang, usersById]);\n\n return (\n
\n
\n
\n \n {lang('EventLog')}\n {lang(isChannel ? 'EventLogInfoDetailChannel' : 'EventLogInfoDetail')}\n \n
\n\n
\n

\n {isChannel\n ? 'You can add administrators to help you manage your channel.'\n : 'You can add administrators to help you manage your group.'}\n

\n\n {adminMembers.map((member) => (\n handleAdminMemberClick(member)}\n >\n \n \n ))}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { byId: usersById } = global.users;\n\n return {\n chat,\n currentUserId: global.currentUserId,\n isChannel: isChatChannel(chat),\n usersById,\n };\n },\n // (setGlobal, actions): DispatchProps => pick(actions, ['togglePreHistoryHidden', 'updateChat']),\n)(ManageChatAdministrators));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatMember } from '../../../api/types';\nimport useLang from '../../../hooks/useLang';\nimport { selectChat } from '../../../modules/selectors';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n};\n\nconst ManageGroupRecentActions: FC = ({ chat, onClose, isActive }) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n const adminMembers = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.adminMembers) {\n return [];\n }\n\n return chat.fullInfo.adminMembers.sort((a, b) => {\n if (a.isOwner) {\n return -1;\n } else if (b.isOwner) {\n return 1;\n }\n\n return 0;\n });\n }, [chat]);\n\n const getMemberStatus = useCallback((member: ApiChatMember) => {\n if (member.isOwner) {\n return lang('ChannelCreator');\n }\n\n return lang('ChannelAdmin');\n }, [lang]);\n\n return (\n
\n
\n
\n

Actions

\n\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n
\n

{lang('Channel.Management.Title')}

\n\n
\n \n
\n\n {adminMembers.map((member) => (\n \n \n \n \n ))}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n\n return { chat };\n },\n)(ManageGroupRecentActions));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatAdminRights, ApiUser } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectChat } from '../../../modules/selectors';\nimport { getUserFullName, isChatBasicGroup, isChatChannel } from '../../../modules/helpers';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\nimport InputText from '../../ui/InputText';\n\ntype OwnProps = {\n chatId: number;\n selectedChatMemberId?: number;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat: ApiChat;\n usersById: Record;\n currentUserId?: number;\n isChannel: boolean;\n isFormFullyDisabled: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst CUSTOM_TITLE_MAX_LENGTH = 16;\n\nconst ManageGroupAdminRights: FC = ({\n selectedChatMemberId,\n onScreenSelect,\n chat,\n usersById,\n currentUserId,\n isChannel,\n isFormFullyDisabled,\n updateChatAdmin,\n onClose,\n isActive,\n}) => {\n const [permissions, setPermissions] = useState({});\n const [isTouched, setIsTouched] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [isDismissConfirmationDialogOpen, openDismissConfirmationDialog, closeDismissConfirmationDialog] = useFlag();\n const [customTitle, setCustomTitle] = useState('');\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n const selectedChatMember = useMemo(() => {\n if (!chat.fullInfo || !chat.fullInfo.adminMembers) {\n return undefined;\n }\n\n return chat.fullInfo.adminMembers.find(({ userId }) => userId === selectedChatMemberId);\n }, [chat, selectedChatMemberId]);\n\n useEffect(() => {\n if (chat && chat.fullInfo && selectedChatMemberId && !selectedChatMember) {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }\n }, [chat, onScreenSelect, selectedChatMember, selectedChatMemberId]);\n\n useEffect(() => {\n setPermissions((selectedChatMember && selectedChatMember.adminRights) || {});\n setCustomTitle(((selectedChatMember && selectedChatMember.customTitle) || '').substr(0, CUSTOM_TITLE_MAX_LENGTH));\n setIsTouched(false);\n setIsLoading(false);\n }, [selectedChatMember]);\n\n const handlePermissionChange = useCallback((e: React.ChangeEvent) => {\n const { name } = e.target;\n\n function getUpdatedPermissionValue(value: true | undefined) {\n return value ? undefined : true;\n }\n\n setPermissions((p) => ({\n ...p,\n [name]: getUpdatedPermissionValue(p[name as keyof ApiChatAdminRights]),\n }));\n setIsTouched(true);\n }, []);\n\n const handleSavePermissions = useCallback(() => {\n if (!selectedChatMemberId) {\n return;\n }\n\n setIsLoading(true);\n updateChatAdmin({\n chatId: chat.id,\n userId: selectedChatMemberId,\n adminRights: permissions,\n customTitle,\n });\n }, [chat, selectedChatMemberId, permissions, customTitle, updateChatAdmin]);\n\n const handleDismissAdmin = useCallback(() => {\n if (!selectedChatMemberId) {\n return;\n }\n\n updateChatAdmin({\n chatId: chat.id,\n userId: selectedChatMemberId,\n adminRights: {},\n });\n closeDismissConfirmationDialog();\n }, [chat.id, closeDismissConfirmationDialog, selectedChatMemberId, updateChatAdmin]);\n\n const getControlIsDisabled = useCallback((key: keyof ApiChatAdminRights) => {\n if (isChatBasicGroup(chat)) {\n return false;\n }\n\n if (isFormFullyDisabled || !chat.adminRights) {\n return true;\n }\n\n return !chat.adminRights![key];\n }, [chat, isFormFullyDisabled]);\n\n const memberStatus = useMemo(() => {\n if (!selectedChatMember) {\n return undefined;\n }\n\n if (selectedChatMember.isOwner) {\n return lang('ChannelCreator');\n }\n\n const promotedByUser = selectedChatMember.promotedByUserId\n ? usersById[selectedChatMember.promotedByUserId]\n : undefined;\n\n if (promotedByUser) {\n return lang('EditAdminPromotedBy', getUserFullName(promotedByUser));\n }\n\n return lang('ChannelAdmin');\n }, [selectedChatMember, usersById, lang]);\n\n const handleCustomTitleChange = useCallback((e) => {\n const { value } = e.target;\n setCustomTitle(value);\n setIsTouched(true);\n }, []);\n\n if (!selectedChatMember) {\n return undefined;\n }\n\n return (\n
\n
\n
\n \n \n \n\n

{lang('EditAdminWhatCanDo')}

\n\n
\n \n
\n {isChannel && (\n
\n \n
\n )}\n {isChannel && (\n
\n \n
\n )}\n
\n \n
\n {!isChannel && (\n
\n \n
\n )}\n
\n \n
\n {!isChannel && (\n
\n \n
\n )}\n
\n \n
\n {!isChannel && (\n
\n \n
\n )}\n\n {isFormFullyDisabled && (\n

\n {lang('Channel.EditAdmin.CannotEdit')}\n

\n )}\n\n {!isChannel && (\n \n )}\n\n {currentUserId !== selectedChatMemberId && !isFormFullyDisabled && (\n \n {lang('EditAdminRemoveAdmin')}\n \n )}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n\n \n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global, { chatId, isPromotedByCurrentUser }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { byId: usersById } = global.users;\n const { currentUserId } = global;\n const isChannel = isChatChannel(chat);\n const isFormFullyDisabled = !(chat.isCreator || isPromotedByCurrentUser);\n\n return {\n chat,\n usersById,\n currentUserId,\n isChannel,\n isFormFullyDisabled,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatAdmin']),\n)(ManageGroupAdminRights));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChatMember, ApiUser } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { selectChat } from '../../../modules/selectors';\nimport { sortUserIds, isChatChannel } from '../../../modules/helpers';\nimport { pick } from '../../../util/iteratees';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport NothingFound from '../../common/NothingFound';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n usersById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n serverTimeOffset: number;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupMembers: FC = ({\n members,\n usersById,\n isChannel,\n openUserInfo,\n onClose,\n isActive,\n serverTimeOffset,\n}) => {\n const memberIds = useMemo(() => {\n if (!members || !usersById) {\n return undefined;\n }\n\n return sortUserIds(members.map(({ userId }) => userId), usersById, undefined, serverTimeOffset);\n }, [members, serverTimeOffset, usersById]);\n\n const handleMemberClick = useCallback((id: number) => {\n openUserInfo({ id });\n }, [openUserInfo]);\n\n useHistoryBack(isActive, onClose);\n\n return (\n
\n
\n
\n {memberIds ? (\n memberIds.map((id, i) => (\n handleMemberClick(id)}\n >\n \n \n ))\n ) : (\n \n )}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { byId: usersById } = global.users;\n const members = chat && chat.fullInfo && chat.fullInfo.members;\n const isChannel = chat && isChatChannel(chat);\n\n return {\n members,\n usersById,\n isChannel,\n serverTimeOffset: global.serverTimeOffset,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openUserInfo',\n ]),\n)(ManageGroupMembers));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChatMember, ApiUser } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\n\nimport { selectChat } from '../../../modules/selectors';\nimport { sortUserIds, isChatChannel } from '../../../modules/helpers';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport NothingFound from '../../common/NothingFound';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n usersById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n serverTimeOffset: number;\n};\n\nconst ManageGroupUserPermissionsCreate: FC = ({\n usersById,\n members,\n isChannel,\n onScreenSelect,\n onChatMemberSelect,\n onClose,\n isActive,\n serverTimeOffset,\n}) => {\n useHistoryBack(isActive, onClose);\n\n const memberIds = useMemo(() => {\n if (!members || !usersById) {\n return undefined;\n }\n\n return sortUserIds(\n members.filter((member) => !member.isOwner).map(({ userId }) => userId),\n usersById, undefined, serverTimeOffset,\n );\n }, [members, serverTimeOffset, usersById]);\n\n const handleExceptionMemberClick = useCallback((memberId: number) => {\n onChatMemberSelect(memberId);\n onScreenSelect(ManagementScreens.GroupUserPermissions);\n }, [onChatMemberSelect, onScreenSelect]);\n\n return (\n
\n
\n
\n {memberIds ? (\n memberIds.map((id, i) => (\n handleExceptionMemberClick(id)}\n >\n \n \n ))\n ) : (\n \n )}\n
\n
\n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { byId: usersById } = global.users;\n const members = chat && chat.fullInfo && chat.fullInfo.members;\n const isChannel = chat && isChatChannel(chat);\n\n return {\n members,\n usersById,\n isChannel,\n serverTimeOffset: global.serverTimeOffset,\n };\n },\n)(ManageGroupUserPermissionsCreate));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens, ManagementType } from '../../../types';\n\nimport { selectCurrentManagementType } from '../../../modules/selectors';\n\nimport ManageUser from './ManageUser';\nimport ManageGroup from './ManageGroup';\nimport ManageGroupPermissions from './ManageGroupPermissions';\nimport ManageGroupRemovedUsers from './ManageGroupRemovedUsers';\nimport ManageChannel from './ManageChannel';\nimport ManageChatPrivacyType from './ManageChatPrivacyType';\nimport ManageDiscussion from './ManageDiscussion';\nimport ManageGroupUserPermissions from './ManageGroupUserPermissions';\nimport ManageChatAdministrators from './ManageChatAdministrators';\nimport ManageGroupRecentActions from './ManageGroupRecentActions';\nimport ManageGroupAdminRights from './ManageGroupAdminRights';\nimport ManageGroupMembers from './ManageGroupMembers';\nimport ManageGroupUserPermissionsCreate from './ManageGroupUserPermissionsCreate';\n\nexport type OwnProps = {\n chatId: number;\n currentScreen: ManagementScreens;\n selectedChatMemberId?: number;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n managementType?: ManagementType;\n};\n\nconst Management: FC = ({\n chatId,\n currentScreen,\n selectedChatMemberId,\n isPromotedByCurrentUser,\n onScreenSelect,\n onChatMemberSelect,\n onClose,\n isActive,\n managementType,\n}) => {\n switch (currentScreen) {\n case ManagementScreens.Initial: {\n switch (managementType) {\n case 'user':\n return (\n \n );\n case 'group':\n return (\n \n );\n case 'channel':\n return (\n \n );\n }\n\n break;\n }\n\n case ManagementScreens.ChatPrivacyType:\n return (\n \n );\n\n case ManagementScreens.Discussion:\n return (\n \n );\n\n case ManagementScreens.GroupPermissions:\n return (\n \n );\n\n case ManagementScreens.GroupRemovedUsers:\n return (\n \n );\n\n case ManagementScreens.GroupUserPermissionsCreate:\n return (\n \n );\n\n case ManagementScreens.GroupUserPermissions:\n return (\n \n );\n\n case ManagementScreens.ChatAdministrators:\n return (\n \n );\n\n case ManagementScreens.GroupRecentActions:\n return (\n \n );\n\n case ManagementScreens.ChatAdminRights:\n return (\n \n );\n\n case ManagementScreens.ChannelSubscribers:\n case ManagementScreens.GroupMembers:\n return (\n \n );\n }\n\n return undefined; // Never reached\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const managementType = selectCurrentManagementType(global);\n\n return {\n managementType,\n };\n },\n)(Management));\n","const CURRENCIES: Record = {\n USD: '$',\n EUR: '€',\n GBP: '£',\n JPY: '¥',\n RUB: '₽',\n UAH: '₴',\n INR: '₹',\n AED: 'د.إ',\n};\n\nexport function getCurrencySign(currency: string | undefined): string {\n if (!currency) {\n return '';\n }\n return CURRENCIES[currency] || '';\n}\n","const VISA = /^4[0-9]{12}(?:[0-9]{1,3})?$/;\nconst MASTERCARD1 = /^5[1-5][0-9]{11,14}$/;\nconst MASTERCARD2 = /^2[2-7][0-9]{11,14}$/;\n\nexport enum CardType {\n Default,\n Visa,\n Mastercard,\n}\n\nconst cards: Record = {\n [CardType.Default]: '',\n [CardType.Visa]: 'visa',\n [CardType.Mastercard]: 'mastercard',\n};\n\nexport function detectCardType(cardNumber: string): number {\n cardNumber = cardNumber.replace(/\\s/g, '');\n if (VISA.test(cardNumber)) {\n return CardType.Visa;\n }\n if (MASTERCARD1.test(cardNumber) || MASTERCARD2.test(cardNumber)) {\n return CardType.Mastercard;\n }\n return CardType.Default;\n}\n\nexport function detectCardTypeText(cardNumber: string): string {\n const cardType = detectCardType(cardNumber);\n return cards[cardType as number] || '';\n}\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\nimport { countryList } from '../../util/phoneNumber';\n\nexport type FormState = {\n streetLine1: string;\n streetLine2: string;\n city: string;\n state: string;\n countryIso2: string;\n postCode: string;\n fullName: string;\n email: string;\n phone: string;\n shipping: string;\n cardNumber: string;\n cardholder: string;\n expiry: string;\n cvv: string;\n billingCountry: string;\n billingZip: string;\n saveInfo: boolean;\n saveCredentials: boolean;\n formErrors: Record;\n};\n\nexport type FormActions = (\n 'changeAddress1' | 'changeAddress2' | 'changeCity' | 'changeState' | 'changeCountry' |\n 'changePostCode' | 'changeFullName' | 'changeEmail' | 'changePhone' | 'changeShipping' | 'updateUserInfo' |\n 'changeCardNumber' | 'changeCardholder' | 'changeExpiryDate' | 'changeCvvCode' | 'changeBillingCountry' |\n 'changeBillingZip' | 'changeSaveInfo' | 'changeSaveCredentials' | 'setFormErrors'\n);\nexport type FormEditDispatch = Dispatch;\n\nconst INITIAL_STATE: FormState = {\n streetLine1: '',\n streetLine2: '',\n city: '',\n state: '',\n countryIso2: '',\n postCode: '',\n fullName: '',\n email: '',\n phone: '',\n shipping: '',\n cardNumber: '',\n cardholder: '',\n expiry: '',\n cvv: '',\n billingCountry: '',\n billingZip: '',\n saveInfo: true,\n saveCredentials: false,\n formErrors: {},\n};\n\nconst reducer: StateReducer = (state, action) => {\n switch (action.type) {\n case 'changeAddress1':\n return {\n ...state,\n streetLine1: action.payload,\n formErrors: {\n ...state.formErrors,\n streetLine1: undefined,\n },\n };\n case 'changeAddress2':\n return {\n ...state,\n streetLine2: action.payload,\n formErrors: {\n ...state.formErrors,\n streetLine2: undefined,\n },\n };\n case 'changeCity':\n return {\n ...state,\n city: action.payload,\n formErrors: {\n ...state.formErrors,\n city: undefined,\n },\n };\n case 'changeState':\n return {\n ...state,\n state: action.payload,\n formErrors: {\n ...state.formErrors,\n state: undefined,\n },\n };\n case 'changeCountry':\n return {\n ...state,\n countryIso2: action.payload,\n billingCountry: getBillingCountry(action.payload),\n formErrors: {\n ...state.formErrors,\n countryIso2: undefined,\n },\n };\n case 'changePostCode':\n return {\n ...state,\n postCode: action.payload,\n formErrors: {\n ...state.formErrors,\n postCode: undefined,\n },\n };\n case 'changeFullName':\n return {\n ...state,\n fullName: action.payload,\n formErrors: {\n ...state.formErrors,\n fullName: undefined,\n },\n };\n case 'changeEmail':\n return {\n ...state,\n email: action.payload,\n formErrors: {\n ...state.formErrors,\n email: undefined,\n },\n };\n case 'changePhone':\n return {\n ...state,\n phone: action.payload,\n formErrors: {\n ...state.formErrors,\n phone: undefined,\n },\n };\n case 'changeShipping':\n return { ...state, shipping: action.payload };\n case 'changeCardNumber':\n return {\n ...state,\n cardNumber: action.payload,\n formErrors: {\n ...state.formErrors,\n cardNumber: undefined,\n },\n };\n case 'changeCardholder':\n return {\n ...state,\n cardholder: action.payload,\n formErrors: {\n ...state.formErrors,\n cardholder: undefined,\n },\n };\n case 'changeExpiryDate':\n return {\n ...state,\n expiry: action.payload,\n formErrors: {\n ...state.formErrors,\n expiry: undefined,\n },\n };\n case 'changeCvvCode':\n return {\n ...state,\n cvv: action.payload,\n formErrors: {\n ...state.formErrors,\n cvv: undefined,\n },\n };\n case 'changeBillingCountry':\n return {\n ...state,\n billingCountry: action.payload,\n formErrors: {\n ...state.formErrors,\n billingCountry: undefined,\n },\n };\n case 'changeBillingZip':\n return {\n ...state,\n billingZip: action.payload,\n formErrors: {\n ...state.formErrors,\n billingZip: undefined,\n },\n };\n case 'changeSaveInfo':\n return { ...state, saveInfo: action.payload };\n case 'changeSaveCredentials':\n return { ...state, saveCredentials: action.payload };\n case 'updateUserInfo':\n if (action.payload.countryIso2) {\n return {\n ...state,\n ...action.payload,\n billingCountry: getBillingCountry(action.payload.countryIso2),\n };\n }\n return { ...state, ...action.payload };\n case 'setFormErrors':\n return {\n ...state,\n formErrors: {\n ...state.formErrors,\n ...action.payload,\n },\n };\n default:\n return state;\n }\n};\n\nfunction getBillingCountry(countryCode: string) {\n const country = countryList.find(({ id }) => id === countryCode);\n return country ? country.name : '';\n}\n\nexport default () => {\n return useReducer(reducer, INITIAL_STATE);\n};\n","import { RefObject } from 'react';\n\nimport { IS_TOUCH_ENV } from '../util/environment';\nimport { fastRaf } from '../util/schedulers';\nimport { useEffect } from '../lib/teact/teact';\n\nconst DEFAULT_DURATION = 400;\n\nexport default function useFocusAfterAnimation(\n ref: RefObject, animationDuration = DEFAULT_DURATION,\n) {\n useEffect(() => {\n if (IS_TOUCH_ENV) {\n return;\n }\n\n setTimeout(() => {\n fastRaf(() => {\n if (ref.current) {\n ref.current.focus();\n }\n });\n }, animationDuration);\n }, [ref, animationDuration]);\n}\n","import { ChangeEvent, RefObject } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\n\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n id?: string;\n value?: string;\n label?: string;\n error?: string;\n ref?: RefObject;\n hasArrow?: boolean;\n placeholder?: string;\n onChange?: (e: ChangeEvent) => void;\n children: any;\n};\n\nconst Select: FC = (props) => {\n const {\n id,\n value,\n label,\n hasArrow,\n error,\n ref,\n placeholder,\n onChange,\n children,\n } = props;\n const labelText = error || label;\n const fullClassName = buildClassName(\n 'input-group',\n value && 'touched',\n error && 'error',\n labelText && 'with-label',\n hasArrow && 'with-arrow',\n 'input-group',\n );\n\n return (\n
\n \n {children}\n \n {labelText && id && (\n \n )}\n
\n );\n};\n\nexport default memo(Select);\n","import React, {\n FC, useRef, useCallback, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\nimport useFocusAfterAnimation from '../../hooks/useFocusAfterAnimation';\nimport useLang from '../../hooks/useLang';\nimport { countryList } from '../../util/phoneNumber';\n\nimport InputText from '../ui/InputText';\nimport Select from '../ui/Select';\nimport Checkbox from '../ui/Checkbox';\n\nimport './ShippingInfo.scss';\n\nexport type OwnProps = {\n state: FormState;\n needEmail: boolean;\n needPhone: boolean;\n needName: boolean;\n needAddress: boolean;\n dispatch: FormEditDispatch;\n};\n\nconst ShippingInfo: FC = ({\n state,\n needEmail,\n needPhone,\n needName,\n needAddress,\n dispatch,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const phoneRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const selectCountryRef = useRef(null);\n\n useEffect(() => {\n if (selectCountryRef.current\n && selectCountryRef.current.value !== state.countryIso2) {\n selectCountryRef.current.value = state.countryIso2;\n }\n }, [state.countryIso2]);\n\n const lang = useLang();\n\n useFocusAfterAnimation(inputRef);\n\n const handleAddress1Change = useCallback((e) => {\n dispatch({ type: 'changeAddress1', payload: e.target.value });\n }, [dispatch]);\n\n const handleAddress2Change = useCallback((e) => {\n dispatch({ type: 'changeAddress2', payload: e.target.value });\n }, [dispatch]);\n\n const handleCityChange = useCallback((e) => {\n dispatch({ type: 'changeCity', payload: e.target.value });\n }, [dispatch]);\n\n const handleStateChange = useCallback((e) => {\n dispatch({ type: 'changeState', payload: e.target.value });\n }, [dispatch]);\n\n const handleCountryChange = useCallback((e) => {\n dispatch({ type: 'changeCountry', payload: e.target.value });\n }, [dispatch]);\n\n const handlePostCodeChange = useCallback((e) => {\n dispatch({ type: 'changePostCode', payload: e.target.value });\n }, [dispatch]);\n\n const handleFullNameChange = useCallback((e) => {\n dispatch({ type: 'changeFullName', payload: e.target.value });\n }, [dispatch]);\n\n const handleEmailChange = useCallback((e) => {\n dispatch({ type: 'changeEmail', payload: e.target.value });\n }, [dispatch]);\n\n const handlePhoneChange = useCallback((e) => {\n let { value } = e.target;\n value = `+${value.replace(/\\D/g, '')}`;\n if (phoneRef.current) {\n phoneRef.current.value = value;\n }\n dispatch({ type: 'changePhone', payload: value });\n }, [dispatch]);\n\n const handleSaveInfoChange = useCallback((e) => {\n dispatch({ type: 'changeSaveInfo', payload: e.target.value });\n }, [dispatch]);\n\n const { formErrors } = state;\n return (\n
\n
\n {needAddress ? (\n
\n
{lang('PaymentShippingAddress')}
\n \n \n \n \n \n {countryList.map(({ name, id }) => (\n \n {name}\n \n ))}\n \n\n \n
\n ) : undefined}\n { needName || needEmail || needPhone ? (\n
{lang('PaymentShippingReceiver')}
\n ) : undefined }\n { needName && (\n \n ) }\n { needEmail && (\n \n ) }\n { needPhone && (\n \n ) }\n \n \n
\n );\n};\n\nexport default memo(ShippingInfo);\n","import React, {\n FC, useCallback, memo, useMemo, useEffect,\n} from '../../lib/teact/teact';\n\nimport { ShippingOption } from '../../types/index';\n\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\n\nimport RadioGroup from '../ui/RadioGroup';\n\nimport './Shipping.scss';\n\nexport type OwnProps = {\n state: FormState;\n shippingOptions: ShippingOption[];\n currency: string;\n dispatch: FormEditDispatch;\n};\n\nconst Shipping: FC = ({\n state,\n shippingOptions,\n currency,\n dispatch,\n}) => {\n useEffect(() => {\n if (!shippingOptions || state.shipping) {\n return;\n }\n dispatch({ type: 'changeShipping', payload: shippingOptions[0].id });\n }, [shippingOptions, state.shipping, dispatch]);\n\n const handleShippingSelect = useCallback((value) => {\n dispatch({ type: 'changeShipping', payload: value });\n }, [dispatch]);\n\n const options = useMemo(() => (shippingOptions.map(({ id: value, title: label, amount }) => ({\n label,\n subLabel: `${currency} ${String(amount / 100)}`,\n value,\n }))), [shippingOptions, currency]);\n\n return (\n
\n
\n

Select shipping method

\n \n \n
\n );\n};\n\nexport default memo(Shipping);\n","import React, {\n FC, memo,\n} from '../../lib/teact/teact';\n\nimport { Price } from '../../types';\n\nimport './Checkout.scss';\n\nexport type OwnProps = {\n invoiceContent?: {\n title?: string;\n description?: string;\n text?: string;\n photoUrl?: string;\n };\n checkoutInfo?: {\n paymentMethod?: string;\n paymentProvider?: string;\n shippingAddress?: string;\n name?: string;\n phone?: string;\n shippingMethod?: string;\n };\n prices?: Price[];\n totalPrice?: number;\n shippingPrices?: Price[];\n currency?: string;\n};\n\nconst Checkout: FC = ({\n invoiceContent,\n prices,\n shippingPrices,\n checkoutInfo,\n currency,\n totalPrice,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const { photoUrl, title, text } = (invoiceContent || {});\n const {\n paymentMethod,\n paymentProvider,\n shippingAddress,\n name,\n phone,\n shippingMethod,\n } = (checkoutInfo || {});\n return (\n
\n
\n { photoUrl && (\n \"\"\n )}\n
\n
{ title }
\n

{ text }

\n
\n
\n
\n { prices && prices.map((item) => (\n renderPaymentItem(item.label, item.amount, currency, false)\n )) }\n { shippingPrices && shippingPrices.map((item) => (\n renderPaymentItem(item.label, item.amount, currency, false)\n )) }\n { totalPrice !== undefined && (\n renderPaymentItem('Total', totalPrice, currency, true)\n ) }\n
\n
\n {paymentMethod && renderCheckoutItem('icon-card', paymentMethod, 'Payment method')}\n {paymentProvider && renderCheckoutItem('stripe-provider', paymentProvider, 'Payment provider')}\n {shippingAddress && renderCheckoutItem('icon-location', shippingAddress, 'Shipping address')}\n {name && renderCheckoutItem('icon-user', name, 'Name')}\n {phone && renderCheckoutItem('icon-phone', phone, 'Phone number')}\n {shippingMethod && renderCheckoutItem('icon-truck', shippingMethod, 'Shipping method')}\n
\n
\n );\n};\n\nfunction renderPaymentItem(title: string, value: number, currency?: string, main = false) {\n return (\n
\n
\n { title }\n
\n
\n { `${currency || ''} ${(value / 100).toFixed(2)}` }\n
\n
\n );\n}\n\nfunction renderCheckoutItem(icon: string, title: string, data: string) {\n return (\n
\n \n
\n
\n { title }\n
\n

\n { data }\n

\n
\n
\n );\n}\n\nexport default memo(Checkout);\n","import React, {\n FC, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\n\nimport { formatCardExpiry } from '../middle/helpers/inputFormatters';\n\nimport InputText from '../ui/InputText';\n\nconst MAX_FIELD_LENGTH = 5;\n\nexport type OwnProps = {\n value: string;\n error?: string;\n onChange: (value: string) => void;\n};\n\nconst ExpiryInput : FC = ({ value, error, onChange }) => {\n // eslint-disable-next-line no-null/no-null\n const expiryInputRef = useRef(null);\n\n const handleKeyDown = useCallback((e) => {\n if (e.key === 'Backspace' && value.charAt(value.length - 1) === '/') {\n const newValue = value.slice(0, value.length - 1);\n if (expiryInputRef.current) {\n expiryInputRef.current.value = newValue;\n }\n }\n }, [value]);\n\n const handleChange = useCallback((e) => {\n onChange(formatCardExpiry(e.target.value));\n }, [onChange]);\n\n return (\n \n );\n};\n\nexport default memo(ExpiryInput);\n","export function formatCardExpiry(input: string) {\n input = input.replace(/[^\\d]/g, '').slice(0, 4);\n const parts = input.match(/.{1,2}/g);\n if (parts && parts[0] && Number(parts[0]) > 12) {\n parts[0] = '12';\n }\n if (parts && parts[0] && parts[0].length === 2 && !parts[1]) {\n parts[1] = '';\n }\n return parts ? parts.join('/') : '';\n}\n\nexport function formatCardNumber(input: string) {\n input = input.replace(/[^\\d]/g, '');\n const parts = input.match(/.{1,4}/g);\n return parts ? parts.join(' ') : '';\n}\n","export default __webpack_public_path__ + \"mastercard.4216118edafe23cc2dec7b8807ba4622.svg\";","export default __webpack_public_path__ + \"visa.e5a7c336e1deb4b92a636e2e053878c4.svg\";","import React, {\n FC, memo, useCallback, useState, useRef, useEffect,\n} from '../../lib/teact/teact';\n\nimport useFocusAfterAnimation from '../../hooks/useFocusAfterAnimation';\nimport { formatCardNumber } from '../middle/helpers/inputFormatters';\nimport { detectCardType, CardType } from '../common/helpers/detectCardType';\n\nimport InputText from '../ui/InputText';\n\nimport './CardInput.scss';\n\n// @ts-ignore\nimport mastercardIconPath from '../../assets/mastercard.svg';\n// @ts-ignore\nimport visaIconPath from '../../assets/visa.svg';\n\nconst CARD_NUMBER_MAX_LENGTH = 23;\n\nexport type OwnProps = {\n value: string;\n error?: string;\n onChange: (value: string) => void;\n};\n\nconst CardInput : FC = ({ value, error, onChange }) => {\n // eslint-disable-next-line no-null/no-null\n const cardNumberRef = useRef(null);\n\n useFocusAfterAnimation(cardNumberRef);\n\n const [cardType, setCardType] = useState(CardType.Default);\n useEffect(() => {\n const newCardType = detectCardType(value);\n setCardType(newCardType);\n // eslint-disable-next-line\n }, []);\n\n const handleChange = useCallback((e) => {\n const newValue = formatCardNumber(e.target.value);\n const newCardType = detectCardType(e.target.value);\n setCardType(newCardType);\n onChange(newValue);\n if (cardNumberRef.current) {\n cardNumberRef.current.value = newValue;\n }\n }, [onChange, cardNumberRef]);\n\n const cardIcon = getCardIcon(cardType);\n\n return (\n
\n {cardIcon}\n \n
\n );\n};\n\nexport default memo(CardInput);\n\nfunction getCardIcon(cardType: CardType) {\n switch (cardType) {\n case CardType.Mastercard:\n return \"\";\n case CardType.Visa:\n return \"\";\n default:\n return undefined;\n }\n}\n","import React, {\n FC, useCallback, memo, useRef, useEffect,\n} from '../../lib/teact/teact';\n\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\nimport useLang from '../../hooks/useLang';\nimport { countryList } from '../../util/phoneNumber';\n\nimport InputText from '../ui/InputText';\nimport Checkbox from '../ui/Checkbox';\nimport Select from '../ui/Select';\nimport ExpiryInput from './ExpiryInput';\nimport CardInput from './CardInput';\n\nimport './PaymentInfo.scss';\n\nexport type OwnProps = {\n state: FormState;\n canSaveCredentials: boolean;\n needCardholderName?: boolean;\n needCountry?: boolean;\n needZip?: boolean;\n dispatch: FormEditDispatch;\n};\n\nconst PaymentInfo: FC = ({\n state,\n canSaveCredentials,\n needCardholderName,\n needCountry,\n needZip,\n dispatch,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const selectCountryRef = useRef(null);\n\n useEffect(() => {\n if (selectCountryRef.current\n && selectCountryRef.current.value !== state.billingCountry) {\n selectCountryRef.current.value = state.billingCountry;\n }\n }, [state.billingCountry]);\n\n const handleCardNumberChange = useCallback((value) => {\n dispatch({ type: 'changeCardNumber', payload: value });\n }, [dispatch]);\n\n const handleCardholderChange = useCallback((e) => {\n dispatch({ type: 'changeCardholder', payload: e.target.value.toUpperCase() });\n }, [dispatch]);\n\n const handleExpiryChange = useCallback((value) => {\n dispatch({ type: 'changeExpiryDate', payload: value });\n }, [dispatch]);\n\n const handleCvvChange = useCallback((e) => {\n dispatch({ type: 'changeCvvCode', payload: e.target.value });\n }, [dispatch]);\n\n const handleCountryChange = useCallback((e) => {\n dispatch({ type: 'changeBillingCountry', payload: e.target.value });\n }, [dispatch]);\n\n const handleBillingPostCodeChange = useCallback((e) => {\n dispatch({ type: 'changeBillingZip', payload: e.target.value });\n }, [dispatch]);\n\n const handleChangeSaveCredentials = useCallback((e) => {\n dispatch({ type: 'changeSaveCredentials', payload: e.target.value });\n }, [dispatch]);\n\n const lang = useLang();\n\n const { formErrors = {} } = state;\n\n return (\n
\n
\n
{lang('PaymentCardTitle')}
\n \n { needCardholderName && (\n \n )}\n
\n \n \n
\n { needCountry || needZip ? (\n
{lang('PaymentBillingAddress')}
\n ) : undefined }\n { needCountry && (\n \n {\n countryList.map(({ name }) => (\n \n {name}\n \n ))\n }\n \n ) }\n { needZip && (\n \n )}\n { canSaveCredentials && (\n \n ) }\n \n
\n );\n};\n\nexport default memo(PaymentInfo);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { PaymentStep, ShippingOption, Price } from '../../types';\nimport { ApiError, ApiInviteInfo } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport { getCurrencySign } from '../middle/helpers/getCurrencySign';\nimport { detectCardTypeText } from '../common/helpers/detectCardType';\nimport { getShippingErrors } from '../../modules/helpers/payments';\nimport usePaymentReducer, { FormState } from '../../hooks/reducers/usePaymentReducer';\nimport useLang from '../../hooks/useLang';\n\nimport ShippingInfo from './ShippingInfo';\nimport Shipping from './Shipping';\nimport Checkout from './Checkout';\nimport PaymentInfo from './PaymentInfo';\nimport Button from '../ui/Button';\nimport Modal from '../ui/Modal';\nimport Transition from '../ui/Transition';\nimport Spinner from '../ui/Spinner';\n\nimport './PaymentModal.scss';\n\nconst DEFAULT_PROVIDER = 'stripe';\n\nexport type OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n};\n\ntype StateProps = {\n nameRequested?: boolean;\n shippingAddressRequested?: boolean;\n phoneRequested?: boolean;\n emailRequested?: boolean;\n flexible?: boolean;\n phoneToProvider?: boolean;\n emailToProvider?: boolean;\n currency?: string;\n prices?: Price[];\n isProviderError: boolean;\n needCardholderName?: boolean;\n needCountry?: boolean;\n needZip?: boolean;\n globalDialogs?: (ApiError | ApiInviteInfo)[];\n};\n\ntype GlobalStateProps = Pick;\n\ntype DispatchProps = Pick;\n\nconst Invoice: FC = ({\n isOpen,\n onClose,\n step,\n shippingOptions,\n savedInfo,\n canSaveCredentials,\n nameRequested,\n shippingAddressRequested,\n phoneRequested,\n emailRequested,\n phoneToProvider,\n emailToProvider,\n currency,\n passwordMissing,\n isProviderError,\n invoiceContent,\n nativeProvider,\n prices,\n needCardholderName,\n needCountry,\n needZip,\n error,\n globalDialogs,\n validateRequestedInfo,\n sendPaymentForm,\n setPaymentStep,\n sendCredentialsInfo,\n clearPaymentError,\n}) => {\n const [paymentState, paymentDispatch] = usePaymentReducer();\n const currencySign = getCurrencySign(currency);\n const [isLoading, setIsLoading] = useState(false);\n const lang = useLang();\n\n useEffect(() => {\n if (step || error || globalDialogs) {\n setIsLoading(false);\n }\n }, [step, error, globalDialogs]);\n\n useEffect(() => {\n if (error && error.field) {\n paymentDispatch({\n type: 'setFormErrors',\n payload: {\n [error.field]: error.fieldError,\n },\n });\n return;\n }\n if (globalDialogs && globalDialogs.length) {\n const errors = getShippingErrors(globalDialogs);\n paymentDispatch({\n type: 'setFormErrors',\n payload: {\n ...errors,\n },\n });\n }\n }, [error, globalDialogs, paymentDispatch]);\n\n useEffect(() => {\n if (savedInfo) {\n const {\n name: fullName, phone, email, shippingAddress,\n } = savedInfo;\n paymentDispatch({\n type: 'updateUserInfo',\n payload: {\n fullName,\n phone: phone && phone.charAt(0) !== '+'\n ? `+${phone}`\n : phone,\n email,\n ...(shippingAddress || {}),\n },\n });\n }\n }, [savedInfo, paymentDispatch]);\n\n const handleErrorModalClose = useCallback(() => {\n clearPaymentError();\n }, [clearPaymentError]);\n\n const totalPrice = useMemo(() => {\n if (step !== PaymentStep.Checkout) {\n return 0;\n }\n\n return getTotalPrice(prices, shippingOptions, paymentState.shipping);\n }, [step, paymentState.shipping, prices, shippingOptions]);\n\n const checkoutInfo = useMemo(() => {\n if (step !== PaymentStep.Checkout) {\n return undefined;\n }\n return getCheckoutInfo(paymentState, shippingOptions, nativeProvider || '');\n }, [step, paymentState, shippingOptions, nativeProvider]);\n\n function renderError() {\n if (!error) {\n return undefined;\n }\n return (\n \n

{error.description || 'Error'}

\n

{error.description || 'Error'}

\n \n {lang('OK')}\n \n
\n );\n }\n\n function renderModalContent(cuurentStep: PaymentStep) {\n switch (cuurentStep) {\n case PaymentStep.ShippingInfo:\n return (\n \n );\n case PaymentStep.Shipping:\n return (\n \n );\n case PaymentStep.PaymentInfo:\n return (\n \n );\n case PaymentStep.Checkout:\n return (\n \n );\n default:\n return undefined;\n }\n }\n\n const validateRequest = useCallback(() => {\n const { saveInfo } = paymentState;\n const requestInfo = getRequestInfo(paymentState);\n validateRequestedInfo({ requestInfo, saveInfo });\n }, [validateRequestedInfo, paymentState]);\n\n const sendCredentials = useCallback(() => {\n const credentials = getCredentials(paymentState);\n sendCredentialsInfo({\n credentials,\n });\n }, [sendCredentialsInfo, paymentState]);\n\n const sendForm = useCallback(() => {\n sendPaymentForm({\n shippingOptionId: paymentState.shipping,\n saveCredentials: paymentState.saveCredentials,\n });\n }, [sendPaymentForm, paymentState]);\n\n const setStep = useCallback((nextStep) => {\n setPaymentStep({ step: nextStep });\n }, [setPaymentStep]);\n\n const handleButtonClick = useCallback(() => {\n setIsLoading(true);\n switch (step) {\n case PaymentStep.ShippingInfo:\n return validateRequest();\n case PaymentStep.Shipping:\n return setStep(PaymentStep.PaymentInfo);\n case PaymentStep.PaymentInfo:\n return sendCredentials();\n case PaymentStep.Checkout:\n return sendForm();\n default:\n return () => {};\n }\n }, [step, validateRequest, setStep, sendCredentials, sendForm]);\n\n const modalHeader = useMemo(() => {\n switch (step) {\n case PaymentStep.ShippingInfo:\n return lang('PaymentShippingInfo');\n case PaymentStep.Shipping:\n return lang('PaymentShippingMethod');\n case PaymentStep.PaymentInfo:\n return lang('PaymentCardInfo');\n case PaymentStep.Checkout:\n return lang('PaymentCheckout');\n default:\n return '';\n }\n }, [step, lang]);\n\n const buttonText = useMemo(() => {\n switch (step) {\n case PaymentStep.Checkout:\n return lang('Checkout.PayPrice', `${currencySign}${(totalPrice / 100).toFixed(2)}`);\n default:\n return lang('Next');\n }\n }, [step, lang, currencySign, totalPrice]);\n\n if (isProviderError) {\n return (\n \n

\n Sorry, Telegram WebZ doesn't support payments with this provider yet.
\n Please use one of our mobile apps to do this.\n

\n \n {lang('OK')}\n \n \n );\n }\n\n return (\n \n
\n \n \n \n

{modalHeader}

\n
\n {step !== undefined ? (\n \n {() => (\n
\n {renderModalContent(step)}\n
\n )}\n
\n ) : (\n
\n \n
\n )}\n
\n \n {buttonText}\n \n
\n {error && !error.field && renderError()}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps & GlobalStateProps => {\n const {\n step,\n shippingOptions,\n savedInfo,\n canSaveCredentials,\n invoice,\n invoiceContent,\n nativeProvider,\n nativeParams,\n passwordMissing,\n error,\n } = global.payment;\n\n const isProviderError = Boolean(invoice && (!nativeProvider || nativeProvider !== DEFAULT_PROVIDER));\n const { needCardholderName, needCountry, needZip } = (nativeParams || {});\n const {\n nameRequested,\n phoneRequested,\n emailRequested,\n shippingAddressRequested,\n flexible,\n phoneToProvider,\n emailToProvider,\n currency,\n prices,\n } = (invoice || {});\n\n return {\n step,\n shippingOptions,\n savedInfo,\n canSaveCredentials,\n nativeProvider,\n passwordMissing,\n nameRequested,\n shippingAddressRequested,\n phoneRequested,\n emailRequested,\n flexible,\n phoneToProvider,\n emailToProvider,\n currency,\n prices,\n isProviderError,\n invoiceContent,\n needCardholderName,\n needCountry,\n needZip,\n error,\n globalDialogs: global.dialogs,\n };\n },\n (setGlobal, actions): DispatchProps => {\n return pick(actions, [\n 'validateRequestedInfo',\n 'sendPaymentForm',\n 'setPaymentStep',\n 'sendCredentialsInfo',\n 'clearPaymentError',\n ]);\n },\n)(Invoice));\n\nfunction findShippingOption(shippingOptions: ShippingOption[], optionId: string) {\n return shippingOptions.find(({ id }) => id === optionId);\n}\n\nfunction getShippingPrices(shippingOptions: ShippingOption[], shippingOption: string) {\n const option = findShippingOption(shippingOptions, shippingOption);\n return option ? option.prices : undefined;\n}\n\nfunction getTotalPrice(prices: Price[] = [], shippingOptions: ShippingOption[] | undefined, shippingOption: string) {\n const shippingPrices = shippingOptions\n ? getShippingPrices(shippingOptions, shippingOption)\n : [];\n let total = 0;\n const totalPrices = prices.concat(shippingPrices || []);\n total = totalPrices.reduce((acc, cur) => {\n return acc + cur.amount;\n }, total);\n return total;\n}\n\nfunction getCheckoutInfo(state: FormState, shippingOptions: ShippingOption[] | undefined, paymentProvider: string) {\n const cardTypeText = detectCardTypeText(state.cardNumber);\n const paymentMethod = `${cardTypeText} *${state.cardNumber.slice(-4)}`;\n const shippingAddress = state.streetLine1\n ? `${state.streetLine1}, ${state.city}, ${state.countryIso2}`\n : undefined;\n const { phone, fullName: name } = state;\n const shippingOption = shippingOptions ? findShippingOption(shippingOptions, state.shipping) : undefined;\n const shippingMethod = shippingOption ? shippingOption.title : undefined;\n return {\n paymentMethod,\n paymentProvider,\n shippingAddress,\n name,\n phone,\n shippingMethod,\n };\n}\n\nfunction getRequestInfo(paymentState: FormState) {\n const {\n streetLine1,\n streetLine2,\n city,\n state,\n countryIso2,\n postCode,\n fullName: name,\n phone,\n email,\n } = paymentState;\n\n const shippingAddress = {\n streetLine1,\n streetLine2,\n city,\n state,\n countryIso2,\n postCode,\n };\n\n return {\n name,\n phone,\n email,\n shippingAddress,\n };\n}\n\nfunction getCredentials(paymentState: FormState) {\n const {\n cardNumber, cardholder, expiry, cvv, billingCountry, billingZip,\n } = paymentState;\n const [expiryMonth, expiryYear] = expiry.split('/');\n const data = {\n cardNumber,\n cardholder,\n expiryMonth,\n expiryYear,\n cvv,\n country: billingCountry,\n zip: billingZip,\n };\n\n return {\n data,\n };\n}\n","import React, {\n FC, memo, useMemo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { Price } from '../../types';\nimport { ApiShippingAddress } from '../../api/types/payments';\n\nimport useLang from '../../hooks/useLang';\nimport { getCurrencySign } from '../middle/helpers/getCurrencySign';\n\nimport Checkout from './Checkout';\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './PaymentModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n};\n\ntype StateProps = {\n prices?: Price[];\n shippingPrices: any;\n totalAmount?: number;\n currency?: string;\n info?: {\n shippingAddress?: ApiShippingAddress;\n phone?: string;\n name?: string;\n };\n photoUrl?: string;\n text?: string;\n title?: string;\n credentialsTitle?: string;\n shippingMethod?: string;\n};\n\nconst ReceiptModal: FC = ({\n isOpen,\n onClose,\n prices,\n shippingPrices,\n totalAmount,\n currency,\n info,\n photoUrl,\n text,\n title,\n credentialsTitle,\n shippingMethod,\n}) => {\n const lang = useLang();\n const currencySign = getCurrencySign(currency);\n const checkoutInfo = useMemo(() => {\n return getCheckoutInfo(credentialsTitle, info, shippingMethod);\n }, [info, shippingMethod, credentialsTitle]);\n return (\n \n
\n
\n \n \n \n

{lang('PaymentReceipt')}

\n
\n
\n \n
\n
\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { receipt } = global.payment;\n const {\n currency,\n prices: mapedPrices,\n info,\n totalAmount,\n credentialsTitle,\n shippingPrices,\n shippingMethod,\n photoUrl,\n text,\n title,\n } = (receipt || {});\n\n return {\n currency,\n prices: mapedPrices,\n info,\n totalAmount,\n credentialsTitle,\n shippingPrices,\n shippingMethod,\n photoUrl,\n text,\n title,\n };\n },\n)(ReceiptModal));\n\nfunction getCheckoutInfo(paymentMethod?: string,\n info?:\n { phone?: string;\n name?: string;\n shippingAddress?: ApiShippingAddress;\n },\n shippingMethod?: string) {\n if (!info) {\n return { paymentMethod };\n }\n const { shippingAddress } = info;\n const fullAddress = shippingAddress && shippingAddress.streetLine1\n ? `${shippingAddress.streetLine1}, ${shippingAddress.city}, ${shippingAddress.countryIso2}`\n : undefined;\n const { phone, name } = info;\n return {\n paymentMethod,\n paymentProvider: 'Stripe',\n shippingAddress: fullAddress,\n name,\n phone,\n shippingMethod,\n };\n}\n","import { ApiMediaFormat } from '../../../api/types';\n\nimport * as mediaLoader from '../../../util/mediaLoader';\n\n// @ts-ignore\nimport MonkeyIdle from '../../../assets/TwoFactorSetupMonkeyIdle.tgs';\n// @ts-ignore\nimport MonkeyTracking from '../../../assets/TwoFactorSetupMonkeyTracking.tgs';\n// @ts-ignore\nimport MonkeyClose from '../../../assets/TwoFactorSetupMonkeyClose.tgs';\n// @ts-ignore\nimport MonkeyPeek from '../../../assets/TwoFactorSetupMonkeyPeek.tgs';\n// @ts-ignore\nimport FoldersAll from '../../../assets/FoldersAll.tgs';\n// @ts-ignore\nimport FoldersNew from '../../../assets/FoldersNew.tgs';\n// @ts-ignore\nimport DiscussionGroups from '../../../assets/DiscussionGroupsDucks.tgs';\n\nexport const ANIMATED_STICKERS_PATHS = {\n MonkeyIdle,\n MonkeyTracking,\n MonkeyClose,\n MonkeyPeek,\n FoldersAll,\n FoldersNew,\n DiscussionGroups,\n};\n\nexport default function getAnimationData(name: keyof typeof ANIMATED_STICKERS_PATHS) {\n const path = ANIMATED_STICKERS_PATHS[name].replace(window.location.origin, '');\n\n return mediaLoader.fetch(`file${path}`, ApiMediaFormat.Lottie);\n}\n","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs\";","export default __webpack_public_path__ + \"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs\";","export default __webpack_public_path__ + \"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs\";","export default __webpack_public_path__ + \"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs\";","import React, {\n FC, useEffect, useState, memo,\n} from '../../lib/teact/teact';\n\nimport { DEBUG } from '../../config';\nimport { blobToFile, blobToDataUri } from '../../util/files';\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\nimport Modal from './Modal';\nimport Loading from './Loading';\n\nimport './CropModal.scss';\n\n// Change to 'base64' to get base64-encoded string\nconst cropperResultOptions: Croppie.ResultOptions & { type: 'blob' } = {\n type: 'blob',\n quality: 0.8,\n format: 'jpeg',\n circle: false,\n};\n\ntype ICroppie = typeof import('croppie');\nlet Croppie: ICroppie;\nlet croppiePromise: Promise<{ default: ICroppie }>;\n\nasync function ensureCroppie() {\n if (!croppiePromise) {\n croppiePromise = import('../../lib/croppie') as unknown as Promise<{ default: ICroppie }>;\n Croppie = (await croppiePromise).default;\n }\n\n return croppiePromise;\n}\n\nlet cropper: Croppie;\n\nasync function initCropper(imgFile: File) {\n try {\n const cropContainer = document.getElementById('avatar-crop');\n if (!cropContainer) {\n return;\n }\n\n const { offsetWidth, offsetHeight } = cropContainer;\n\n cropper = new Croppie(cropContainer, {\n enableZoom: true,\n boundary: {\n width: offsetWidth,\n height: offsetHeight,\n },\n viewport: {\n width: offsetWidth - 16,\n height: offsetHeight - 16,\n type: 'circle',\n },\n });\n\n const dataUri = await blobToDataUri(imgFile);\n await cropper.bind({ url: dataUri });\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }\n}\n\ntype OwnProps = {\n file?: File;\n onChange: (file: File) => void;\n onClose: () => void;\n};\n\nconst CropModal: FC = ({ file, onChange, onClose }: OwnProps) => {\n const [isCroppieReady, setIsCroppieReady] = useState(false);\n\n useEffect(() => {\n if (!file) {\n return;\n }\n\n if (!isCroppieReady) {\n ensureCroppie().then(() => setIsCroppieReady(true));\n\n return;\n }\n\n initCropper(file);\n }, [file, isCroppieReady]);\n\n const lang = useLang();\n\n async function handleCropClick() {\n if (!cropper) {\n return;\n }\n\n const result: Blob | string = await cropper.result(cropperResultOptions);\n const croppedImg = typeof result === 'string' ? result : blobToFile(result, 'avatar.jpg');\n\n onChange(croppedImg);\n }\n\n return (\n \n {isCroppieReady ? (\n
\n ) : (\n \n )}\n \n \n \n \n );\n};\n\nexport default memo(CropModal);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport CropModal from './CropModal';\n\nimport './AvatarEditable.scss';\n\ninterface OwnProps {\n title?: string;\n disabled?: boolean;\n currentAvatarBlobUrl?: string;\n onChange: (file: File) => void;\n}\n\nconst AvatarEditable: FC = ({\n title = 'Change your profile picture',\n disabled,\n currentAvatarBlobUrl,\n onChange,\n}) => {\n const [selectedFile, setSelectedFile] = useState();\n const [croppedBlobUrl, setCroppedBlobUrl] = useState(currentAvatarBlobUrl);\n\n useEffect(() => {\n setCroppedBlobUrl(currentAvatarBlobUrl);\n }, [currentAvatarBlobUrl]);\n\n function handleSelectFile(event: ChangeEvent) {\n const target = event.target as HTMLInputElement;\n\n if (!target || !target.files || !target.files[0]) {\n return;\n }\n\n setSelectedFile(target.files[0]);\n target.value = '';\n }\n\n function handleAvatarCrop(croppedImg: File) {\n setSelectedFile(undefined);\n onChange(croppedImg);\n\n if (croppedBlobUrl) {\n URL.revokeObjectURL(croppedBlobUrl);\n }\n setCroppedBlobUrl(URL.createObjectURL(croppedImg));\n }\n\n function handleModalClose() {\n setSelectedFile(undefined);\n }\n\n const labelClassName = buildClassName(\n croppedBlobUrl && 'filled',\n disabled && 'disabled',\n );\n\n return (\n
\n \n \n \n {croppedBlobUrl && \"Avatar\"}\n \n \n
\n );\n};\n\nexport default memo(AvatarEditable);\n","import React, {\n FC, useState, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\n\nimport { STICKER_SIZE_AUTH, STICKER_SIZE_AUTH_MOBILE, STICKER_SIZE_TWO_FA } from '../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport getAnimationData from './helpers/animatedAssets';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './PasswordMonkey.scss';\n\ntype OwnProps = {\n isPasswordVisible: boolean;\n isBig?: boolean;\n};\n\nconst PEEK_MONKEY_SHOW_DELAY = 2000;\nconst SEGMENT_COVER_EYES: [number, number] = [0, 50];\nconst SEGMENT_UNCOVER_EYE: [number, number] = [0, 20];\nconst SEGMENT_COVER_EYE: [number, number] = [20, 0];\nconst STICKER_SIZE = IS_SINGLE_COLUMN_LAYOUT ? STICKER_SIZE_AUTH_MOBILE : STICKER_SIZE_AUTH;\n\nconst PasswordMonkey: FC = ({ isPasswordVisible, isBig }) => {\n const [closeMonkeyData, setCloseMonkeyData] = useState>();\n const [peekMonkeyData, setPeekMonkeyData] = useState>();\n const [isFirstMonkeyLoaded, setIsFirstMonkeyLoaded] = useState(false);\n const [isPeekShown, setIsPeekShown] = useState(false);\n\n useEffect(() => {\n if (!closeMonkeyData) {\n getAnimationData('MonkeyClose').then(setCloseMonkeyData);\n } else {\n setTimeout(() => setIsPeekShown(true), PEEK_MONKEY_SHOW_DELAY);\n }\n }, [closeMonkeyData]);\n\n useEffect(() => {\n if (!peekMonkeyData) {\n getAnimationData('MonkeyPeek').then(setPeekMonkeyData);\n }\n }, [peekMonkeyData]);\n\n const handleFirstMonkeyLoad = useCallback(() => setIsFirstMonkeyLoaded(true), []);\n\n return (\n
\n {!isFirstMonkeyLoaded && (\n
\n )}\n {closeMonkeyData && (\n \n )}\n {peekMonkeyData && (\n \n )}\n
\n );\n};\n\nexport default memo(PasswordMonkey);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { MIN_PASSWORD_LENGTH } from '../../config';\nimport { IS_TOUCH_ENV, IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\ntype OwnProps = {\n submitLabel?: string;\n error?: string;\n hint?: string;\n placeholder?: string;\n isLoading?: boolean;\n isPasswordVisible?: boolean;\n clearError: NoneToVoidFunction;\n onChangePasswordVisibility: (state: boolean) => void;\n onInputChange?: (password: string) => void;\n onSubmit: (password: string) => void;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_SINGLE_COLUMN_LAYOUT ? 550 : 400;\n\nconst PasswordForm: FC = ({\n isLoading = false,\n isPasswordVisible,\n error,\n hint,\n placeholder = 'Password',\n submitLabel = 'Next',\n clearError,\n onChangePasswordVisibility,\n onInputChange,\n onSubmit,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const lang = useLang();\n\n const [password, setPassword] = useState('');\n const [canSubmit, setCanSubmit] = useState(false);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n useEffect(() => {\n if (error) {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n inputRef.current!.select();\n });\n }\n }, [error]);\n\n function onPasswordChange(e: ChangeEvent) {\n if (error) {\n clearError();\n }\n\n const { target } = e;\n setPassword(target.value);\n setCanSubmit(target.value.length >= MIN_PASSWORD_LENGTH);\n if (onInputChange) {\n onInputChange(target.value);\n }\n }\n\n function togglePasswordVisibility() {\n onChangePasswordVisibility(!isPasswordVisible);\n }\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n\n if (isLoading) {\n return;\n }\n\n if (canSubmit) {\n onSubmit(password);\n }\n }\n\n return (\n
\n \n \n \n \n \n
\n
\n {canSubmit && (\n \n )}\n \n );\n};\n\nexport default memo(PasswordForm);\n"],"sourceRoot":""}