From fd867a92c736cebb7e1dadfcfa9c5b909999bfed Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Tue, 21 Jan 2020 20:31:00 +0300 Subject: [PATCH 1/4] Escape asterisks in peer names in live location panel subtitle --- Telegram-iOS/en.lproj/Localizable.strings | 2 + ...ionBroadcastNavigationAccessoryPanel.swift | 4 +- .../Sources/PresentationStrings.swift | 6683 +++++++++-------- .../Resources/PresentationStrings.mapping | Bin 144171 -> 144219 bytes 4 files changed, 3347 insertions(+), 3342 deletions(-) diff --git a/Telegram-iOS/en.lproj/Localizable.strings b/Telegram-iOS/en.lproj/Localizable.strings index 0fdd4b8f34..c2aade54e4 100644 --- a/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram-iOS/en.lproj/Localizable.strings @@ -5282,3 +5282,5 @@ Any member of this group will be able to see messages in the channel."; "Forward.ErrorPublicQuizDisabledInChannels" = "Sorry, public polls can’t be forwarded to channels."; "Map.PlacesInThisArea" = "Places In This Area"; + +"Conversation.LiveLocationYouAndOther" = "**You** and %@"; diff --git a/submodules/TelegramBaseController/Sources/LocationBroadcastNavigationAccessoryPanel.swift b/submodules/TelegramBaseController/Sources/LocationBroadcastNavigationAccessoryPanel.swift index d75b0ee04f..59430f3883 100644 --- a/submodules/TelegramBaseController/Sources/LocationBroadcastNavigationAccessoryPanel.swift +++ b/submodules/TelegramBaseController/Sources/LocationBroadcastNavigationAccessoryPanel.swift @@ -135,13 +135,13 @@ final class LocationBroadcastNavigationAccessoryPanel: ASDisplayNode { } else { let otherString: String if filteredPeers.count == 1 { - otherString = peers[0].compactDisplayTitle + otherString = peers[0].compactDisplayTitle.replacingOccurrences(of: "*", with: "") } else { otherString = self.strings.Conversation_LiveLocationMembersCount(Int32(peers.count)) } let rawText: String if filteredPeers.count != peers.count { - rawText = self.strings.Conversation_LiveLocationYouAnd(otherString).0.replacingOccurrences(of: "*", with: "**") + rawText = self.strings.Conversation_LiveLocationYouAndOther(otherString).0 } else { rawText = otherString } diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index 08c5862b4c..f55acaf222 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -1131,4170 +1131,4173 @@ public final class PresentationStrings: Equatable { public var TwoStepAuth_EnterPasswordPassword: String { return self._s[869]! } public var NotificationsSound_Calypso: String { return self._s[870]! } public var Map_Map: String { return self._s[871]! } - public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[873]! } - public var ChatSettings_TextSizeUnits: String { return self._s[874]! } + public func Conversation_LiveLocationYouAndOther(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[872]!, self._r[872]!, [_0]) + } + public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[874]! } + public var ChatSettings_TextSizeUnits: String { return self._s[875]! } public func VoiceOver_Chat_FileFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[875]!, self._r[875]!, [_0]) + return formatWithArgumentRanges(self._s[876]!, self._r[876]!, [_0]) } - public var Common_of: String { return self._s[876]! } - public var Conversation_ForwardContacts: String { return self._s[879]! } - public var IntentsSettings_SuggestByAll: String { return self._s[881]! } + public var Common_of: String { return self._s[877]! } + public var Conversation_ForwardContacts: String { return self._s[880]! } + public var IntentsSettings_SuggestByAll: String { return self._s[882]! } public func Call_AnsweringWithAccount(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[882]!, self._r[882]!, [_0]) + return formatWithArgumentRanges(self._s[883]!, self._r[883]!, [_0]) } - public var Passport_Language_hy: String { return self._s[883]! } - public var Notifications_MessageNotificationsHelp: String { return self._s[884]! } - public var AutoDownloadSettings_Reset: String { return self._s[885]! } - public var Wallet_TransactionInfo_AddressCopied: String { return self._s[886]! } - public var Paint_ClearConfirm: String { return self._s[887]! } - public var Camera_VideoMode: String { return self._s[888]! } + public var Passport_Language_hy: String { return self._s[884]! } + public var Notifications_MessageNotificationsHelp: String { return self._s[885]! } + public var AutoDownloadSettings_Reset: String { return self._s[886]! } + public var Wallet_TransactionInfo_AddressCopied: String { return self._s[887]! } + public var Paint_ClearConfirm: String { return self._s[888]! } + public var Camera_VideoMode: String { return self._s[889]! } public func Conversation_RestrictedStickersTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[889]!, self._r[889]!, [_0]) + return formatWithArgumentRanges(self._s[890]!, self._r[890]!, [_0]) } - public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[890]! } - public var Conversation_ViewBackground: String { return self._s[891]! } + public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[891]! } + public var Conversation_ViewBackground: String { return self._s[892]! } public func Wallet_Info_TransactionDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[892]!, self._r[892]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[893]!, self._r[893]!, [_1, _2, _3]) } - public var Passport_Language_el: String { return self._s[893]! } - public var PhotoEditor_Original: String { return self._s[894]! } - public var Settings_FAQ_Button: String { return self._s[896]! } - public var Channel_Setup_PublicNoLink: String { return self._s[898]! } - public var Conversation_UnsupportedMedia: String { return self._s[899]! } - public var Conversation_SlideToCancel: String { return self._s[900]! } - public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[901]! } - public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[902]! } - public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[903]! } - public var Conversation_ReportSpamChannelConfirmation: String { return self._s[904]! } - public var AutoNightTheme_NotAvailable: String { return self._s[905]! } - public var Conversation_Owner: String { return self._s[906]! } - public var Common_Create: String { return self._s[907]! } - public var Settings_ApplyProxyAlertEnable: String { return self._s[908]! } - public var ContactList_Context_Call: String { return self._s[909]! } - public var Localization_ChooseLanguage: String { return self._s[911]! } - public var ChatList_Context_AddToContacts: String { return self._s[913]! } - public var OldChannels_NoticeTitle: String { return self._s[914]! } - public var Settings_Proxy: String { return self._s[916]! } - public var Privacy_TopPeersHelp: String { return self._s[917]! } - public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[918]! } - public var Chat_UnsendMyMessages: String { return self._s[919]! } + public var Passport_Language_el: String { return self._s[894]! } + public var PhotoEditor_Original: String { return self._s[895]! } + public var Settings_FAQ_Button: String { return self._s[897]! } + public var Channel_Setup_PublicNoLink: String { return self._s[899]! } + public var Conversation_UnsupportedMedia: String { return self._s[900]! } + public var Conversation_SlideToCancel: String { return self._s[901]! } + public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[902]! } + public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[903]! } + public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[904]! } + public var Conversation_ReportSpamChannelConfirmation: String { return self._s[905]! } + public var AutoNightTheme_NotAvailable: String { return self._s[906]! } + public var Conversation_Owner: String { return self._s[907]! } + public var Common_Create: String { return self._s[908]! } + public var Settings_ApplyProxyAlertEnable: String { return self._s[909]! } + public var ContactList_Context_Call: String { return self._s[910]! } + public var Localization_ChooseLanguage: String { return self._s[912]! } + public var ChatList_Context_AddToContacts: String { return self._s[914]! } + public var OldChannels_NoticeTitle: String { return self._s[915]! } + public var Settings_Proxy: String { return self._s[917]! } + public var Privacy_TopPeersHelp: String { return self._s[918]! } + public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[919]! } + public var Chat_UnsendMyMessages: String { return self._s[920]! } public func VoiceOver_Chat_Duration(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[920]!, self._r[920]!, [_0]) + return formatWithArgumentRanges(self._s[921]!, self._r[921]!, [_0]) } - public var TwoStepAuth_ConfirmationAbort: String { return self._s[921]! } + public var TwoStepAuth_ConfirmationAbort: String { return self._s[922]! } public func Contacts_AccessDeniedHelpPortrait(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[923]!, self._r[923]!, [_0]) + return formatWithArgumentRanges(self._s[924]!, self._r[924]!, [_0]) } - public var Contacts_SortedByPresence: String { return self._s[924]! } - public var Passport_Identity_SurnamePlaceholder: String { return self._s[925]! } - public var Cache_Title: String { return self._s[926]! } + public var Contacts_SortedByPresence: String { return self._s[925]! } + public var Passport_Identity_SurnamePlaceholder: String { return self._s[926]! } + public var Cache_Title: String { return self._s[927]! } public func Login_PhoneBannedEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[927]!, self._r[927]!, [_0]) + return formatWithArgumentRanges(self._s[928]!, self._r[928]!, [_0]) } - public var TwoStepAuth_EmailCodeExpired: String { return self._s[928]! } - public var Channel_Moderator_Title: String { return self._s[929]! } - public var InstantPage_AutoNightTheme: String { return self._s[931]! } + public var TwoStepAuth_EmailCodeExpired: String { return self._s[929]! } + public var Channel_Moderator_Title: String { return self._s[930]! } + public var InstantPage_AutoNightTheme: String { return self._s[932]! } public func PUSH_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[934]!, self._r[934]!, [_1]) + return formatWithArgumentRanges(self._s[935]!, self._r[935]!, [_1]) } - public var Passport_Scans_Upload: String { return self._s[935]! } - public var Undo_Undo: String { return self._s[937]! } - public var Contacts_AccessDeniedHelpON: String { return self._s[938]! } - public var TwoStepAuth_RemovePassword: String { return self._s[939]! } - public var Common_Delete: String { return self._s[940]! } - public var Contacts_AddPeopleNearby: String { return self._s[942]! } - public var Conversation_ContextMenuDelete: String { return self._s[943]! } - public var SocksProxySetup_Credentials: String { return self._s[944]! } - public var Appearance_EditTheme: String { return self._s[946]! } - public var ClearCache_StorageOtherApps: String { return self._s[947]! } - public var PasscodeSettings_AutoLock_Disabled: String { return self._s[948]! } - public var Wallet_Send_NetworkErrorText: String { return self._s[949]! } - public var AuthSessions_DevicesTitle: String { return self._s[951]! } - public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[953]! } - public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[954]! } - public var Passport_Language_id: String { return self._s[956]! } - public var WallpaperSearch_ColorTeal: String { return self._s[957]! } - public var ChannelIntro_Title: String { return self._s[958]! } + public var Passport_Scans_Upload: String { return self._s[936]! } + public var Undo_Undo: String { return self._s[938]! } + public var Contacts_AccessDeniedHelpON: String { return self._s[939]! } + public var TwoStepAuth_RemovePassword: String { return self._s[940]! } + public var Common_Delete: String { return self._s[941]! } + public var Contacts_AddPeopleNearby: String { return self._s[943]! } + public var Conversation_ContextMenuDelete: String { return self._s[944]! } + public var SocksProxySetup_Credentials: String { return self._s[945]! } + public var Appearance_EditTheme: String { return self._s[947]! } + public var ClearCache_StorageOtherApps: String { return self._s[948]! } + public var PasscodeSettings_AutoLock_Disabled: String { return self._s[949]! } + public var Wallet_Send_NetworkErrorText: String { return self._s[950]! } + public var AuthSessions_DevicesTitle: String { return self._s[952]! } + public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[954]! } + public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[955]! } + public var Passport_Language_id: String { return self._s[957]! } + public var WallpaperSearch_ColorTeal: String { return self._s[958]! } + public var ChannelIntro_Title: String { return self._s[959]! } public func Channel_AdminLog_MessageToggleSignaturesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[959]!, self._r[959]!, [_0]) + return formatWithArgumentRanges(self._s[960]!, self._r[960]!, [_0]) } - public var VoiceOver_Chat_OpenLinkHint: String { return self._s[961]! } - public var VoiceOver_Chat_Reply: String { return self._s[962]! } - public var ScheduledMessages_BotActionUnavailable: String { return self._s[963]! } - public var Channel_Info_Description: String { return self._s[964]! } - public var Stickers_FavoriteStickers: String { return self._s[965]! } - public var Channel_BanUser_PermissionAddMembers: String { return self._s[966]! } - public var Notifications_DisplayNamesOnLockScreen: String { return self._s[967]! } - public var ChatSearch_ResultsTooltip: String { return self._s[968]! } - public var Wallet_VoiceOver_Editing_ClearText: String { return self._s[969]! } - public var Calls_NoMissedCallsPlacehoder: String { return self._s[970]! } - public var Group_PublicLink_Placeholder: String { return self._s[971]! } - public var Notifications_ExceptionsDefaultSound: String { return self._s[972]! } + public var VoiceOver_Chat_OpenLinkHint: String { return self._s[962]! } + public var VoiceOver_Chat_Reply: String { return self._s[963]! } + public var ScheduledMessages_BotActionUnavailable: String { return self._s[964]! } + public var Channel_Info_Description: String { return self._s[965]! } + public var Stickers_FavoriteStickers: String { return self._s[966]! } + public var Channel_BanUser_PermissionAddMembers: String { return self._s[967]! } + public var Notifications_DisplayNamesOnLockScreen: String { return self._s[968]! } + public var ChatSearch_ResultsTooltip: String { return self._s[969]! } + public var Wallet_VoiceOver_Editing_ClearText: String { return self._s[970]! } + public var Calls_NoMissedCallsPlacehoder: String { return self._s[971]! } + public var Group_PublicLink_Placeholder: String { return self._s[972]! } + public var Notifications_ExceptionsDefaultSound: String { return self._s[973]! } public func PUSH_CHANNEL_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[973]!, self._r[973]!, [_1]) + return formatWithArgumentRanges(self._s[974]!, self._r[974]!, [_1]) } - public var TextFormat_Underline: String { return self._s[974]! } + public var TextFormat_Underline: String { return self._s[975]! } public func DialogList_SearchSubtitleFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[976]!, self._r[976]!, [_1, _2]) + return formatWithArgumentRanges(self._s[977]!, self._r[977]!, [_1, _2]) } public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[977]!, self._r[977]!, [_0]) + return formatWithArgumentRanges(self._s[978]!, self._r[978]!, [_0]) } - public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[978]! } + public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[979]! } public func Channel_OwnershipTransfer_TransferCompleted(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[979]!, self._r[979]!, [_1, _2]) + return formatWithArgumentRanges(self._s[980]!, self._r[980]!, [_1, _2]) } - public var Wallet_Intro_ImportExisting: String { return self._s[980]! } - public var GroupPermission_Delete: String { return self._s[981]! } - public var Passport_Language_uk: String { return self._s[982]! } - public var StickerPack_HideStickers: String { return self._s[984]! } - public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[985]! } + public var Wallet_Intro_ImportExisting: String { return self._s[981]! } + public var GroupPermission_Delete: String { return self._s[982]! } + public var Passport_Language_uk: String { return self._s[983]! } + public var StickerPack_HideStickers: String { return self._s[985]! } + public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[986]! } public func PUSH_CHAT_MESSAGE_PHOTO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[986]!, self._r[986]!, [_1, _2]) + return formatWithArgumentRanges(self._s[987]!, self._r[987]!, [_1, _2]) } - public var Activity_UploadingVideoMessage: String { return self._s[987]! } + public var Activity_UploadingVideoMessage: String { return self._s[988]! } public func GroupPermission_ApplyAlertText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[988]!, self._r[988]!, [_0]) + return formatWithArgumentRanges(self._s[989]!, self._r[989]!, [_0]) } - public var Channel_TitleInfo: String { return self._s[989]! } - public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[990]! } - public var Settings_CallSettings: String { return self._s[991]! } - public var Camera_SquareMode: String { return self._s[992]! } - public var Conversation_SendMessage_ScheduleMessage: String { return self._s[993]! } - public var GroupInfo_SharedMediaNone: String { return self._s[994]! } + public var Channel_TitleInfo: String { return self._s[990]! } + public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[991]! } + public var Settings_CallSettings: String { return self._s[992]! } + public var Camera_SquareMode: String { return self._s[993]! } + public var Conversation_SendMessage_ScheduleMessage: String { return self._s[994]! } + public var GroupInfo_SharedMediaNone: String { return self._s[995]! } public func PUSH_MESSAGE_VIDEO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[995]!, self._r[995]!, [_1]) + return formatWithArgumentRanges(self._s[996]!, self._r[996]!, [_1]) } - public var Bot_GenericBotStatus: String { return self._s[996]! } - public var Application_Update: String { return self._s[998]! } - public var Month_ShortJanuary: String { return self._s[999]! } - public var Contacts_PermissionsKeepDisabled: String { return self._s[1000]! } - public var Channel_AdminLog_BanReadMessages: String { return self._s[1001]! } - public var Settings_AppLanguage_Unofficial: String { return self._s[1002]! } - public var Passport_Address_Street2Placeholder: String { return self._s[1003]! } + public var Bot_GenericBotStatus: String { return self._s[997]! } + public var Application_Update: String { return self._s[999]! } + public var Month_ShortJanuary: String { return self._s[1000]! } + public var Contacts_PermissionsKeepDisabled: String { return self._s[1001]! } + public var Channel_AdminLog_BanReadMessages: String { return self._s[1002]! } + public var Settings_AppLanguage_Unofficial: String { return self._s[1003]! } + public var Passport_Address_Street2Placeholder: String { return self._s[1004]! } public func Map_LiveLocationShortHour(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1004]!, self._r[1004]!, [_0]) + return formatWithArgumentRanges(self._s[1005]!, self._r[1005]!, [_0]) } - public var NetworkUsageSettings_Cellular: String { return self._s[1005]! } - public var Appearance_PreviewOutgoingText: String { return self._s[1006]! } + public var NetworkUsageSettings_Cellular: String { return self._s[1006]! } + public var Appearance_PreviewOutgoingText: String { return self._s[1007]! } public func StickerPackActionInfo_RemovedText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1007]!, self._r[1007]!, [_0]) + return formatWithArgumentRanges(self._s[1008]!, self._r[1008]!, [_0]) } - public var Notifications_PermissionsAllowInSettings: String { return self._s[1008]! } - public var AutoDownloadSettings_OnForAll: String { return self._s[1010]! } - public var Map_Directions: String { return self._s[1011]! } - public var Passport_FieldIdentityTranslationHelp: String { return self._s[1013]! } - public var Appearance_ThemeDay: String { return self._s[1014]! } - public var LogoutOptions_LogOut: String { return self._s[1015]! } - public var Group_PublicLink_Title: String { return self._s[1017]! } - public var Channel_AddBotErrorNoRights: String { return self._s[1018]! } - public var ChatList_Search_ShowLess: String { return self._s[1019]! } - public var Passport_Identity_AddPassport: String { return self._s[1020]! } - public var LocalGroup_ButtonTitle: String { return self._s[1021]! } - public var Call_Message: String { return self._s[1022]! } - public var PhotoEditor_ExposureTool: String { return self._s[1023]! } - public var Wallet_Receive_CommentInfo: String { return self._s[1025]! } - public var Passport_FieldOneOf_Delimeter: String { return self._s[1026]! } - public var Channel_AdminLog_CanBanUsers: String { return self._s[1028]! } - public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[1029]! } - public var Appearance_Preview: String { return self._s[1030]! } - public var Compose_ChannelMembers: String { return self._s[1031]! } - public var Conversation_DeleteManyMessages: String { return self._s[1032]! } - public var ReportPeer_ReasonOther_Title: String { return self._s[1033]! } - public var Checkout_ErrorProviderAccountTimeout: String { return self._s[1034]! } - public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[1035]! } - public var Channel_Stickers_CreateYourOwn: String { return self._s[1038]! } - public var Conversation_UpdateTelegram: String { return self._s[1039]! } - public var EditTheme_Create_TopInfo: String { return self._s[1040]! } + public var Notifications_PermissionsAllowInSettings: String { return self._s[1009]! } + public var AutoDownloadSettings_OnForAll: String { return self._s[1011]! } + public var Map_Directions: String { return self._s[1012]! } + public var Passport_FieldIdentityTranslationHelp: String { return self._s[1014]! } + public var Appearance_ThemeDay: String { return self._s[1015]! } + public var LogoutOptions_LogOut: String { return self._s[1016]! } + public var Group_PublicLink_Title: String { return self._s[1018]! } + public var Channel_AddBotErrorNoRights: String { return self._s[1019]! } + public var ChatList_Search_ShowLess: String { return self._s[1020]! } + public var Passport_Identity_AddPassport: String { return self._s[1021]! } + public var LocalGroup_ButtonTitle: String { return self._s[1022]! } + public var Call_Message: String { return self._s[1023]! } + public var PhotoEditor_ExposureTool: String { return self._s[1024]! } + public var Wallet_Receive_CommentInfo: String { return self._s[1026]! } + public var Passport_FieldOneOf_Delimeter: String { return self._s[1027]! } + public var Channel_AdminLog_CanBanUsers: String { return self._s[1029]! } + public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[1030]! } + public var Appearance_Preview: String { return self._s[1031]! } + public var Compose_ChannelMembers: String { return self._s[1032]! } + public var Conversation_DeleteManyMessages: String { return self._s[1033]! } + public var ReportPeer_ReasonOther_Title: String { return self._s[1034]! } + public var Checkout_ErrorProviderAccountTimeout: String { return self._s[1035]! } + public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[1036]! } + public var Channel_Stickers_CreateYourOwn: String { return self._s[1039]! } + public var Conversation_UpdateTelegram: String { return self._s[1040]! } + public var EditTheme_Create_TopInfo: String { return self._s[1041]! } public func Notification_PinnedPhotoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1041]!, self._r[1041]!, [_0]) + return formatWithArgumentRanges(self._s[1042]!, self._r[1042]!, [_0]) } - public var Wallet_WordCheck_Continue: String { return self._s[1042]! } - public var TwoFactorSetup_Hint_Action: String { return self._s[1043]! } - public var IntentsSettings_ResetAll: String { return self._s[1044]! } + public var Wallet_WordCheck_Continue: String { return self._s[1043]! } + public var TwoFactorSetup_Hint_Action: String { return self._s[1044]! } + public var IntentsSettings_ResetAll: String { return self._s[1045]! } public func PUSH_PINNED_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1045]!, self._r[1045]!, [_1]) + return formatWithArgumentRanges(self._s[1046]!, self._r[1046]!, [_1]) } - public var GroupInfo_Administrators_Title: String { return self._s[1046]! } - public var Privacy_Forwards_PreviewMessageText: String { return self._s[1047]! } + public var GroupInfo_Administrators_Title: String { return self._s[1047]! } + public var Privacy_Forwards_PreviewMessageText: String { return self._s[1048]! } public func PrivacySettings_LastSeenNobodyPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1048]!, self._r[1048]!, [_0]) + return formatWithArgumentRanges(self._s[1049]!, self._r[1049]!, [_0]) } - public var Tour_Title3: String { return self._s[1049]! } - public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[1050]! } - public var Clipboard_SendPhoto: String { return self._s[1054]! } - public var MediaPicker_Videos: String { return self._s[1055]! } - public var Passport_Email_Title: String { return self._s[1056]! } + public var Tour_Title3: String { return self._s[1050]! } + public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[1051]! } + public var Clipboard_SendPhoto: String { return self._s[1055]! } + public var MediaPicker_Videos: String { return self._s[1056]! } + public var Passport_Email_Title: String { return self._s[1057]! } public func PrivacySettings_LastSeenEverybodyMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1057]!, self._r[1057]!, [_0]) + return formatWithArgumentRanges(self._s[1058]!, self._r[1058]!, [_0]) } - public var StickerPacksSettings_Title: String { return self._s[1058]! } - public var Conversation_MessageDialogDelete: String { return self._s[1059]! } - public var Privacy_Calls_CustomHelp: String { return self._s[1061]! } - public var Message_Wallpaper: String { return self._s[1062]! } - public var MemberSearch_BotSection: String { return self._s[1063]! } - public var GroupInfo_SetSound: String { return self._s[1064]! } - public var Core_ServiceUserStatus: String { return self._s[1065]! } - public var LiveLocationUpdated_JustNow: String { return self._s[1066]! } - public var Call_StatusFailed: String { return self._s[1067]! } - public var TwoFactorSetup_Email_Placeholder: String { return self._s[1068]! } - public var TwoStepAuth_SetupPasswordDescription: String { return self._s[1069]! } - public var TwoStepAuth_SetPassword: String { return self._s[1070]! } - public var Permissions_PeopleNearbyText_v0: String { return self._s[1071]! } + public var StickerPacksSettings_Title: String { return self._s[1059]! } + public var Conversation_MessageDialogDelete: String { return self._s[1060]! } + public var Privacy_Calls_CustomHelp: String { return self._s[1062]! } + public var Message_Wallpaper: String { return self._s[1063]! } + public var MemberSearch_BotSection: String { return self._s[1064]! } + public var GroupInfo_SetSound: String { return self._s[1065]! } + public var Core_ServiceUserStatus: String { return self._s[1066]! } + public var LiveLocationUpdated_JustNow: String { return self._s[1067]! } + public var Call_StatusFailed: String { return self._s[1068]! } + public var TwoFactorSetup_Email_Placeholder: String { return self._s[1069]! } + public var TwoStepAuth_SetupPasswordDescription: String { return self._s[1070]! } + public var TwoStepAuth_SetPassword: String { return self._s[1071]! } + public var Permissions_PeopleNearbyText_v0: String { return self._s[1072]! } public func SocksProxySetup_ProxyStatusPing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1073]!, self._r[1073]!, [_0]) + return formatWithArgumentRanges(self._s[1074]!, self._r[1074]!, [_0]) } - public var Calls_SubmitRating: String { return self._s[1074]! } - public var Map_NoPlacesNearby: String { return self._s[1075]! } - public var Profile_Username: String { return self._s[1076]! } - public var Bot_DescriptionTitle: String { return self._s[1077]! } - public var MaskStickerSettings_Title: String { return self._s[1078]! } - public var SharedMedia_CategoryOther: String { return self._s[1079]! } - public var GroupInfo_SetGroupPhoto: String { return self._s[1080]! } - public var Common_NotNow: String { return self._s[1081]! } - public var CallFeedback_IncludeLogsInfo: String { return self._s[1082]! } - public var Conversation_ShareMyPhoneNumber: String { return self._s[1083]! } - public var Map_Location: String { return self._s[1084]! } - public var Invitation_JoinGroup: String { return self._s[1085]! } - public var AutoDownloadSettings_Title: String { return self._s[1087]! } - public var Conversation_DiscardVoiceMessageDescription: String { return self._s[1088]! } - public var Channel_ErrorAddBlocked: String { return self._s[1089]! } - public var Conversation_UnblockUser: String { return self._s[1090]! } - public var EditTheme_Edit_TopInfo: String { return self._s[1091]! } - public var Watch_Bot_Restart: String { return self._s[1092]! } - public var TwoStepAuth_Title: String { return self._s[1093]! } - public var Channel_AdminLog_BanSendMessages: String { return self._s[1094]! } - public var Checkout_ShippingMethod: String { return self._s[1095]! } - public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[1096]! } + public var Calls_SubmitRating: String { return self._s[1075]! } + public var Map_NoPlacesNearby: String { return self._s[1076]! } + public var Profile_Username: String { return self._s[1077]! } + public var Bot_DescriptionTitle: String { return self._s[1078]! } + public var MaskStickerSettings_Title: String { return self._s[1079]! } + public var SharedMedia_CategoryOther: String { return self._s[1080]! } + public var GroupInfo_SetGroupPhoto: String { return self._s[1081]! } + public var Common_NotNow: String { return self._s[1082]! } + public var CallFeedback_IncludeLogsInfo: String { return self._s[1083]! } + public var Conversation_ShareMyPhoneNumber: String { return self._s[1084]! } + public var Map_Location: String { return self._s[1085]! } + public var Invitation_JoinGroup: String { return self._s[1086]! } + public var AutoDownloadSettings_Title: String { return self._s[1088]! } + public var Conversation_DiscardVoiceMessageDescription: String { return self._s[1089]! } + public var Channel_ErrorAddBlocked: String { return self._s[1090]! } + public var Conversation_UnblockUser: String { return self._s[1091]! } + public var EditTheme_Edit_TopInfo: String { return self._s[1092]! } + public var Watch_Bot_Restart: String { return self._s[1093]! } + public var TwoStepAuth_Title: String { return self._s[1094]! } + public var Channel_AdminLog_BanSendMessages: String { return self._s[1095]! } + public var Checkout_ShippingMethod: String { return self._s[1096]! } + public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[1097]! } public func PUSH_CHAT_MESSAGE_STICKER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1097]!, self._r[1097]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1098]!, self._r[1098]!, [_1, _2, _3]) } - public var EditTheme_ChangeColors: String { return self._s[1099]! } + public var EditTheme_ChangeColors: String { return self._s[1100]! } public func Chat_UnsendMyMessagesAlertTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1100]!, self._r[1100]!, [_0]) - } - public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1101]!, self._r[1101]!, [_0]) } - public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[1102]! } - public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[1103]! } - public var AuthSessions_TerminateOtherSessions: String { return self._s[1104]! } - public var Contacts_FailedToSendInvitesMessage: String { return self._s[1105]! } - public var PrivacySettings_TwoStepAuth: String { return self._s[1106]! } - public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[1107]! } - public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[1108]! } - public var Conversation_EditingMessagePanelMedia: String { return self._s[1109]! } - public var Checkout_PaymentMethod_Title: String { return self._s[1110]! } - public var SocksProxySetup_Connection: String { return self._s[1111]! } - public var Group_MessagePhotoRemoved: String { return self._s[1112]! } - public var Channel_Stickers_NotFound: String { return self._s[1115]! } - public var Group_About_Help: String { return self._s[1116]! } - public var Notification_PassportValueProofOfIdentity: String { return self._s[1117]! } - public var PeopleNearby_Title: String { return self._s[1119]! } - public func ApplyLanguage_ChangeLanguageOfficialText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1120]!, self._r[1120]!, [_1]) + public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1102]!, self._r[1102]!, [_0]) } - public var Map_Home: String { return self._s[1121]! } - public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[1123]! } - public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[1124]! } - public var SocksProxySetup_Password: String { return self._s[1125]! } - public var Notifications_PermissionsEnable: String { return self._s[1126]! } - public var TwoStepAuth_ChangeEmail: String { return self._s[1128]! } + public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[1103]! } + public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[1104]! } + public var AuthSessions_TerminateOtherSessions: String { return self._s[1105]! } + public var Contacts_FailedToSendInvitesMessage: String { return self._s[1106]! } + public var PrivacySettings_TwoStepAuth: String { return self._s[1107]! } + public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[1108]! } + public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[1109]! } + public var Conversation_EditingMessagePanelMedia: String { return self._s[1110]! } + public var Checkout_PaymentMethod_Title: String { return self._s[1111]! } + public var SocksProxySetup_Connection: String { return self._s[1112]! } + public var Group_MessagePhotoRemoved: String { return self._s[1113]! } + public var Channel_Stickers_NotFound: String { return self._s[1116]! } + public var Group_About_Help: String { return self._s[1117]! } + public var Notification_PassportValueProofOfIdentity: String { return self._s[1118]! } + public var PeopleNearby_Title: String { return self._s[1120]! } + public func ApplyLanguage_ChangeLanguageOfficialText(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1121]!, self._r[1121]!, [_1]) + } + public var Map_Home: String { return self._s[1122]! } + public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[1124]! } + public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[1125]! } + public var SocksProxySetup_Password: String { return self._s[1126]! } + public var Notifications_PermissionsEnable: String { return self._s[1127]! } + public var TwoStepAuth_ChangeEmail: String { return self._s[1129]! } public func Channel_AdminLog_MessageInvitedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1129]!, self._r[1129]!, [_1]) + return formatWithArgumentRanges(self._s[1130]!, self._r[1130]!, [_1]) } public func Time_MonthOfYear_m10(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1131]!, self._r[1131]!, [_0]) + return formatWithArgumentRanges(self._s[1132]!, self._r[1132]!, [_0]) } - public var Passport_Identity_TypeDriversLicense: String { return self._s[1132]! } - public var ArchivedPacksAlert_Title: String { return self._s[1133]! } - public var Wallet_Receive_InvoiceUrlCopied: String { return self._s[1134]! } - public var Map_PlacesNearby: String { return self._s[1135]! } + public var Passport_Identity_TypeDriversLicense: String { return self._s[1133]! } + public var ArchivedPacksAlert_Title: String { return self._s[1134]! } + public var Wallet_Receive_InvoiceUrlCopied: String { return self._s[1135]! } + public var Map_PlacesNearby: String { return self._s[1136]! } public func Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1136]!, self._r[1136]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1137]!, self._r[1137]!, [_1, _2, _3]) } - public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1137]! } - public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1139]! } - public var Conversation_StatusTyping: String { return self._s[1140]! } - public var Broadcast_AdminLog_EmptyText: String { return self._s[1141]! } - public var Notification_PassportValueProofOfAddress: String { return self._s[1142]! } - public var UserInfo_CreateNewContact: String { return self._s[1143]! } - public var Passport_Identity_FrontSide: String { return self._s[1144]! } - public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1145]! } - public var Calls_CallTabTitle: String { return self._s[1146]! } - public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1147]! } + public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1138]! } + public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1140]! } + public var Conversation_StatusTyping: String { return self._s[1141]! } + public var Broadcast_AdminLog_EmptyText: String { return self._s[1142]! } + public var Notification_PassportValueProofOfAddress: String { return self._s[1143]! } + public var UserInfo_CreateNewContact: String { return self._s[1144]! } + public var Passport_Identity_FrontSide: String { return self._s[1145]! } + public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1146]! } + public var Calls_CallTabTitle: String { return self._s[1147]! } + public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1148]! } public func Login_BannedPhoneBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1149]!, self._r[1149]!, [_0]) + return formatWithArgumentRanges(self._s[1150]!, self._r[1150]!, [_0]) } - public var Watch_UserInfo_MuteTitle: String { return self._s[1150]! } - public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1151]! } - public var SharedMedia_EmptyMusicText: String { return self._s[1152]! } - public var Wallet_Completed_Text: String { return self._s[1153]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1154]! } - public var Paint_Stickers: String { return self._s[1155]! } - public var Privacy_GroupsAndChannels: String { return self._s[1156]! } - public var ChatList_Context_Delete: String { return self._s[1158]! } - public var UserInfo_AddContact: String { return self._s[1159]! } + public var Watch_UserInfo_MuteTitle: String { return self._s[1151]! } + public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1152]! } + public var SharedMedia_EmptyMusicText: String { return self._s[1153]! } + public var Wallet_Completed_Text: String { return self._s[1154]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1155]! } + public var Paint_Stickers: String { return self._s[1156]! } + public var Privacy_GroupsAndChannels: String { return self._s[1157]! } + public var ChatList_Context_Delete: String { return self._s[1159]! } + public var UserInfo_AddContact: String { return self._s[1160]! } public func Conversation_MessageViaUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1160]!, self._r[1160]!, [_0]) + return formatWithArgumentRanges(self._s[1161]!, self._r[1161]!, [_0]) } - public var PhoneNumberHelp_ChangeNumber: String { return self._s[1162]! } + public var PhoneNumberHelp_ChangeNumber: String { return self._s[1163]! } public func ChatList_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1164]!, self._r[1164]!, [_0]) + return formatWithArgumentRanges(self._s[1165]!, self._r[1165]!, [_0]) } - public var DialogList_NoMessagesTitle: String { return self._s[1165]! } - public var EditProfile_NameAndPhotoHelp: String { return self._s[1166]! } - public var BlockedUsers_BlockUser: String { return self._s[1167]! } - public var Notifications_PermissionsOpenSettings: String { return self._s[1168]! } - public var MediaPicker_UngroupDescription: String { return self._s[1170]! } - public var Watch_NoConnection: String { return self._s[1171]! } - public var Month_GenSeptember: String { return self._s[1172]! } - public var Conversation_ViewGroup: String { return self._s[1174]! } - public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1177]! } - public var Privacy_Forwards_AlwaysLink: String { return self._s[1178]! } - public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1179]! } - public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1180]! } - public var Wallet_WordCheck_IncorrectHeader: String { return self._s[1181]! } - public var MediaPicker_CameraRoll: String { return self._s[1183]! } - public var Month_GenAugust: String { return self._s[1184]! } - public var Wallet_Configuration_SourceHeader: String { return self._s[1185]! } - public var AccessDenied_VideoMessageMicrophone: String { return self._s[1186]! } - public var SharedMedia_EmptyText: String { return self._s[1187]! } - public var Map_ShareLiveLocation: String { return self._s[1188]! } - public var Calls_All: String { return self._s[1189]! } - public var Map_SendThisPlace: String { return self._s[1191]! } - public var Appearance_ThemeNight: String { return self._s[1193]! } - public var Conversation_HoldForAudio: String { return self._s[1194]! } - public var SettingsSearch_Synonyms_Support: String { return self._s[1197]! } - public var GroupInfo_GroupHistoryHidden: String { return self._s[1198]! } - public var SocksProxySetup_Secret: String { return self._s[1199]! } + public var DialogList_NoMessagesTitle: String { return self._s[1166]! } + public var EditProfile_NameAndPhotoHelp: String { return self._s[1167]! } + public var BlockedUsers_BlockUser: String { return self._s[1168]! } + public var Notifications_PermissionsOpenSettings: String { return self._s[1169]! } + public var MediaPicker_UngroupDescription: String { return self._s[1171]! } + public var Watch_NoConnection: String { return self._s[1172]! } + public var Month_GenSeptember: String { return self._s[1173]! } + public var Conversation_ViewGroup: String { return self._s[1175]! } + public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1178]! } + public var Privacy_Forwards_AlwaysLink: String { return self._s[1179]! } + public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1180]! } + public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1181]! } + public var Wallet_WordCheck_IncorrectHeader: String { return self._s[1182]! } + public var MediaPicker_CameraRoll: String { return self._s[1184]! } + public var Month_GenAugust: String { return self._s[1185]! } + public var Wallet_Configuration_SourceHeader: String { return self._s[1186]! } + public var AccessDenied_VideoMessageMicrophone: String { return self._s[1187]! } + public var SharedMedia_EmptyText: String { return self._s[1188]! } + public var Map_ShareLiveLocation: String { return self._s[1189]! } + public var Calls_All: String { return self._s[1190]! } + public var Map_SendThisPlace: String { return self._s[1192]! } + public var Appearance_ThemeNight: String { return self._s[1194]! } + public var Conversation_HoldForAudio: String { return self._s[1195]! } + public var SettingsSearch_Synonyms_Support: String { return self._s[1198]! } + public var GroupInfo_GroupHistoryHidden: String { return self._s[1199]! } + public var SocksProxySetup_Secret: String { return self._s[1200]! } public func Activity_RemindAboutChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1200]!, self._r[1200]!, [_0]) + return formatWithArgumentRanges(self._s[1201]!, self._r[1201]!, [_0]) } - public var Channel_BanList_RestrictedTitle: String { return self._s[1202]! } - public var Conversation_Location: String { return self._s[1203]! } + public var Channel_BanList_RestrictedTitle: String { return self._s[1203]! } + public var Conversation_Location: String { return self._s[1204]! } public func AutoDownloadSettings_UpToFor(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1204]!, self._r[1204]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1205]!, self._r[1205]!, [_1, _2]) } - public var ChatSettings_AutoDownloadPhotos: String { return self._s[1206]! } - public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1207]! } - public var Notifications_PermissionsText: String { return self._s[1208]! } - public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1209]! } - public var Call_Flip: String { return self._s[1210]! } - public var Channel_AdminLog_CanDeleteMessagesOfOthers: String { return self._s[1212]! } - public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1213]! } - public var Wallet_TransactionInfo_StorageFeeInfoUrl: String { return self._s[1214]! } - public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[1215]! } - public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1217]! } - public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1219]! } - public var Channel_TooMuchBots: String { return self._s[1221]! } - public var Passport_DeletePassportConfirmation: String { return self._s[1222]! } - public var Login_InvalidCodeError: String { return self._s[1223]! } - public var StickerPacksSettings_FeaturedPacks: String { return self._s[1224]! } + public var ChatSettings_AutoDownloadPhotos: String { return self._s[1207]! } + public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1208]! } + public var Notifications_PermissionsText: String { return self._s[1209]! } + public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1210]! } + public var Call_Flip: String { return self._s[1211]! } + public var Channel_AdminLog_CanDeleteMessagesOfOthers: String { return self._s[1213]! } + public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1214]! } + public var Wallet_TransactionInfo_StorageFeeInfoUrl: String { return self._s[1215]! } + public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[1216]! } + public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1218]! } + public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1220]! } + public var Channel_TooMuchBots: String { return self._s[1222]! } + public var Passport_DeletePassportConfirmation: String { return self._s[1223]! } + public var Login_InvalidCodeError: String { return self._s[1224]! } + public var StickerPacksSettings_FeaturedPacks: String { return self._s[1225]! } public func ChatList_DeleteSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1225]!, self._r[1225]!, [_0]) - } - public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1226]!, self._r[1226]!, [_0]) } - public var VoiceOver_Navigation_ProxySettings: String { return self._s[1227]! } - public var Call_CallInProgressTitle: String { return self._s[1228]! } - public var Month_ShortSeptember: String { return self._s[1229]! } - public var Watch_ChannelInfo_Title: String { return self._s[1230]! } - public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1233]! } - public var DialogList_PasscodeLockHelp: String { return self._s[1234]! } - public var Chat_MultipleTextMessagesDisabled: String { return self._s[1235]! } - public var Wallet_Receive_Title: String { return self._s[1236]! } - public var Notifications_Badge_IncludePublicGroups: String { return self._s[1237]! } - public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1238]! } - public var PhotoEditor_CropReset: String { return self._s[1239]! } - public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1241]! } - public var Channel_Management_LabelEditor: String { return self._s[1242]! } - public var Passport_Identity_LatinNameHelp: String { return self._s[1244]! } - public var PhotoEditor_HighlightsTool: String { return self._s[1245]! } - public var Wallet_Info_WalletCreated: String { return self._s[1246]! } - public var UserInfo_Title: String { return self._s[1247]! } - public var ChatList_HideAction: String { return self._s[1248]! } - public var AccessDenied_Title: String { return self._s[1249]! } - public var DialogList_SearchLabel: String { return self._s[1250]! } - public var Group_Setup_HistoryHidden: String { return self._s[1251]! } - public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1252]! } - public var State_Updating: String { return self._s[1254]! } - public var Contacts_TabTitle: String { return self._s[1255]! } - public var Notifications_Badge_CountUnreadMessages: String { return self._s[1257]! } - public var GroupInfo_GroupHistory: String { return self._s[1258]! } - public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1259]! } - public var Wallpaper_SetColor: String { return self._s[1260]! } - public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1261]! } - public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1262]! } - public var Chat_AttachmentLimitReached: String { return self._s[1263]! } - public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1264]! } - public var Contacts_NotRegisteredSection: String { return self._s[1265]! } + public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1227]!, self._r[1227]!, [_0]) + } + public var VoiceOver_Navigation_ProxySettings: String { return self._s[1228]! } + public var Call_CallInProgressTitle: String { return self._s[1229]! } + public var Month_ShortSeptember: String { return self._s[1230]! } + public var Watch_ChannelInfo_Title: String { return self._s[1231]! } + public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1234]! } + public var DialogList_PasscodeLockHelp: String { return self._s[1235]! } + public var Chat_MultipleTextMessagesDisabled: String { return self._s[1236]! } + public var Wallet_Receive_Title: String { return self._s[1237]! } + public var Notifications_Badge_IncludePublicGroups: String { return self._s[1238]! } + public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1239]! } + public var PhotoEditor_CropReset: String { return self._s[1240]! } + public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1242]! } + public var Channel_Management_LabelEditor: String { return self._s[1243]! } + public var Passport_Identity_LatinNameHelp: String { return self._s[1245]! } + public var PhotoEditor_HighlightsTool: String { return self._s[1246]! } + public var Wallet_Info_WalletCreated: String { return self._s[1247]! } + public var UserInfo_Title: String { return self._s[1248]! } + public var ChatList_HideAction: String { return self._s[1249]! } + public var AccessDenied_Title: String { return self._s[1250]! } + public var DialogList_SearchLabel: String { return self._s[1251]! } + public var Group_Setup_HistoryHidden: String { return self._s[1252]! } + public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1253]! } + public var State_Updating: String { return self._s[1255]! } + public var Contacts_TabTitle: String { return self._s[1256]! } + public var Notifications_Badge_CountUnreadMessages: String { return self._s[1258]! } + public var GroupInfo_GroupHistory: String { return self._s[1259]! } + public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1260]! } + public var Wallpaper_SetColor: String { return self._s[1261]! } + public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1262]! } + public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1263]! } + public var Chat_AttachmentLimitReached: String { return self._s[1264]! } + public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1265]! } + public var Contacts_NotRegisteredSection: String { return self._s[1266]! } public func Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1266]!, self._r[1266]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1267]!, self._r[1267]!, [_1, _2, _3]) } - public var Paint_Clear: String { return self._s[1267]! } - public var StickerPacksSettings_ArchivedMasks: String { return self._s[1268]! } - public var SocksProxySetup_Connecting: String { return self._s[1269]! } - public var ExplicitContent_AlertChannel: String { return self._s[1270]! } - public var CreatePoll_AllOptionsAdded: String { return self._s[1271]! } - public var Conversation_Contact: String { return self._s[1272]! } - public var Login_CodeExpired: String { return self._s[1273]! } - public var Passport_DiscardMessageAction: String { return self._s[1274]! } - public var ChatList_Context_Unpin: String { return self._s[1275]! } - public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1276]! } + public var Paint_Clear: String { return self._s[1268]! } + public var StickerPacksSettings_ArchivedMasks: String { return self._s[1269]! } + public var SocksProxySetup_Connecting: String { return self._s[1270]! } + public var ExplicitContent_AlertChannel: String { return self._s[1271]! } + public var CreatePoll_AllOptionsAdded: String { return self._s[1272]! } + public var Conversation_Contact: String { return self._s[1273]! } + public var Login_CodeExpired: String { return self._s[1274]! } + public var Passport_DiscardMessageAction: String { return self._s[1275]! } + public var ChatList_Context_Unpin: String { return self._s[1276]! } + public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1277]! } public func VoiceOver_Chat_MusicFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1277]!, self._r[1277]!, [_0]) + return formatWithArgumentRanges(self._s[1278]!, self._r[1278]!, [_0]) } - public var Channel_AdminLog_EmptyMessageText: String { return self._s[1278]! } - public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1279]! } + public var Channel_AdminLog_EmptyMessageText: String { return self._s[1279]! } + public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1280]! } public func Group_EditAdmin_RankInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1280]!, self._r[1280]!, [_0]) + return formatWithArgumentRanges(self._s[1281]!, self._r[1281]!, [_0]) } - public var Month_ShortApril: String { return self._s[1281]! } - public var AuthSessions_CurrentSession: String { return self._s[1282]! } - public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1285]! } - public var Wallet_Navigation_Cancel: String { return self._s[1287]! } - public var WallpaperPreview_CropTopText: String { return self._s[1288]! } - public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1289]! } - public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1290]! } + public var Month_ShortApril: String { return self._s[1282]! } + public var AuthSessions_CurrentSession: String { return self._s[1283]! } + public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1286]! } + public var Wallet_Navigation_Cancel: String { return self._s[1288]! } + public var WallpaperPreview_CropTopText: String { return self._s[1289]! } + public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1290]! } + public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1291]! } public func Conversation_ScheduleMessage_SendOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1291]!, self._r[1291]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1292]!, self._r[1292]!, [_0, _1]) } - public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1292]! } - public var Channel_Setup_TypePrivate: String { return self._s[1294]! } - public var Forward_ChannelReadOnly: String { return self._s[1297]! } - public var PhotoEditor_CurvesBlue: String { return self._s[1298]! } - public var AddContact_SharedContactException: String { return self._s[1299]! } - public var UserInfo_BotPrivacy: String { return self._s[1301]! } - public var Wallet_CreateInvoice_Title: String { return self._s[1302]! } - public var Notification_PassportValueEmail: String { return self._s[1303]! } - public var EmptyGroupInfo_Subtitle: String { return self._s[1304]! } - public var GroupPermission_NewTitle: String { return self._s[1305]! } - public var CallFeedback_ReasonDropped: String { return self._s[1306]! } - public var GroupInfo_Permissions_AddException: String { return self._s[1307]! } - public var Channel_SignMessages_Help: String { return self._s[1309]! } - public var Undo_ChatDeleted: String { return self._s[1311]! } - public var Conversation_ChatBackground: String { return self._s[1312]! } + public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1293]! } + public var Channel_Setup_TypePrivate: String { return self._s[1295]! } + public var Forward_ChannelReadOnly: String { return self._s[1298]! } + public var PhotoEditor_CurvesBlue: String { return self._s[1299]! } + public var AddContact_SharedContactException: String { return self._s[1300]! } + public var UserInfo_BotPrivacy: String { return self._s[1302]! } + public var Wallet_CreateInvoice_Title: String { return self._s[1303]! } + public var Notification_PassportValueEmail: String { return self._s[1304]! } + public var EmptyGroupInfo_Subtitle: String { return self._s[1305]! } + public var GroupPermission_NewTitle: String { return self._s[1306]! } + public var CallFeedback_ReasonDropped: String { return self._s[1307]! } + public var GroupInfo_Permissions_AddException: String { return self._s[1308]! } + public var Channel_SignMessages_Help: String { return self._s[1310]! } + public var Undo_ChatDeleted: String { return self._s[1312]! } + public var Conversation_ChatBackground: String { return self._s[1313]! } public func Wallet_WordCheck_Text(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1313]!, self._r[1313]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1314]!, self._r[1314]!, [_1, _2, _3]) } - public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1314]! } - public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1315]! } - public var Passport_Language_pt: String { return self._s[1316]! } - public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1317]! } - public var NotificationsSound_Popcorn: String { return self._s[1320]! } - public var AutoNightTheme_Disabled: String { return self._s[1321]! } - public var BlockedUsers_LeavePrefix: String { return self._s[1322]! } - public var WallpaperPreview_CustomColorTopText: String { return self._s[1323]! } - public var Contacts_PermissionsSuppressWarningText: String { return self._s[1324]! } - public var WallpaperSearch_ColorBlue: String { return self._s[1325]! } + public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1315]! } + public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1316]! } + public var Passport_Language_pt: String { return self._s[1317]! } + public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1318]! } + public var NotificationsSound_Popcorn: String { return self._s[1321]! } + public var AutoNightTheme_Disabled: String { return self._s[1322]! } + public var BlockedUsers_LeavePrefix: String { return self._s[1323]! } + public var WallpaperPreview_CustomColorTopText: String { return self._s[1324]! } + public var Contacts_PermissionsSuppressWarningText: String { return self._s[1325]! } + public var WallpaperSearch_ColorBlue: String { return self._s[1326]! } public func CancelResetAccount_TextSMS(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1326]!, self._r[1326]!, [_0]) + return formatWithArgumentRanges(self._s[1327]!, self._r[1327]!, [_0]) } - public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1327]! } - public var SocksProxySetup_UseForCalls: String { return self._s[1328]! } - public var Passport_DeleteDocumentConfirmation: String { return self._s[1330]! } + public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1328]! } + public var SocksProxySetup_UseForCalls: String { return self._s[1329]! } + public var Passport_DeleteDocumentConfirmation: String { return self._s[1331]! } public func Conversation_Megabytes(_ _0: Float) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1331]!, self._r[1331]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1332]!, self._r[1332]!, ["\(_0)"]) } - public var SocksProxySetup_Hostname: String { return self._s[1334]! } - public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1335]! } - public var Compose_NewEncryptedChat: String { return self._s[1336]! } - public var Login_CodeFloodError: String { return self._s[1337]! } - public var Calls_TabTitle: String { return self._s[1338]! } - public var Privacy_ProfilePhoto: String { return self._s[1339]! } - public var Passport_Language_he: String { return self._s[1340]! } + public var SocksProxySetup_Hostname: String { return self._s[1335]! } + public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1336]! } + public var Compose_NewEncryptedChat: String { return self._s[1337]! } + public var Login_CodeFloodError: String { return self._s[1338]! } + public var Calls_TabTitle: String { return self._s[1339]! } + public var Privacy_ProfilePhoto: String { return self._s[1340]! } + public var Passport_Language_he: String { return self._s[1341]! } public func Conversation_SetReminder_RemindToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1341]!, self._r[1341]!, [_0]) + return formatWithArgumentRanges(self._s[1342]!, self._r[1342]!, [_0]) } - public var GroupPermission_Title: String { return self._s[1342]! } + public var GroupPermission_Title: String { return self._s[1343]! } public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1343]!, self._r[1343]!, [_0]) + return formatWithArgumentRanges(self._s[1344]!, self._r[1344]!, [_0]) } - public var Wallet_TransactionInfo_SenderHeader: String { return self._s[1344]! } - public var GroupPermission_NoChangeInfo: String { return self._s[1345]! } - public var ChatList_DeleteForCurrentUser: String { return self._s[1346]! } - public var Tour_Text1: String { return self._s[1347]! } - public var Channel_EditAdmin_TransferOwnership: String { return self._s[1348]! } - public var Month_ShortFebruary: String { return self._s[1349]! } - public var TwoStepAuth_EmailSkip: String { return self._s[1350]! } + public var Wallet_TransactionInfo_SenderHeader: String { return self._s[1345]! } + public var GroupPermission_NoChangeInfo: String { return self._s[1346]! } + public var ChatList_DeleteForCurrentUser: String { return self._s[1347]! } + public var Tour_Text1: String { return self._s[1348]! } + public var Channel_EditAdmin_TransferOwnership: String { return self._s[1349]! } + public var Month_ShortFebruary: String { return self._s[1350]! } + public var TwoStepAuth_EmailSkip: String { return self._s[1351]! } public func Wallet_Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1351]!, self._r[1351]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1352]!, self._r[1352]!, [_1, _2, _3]) } - public var NotificationsSound_Glass: String { return self._s[1352]! } - public var Appearance_ThemeNightBlue: String { return self._s[1353]! } - public var CheckoutInfo_Pay: String { return self._s[1354]! } - public var Invite_LargeRecipientsCountWarning: String { return self._s[1356]! } - public var Call_CallAgain: String { return self._s[1358]! } - public var AttachmentMenu_SendAsFile: String { return self._s[1359]! } - public var AccessDenied_MicrophoneRestricted: String { return self._s[1360]! } - public var Passport_InvalidPasswordError: String { return self._s[1361]! } - public var Watch_Message_Game: String { return self._s[1362]! } - public var Stickers_Install: String { return self._s[1363]! } - public var VoiceOver_Chat_Message: String { return self._s[1364]! } - public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1365]! } - public var Passport_Identity_ResidenceCountry: String { return self._s[1367]! } - public var Notifications_GroupNotificationsHelp: String { return self._s[1368]! } - public var AuthSessions_OtherSessions: String { return self._s[1369]! } - public var Channel_Username_Help: String { return self._s[1370]! } - public var Camera_Title: String { return self._s[1371]! } - public var IntentsSettings_Title: String { return self._s[1372]! } - public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1374]! } - public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1375]! } - public var Channel_AdminLog_SendPolls: String { return self._s[1376]! } - public var Channel_AdminLog_TitleAllEvents: String { return self._s[1377]! } - public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1378]! } - public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1379]! } - public var ScheduledMessages_DeleteMany: String { return self._s[1380]! } - public var Conversation_RestrictedStickers: String { return self._s[1381]! } - public var Notifications_ExceptionsResetToDefaults: String { return self._s[1383]! } - public var UserInfo_TelegramCall: String { return self._s[1385]! } - public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1386]! } - public var CreatePoll_OptionsHeader: String { return self._s[1387]! } - public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1388]! } - public var ArchivedChats_IntroTitle1: String { return self._s[1389]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1390]! } - public var Theme_Colors_Proceed: String { return self._s[1391]! } - public var Passport_Identity_EditPersonalDetails: String { return self._s[1392]! } + public var NotificationsSound_Glass: String { return self._s[1353]! } + public var Appearance_ThemeNightBlue: String { return self._s[1354]! } + public var CheckoutInfo_Pay: String { return self._s[1355]! } + public var Invite_LargeRecipientsCountWarning: String { return self._s[1357]! } + public var Call_CallAgain: String { return self._s[1359]! } + public var AttachmentMenu_SendAsFile: String { return self._s[1360]! } + public var AccessDenied_MicrophoneRestricted: String { return self._s[1361]! } + public var Passport_InvalidPasswordError: String { return self._s[1362]! } + public var Watch_Message_Game: String { return self._s[1363]! } + public var Stickers_Install: String { return self._s[1364]! } + public var VoiceOver_Chat_Message: String { return self._s[1365]! } + public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1366]! } + public var Passport_Identity_ResidenceCountry: String { return self._s[1368]! } + public var Notifications_GroupNotificationsHelp: String { return self._s[1369]! } + public var AuthSessions_OtherSessions: String { return self._s[1370]! } + public var Channel_Username_Help: String { return self._s[1371]! } + public var Camera_Title: String { return self._s[1372]! } + public var IntentsSettings_Title: String { return self._s[1373]! } + public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1375]! } + public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1376]! } + public var Channel_AdminLog_SendPolls: String { return self._s[1377]! } + public var Channel_AdminLog_TitleAllEvents: String { return self._s[1378]! } + public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1379]! } + public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1380]! } + public var ScheduledMessages_DeleteMany: String { return self._s[1381]! } + public var Conversation_RestrictedStickers: String { return self._s[1382]! } + public var Notifications_ExceptionsResetToDefaults: String { return self._s[1384]! } + public var UserInfo_TelegramCall: String { return self._s[1386]! } + public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1387]! } + public var CreatePoll_OptionsHeader: String { return self._s[1388]! } + public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1389]! } + public var ArchivedChats_IntroTitle1: String { return self._s[1390]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1391]! } + public var Theme_Colors_Proceed: String { return self._s[1392]! } + public var Passport_Identity_EditPersonalDetails: String { return self._s[1393]! } public func Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1393]!, self._r[1393]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1394]!, self._r[1394]!, [_1, _2, _3]) } - public var Wallet_Month_GenAugust: String { return self._s[1394]! } - public var Settings_SaveEditedPhotos: String { return self._s[1395]! } - public var TwoStepAuth_ConfirmationTitle: String { return self._s[1396]! } - public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1397]! } - public var Conversation_MessageDialogRetry: String { return self._s[1398]! } - public var ChatList_Context_MarkAsUnread: String { return self._s[1399]! } - public var MessagePoll_SubmitVote: String { return self._s[1400]! } - public var Conversation_DiscardVoiceMessageAction: String { return self._s[1401]! } - public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1402]! } - public var Group_Setup_TypeHeader: String { return self._s[1403]! } - public var Paint_RecentStickers: String { return self._s[1404]! } - public var PhotoEditor_GrainTool: String { return self._s[1405]! } - public var CheckoutInfo_ShippingInfoState: String { return self._s[1406]! } - public var EmptyGroupInfo_Line4: String { return self._s[1407]! } - public var Watch_AuthRequired: String { return self._s[1409]! } + public var Wallet_Month_GenAugust: String { return self._s[1395]! } + public var Settings_SaveEditedPhotos: String { return self._s[1396]! } + public var TwoStepAuth_ConfirmationTitle: String { return self._s[1397]! } + public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1398]! } + public var Conversation_MessageDialogRetry: String { return self._s[1399]! } + public var ChatList_Context_MarkAsUnread: String { return self._s[1400]! } + public var MessagePoll_SubmitVote: String { return self._s[1401]! } + public var Conversation_DiscardVoiceMessageAction: String { return self._s[1402]! } + public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1403]! } + public var Group_Setup_TypeHeader: String { return self._s[1404]! } + public var Paint_RecentStickers: String { return self._s[1405]! } + public var PhotoEditor_GrainTool: String { return self._s[1406]! } + public var CheckoutInfo_ShippingInfoState: String { return self._s[1407]! } + public var EmptyGroupInfo_Line4: String { return self._s[1408]! } + public var Watch_AuthRequired: String { return self._s[1410]! } public func Passport_Email_UseTelegramEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1410]!, self._r[1410]!, [_0]) + return formatWithArgumentRanges(self._s[1411]!, self._r[1411]!, [_0]) } - public var Conversation_EncryptedDescriptionTitle: String { return self._s[1411]! } - public var ChannelIntro_Text: String { return self._s[1412]! } - public var DialogList_DeleteBotConfirmation: String { return self._s[1413]! } - public var GroupPermission_NoSendMedia: String { return self._s[1414]! } - public var Calls_AddTab: String { return self._s[1415]! } - public var Message_ReplyActionButtonShowReceipt: String { return self._s[1416]! } - public var Channel_AdminLog_EmptyFilterText: String { return self._s[1417]! } - public var Conversation_WalletRequiredSetup: String { return self._s[1418]! } - public var Notification_MessageLifetime1d: String { return self._s[1419]! } - public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1420]! } - public var Channel_BanUser_PermissionsHeader: String { return self._s[1421]! } - public var Passport_Identity_GenderFemale: String { return self._s[1422]! } - public var BlockedUsers_BlockTitle: String { return self._s[1423]! } + public var Conversation_EncryptedDescriptionTitle: String { return self._s[1412]! } + public var ChannelIntro_Text: String { return self._s[1413]! } + public var DialogList_DeleteBotConfirmation: String { return self._s[1414]! } + public var GroupPermission_NoSendMedia: String { return self._s[1415]! } + public var Calls_AddTab: String { return self._s[1416]! } + public var Message_ReplyActionButtonShowReceipt: String { return self._s[1417]! } + public var Channel_AdminLog_EmptyFilterText: String { return self._s[1418]! } + public var Conversation_WalletRequiredSetup: String { return self._s[1419]! } + public var Notification_MessageLifetime1d: String { return self._s[1420]! } + public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1421]! } + public var Channel_BanUser_PermissionsHeader: String { return self._s[1422]! } + public var Passport_Identity_GenderFemale: String { return self._s[1423]! } + public var BlockedUsers_BlockTitle: String { return self._s[1424]! } public func PUSH_CHANNEL_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1424]!, self._r[1424]!, [_1]) + return formatWithArgumentRanges(self._s[1425]!, self._r[1425]!, [_1]) } - public var Weekday_Yesterday: String { return self._s[1425]! } - public var WallpaperSearch_ColorBlack: String { return self._s[1426]! } - public var Settings_Context_Logout: String { return self._s[1427]! } - public var Wallet_Info_UnknownTransaction: String { return self._s[1428]! } - public var ChatList_ArchiveAction: String { return self._s[1429]! } - public var AutoNightTheme_Scheduled: String { return self._s[1430]! } - public var TwoFactorSetup_Email_SkipAction: String { return self._s[1431]! } - public var Settings_Devices: String { return self._s[1432]! } - public var ContactInfo_Note: String { return self._s[1433]! } + public var Weekday_Yesterday: String { return self._s[1426]! } + public var WallpaperSearch_ColorBlack: String { return self._s[1427]! } + public var Settings_Context_Logout: String { return self._s[1428]! } + public var Wallet_Info_UnknownTransaction: String { return self._s[1429]! } + public var ChatList_ArchiveAction: String { return self._s[1430]! } + public var AutoNightTheme_Scheduled: String { return self._s[1431]! } + public var TwoFactorSetup_Email_SkipAction: String { return self._s[1432]! } + public var Settings_Devices: String { return self._s[1433]! } + public var ContactInfo_Note: String { return self._s[1434]! } public func Login_PhoneGenericEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1434]!, self._r[1434]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[1435]!, self._r[1435]!, [_1, _2, _3, _4, _5, _6]) } - public var EditTheme_ThemeTemplateAlertTitle: String { return self._s[1435]! } - public var Wallet_Receive_CreateInvoice: String { return self._s[1436]! } - public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1437]! } - public var Theme_Colors_ColorWallpaperWarningProceed: String { return self._s[1438]! } + public var EditTheme_ThemeTemplateAlertTitle: String { return self._s[1436]! } + public var Wallet_Receive_CreateInvoice: String { return self._s[1437]! } + public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1438]! } + public var Theme_Colors_ColorWallpaperWarningProceed: String { return self._s[1439]! } public func PUSH_CHAT_JOINED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1439]!, self._r[1439]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1440]!, self._r[1440]!, [_1, _2]) } - public var CreatePoll_Create: String { return self._s[1440]! } - public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1441]! } + public var CreatePoll_Create: String { return self._s[1441]! } + public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1442]! } public func Notification_CallFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1442]!, self._r[1442]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1443]!, self._r[1443]!, [_1, _2]) } - public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1443]! } - public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1444]! } - public var Notifications_InAppNotificationsSounds: String { return self._s[1446]! } + public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1444]! } + public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1445]! } + public var Notifications_InAppNotificationsSounds: String { return self._s[1447]! } public func PUSH_PINNED_GAME_SCORE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1447]!, self._r[1447]!, [_1]) + return formatWithArgumentRanges(self._s[1448]!, self._r[1448]!, [_1]) } - public var Preview_OpenInInstagram: String { return self._s[1448]! } - public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1449]! } + public var Preview_OpenInInstagram: String { return self._s[1449]! } + public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1450]! } public func PUSH_CHAT_ADD_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1450]!, self._r[1450]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1451]!, self._r[1451]!, [_1, _2, _3]) } public func Passport_PrivacyPolicy(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1451]!, self._r[1451]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1452]!, self._r[1452]!, [_1, _2]) } - public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1452]! } - public var ArchivedChats_IntroText3: String { return self._s[1453]! } - public var ChatList_UndoArchiveHiddenText: String { return self._s[1454]! } - public var NetworkUsageSettings_TotalSection: String { return self._s[1455]! } - public var Wallet_Month_GenSeptember: String { return self._s[1456]! } - public var Channel_Setup_TypePrivateHelp: String { return self._s[1457]! } + public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1453]! } + public var ArchivedChats_IntroText3: String { return self._s[1454]! } + public var ChatList_UndoArchiveHiddenText: String { return self._s[1455]! } + public var NetworkUsageSettings_TotalSection: String { return self._s[1456]! } + public var Wallet_Month_GenSeptember: String { return self._s[1457]! } + public var Channel_Setup_TypePrivateHelp: String { return self._s[1458]! } public func PUSH_CHAT_MESSAGE_POLL(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1458]!, self._r[1458]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1459]!, self._r[1459]!, [_1, _2, _3]) } - public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1460]! } - public var FastTwoStepSetup_HintSection: String { return self._s[1461]! } - public var Wallpaper_PhotoLibrary: String { return self._s[1462]! } - public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1463]! } - public var Gif_NoGifsFound: String { return self._s[1464]! } - public var Watch_LastSeen_WithinAMonth: String { return self._s[1465]! } - public var VoiceOver_MessageContextDelete: String { return self._s[1466]! } - public var EditTheme_Preview: String { return self._s[1467]! } + public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1461]! } + public var FastTwoStepSetup_HintSection: String { return self._s[1462]! } + public var Wallpaper_PhotoLibrary: String { return self._s[1463]! } + public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1464]! } + public var Gif_NoGifsFound: String { return self._s[1465]! } + public var Watch_LastSeen_WithinAMonth: String { return self._s[1466]! } + public var VoiceOver_MessageContextDelete: String { return self._s[1467]! } + public var EditTheme_Preview: String { return self._s[1468]! } public func ClearCache_StorageTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1468]!, self._r[1468]!, [_0]) + return formatWithArgumentRanges(self._s[1469]!, self._r[1469]!, [_0]) } - public var GroupInfo_ActionPromote: String { return self._s[1469]! } - public var PasscodeSettings_SimplePasscode: String { return self._s[1470]! } - public var GroupInfo_Permissions_Title: String { return self._s[1471]! } - public var Permissions_ContactsText_v0: String { return self._s[1472]! } - public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[1473]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1474]! } - public var PrivacySettings_DataSettingsHelp: String { return self._s[1477]! } - public var Passport_FieldEmailHelp: String { return self._s[1478]! } + public var GroupInfo_ActionPromote: String { return self._s[1470]! } + public var PasscodeSettings_SimplePasscode: String { return self._s[1471]! } + public var GroupInfo_Permissions_Title: String { return self._s[1472]! } + public var Permissions_ContactsText_v0: String { return self._s[1473]! } + public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[1474]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1475]! } + public var PrivacySettings_DataSettingsHelp: String { return self._s[1478]! } + public var Passport_FieldEmailHelp: String { return self._s[1479]! } public func Activity_RemindAboutUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1479]!, self._r[1479]!, [_0]) + return formatWithArgumentRanges(self._s[1480]!, self._r[1480]!, [_0]) } - public var Passport_Identity_GenderPlaceholder: String { return self._s[1480]! } - public var Weekday_ShortSaturday: String { return self._s[1481]! } - public var ContactInfo_PhoneLabelMain: String { return self._s[1482]! } - public var Watch_Conversation_UserInfo: String { return self._s[1483]! } - public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1484]! } - public var GroupPermission_PermissionDisabledByDefault: String { return self._s[1485]! } - public var PrivacyLastSeenSettings_Title: String { return self._s[1486]! } - public var Conversation_ShareBotLocationConfirmation: String { return self._s[1487]! } - public var PhotoEditor_VignetteTool: String { return self._s[1488]! } - public var Passport_Address_Street1Placeholder: String { return self._s[1489]! } - public var Passport_Language_et: String { return self._s[1490]! } - public var AppUpgrade_Running: String { return self._s[1491]! } - public var Channel_DiscussionGroup_Info: String { return self._s[1493]! } - public var EditTheme_Create_Preview_IncomingReplyName: String { return self._s[1494]! } - public var Passport_Language_bg: String { return self._s[1495]! } - public var Stickers_NoStickersFound: String { return self._s[1497]! } + public var Passport_Identity_GenderPlaceholder: String { return self._s[1481]! } + public var Weekday_ShortSaturday: String { return self._s[1482]! } + public var ContactInfo_PhoneLabelMain: String { return self._s[1483]! } + public var Watch_Conversation_UserInfo: String { return self._s[1484]! } + public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1485]! } + public var GroupPermission_PermissionDisabledByDefault: String { return self._s[1486]! } + public var PrivacyLastSeenSettings_Title: String { return self._s[1487]! } + public var Conversation_ShareBotLocationConfirmation: String { return self._s[1488]! } + public var PhotoEditor_VignetteTool: String { return self._s[1489]! } + public var Passport_Address_Street1Placeholder: String { return self._s[1490]! } + public var Passport_Language_et: String { return self._s[1491]! } + public var AppUpgrade_Running: String { return self._s[1492]! } + public var Channel_DiscussionGroup_Info: String { return self._s[1494]! } + public var EditTheme_Create_Preview_IncomingReplyName: String { return self._s[1495]! } + public var Passport_Language_bg: String { return self._s[1496]! } + public var Stickers_NoStickersFound: String { return self._s[1498]! } public func PUSH_CHANNEL_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1499]!, self._r[1499]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1500]!, self._r[1500]!, [_1, _2]) } public func VoiceOver_Chat_ContactFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1500]!, self._r[1500]!, [_0]) + return formatWithArgumentRanges(self._s[1501]!, self._r[1501]!, [_0]) } - public var Wallet_Month_GenJuly: String { return self._s[1501]! } - public var Wallet_Receive_AddressHeader: String { return self._s[1502]! } - public var Wallet_Send_AmountText: String { return self._s[1503]! } - public var Settings_About: String { return self._s[1504]! } + public var Wallet_Month_GenJuly: String { return self._s[1502]! } + public var Wallet_Receive_AddressHeader: String { return self._s[1503]! } + public var Wallet_Send_AmountText: String { return self._s[1504]! } + public var Settings_About: String { return self._s[1505]! } public func Channel_AdminLog_MessageRestricted(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1505]!, self._r[1505]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1506]!, self._r[1506]!, [_0, _1, _2]) } - public var ChatList_Context_MarkAsRead: String { return self._s[1507]! } - public var KeyCommand_NewMessage: String { return self._s[1508]! } - public var Group_ErrorAddBlocked: String { return self._s[1509]! } + public var ChatList_Context_MarkAsRead: String { return self._s[1508]! } + public var KeyCommand_NewMessage: String { return self._s[1509]! } + public var Group_ErrorAddBlocked: String { return self._s[1510]! } public func Message_PaymentSent(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1510]!, self._r[1510]!, [_0]) + return formatWithArgumentRanges(self._s[1511]!, self._r[1511]!, [_0]) } - public var Map_LocationTitle: String { return self._s[1511]! } - public var ReportGroupLocation_Title: String { return self._s[1512]! } - public var CallSettings_UseLessDataLongDescription: String { return self._s[1513]! } - public var Cache_ClearProgress: String { return self._s[1514]! } + public var Map_LocationTitle: String { return self._s[1512]! } + public var ReportGroupLocation_Title: String { return self._s[1513]! } + public var CallSettings_UseLessDataLongDescription: String { return self._s[1514]! } + public var Cache_ClearProgress: String { return self._s[1515]! } public func Channel_Management_ErrorNotMember(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1515]!, self._r[1515]!, [_0]) + return formatWithArgumentRanges(self._s[1516]!, self._r[1516]!, [_0]) } - public var GroupRemoved_AddToGroup: String { return self._s[1516]! } - public var Passport_UpdateRequiredError: String { return self._s[1517]! } - public var Wallet_SecureStorageNotAvailable_Text: String { return self._s[1518]! } + public var GroupRemoved_AddToGroup: String { return self._s[1517]! } + public var Passport_UpdateRequiredError: String { return self._s[1518]! } + public var Wallet_SecureStorageNotAvailable_Text: String { return self._s[1519]! } public func PUSH_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1519]!, self._r[1519]!, [_1]) + return formatWithArgumentRanges(self._s[1520]!, self._r[1520]!, [_1]) } - public var Notifications_PermissionsSuppressWarningText: String { return self._s[1521]! } - public var Passport_Identity_MainPageHelp: String { return self._s[1522]! } - public var Conversation_StatusKickedFromGroup: String { return self._s[1523]! } - public var Passport_Language_ka: String { return self._s[1524]! } + public var Notifications_PermissionsSuppressWarningText: String { return self._s[1522]! } + public var Passport_Identity_MainPageHelp: String { return self._s[1523]! } + public var Conversation_StatusKickedFromGroup: String { return self._s[1524]! } + public var Passport_Language_ka: String { return self._s[1525]! } public func Wallet_Time_PreciseDate_m12(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1525]!, self._r[1525]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1526]!, self._r[1526]!, [_1, _2, _3]) } - public var Call_Decline: String { return self._s[1526]! } - public var SocksProxySetup_ProxyEnabled: String { return self._s[1527]! } - public var TwoFactorSetup_Email_SkipConfirmationText: String { return self._s[1530]! } + public var Call_Decline: String { return self._s[1527]! } + public var SocksProxySetup_ProxyEnabled: String { return self._s[1528]! } + public var TwoFactorSetup_Email_SkipConfirmationText: String { return self._s[1531]! } public func AuthCode_Alert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1531]!, self._r[1531]!, [_0]) + return formatWithArgumentRanges(self._s[1532]!, self._r[1532]!, [_0]) } - public var CallFeedback_Send: String { return self._s[1532]! } - public var EditTheme_EditTitle: String { return self._s[1533]! } + public var CallFeedback_Send: String { return self._s[1533]! } + public var EditTheme_EditTitle: String { return self._s[1534]! } public func Channel_AdminLog_MessagePromotedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1534]!, self._r[1534]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1535]!, self._r[1535]!, [_1, _2]) } - public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1535]! } + public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1536]! } public func Wallet_Updated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1537]!, self._r[1537]!, [_0]) + return formatWithArgumentRanges(self._s[1538]!, self._r[1538]!, [_0]) } - public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1538]! } - public var Passport_DeletePassport: String { return self._s[1539]! } - public var Appearance_AppIconFilled: String { return self._s[1540]! } - public var Privacy_Calls_P2PAlways: String { return self._s[1541]! } - public var Month_ShortDecember: String { return self._s[1542]! } - public var Channel_AdminLog_CanEditMessages: String { return self._s[1544]! } + public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1539]! } + public var Passport_DeletePassport: String { return self._s[1540]! } + public var Appearance_AppIconFilled: String { return self._s[1541]! } + public var Privacy_Calls_P2PAlways: String { return self._s[1542]! } + public var Month_ShortDecember: String { return self._s[1543]! } + public var Channel_AdminLog_CanEditMessages: String { return self._s[1545]! } public func Contacts_AccessDeniedHelpLandscape(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1545]!, self._r[1545]!, [_0]) + return formatWithArgumentRanges(self._s[1546]!, self._r[1546]!, [_0]) } - public var Channel_Stickers_Searching: String { return self._s[1546]! } - public var Conversation_EncryptedDescription1: String { return self._s[1547]! } - public var Conversation_EncryptedDescription2: String { return self._s[1548]! } - public var PasscodeSettings_PasscodeOptions: String { return self._s[1549]! } - public var Conversation_EncryptedDescription3: String { return self._s[1551]! } - public var PhotoEditor_SharpenTool: String { return self._s[1552]! } - public var Wallet_Configuration_Title: String { return self._s[1553]! } + public var Channel_Stickers_Searching: String { return self._s[1547]! } + public var Conversation_EncryptedDescription1: String { return self._s[1548]! } + public var Conversation_EncryptedDescription2: String { return self._s[1549]! } + public var PasscodeSettings_PasscodeOptions: String { return self._s[1550]! } + public var Conversation_EncryptedDescription3: String { return self._s[1552]! } + public var PhotoEditor_SharpenTool: String { return self._s[1553]! } + public var Wallet_Configuration_Title: String { return self._s[1554]! } public func Conversation_AddNameToContacts(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1554]!, self._r[1554]!, [_0]) + return formatWithArgumentRanges(self._s[1555]!, self._r[1555]!, [_0]) } - public var Conversation_EncryptedDescription4: String { return self._s[1556]! } - public var Channel_Members_AddMembers: String { return self._s[1557]! } - public var Wallpaper_Search: String { return self._s[1558]! } - public var Weekday_Friday: String { return self._s[1560]! } - public var Privacy_ContactsSync: String { return self._s[1561]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1562]! } - public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1563]! } + public var Conversation_EncryptedDescription4: String { return self._s[1557]! } + public var Channel_Members_AddMembers: String { return self._s[1558]! } + public var Wallpaper_Search: String { return self._s[1559]! } + public var Weekday_Friday: String { return self._s[1561]! } + public var Privacy_ContactsSync: String { return self._s[1562]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1563]! } + public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1564]! } public func Channel_Management_RestrictedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1564]!, self._r[1564]!, [_0]) + return formatWithArgumentRanges(self._s[1565]!, self._r[1565]!, [_0]) } - public var Wallet_Configuration_BlockchainIdHeader: String { return self._s[1565]! } - public var GroupInfo_Permissions_Removed: String { return self._s[1566]! } - public var ScheduledMessages_ScheduledOnline: String { return self._s[1567]! } - public var Passport_Identity_GenderMale: String { return self._s[1568]! } + public var Wallet_Configuration_BlockchainIdHeader: String { return self._s[1566]! } + public var GroupInfo_Permissions_Removed: String { return self._s[1567]! } + public var ScheduledMessages_ScheduledOnline: String { return self._s[1568]! } + public var Passport_Identity_GenderMale: String { return self._s[1569]! } public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1569]!, self._r[1569]!, [_0]) + return formatWithArgumentRanges(self._s[1570]!, self._r[1570]!, [_0]) } - public var Notifications_PermissionsKeepDisabled: String { return self._s[1570]! } - public var Conversation_JumpToDate: String { return self._s[1571]! } - public var Contacts_GlobalSearch: String { return self._s[1572]! } - public var AutoDownloadSettings_ResetHelp: String { return self._s[1573]! } - public var SettingsSearch_Synonyms_FAQ: String { return self._s[1574]! } - public var Profile_MessageLifetime1d: String { return self._s[1575]! } + public var Notifications_PermissionsKeepDisabled: String { return self._s[1571]! } + public var Conversation_JumpToDate: String { return self._s[1572]! } + public var Contacts_GlobalSearch: String { return self._s[1573]! } + public var AutoDownloadSettings_ResetHelp: String { return self._s[1574]! } + public var SettingsSearch_Synonyms_FAQ: String { return self._s[1575]! } + public var Profile_MessageLifetime1d: String { return self._s[1576]! } public func MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1576]!, self._r[1576]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1577]!, self._r[1577]!, [_1, _2]) } - public var StickerPack_BuiltinPackName: String { return self._s[1579]! } + public var StickerPack_BuiltinPackName: String { return self._s[1580]! } public func PUSH_CHAT_MESSAGE_AUDIO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1580]!, self._r[1580]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1581]!, self._r[1581]!, [_1, _2]) } - public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1581]! } - public var Passport_InfoTitle: String { return self._s[1583]! } - public var Notifications_PermissionsUnreachableText: String { return self._s[1584]! } + public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1582]! } + public var Passport_InfoTitle: String { return self._s[1584]! } + public var Notifications_PermissionsUnreachableText: String { return self._s[1585]! } public func NetworkUsageSettings_CellularUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1588]!, self._r[1588]!, [_0]) + return formatWithArgumentRanges(self._s[1589]!, self._r[1589]!, [_0]) } public func PUSH_CHAT_MESSAGE_GEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1589]!, self._r[1589]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1590]!, self._r[1590]!, [_1, _2]) } - public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1590]! } - public var Profile_BotInfo: String { return self._s[1591]! } - public var Watch_Compose_CreateMessage: String { return self._s[1592]! } - public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1593]! } - public var Month_ShortNovember: String { return self._s[1594]! } - public var Conversation_ScamWarning: String { return self._s[1595]! } - public var Wallpaper_SetCustomBackground: String { return self._s[1596]! } - public var Appearance_TextSize_Title: String { return self._s[1597]! } - public var Passport_Identity_TranslationsHelp: String { return self._s[1598]! } - public var NotificationsSound_Chime: String { return self._s[1599]! } - public var Passport_Language_ko: String { return self._s[1601]! } - public var InviteText_URL: String { return self._s[1602]! } - public var TextFormat_Monospace: String { return self._s[1603]! } + public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1591]! } + public var Profile_BotInfo: String { return self._s[1592]! } + public var Watch_Compose_CreateMessage: String { return self._s[1593]! } + public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1594]! } + public var Month_ShortNovember: String { return self._s[1595]! } + public var Conversation_ScamWarning: String { return self._s[1596]! } + public var Wallpaper_SetCustomBackground: String { return self._s[1597]! } + public var Appearance_TextSize_Title: String { return self._s[1598]! } + public var Passport_Identity_TranslationsHelp: String { return self._s[1599]! } + public var NotificationsSound_Chime: String { return self._s[1600]! } + public var Passport_Language_ko: String { return self._s[1602]! } + public var InviteText_URL: String { return self._s[1603]! } + public var TextFormat_Monospace: String { return self._s[1604]! } public func Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1604]!, self._r[1604]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1605]!, self._r[1605]!, [_1, _2, _3]) } - public var EditTheme_Edit_BottomInfo: String { return self._s[1605]! } + public var EditTheme_Edit_BottomInfo: String { return self._s[1606]! } public func Login_WillSendSms(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1606]!, self._r[1606]!, [_0]) + return formatWithArgumentRanges(self._s[1607]!, self._r[1607]!, [_0]) } public func Watch_Time_ShortWeekdayAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1607]!, self._r[1607]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1608]!, self._r[1608]!, [_1, _2]) } - public var Wallet_Words_Title: String { return self._s[1608]! } - public var Wallet_Month_ShortMay: String { return self._s[1609]! } - public var EditTheme_CreateTitle: String { return self._s[1611]! } - public var Passport_InfoLearnMore: String { return self._s[1612]! } - public var TwoStepAuth_EmailPlaceholder: String { return self._s[1613]! } - public var Passport_Identity_AddIdentityCard: String { return self._s[1614]! } - public var Your_card_has_expired: String { return self._s[1615]! } - public var StickerPacksSettings_StickerPacksSection: String { return self._s[1616]! } - public var GroupInfo_InviteLink_Help: String { return self._s[1617]! } - public var TwoFactorSetup_EmailVerification_ResendAction: String { return self._s[1621]! } - public var Conversation_Report: String { return self._s[1623]! } - public var Notifications_MessageNotificationsSound: String { return self._s[1624]! } - public var Notification_MessageLifetime1m: String { return self._s[1625]! } - public var Privacy_ContactsTitle: String { return self._s[1626]! } - public var Conversation_ShareMyContactInfo: String { return self._s[1627]! } - public var Wallet_WordCheck_Title: String { return self._s[1628]! } - public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1629]! } - public var Channel_Members_Title: String { return self._s[1630]! } - public var Map_OpenInWaze: String { return self._s[1631]! } - public var Appearance_RemoveThemeColorConfirmation: String { return self._s[1632]! } - public var Login_PhoneBannedError: String { return self._s[1633]! } + public var Wallet_Words_Title: String { return self._s[1609]! } + public var Wallet_Month_ShortMay: String { return self._s[1610]! } + public var EditTheme_CreateTitle: String { return self._s[1612]! } + public var Passport_InfoLearnMore: String { return self._s[1613]! } + public var TwoStepAuth_EmailPlaceholder: String { return self._s[1614]! } + public var Passport_Identity_AddIdentityCard: String { return self._s[1615]! } + public var Your_card_has_expired: String { return self._s[1616]! } + public var StickerPacksSettings_StickerPacksSection: String { return self._s[1617]! } + public var GroupInfo_InviteLink_Help: String { return self._s[1618]! } + public var TwoFactorSetup_EmailVerification_ResendAction: String { return self._s[1622]! } + public var Conversation_Report: String { return self._s[1624]! } + public var Notifications_MessageNotificationsSound: String { return self._s[1625]! } + public var Notification_MessageLifetime1m: String { return self._s[1626]! } + public var Privacy_ContactsTitle: String { return self._s[1627]! } + public var Conversation_ShareMyContactInfo: String { return self._s[1628]! } + public var Wallet_WordCheck_Title: String { return self._s[1629]! } + public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1630]! } + public var Channel_Members_Title: String { return self._s[1631]! } + public var Map_OpenInWaze: String { return self._s[1632]! } + public var Appearance_RemoveThemeColorConfirmation: String { return self._s[1633]! } + public var Login_PhoneBannedError: String { return self._s[1634]! } public func LiveLocationUpdated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1634]!, self._r[1634]!, [_0]) + return formatWithArgumentRanges(self._s[1635]!, self._r[1635]!, [_0]) } - public var IntentsSettings_MainAccount: String { return self._s[1635]! } - public var Group_Management_AddModeratorHelp: String { return self._s[1636]! } - public var AutoDownloadSettings_WifiTitle: String { return self._s[1637]! } - public var Common_OK: String { return self._s[1638]! } - public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1639]! } - public var Wallet_Words_NotDoneResponse: String { return self._s[1640]! } - public var Cache_Music: String { return self._s[1641]! } - public var Wallet_Configuration_SourceURL: String { return self._s[1642]! } - public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1643]! } - public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1645]! } - public var TwoStepAuth_HintPlaceholder: String { return self._s[1646]! } + public var IntentsSettings_MainAccount: String { return self._s[1636]! } + public var Group_Management_AddModeratorHelp: String { return self._s[1637]! } + public var AutoDownloadSettings_WifiTitle: String { return self._s[1638]! } + public var Common_OK: String { return self._s[1639]! } + public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1640]! } + public var Wallet_Words_NotDoneResponse: String { return self._s[1641]! } + public var Cache_Music: String { return self._s[1642]! } + public var Wallet_Configuration_SourceURL: String { return self._s[1643]! } + public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1644]! } + public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1646]! } + public var TwoStepAuth_HintPlaceholder: String { return self._s[1647]! } public func PUSH_PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1647]!, self._r[1647]!, [_1]) + return formatWithArgumentRanges(self._s[1648]!, self._r[1648]!, [_1]) } public func Passport_RequestHeader(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1648]!, self._r[1648]!, [_0]) + return formatWithArgumentRanges(self._s[1649]!, self._r[1649]!, [_0]) } - public var TwoFactorSetup_Done_Action: String { return self._s[1649]! } + public var TwoFactorSetup_Done_Action: String { return self._s[1650]! } public func VoiceOver_Chat_ContactOrganization(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1650]!, self._r[1650]!, [_0]) + return formatWithArgumentRanges(self._s[1651]!, self._r[1651]!, [_0]) } - public var Wallet_Send_ErrorNotEnoughFundsText: String { return self._s[1651]! } - public var Watch_MessageView_ViewOnPhone: String { return self._s[1653]! } - public var Privacy_Calls_CustomShareHelp: String { return self._s[1654]! } - public var Wallet_Receive_CreateInvoiceInfo: String { return self._s[1656]! } - public var ChangePhoneNumberNumber_Title: String { return self._s[1657]! } - public var State_ConnectingToProxyInfo: String { return self._s[1658]! } - public var Conversation_SwipeToReplyHintTitle: String { return self._s[1659]! } - public var Message_VideoMessage: String { return self._s[1661]! } - public var ChannelInfo_DeleteChannel: String { return self._s[1662]! } - public var ContactInfo_PhoneLabelOther: String { return self._s[1663]! } - public var Channel_EditAdmin_CannotEdit: String { return self._s[1664]! } - public var Passport_DeleteAddressConfirmation: String { return self._s[1665]! } + public var Wallet_Send_ErrorNotEnoughFundsText: String { return self._s[1652]! } + public var Watch_MessageView_ViewOnPhone: String { return self._s[1654]! } + public var Privacy_Calls_CustomShareHelp: String { return self._s[1655]! } + public var Wallet_Receive_CreateInvoiceInfo: String { return self._s[1657]! } + public var ChangePhoneNumberNumber_Title: String { return self._s[1658]! } + public var State_ConnectingToProxyInfo: String { return self._s[1659]! } + public var Conversation_SwipeToReplyHintTitle: String { return self._s[1660]! } + public var Message_VideoMessage: String { return self._s[1662]! } + public var ChannelInfo_DeleteChannel: String { return self._s[1663]! } + public var ContactInfo_PhoneLabelOther: String { return self._s[1664]! } + public var Channel_EditAdmin_CannotEdit: String { return self._s[1665]! } + public var Passport_DeleteAddressConfirmation: String { return self._s[1666]! } public func Wallet_Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1666]!, self._r[1666]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1667]!, self._r[1667]!, [_1, _2, _3]) } - public var WallpaperPreview_SwipeBottomText: String { return self._s[1667]! } - public var Activity_RecordingAudio: String { return self._s[1668]! } - public var SettingsSearch_Synonyms_Watch: String { return self._s[1669]! } - public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1670]! } - public var Wallet_Info_Address: String { return self._s[1671]! } + public var WallpaperPreview_SwipeBottomText: String { return self._s[1668]! } + public var Activity_RecordingAudio: String { return self._s[1669]! } + public var SettingsSearch_Synonyms_Watch: String { return self._s[1670]! } + public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1671]! } + public var Wallet_Info_Address: String { return self._s[1672]! } public func Notification_ChangedGroupName(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1673]!, self._r[1673]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1674]!, self._r[1674]!, [_0, _1]) } public func EmptyGroupInfo_Line1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1677]!, self._r[1677]!, [_0]) + return formatWithArgumentRanges(self._s[1678]!, self._r[1678]!, [_0]) } - public var Conversation_ApplyLocalization: String { return self._s[1678]! } - public var TwoFactorSetup_Intro_Action: String { return self._s[1679]! } - public var UserInfo_AddPhone: String { return self._s[1680]! } - public var Map_ShareLiveLocationHelp: String { return self._s[1681]! } + public var Conversation_ApplyLocalization: String { return self._s[1679]! } + public var TwoFactorSetup_Intro_Action: String { return self._s[1680]! } + public var UserInfo_AddPhone: String { return self._s[1681]! } + public var Map_ShareLiveLocationHelp: String { return self._s[1682]! } public func Passport_Identity_NativeNameGenericHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1682]!, self._r[1682]!, [_0]) + return formatWithArgumentRanges(self._s[1683]!, self._r[1683]!, [_0]) } - public var Passport_Scans: String { return self._s[1684]! } - public var BlockedUsers_Unblock: String { return self._s[1685]! } + public var Passport_Scans: String { return self._s[1685]! } + public var BlockedUsers_Unblock: String { return self._s[1686]! } public func PUSH_ENCRYPTION_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1686]!, self._r[1686]!, [_1]) + return formatWithArgumentRanges(self._s[1687]!, self._r[1687]!, [_1]) } - public var Channel_Management_LabelCreator: String { return self._s[1687]! } - public var Conversation_ReportSpamAndLeave: String { return self._s[1688]! } - public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1689]! } - public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1690]! } - public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1691]! } + public var Channel_Management_LabelCreator: String { return self._s[1688]! } + public var Conversation_ReportSpamAndLeave: String { return self._s[1689]! } + public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1690]! } + public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1691]! } + public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1692]! } public func Login_EmailPhoneBody(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1692]!, self._r[1692]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1693]!, self._r[1693]!, [_0, _1, _2]) } - public var Login_PhoneNumberHelp: String { return self._s[1693]! } - public var LastSeen_ALongTimeAgo: String { return self._s[1694]! } - public var Channel_AdminLog_CanPinMessages: String { return self._s[1695]! } - public var ChannelIntro_CreateChannel: String { return self._s[1696]! } - public var Conversation_UnreadMessages: String { return self._s[1697]! } - public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1698]! } - public var Channel_AdminLog_EmptyText: String { return self._s[1699]! } - public var Theme_Context_Apply: String { return self._s[1700]! } - public var Notification_GroupActivated: String { return self._s[1701]! } - public var NotificationSettings_ContactJoinedInfo: String { return self._s[1702]! } - public var Wallet_Intro_CreateWallet: String { return self._s[1703]! } + public var Login_PhoneNumberHelp: String { return self._s[1694]! } + public var LastSeen_ALongTimeAgo: String { return self._s[1695]! } + public var Channel_AdminLog_CanPinMessages: String { return self._s[1696]! } + public var ChannelIntro_CreateChannel: String { return self._s[1697]! } + public var Conversation_UnreadMessages: String { return self._s[1698]! } + public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1699]! } + public var Channel_AdminLog_EmptyText: String { return self._s[1700]! } + public var Theme_Context_Apply: String { return self._s[1701]! } + public var Notification_GroupActivated: String { return self._s[1702]! } + public var NotificationSettings_ContactJoinedInfo: String { return self._s[1703]! } + public var Wallet_Intro_CreateWallet: String { return self._s[1704]! } public func Notification_PinnedContactMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1704]!, self._r[1704]!, [_0]) + return formatWithArgumentRanges(self._s[1705]!, self._r[1705]!, [_0]) } public func DownloadingStatus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1705]!, self._r[1705]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1706]!, self._r[1706]!, [_0, _1]) } - public var GroupInfo_ConvertToSupergroup: String { return self._s[1707]! } + public var GroupInfo_ConvertToSupergroup: String { return self._s[1708]! } public func PrivacyPolicy_AgeVerificationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1708]!, self._r[1708]!, [_0]) + return formatWithArgumentRanges(self._s[1709]!, self._r[1709]!, [_0]) } - public var Undo_DeletedChannel: String { return self._s[1709]! } - public var CallFeedback_AddComment: String { return self._s[1710]! } + public var Undo_DeletedChannel: String { return self._s[1710]! } + public var CallFeedback_AddComment: String { return self._s[1711]! } public func Conversation_OpenBotLinkAllowMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1711]!, self._r[1711]!, [_0]) + return formatWithArgumentRanges(self._s[1712]!, self._r[1712]!, [_0]) } - public var Document_TargetConfirmationFormat: String { return self._s[1712]! } + public var Document_TargetConfirmationFormat: String { return self._s[1713]! } public func Call_StatusOngoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1713]!, self._r[1713]!, [_0]) + return formatWithArgumentRanges(self._s[1714]!, self._r[1714]!, [_0]) } - public var LogoutOptions_SetPasscodeTitle: String { return self._s[1714]! } + public var LogoutOptions_SetPasscodeTitle: String { return self._s[1715]! } public func PUSH_CHAT_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1715]!, self._r[1715]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[1716]!, self._r[1716]!, [_1, _2, _3, _4]) } - public var Wallet_SecureStorageChanged_PasscodeText: String { return self._s[1716]! } - public var Theme_ErrorNotFound: String { return self._s[1717]! } - public var Contacts_SortByName: String { return self._s[1718]! } - public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1719]! } + public var Wallet_SecureStorageChanged_PasscodeText: String { return self._s[1717]! } + public var Theme_ErrorNotFound: String { return self._s[1718]! } + public var Contacts_SortByName: String { return self._s[1719]! } + public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1720]! } public func CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1721]!, self._r[1721]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1722]!, self._r[1722]!, [_1, _2, _3]) } - public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1722]! } - public var ScheduledMessages_EditTime: String { return self._s[1723]! } - public var Conversation_ClearSelfHistory: String { return self._s[1724]! } - public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1725]! } - public var PasscodeSettings_DoNotMatch: String { return self._s[1726]! } - public var Stickers_SuggestNone: String { return self._s[1727]! } - public var ChatSettings_Cache: String { return self._s[1728]! } - public var Settings_SaveIncomingPhotos: String { return self._s[1729]! } - public var Media_ShareThisPhoto: String { return self._s[1730]! } - public var Chat_SlowmodeTooltipPending: String { return self._s[1731]! } - public var InfoPlist_NSContactsUsageDescription: String { return self._s[1732]! } - public var Conversation_ContextMenuCopyLink: String { return self._s[1733]! } - public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1734]! } - public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1735]! } - public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1736]! } - public var Appearance_ThemePreview_Chat_6_Text: String { return self._s[1737]! } + public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1723]! } + public var ScheduledMessages_EditTime: String { return self._s[1724]! } + public var Conversation_ClearSelfHistory: String { return self._s[1725]! } + public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1726]! } + public var PasscodeSettings_DoNotMatch: String { return self._s[1727]! } + public var Stickers_SuggestNone: String { return self._s[1728]! } + public var ChatSettings_Cache: String { return self._s[1729]! } + public var Settings_SaveIncomingPhotos: String { return self._s[1730]! } + public var Media_ShareThisPhoto: String { return self._s[1731]! } + public var Chat_SlowmodeTooltipPending: String { return self._s[1732]! } + public var InfoPlist_NSContactsUsageDescription: String { return self._s[1733]! } + public var Conversation_ContextMenuCopyLink: String { return self._s[1734]! } + public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1735]! } + public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1736]! } + public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1737]! } + public var Appearance_ThemePreview_Chat_6_Text: String { return self._s[1738]! } public func Wallet_SecureStorageReset_BiometryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1738]!, self._r[1738]!, [_0]) + return formatWithArgumentRanges(self._s[1739]!, self._r[1739]!, [_0]) } - public var Permissions_CellularDataTitle_v0: String { return self._s[1739]! } - public var WallpaperSearch_ColorWhite: String { return self._s[1741]! } - public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1742]! } - public var Conversation_ErrorInaccessibleMessage: String { return self._s[1743]! } - public var Map_OpenIn: String { return self._s[1744]! } + public var Permissions_CellularDataTitle_v0: String { return self._s[1740]! } + public var WallpaperSearch_ColorWhite: String { return self._s[1742]! } + public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1743]! } + public var Conversation_ErrorInaccessibleMessage: String { return self._s[1744]! } + public var Map_OpenIn: String { return self._s[1745]! } public func PUSH_PHONE_CALL_MISSED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1747]!, self._r[1747]!, [_1]) + return formatWithArgumentRanges(self._s[1748]!, self._r[1748]!, [_1]) } public func ChannelInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1748]!, self._r[1748]!, [_0]) + return formatWithArgumentRanges(self._s[1749]!, self._r[1749]!, [_0]) } - public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1749]! } - public var MessagePoll_LabelClosed: String { return self._s[1750]! } - public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1752]! } - public var Wallet_Send_SendAnyway: String { return self._s[1753]! } - public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1754]! } - public var UserInfo_FirstNamePlaceholder: String { return self._s[1755]! } - public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1756]! } - public var Map_SetThisPlace: String { return self._s[1757]! } - public var Login_SelectCountry_Title: String { return self._s[1758]! } - public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1759]! } + public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1750]! } + public var MessagePoll_LabelClosed: String { return self._s[1751]! } + public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1753]! } + public var Wallet_Send_SendAnyway: String { return self._s[1754]! } + public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1755]! } + public var UserInfo_FirstNamePlaceholder: String { return self._s[1756]! } + public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1757]! } + public var Map_SetThisPlace: String { return self._s[1758]! } + public var Login_SelectCountry_Title: String { return self._s[1759]! } + public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1760]! } public func Conversation_OpenBotLinkLogin(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1760]!, self._r[1760]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1761]!, self._r[1761]!, [_1, _2]) } - public var Channel_AdminLog_ChangeInfo: String { return self._s[1761]! } - public var Watch_Suggestion_BRB: String { return self._s[1762]! } - public var Passport_Identity_EditIdentityCard: String { return self._s[1763]! } - public var Contacts_PermissionsTitle: String { return self._s[1764]! } - public var Conversation_RestrictedInline: String { return self._s[1765]! } - public var Appearance_RemoveThemeColor: String { return self._s[1767]! } - public var StickerPack_ViewPack: String { return self._s[1768]! } - public var Wallet_UnknownError: String { return self._s[1769]! } + public var Channel_AdminLog_ChangeInfo: String { return self._s[1762]! } + public var Watch_Suggestion_BRB: String { return self._s[1763]! } + public var Passport_Identity_EditIdentityCard: String { return self._s[1764]! } + public var Contacts_PermissionsTitle: String { return self._s[1765]! } + public var Conversation_RestrictedInline: String { return self._s[1766]! } + public var Appearance_RemoveThemeColor: String { return self._s[1768]! } + public var StickerPack_ViewPack: String { return self._s[1769]! } + public var Wallet_UnknownError: String { return self._s[1770]! } public func Update_AppVersion(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1770]!, self._r[1770]!, [_0]) + return formatWithArgumentRanges(self._s[1771]!, self._r[1771]!, [_0]) } - public var Compose_NewChannel: String { return self._s[1772]! } - public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1775]! } - public var MessagePoll_LabelQuiz: String { return self._s[1777]! } - public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1778]! } - public var Channel_Info_Stickers: String { return self._s[1779]! } - public var AutoNightTheme_PreferredTheme: String { return self._s[1780]! } - public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1781]! } - public var Passport_DeletePersonalDetails: String { return self._s[1782]! } - public var LogoutOptions_AddAccountTitle: String { return self._s[1783]! } - public var Channel_DiscussionGroupInfo: String { return self._s[1784]! } - public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1785]! } - public var Conversation_SearchNoResults: String { return self._s[1788]! } - public var Wallet_Configuration_ApplyErrorTextURLInvalid: String { return self._s[1789]! } - public var MessagePoll_LabelAnonymous: String { return self._s[1790]! } - public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1791]! } - public var Login_Code: String { return self._s[1792]! } - public var EditTheme_Create_BottomInfo: String { return self._s[1793]! } - public var Watch_Suggestion_WhatsUp: String { return self._s[1794]! } - public var Weekday_ShortThursday: String { return self._s[1795]! } - public var Resolve_ErrorNotFound: String { return self._s[1797]! } - public var LastSeen_Offline: String { return self._s[1798]! } - public var PeopleNearby_NoMembers: String { return self._s[1799]! } - public var GroupPermission_AddMembersNotAvailable: String { return self._s[1800]! } - public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1801]! } - public var GroupInfo_Title: String { return self._s[1803]! } - public var NotificationsSound_Note: String { return self._s[1804]! } - public var Conversation_EditingMessagePanelTitle: String { return self._s[1805]! } - public var Watch_Message_Poll: String { return self._s[1806]! } - public var Privacy_Calls: String { return self._s[1807]! } + public var Compose_NewChannel: String { return self._s[1773]! } + public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1776]! } + public var MessagePoll_LabelQuiz: String { return self._s[1778]! } + public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1779]! } + public var Channel_Info_Stickers: String { return self._s[1780]! } + public var AutoNightTheme_PreferredTheme: String { return self._s[1781]! } + public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1782]! } + public var Passport_DeletePersonalDetails: String { return self._s[1783]! } + public var LogoutOptions_AddAccountTitle: String { return self._s[1784]! } + public var Channel_DiscussionGroupInfo: String { return self._s[1785]! } + public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1786]! } + public var Conversation_SearchNoResults: String { return self._s[1789]! } + public var Wallet_Configuration_ApplyErrorTextURLInvalid: String { return self._s[1790]! } + public var MessagePoll_LabelAnonymous: String { return self._s[1791]! } + public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1792]! } + public var Login_Code: String { return self._s[1793]! } + public var EditTheme_Create_BottomInfo: String { return self._s[1794]! } + public var Watch_Suggestion_WhatsUp: String { return self._s[1795]! } + public var Weekday_ShortThursday: String { return self._s[1796]! } + public var Resolve_ErrorNotFound: String { return self._s[1798]! } + public var LastSeen_Offline: String { return self._s[1799]! } + public var PeopleNearby_NoMembers: String { return self._s[1800]! } + public var GroupPermission_AddMembersNotAvailable: String { return self._s[1801]! } + public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1802]! } + public var GroupInfo_Title: String { return self._s[1804]! } + public var NotificationsSound_Note: String { return self._s[1805]! } + public var Conversation_EditingMessagePanelTitle: String { return self._s[1806]! } + public var Watch_Message_Poll: String { return self._s[1807]! } + public var Privacy_Calls: String { return self._s[1808]! } public func Channel_AdminLog_MessageRankUsername(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1808]!, self._r[1808]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1809]!, self._r[1809]!, [_1, _2, _3]) } - public var Month_ShortAugust: String { return self._s[1809]! } - public var TwoStepAuth_SetPasswordHelp: String { return self._s[1810]! } - public var Notifications_Reset: String { return self._s[1811]! } - public var Conversation_Pin: String { return self._s[1812]! } - public var Passport_Language_lv: String { return self._s[1813]! } - public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1814]! } - public var BlockedUsers_Info: String { return self._s[1815]! } - public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1817]! } - public var Watch_Conversation_Unblock: String { return self._s[1819]! } + public var Month_ShortAugust: String { return self._s[1810]! } + public var TwoStepAuth_SetPasswordHelp: String { return self._s[1811]! } + public var Notifications_Reset: String { return self._s[1812]! } + public var Conversation_Pin: String { return self._s[1813]! } + public var Passport_Language_lv: String { return self._s[1814]! } + public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1815]! } + public var BlockedUsers_Info: String { return self._s[1816]! } + public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1818]! } + public var Watch_Conversation_Unblock: String { return self._s[1820]! } public func Time_MonthOfYear_m9(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1820]!, self._r[1820]!, [_0]) + return formatWithArgumentRanges(self._s[1821]!, self._r[1821]!, [_0]) } - public var CloudStorage_Title: String { return self._s[1821]! } - public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1822]! } + public var CloudStorage_Title: String { return self._s[1822]! } + public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1823]! } public func NetworkUsageSettings_WifiUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1823]!, self._r[1823]!, [_0]) + return formatWithArgumentRanges(self._s[1824]!, self._r[1824]!, [_0]) } - public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1824]! } - public var Watch_Suggestion_OnMyWay: String { return self._s[1825]! } - public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1826]! } - public var Passport_Address_EditBankStatement: String { return self._s[1827]! } + public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1825]! } + public var Watch_Suggestion_OnMyWay: String { return self._s[1826]! } + public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1827]! } + public var Passport_Address_EditBankStatement: String { return self._s[1828]! } public func Channel_AdminLog_MessageChangedUnlinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1828]!, self._r[1828]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1829]!, self._r[1829]!, [_1, _2]) } - public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1829]! } - public var ShareMenu_Comment: String { return self._s[1830]! } - public var Permissions_ContactsTitle_v0: String { return self._s[1831]! } - public var Notifications_PermissionsTitle: String { return self._s[1832]! } - public var GroupPermission_NoSendLinks: String { return self._s[1833]! } - public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1834]! } - public var Wallet_SecureStorageChanged_ImportWallet: String { return self._s[1835]! } - public var Settings_Support: String { return self._s[1836]! } - public var Notifications_ChannelNotificationsSound: String { return self._s[1837]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1838]! } - public var Privacy_Forwards_Preview: String { return self._s[1839]! } - public var GroupPermission_ApplyAlertAction: String { return self._s[1840]! } - public var Watch_Stickers_StickerPacks: String { return self._s[1841]! } - public var Common_Select: String { return self._s[1843]! } - public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1844]! } - public var WallpaperSearch_ColorGray: String { return self._s[1847]! } - public var TwoFactorSetup_Password_PlaceholderPassword: String { return self._s[1848]! } - public var TwoFactorSetup_Hint_SkipAction: String { return self._s[1849]! } - public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1850]! } - public var PollResults_Title: String { return self._s[1851]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1852]! } - public var Appearance_PreviewReplyAuthor: String { return self._s[1853]! } - public var TwoStepAuth_RecoveryTitle: String { return self._s[1854]! } - public var Widget_AuthRequired: String { return self._s[1855]! } - public var Camera_FlashOn: String { return self._s[1856]! } - public var Conversation_ContextMenuLookUp: String { return self._s[1857]! } - public var Channel_Stickers_NotFoundHelp: String { return self._s[1858]! } - public var Watch_Suggestion_OK: String { return self._s[1859]! } + public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1830]! } + public var ShareMenu_Comment: String { return self._s[1831]! } + public var Permissions_ContactsTitle_v0: String { return self._s[1832]! } + public var Notifications_PermissionsTitle: String { return self._s[1833]! } + public var GroupPermission_NoSendLinks: String { return self._s[1834]! } + public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1835]! } + public var Wallet_SecureStorageChanged_ImportWallet: String { return self._s[1836]! } + public var Settings_Support: String { return self._s[1837]! } + public var Notifications_ChannelNotificationsSound: String { return self._s[1838]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1839]! } + public var Privacy_Forwards_Preview: String { return self._s[1840]! } + public var GroupPermission_ApplyAlertAction: String { return self._s[1841]! } + public var Watch_Stickers_StickerPacks: String { return self._s[1842]! } + public var Common_Select: String { return self._s[1844]! } + public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1845]! } + public var WallpaperSearch_ColorGray: String { return self._s[1848]! } + public var TwoFactorSetup_Password_PlaceholderPassword: String { return self._s[1849]! } + public var TwoFactorSetup_Hint_SkipAction: String { return self._s[1850]! } + public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1851]! } + public var PollResults_Title: String { return self._s[1852]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1853]! } + public var Appearance_PreviewReplyAuthor: String { return self._s[1854]! } + public var TwoStepAuth_RecoveryTitle: String { return self._s[1855]! } + public var Widget_AuthRequired: String { return self._s[1856]! } + public var Camera_FlashOn: String { return self._s[1857]! } + public var Conversation_ContextMenuLookUp: String { return self._s[1858]! } + public var Channel_Stickers_NotFoundHelp: String { return self._s[1859]! } + public var Watch_Suggestion_OK: String { return self._s[1860]! } public func Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1861]!, self._r[1861]!, [_0]) + return formatWithArgumentRanges(self._s[1862]!, self._r[1862]!, [_0]) } public func Notification_PinnedLiveLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1863]!, self._r[1863]!, [_0]) + return formatWithArgumentRanges(self._s[1864]!, self._r[1864]!, [_0]) } - public var TextFormat_Strikethrough: String { return self._s[1864]! } - public var DialogList_AdLabel: String { return self._s[1865]! } - public var WatchRemote_NotificationText: String { return self._s[1866]! } - public var IntentsSettings_SuggestedChatsSavedMessages: String { return self._s[1867]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1868]! } - public var Conversation_ReportSpam: String { return self._s[1869]! } - public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1870]! } - public var Settings_LogoutConfirmationTitle: String { return self._s[1872]! } - public var PhoneLabel_Title: String { return self._s[1873]! } - public var Passport_Address_EditRentalAgreement: String { return self._s[1874]! } - public var Settings_ChangePhoneNumber: String { return self._s[1875]! } - public var Notifications_ExceptionsTitle: String { return self._s[1876]! } - public var Notifications_AlertTones: String { return self._s[1877]! } - public var Call_ReportIncludeLogDescription: String { return self._s[1878]! } - public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1879]! } - public var AutoDownloadSettings_PrivateChats: String { return self._s[1880]! } - public var VoiceOver_Chat_Photo: String { return self._s[1882]! } - public var TwoStepAuth_AddHintTitle: String { return self._s[1883]! } - public var ReportPeer_ReasonOther: String { return self._s[1884]! } - public var ChatList_Context_JoinChannel: String { return self._s[1885]! } - public var KeyCommand_ScrollDown: String { return self._s[1887]! } - public var Conversation_ScheduleMessage_Title: String { return self._s[1888]! } + public var TextFormat_Strikethrough: String { return self._s[1865]! } + public var DialogList_AdLabel: String { return self._s[1866]! } + public var WatchRemote_NotificationText: String { return self._s[1867]! } + public var IntentsSettings_SuggestedChatsSavedMessages: String { return self._s[1868]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1869]! } + public var Conversation_ReportSpam: String { return self._s[1870]! } + public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1871]! } + public var Settings_LogoutConfirmationTitle: String { return self._s[1873]! } + public var PhoneLabel_Title: String { return self._s[1874]! } + public var Passport_Address_EditRentalAgreement: String { return self._s[1875]! } + public var Settings_ChangePhoneNumber: String { return self._s[1876]! } + public var Notifications_ExceptionsTitle: String { return self._s[1877]! } + public var Notifications_AlertTones: String { return self._s[1878]! } + public var Call_ReportIncludeLogDescription: String { return self._s[1879]! } + public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1880]! } + public var AutoDownloadSettings_PrivateChats: String { return self._s[1881]! } + public var VoiceOver_Chat_Photo: String { return self._s[1883]! } + public var TwoStepAuth_AddHintTitle: String { return self._s[1884]! } + public var ReportPeer_ReasonOther: String { return self._s[1885]! } + public var ChatList_Context_JoinChannel: String { return self._s[1886]! } + public var KeyCommand_ScrollDown: String { return self._s[1888]! } + public var Conversation_ScheduleMessage_Title: String { return self._s[1889]! } public func Login_BannedPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1889]!, self._r[1889]!, [_0]) + return formatWithArgumentRanges(self._s[1890]!, self._r[1890]!, [_0]) } - public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1890]! } - public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1891]! } - public var AuthSessions_LogOut: String { return self._s[1892]! } - public var Passport_Identity_TypeInternalPassport: String { return self._s[1893]! } - public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1894]! } - public var Passport_Phone_Title: String { return self._s[1895]! } - public var ContactList_Context_StartSecretChat: String { return self._s[1896]! } - public var Settings_PhoneNumber: String { return self._s[1897]! } + public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1891]! } + public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1892]! } + public var AuthSessions_LogOut: String { return self._s[1893]! } + public var Passport_Identity_TypeInternalPassport: String { return self._s[1894]! } + public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1895]! } + public var Passport_Phone_Title: String { return self._s[1896]! } + public var ContactList_Context_StartSecretChat: String { return self._s[1897]! } + public var Settings_PhoneNumber: String { return self._s[1898]! } public func Conversation_ScheduleMessage_SendToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1898]!, self._r[1898]!, [_0]) + return formatWithArgumentRanges(self._s[1899]!, self._r[1899]!, [_0]) } - public var NotificationsSound_Alert: String { return self._s[1900]! } - public var Wallet_SecureStorageChanged_CreateWallet: String { return self._s[1901]! } - public var WebSearch_SearchNoResults: String { return self._s[1902]! } - public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1904]! } - public var Wallet_Configuration_SourceInfo: String { return self._s[1905]! } - public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1906]! } - public var SettingsSearch_Synonyms_Passport: String { return self._s[1907]! } - public var PhotoEditor_CurvesTool: String { return self._s[1908]! } - public var Checkout_PaymentMethod: String { return self._s[1910]! } + public var NotificationsSound_Alert: String { return self._s[1901]! } + public var Wallet_SecureStorageChanged_CreateWallet: String { return self._s[1902]! } + public var WebSearch_SearchNoResults: String { return self._s[1903]! } + public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1905]! } + public var Wallet_Configuration_SourceInfo: String { return self._s[1906]! } + public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1907]! } + public var SettingsSearch_Synonyms_Passport: String { return self._s[1908]! } + public var PhotoEditor_CurvesTool: String { return self._s[1909]! } + public var Checkout_PaymentMethod: String { return self._s[1911]! } public func PUSH_CHAT_ADD_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1911]!, self._r[1911]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1912]!, self._r[1912]!, [_1, _2]) } - public var Contacts_AccessDeniedError: String { return self._s[1912]! } - public var Camera_PhotoMode: String { return self._s[1915]! } - public var EditTheme_Expand_Preview_IncomingText: String { return self._s[1916]! } - public var Appearance_TextSize_Apply: String { return self._s[1917]! } - public var Passport_Address_AddUtilityBill: String { return self._s[1919]! } - public var CallSettings_OnMobile: String { return self._s[1920]! } - public var Tour_Text2: String { return self._s[1921]! } + public var Contacts_AccessDeniedError: String { return self._s[1913]! } + public var Camera_PhotoMode: String { return self._s[1916]! } + public var EditTheme_Expand_Preview_IncomingText: String { return self._s[1917]! } + public var Appearance_TextSize_Apply: String { return self._s[1918]! } + public var Passport_Address_AddUtilityBill: String { return self._s[1920]! } + public var CallSettings_OnMobile: String { return self._s[1921]! } + public var Tour_Text2: String { return self._s[1922]! } public func PUSH_CHAT_MESSAGE_ROUND(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1922]!, self._r[1922]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1923]!, self._r[1923]!, [_1, _2]) } - public var DialogList_EncryptionProcessing: String { return self._s[1924]! } - public var Permissions_Skip: String { return self._s[1925]! } - public var Wallet_Words_NotDoneOk: String { return self._s[1926]! } - public var SecretImage_Title: String { return self._s[1927]! } - public var Watch_MessageView_Title: String { return self._s[1928]! } - public var Channel_DiscussionGroupAdd: String { return self._s[1929]! } - public var AttachmentMenu_Poll: String { return self._s[1930]! } + public var DialogList_EncryptionProcessing: String { return self._s[1925]! } + public var Permissions_Skip: String { return self._s[1926]! } + public var Wallet_Words_NotDoneOk: String { return self._s[1927]! } + public var SecretImage_Title: String { return self._s[1928]! } + public var Watch_MessageView_Title: String { return self._s[1929]! } + public var Channel_DiscussionGroupAdd: String { return self._s[1930]! } + public var AttachmentMenu_Poll: String { return self._s[1931]! } public func Notification_GroupInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1931]!, self._r[1931]!, [_0]) + return formatWithArgumentRanges(self._s[1932]!, self._r[1932]!, [_0]) } public func Channel_DiscussionGroup_PrivateChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1932]!, self._r[1932]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1933]!, self._r[1933]!, [_1, _2]) } - public var Notification_CallCanceled: String { return self._s[1933]! } - public var WallpaperPreview_Title: String { return self._s[1934]! } - public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1935]! } - public var Settings_ProxyConnecting: String { return self._s[1936]! } - public var Settings_CheckPhoneNumberText: String { return self._s[1938]! } - public var VoiceOver_Chat_YourVideo: String { return self._s[1939]! } - public var Wallet_Intro_Title: String { return self._s[1940]! } - public var TwoFactorSetup_Password_Action: String { return self._s[1941]! } - public var Profile_MessageLifetime5s: String { return self._s[1942]! } - public var Username_InvalidCharacters: String { return self._s[1943]! } - public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1944]! } - public var ScheduledMessages_ClearAll: String { return self._s[1945]! } - public var WallpaperPreview_CropBottomText: String { return self._s[1946]! } - public var AutoDownloadSettings_LimitBySize: String { return self._s[1947]! } - public var Settings_AddAccount: String { return self._s[1948]! } - public var Notification_CreatedChannel: String { return self._s[1951]! } + public var Notification_CallCanceled: String { return self._s[1934]! } + public var WallpaperPreview_Title: String { return self._s[1935]! } + public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1936]! } + public var Settings_ProxyConnecting: String { return self._s[1937]! } + public var Settings_CheckPhoneNumberText: String { return self._s[1939]! } + public var VoiceOver_Chat_YourVideo: String { return self._s[1940]! } + public var Wallet_Intro_Title: String { return self._s[1941]! } + public var TwoFactorSetup_Password_Action: String { return self._s[1942]! } + public var Profile_MessageLifetime5s: String { return self._s[1943]! } + public var Username_InvalidCharacters: String { return self._s[1944]! } + public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1945]! } + public var ScheduledMessages_ClearAll: String { return self._s[1946]! } + public var WallpaperPreview_CropBottomText: String { return self._s[1947]! } + public var AutoDownloadSettings_LimitBySize: String { return self._s[1948]! } + public var Settings_AddAccount: String { return self._s[1949]! } + public var Notification_CreatedChannel: String { return self._s[1952]! } public func PUSH_CHAT_DELETE_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1952]!, self._r[1952]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1953]!, self._r[1953]!, [_1, _2, _3]) } - public var Passcode_AppLockedAlert: String { return self._s[1954]! } - public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1955]! } - public var VoiceOver_Media_PlaybackStop: String { return self._s[1956]! } - public var Contacts_TopSection: String { return self._s[1957]! } - public var ChatList_DeleteForEveryoneConfirmationAction: String { return self._s[1958]! } + public var Passcode_AppLockedAlert: String { return self._s[1955]! } + public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1956]! } + public var VoiceOver_Media_PlaybackStop: String { return self._s[1957]! } + public var Contacts_TopSection: String { return self._s[1958]! } + public var ChatList_DeleteForEveryoneConfirmationAction: String { return self._s[1959]! } public func Conversation_SetReminder_RemindOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1959]!, self._r[1959]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1960]!, self._r[1960]!, [_0, _1]) } - public var Wallet_Info_Receive: String { return self._s[1960]! } - public var Wallet_Completed_ViewWallet: String { return self._s[1961]! } + public var Wallet_Info_Receive: String { return self._s[1961]! } + public var Wallet_Completed_ViewWallet: String { return self._s[1962]! } public func Time_MonthOfYear_m6(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1962]!, self._r[1962]!, [_0]) + return formatWithArgumentRanges(self._s[1963]!, self._r[1963]!, [_0]) } - public var ReportPeer_ReasonSpam: String { return self._s[1963]! } - public var UserInfo_TapToCall: String { return self._s[1964]! } - public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1966]! } - public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1967]! } - public var Common_Search: String { return self._s[1968]! } - public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1969]! } + public var ReportPeer_ReasonSpam: String { return self._s[1964]! } + public var UserInfo_TapToCall: String { return self._s[1965]! } + public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1967]! } + public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1968]! } + public var Common_Search: String { return self._s[1969]! } + public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1970]! } public func Channel_AdminLog_MessageChangedGroupGeoLocation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1970]!, self._r[1970]!, [_0]) + return formatWithArgumentRanges(self._s[1971]!, self._r[1971]!, [_0]) } - public var Wallet_Month_ShortJuly: String { return self._s[1971]! } - public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1973]! } - public var Message_InvoiceLabel: String { return self._s[1974]! } - public var Conversation_InputTextPlaceholder: String { return self._s[1975]! } - public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1976]! } + public var Wallet_Month_ShortJuly: String { return self._s[1972]! } + public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1974]! } + public var Message_InvoiceLabel: String { return self._s[1975]! } + public var Conversation_InputTextPlaceholder: String { return self._s[1976]! } + public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1977]! } public func Passport_Address_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1977]!, self._r[1977]!, [_0]) + return formatWithArgumentRanges(self._s[1978]!, self._r[1978]!, [_0]) } - public var IntentsSettings_Reset: String { return self._s[1978]! } - public var Conversation_Info: String { return self._s[1979]! } - public var Login_InfoDeletePhoto: String { return self._s[1980]! } - public var Passport_Language_vi: String { return self._s[1982]! } - public var UserInfo_ScamUserWarning: String { return self._s[1983]! } - public var Conversation_Search: String { return self._s[1984]! } - public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1986]! } - public var ReportPeer_ReasonPornography: String { return self._s[1987]! } - public var AutoDownloadSettings_PhotosTitle: String { return self._s[1988]! } - public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1989]! } - public var Map_LiveLocationGroupDescription: String { return self._s[1990]! } - public var Channel_Setup_TypeHeader: String { return self._s[1991]! } - public var AuthSessions_LoggedIn: String { return self._s[1992]! } - public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1993]! } - public var Login_SmsRequestState3: String { return self._s[1994]! } - public var Passport_Address_EditUtilityBill: String { return self._s[1995]! } - public var Appearance_ReduceMotionInfo: String { return self._s[1996]! } - public var Join_ChannelsTooMuch: String { return self._s[1997]! } - public var Channel_Edit_LinkItem: String { return self._s[1998]! } - public var Privacy_Calls_P2PNever: String { return self._s[1999]! } - public var Conversation_AddToReadingList: String { return self._s[2001]! } - public var Share_MultipleMessagesDisabled: String { return self._s[2002]! } - public var Message_Animation: String { return self._s[2003]! } - public var Conversation_DefaultRestrictedMedia: String { return self._s[2004]! } - public var Map_Unknown: String { return self._s[2005]! } - public var AutoDownloadSettings_LastDelimeter: String { return self._s[2006]! } + public var IntentsSettings_Reset: String { return self._s[1979]! } + public var Conversation_Info: String { return self._s[1980]! } + public var Login_InfoDeletePhoto: String { return self._s[1981]! } + public var Passport_Language_vi: String { return self._s[1983]! } + public var UserInfo_ScamUserWarning: String { return self._s[1984]! } + public var Conversation_Search: String { return self._s[1985]! } + public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1987]! } + public var ReportPeer_ReasonPornography: String { return self._s[1988]! } + public var AutoDownloadSettings_PhotosTitle: String { return self._s[1989]! } + public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1990]! } + public var Map_LiveLocationGroupDescription: String { return self._s[1991]! } + public var Channel_Setup_TypeHeader: String { return self._s[1992]! } + public var AuthSessions_LoggedIn: String { return self._s[1993]! } + public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1994]! } + public var Login_SmsRequestState3: String { return self._s[1995]! } + public var Passport_Address_EditUtilityBill: String { return self._s[1996]! } + public var Appearance_ReduceMotionInfo: String { return self._s[1997]! } + public var Join_ChannelsTooMuch: String { return self._s[1998]! } + public var Channel_Edit_LinkItem: String { return self._s[1999]! } + public var Privacy_Calls_P2PNever: String { return self._s[2000]! } + public var Conversation_AddToReadingList: String { return self._s[2002]! } + public var Share_MultipleMessagesDisabled: String { return self._s[2003]! } + public var Message_Animation: String { return self._s[2004]! } + public var Conversation_DefaultRestrictedMedia: String { return self._s[2005]! } + public var Map_Unknown: String { return self._s[2006]! } + public var AutoDownloadSettings_LastDelimeter: String { return self._s[2007]! } public func PUSH_PINNED_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2007]!, self._r[2007]!, [_1, _2]) - } - public func Passport_FieldOneOf_Or(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2008]!, self._r[2008]!, [_1, _2]) } - public var Call_StatusRequesting: String { return self._s[2009]! } - public var Conversation_SecretChatContextBotAlert: String { return self._s[2010]! } - public var SocksProxySetup_ProxyStatusChecking: String { return self._s[2011]! } + public func Passport_FieldOneOf_Or(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2009]!, self._r[2009]!, [_1, _2]) + } + public var Call_StatusRequesting: String { return self._s[2010]! } + public var Conversation_SecretChatContextBotAlert: String { return self._s[2011]! } + public var SocksProxySetup_ProxyStatusChecking: String { return self._s[2012]! } public func PUSH_CHAT_MESSAGE_DOC(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2012]!, self._r[2012]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2013]!, self._r[2013]!, [_1, _2]) } public func Notification_PinnedLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2013]!, self._r[2013]!, [_0]) + return formatWithArgumentRanges(self._s[2014]!, self._r[2014]!, [_0]) } - public var Update_Skip: String { return self._s[2014]! } - public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[2015]! } - public var Message_PinnedPollMessage: String { return self._s[2016]! } - public var BlockedUsers_Title: String { return self._s[2017]! } + public var Update_Skip: String { return self._s[2015]! } + public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[2016]! } + public var Message_PinnedPollMessage: String { return self._s[2017]! } + public var BlockedUsers_Title: String { return self._s[2018]! } public func PUSH_CHANNEL_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2018]!, self._r[2018]!, [_1]) + return formatWithArgumentRanges(self._s[2019]!, self._r[2019]!, [_1]) } - public var Username_CheckingUsername: String { return self._s[2019]! } - public var NotificationsSound_Bell: String { return self._s[2020]! } - public var Conversation_SendMessageErrorFlood: String { return self._s[2021]! } - public var Weekday_Monday: String { return self._s[2022]! } - public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[2023]! } - public var ChannelMembers_ChannelAdminsTitle: String { return self._s[2024]! } - public var ChatSettings_Groups: String { return self._s[2025]! } - public var WallpaperPreview_PatternPaternDiscard: String { return self._s[2026]! } + public var Username_CheckingUsername: String { return self._s[2020]! } + public var NotificationsSound_Bell: String { return self._s[2021]! } + public var Conversation_SendMessageErrorFlood: String { return self._s[2022]! } + public var Weekday_Monday: String { return self._s[2023]! } + public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[2024]! } + public var ChannelMembers_ChannelAdminsTitle: String { return self._s[2025]! } + public var ChatSettings_Groups: String { return self._s[2026]! } + public var WallpaperPreview_PatternPaternDiscard: String { return self._s[2027]! } public func Conversation_SetReminder_RemindTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2027]!, self._r[2027]!, [_0]) + return formatWithArgumentRanges(self._s[2028]!, self._r[2028]!, [_0]) } - public var Your_card_was_declined: String { return self._s[2028]! } - public var TwoStepAuth_EnterPasswordHelp: String { return self._s[2030]! } - public var Wallet_Month_ShortApril: String { return self._s[2031]! } - public var ChatList_Unmute: String { return self._s[2032]! } - public var AuthSessions_AddDevice_ScanTitle: String { return self._s[2033]! } - public var PhotoEditor_CurvesAll: String { return self._s[2034]! } - public var Weekday_ShortTuesday: String { return self._s[2035]! } - public var DialogList_Read: String { return self._s[2036]! } - public var Appearance_AppIconClassic: String { return self._s[2037]! } - public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[2038]! } - public var Passport_Identity_Gender: String { return self._s[2039]! } + public var Your_card_was_declined: String { return self._s[2029]! } + public var TwoStepAuth_EnterPasswordHelp: String { return self._s[2031]! } + public var Wallet_Month_ShortApril: String { return self._s[2032]! } + public var ChatList_Unmute: String { return self._s[2033]! } + public var AuthSessions_AddDevice_ScanTitle: String { return self._s[2034]! } + public var PhotoEditor_CurvesAll: String { return self._s[2035]! } + public var Weekday_ShortTuesday: String { return self._s[2036]! } + public var DialogList_Read: String { return self._s[2037]! } + public var Appearance_AppIconClassic: String { return self._s[2038]! } + public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[2039]! } + public var Passport_Identity_Gender: String { return self._s[2040]! } public func Target_ShareGameConfirmationPrivate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2040]!, self._r[2040]!, [_0]) + return formatWithArgumentRanges(self._s[2041]!, self._r[2041]!, [_0]) } - public var Target_SelectGroup: String { return self._s[2041]! } - public var Map_HomeAndWorkInfo: String { return self._s[2043]! } + public var Target_SelectGroup: String { return self._s[2042]! } + public var Map_HomeAndWorkInfo: String { return self._s[2044]! } public func DialogList_EncryptedChatStartedIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2044]!, self._r[2044]!, [_0]) + return formatWithArgumentRanges(self._s[2045]!, self._r[2045]!, [_0]) } - public var Passport_Language_en: String { return self._s[2045]! } - public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[2046]! } - public var Channel_Username_CreatePublicLinkHelp: String { return self._s[2047]! } - public var Login_CancelPhoneVerificationContinue: String { return self._s[2048]! } - public var ScheduledMessages_SendNow: String { return self._s[2049]! } - public var Checkout_NewCard_PaymentCard: String { return self._s[2051]! } - public var Login_InfoHelp: String { return self._s[2052]! } - public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[2053]! } - public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[2054]! } + public var Passport_Language_en: String { return self._s[2046]! } + public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[2047]! } + public var Channel_Username_CreatePublicLinkHelp: String { return self._s[2048]! } + public var Login_CancelPhoneVerificationContinue: String { return self._s[2049]! } + public var ScheduledMessages_SendNow: String { return self._s[2050]! } + public var Checkout_NewCard_PaymentCard: String { return self._s[2052]! } + public var Login_InfoHelp: String { return self._s[2053]! } + public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[2054]! } + public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[2055]! } public func Channel_AdminLog_MessageChangedLinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2055]!, self._r[2055]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2056]!, self._r[2056]!, [_1, _2]) } - public var SocksProxySetup_AddProxy: String { return self._s[2058]! } - public var CreatePoll_Title: String { return self._s[2059]! } - public var MessagePoll_QuizNoUsers: String { return self._s[2060]! } - public var Conversation_ViewTheme: String { return self._s[2061]! } - public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[2062]! } - public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[2063]! } - public var TwoFactorSetup_Intro_Text: String { return self._s[2064]! } - public var UserInfo_GroupsInCommon: String { return self._s[2065]! } - public var TelegramWallet_Intro_TermsUrl: String { return self._s[2066]! } - public var Call_AudioRouteHide: String { return self._s[2067]! } + public var SocksProxySetup_AddProxy: String { return self._s[2059]! } + public var CreatePoll_Title: String { return self._s[2060]! } + public var MessagePoll_QuizNoUsers: String { return self._s[2061]! } + public var Conversation_ViewTheme: String { return self._s[2062]! } + public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[2063]! } + public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[2064]! } + public var TwoFactorSetup_Intro_Text: String { return self._s[2065]! } + public var UserInfo_GroupsInCommon: String { return self._s[2066]! } + public var TelegramWallet_Intro_TermsUrl: String { return self._s[2067]! } + public var Call_AudioRouteHide: String { return self._s[2068]! } public func Wallet_Info_TransactionDateHeader(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2069]!, self._r[2069]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2070]!, self._r[2070]!, [_1, _2]) } - public var ContactInfo_PhoneLabelMobile: String { return self._s[2070]! } - public var IntentsSettings_SuggestedChatsInfo: String { return self._s[2071]! } - public var CreatePoll_QuizOptionsHeader: String { return self._s[2072]! } + public var ContactInfo_PhoneLabelMobile: String { return self._s[2071]! } + public var IntentsSettings_SuggestedChatsInfo: String { return self._s[2072]! } + public var CreatePoll_QuizOptionsHeader: String { return self._s[2073]! } public func ChatList_LeaveGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2073]!, self._r[2073]!, [_0]) + return formatWithArgumentRanges(self._s[2074]!, self._r[2074]!, [_0]) } - public var TextFormat_Bold: String { return self._s[2074]! } - public var FastTwoStepSetup_EmailSection: String { return self._s[2075]! } - public var StickerPackActionInfo_AddedTitle: String { return self._s[2076]! } - public var Notifications_Title: String { return self._s[2077]! } - public var Group_Username_InvalidTooShort: String { return self._s[2078]! } - public var Channel_ErrorAddTooMuch: String { return self._s[2079]! } + public var TextFormat_Bold: String { return self._s[2075]! } + public var FastTwoStepSetup_EmailSection: String { return self._s[2076]! } + public var StickerPackActionInfo_AddedTitle: String { return self._s[2077]! } + public var Notifications_Title: String { return self._s[2078]! } + public var Group_Username_InvalidTooShort: String { return self._s[2079]! } + public var Channel_ErrorAddTooMuch: String { return self._s[2080]! } public func DialogList_MultipleTypingSuffix(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2080]!, self._r[2080]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[2081]!, self._r[2081]!, ["\(_0)"]) } - public var VoiceOver_DiscardPreparedContent: String { return self._s[2082]! } - public var Stickers_SuggestAdded: String { return self._s[2083]! } - public var Login_CountryCode: String { return self._s[2084]! } - public var ChatSettings_AutoPlayVideos: String { return self._s[2085]! } - public var Map_GetDirections: String { return self._s[2086]! } - public var Wallet_Receive_ShareInvoiceUrl: String { return self._s[2087]! } - public var Login_PhoneFloodError: String { return self._s[2088]! } + public var VoiceOver_DiscardPreparedContent: String { return self._s[2083]! } + public var Stickers_SuggestAdded: String { return self._s[2084]! } + public var Login_CountryCode: String { return self._s[2085]! } + public var ChatSettings_AutoPlayVideos: String { return self._s[2086]! } + public var Map_GetDirections: String { return self._s[2087]! } + public var Wallet_Receive_ShareInvoiceUrl: String { return self._s[2088]! } + public var Login_PhoneFloodError: String { return self._s[2089]! } public func Time_MonthOfYear_m3(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2089]!, self._r[2089]!, [_0]) + return formatWithArgumentRanges(self._s[2090]!, self._r[2090]!, [_0]) } public func Wallet_Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2090]!, self._r[2090]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2091]!, self._r[2091]!, [_1, _2, _3]) } - public var IntentsSettings_SuggestedChatsPrivateChats: String { return self._s[2091]! } - public var Settings_SetUsername: String { return self._s[2093]! } - public var Group_Location_ChangeLocation: String { return self._s[2094]! } - public var Notification_GroupInviterSelf: String { return self._s[2095]! } - public var InstantPage_TapToOpenLink: String { return self._s[2096]! } + public var IntentsSettings_SuggestedChatsPrivateChats: String { return self._s[2092]! } + public var Settings_SetUsername: String { return self._s[2094]! } + public var Group_Location_ChangeLocation: String { return self._s[2095]! } + public var Notification_GroupInviterSelf: String { return self._s[2096]! } + public var InstantPage_TapToOpenLink: String { return self._s[2097]! } public func Notification_ChannelInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2097]!, self._r[2097]!, [_0]) + return formatWithArgumentRanges(self._s[2098]!, self._r[2098]!, [_0]) } - public var Watch_Suggestion_TalkLater: String { return self._s[2098]! } - public var SecretChat_Title: String { return self._s[2099]! } - public var Group_UpgradeNoticeText1: String { return self._s[2100]! } - public var AuthSessions_Title: String { return self._s[2101]! } + public var Watch_Suggestion_TalkLater: String { return self._s[2099]! } + public var SecretChat_Title: String { return self._s[2100]! } + public var Group_UpgradeNoticeText1: String { return self._s[2101]! } + public var AuthSessions_Title: String { return self._s[2102]! } public func TextFormat_AddLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2102]!, self._r[2102]!, [_0]) + return formatWithArgumentRanges(self._s[2103]!, self._r[2103]!, [_0]) } - public var PhotoEditor_CropAuto: String { return self._s[2103]! } - public var Channel_About_Title: String { return self._s[2104]! } - public var Theme_ThemeChanged: String { return self._s[2105]! } - public var FastTwoStepSetup_EmailHelp: String { return self._s[2106]! } + public var PhotoEditor_CropAuto: String { return self._s[2104]! } + public var Channel_About_Title: String { return self._s[2105]! } + public var Theme_ThemeChanged: String { return self._s[2106]! } + public var FastTwoStepSetup_EmailHelp: String { return self._s[2107]! } public func Conversation_Bytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2108]!, self._r[2108]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[2109]!, self._r[2109]!, ["\(_0)"]) } - public var VoiceOver_MessageContextReport: String { return self._s[2109]! } - public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[2111]! } - public var Group_Setup_HistoryVisibleHelp: String { return self._s[2112]! } + public var VoiceOver_MessageContextReport: String { return self._s[2110]! } + public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[2112]! } + public var Group_Setup_HistoryVisibleHelp: String { return self._s[2113]! } public func PUSH_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2113]!, self._r[2113]!, [_1]) + return formatWithArgumentRanges(self._s[2114]!, self._r[2114]!, [_1]) } public func SharedMedia_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2115]!, self._r[2115]!, [_0]) - } - public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2116]!, self._r[2116]!, [_0]) } - public var Privacy_PaymentsClearInfoHelp: String { return self._s[2117]! } - public var Presence_online: String { return self._s[2120]! } - public var PasscodeSettings_Title: String { return self._s[2121]! } - public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[2122]! } - public var Web_OpenExternal: String { return self._s[2123]! } - public var AutoDownloadSettings_AutoDownload: String { return self._s[2125]! } - public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[2126]! } - public var LocalGroup_Title: String { return self._s[2127]! } + public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2117]!, self._r[2117]!, [_0]) + } + public var Privacy_PaymentsClearInfoHelp: String { return self._s[2118]! } + public var Presence_online: String { return self._s[2121]! } + public var PasscodeSettings_Title: String { return self._s[2122]! } + public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[2123]! } + public var Web_OpenExternal: String { return self._s[2124]! } + public var AutoDownloadSettings_AutoDownload: String { return self._s[2126]! } + public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[2127]! } + public var LocalGroup_Title: String { return self._s[2128]! } public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2128]!, self._r[2128]!, [_0]) + return formatWithArgumentRanges(self._s[2129]!, self._r[2129]!, [_0]) } - public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[2129]! } - public var Conversation_StopQuizConfirmation: String { return self._s[2130]! } - public var Map_YouAreHere: String { return self._s[2131]! } + public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[2130]! } + public var Conversation_StopQuizConfirmation: String { return self._s[2131]! } + public var Map_YouAreHere: String { return self._s[2132]! } public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2132]!, self._r[2132]!, [_0]) - } - public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2133]!, self._r[2133]!, [_0]) } - public var Theme_Context_ChangeColors: String { return self._s[2134]! } - public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[2135]! } - public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[2136]! } - public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2137]!, self._r[2137]!, [_0]) + public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2134]!, self._r[2134]!, [_0]) } - public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { + public var Theme_Context_ChangeColors: String { return self._s[2135]! } + public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[2136]! } + public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[2137]! } + public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2138]!, self._r[2138]!, [_0]) } - public var SocksProxySetup_Username: String { return self._s[2139]! } - public var Bot_Start: String { return self._s[2140]! } - public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2141]!, self._r[2141]!, [_0]) + public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2139]!, self._r[2139]!, [_0]) } - public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { + public var SocksProxySetup_Username: String { return self._s[2140]! } + public var Bot_Start: String { return self._s[2141]! } + public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2142]!, self._r[2142]!, [_0]) } - public var Contacts_SortByPresence: String { return self._s[2143]! } - public var AccentColor_Title: String { return self._s[2145]! } - public var Conversation_DiscardVoiceMessageTitle: String { return self._s[2146]! } + public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2143]!, self._r[2143]!, [_0]) + } + public var Contacts_SortByPresence: String { return self._s[2144]! } + public var AccentColor_Title: String { return self._s[2146]! } + public var Conversation_DiscardVoiceMessageTitle: String { return self._s[2147]! } public func PUSH_CHAT_CREATED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2147]!, self._r[2147]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2148]!, self._r[2148]!, [_1, _2]) } public func PrivacySettings_LastSeenContactsMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2148]!, self._r[2148]!, [_0]) + return formatWithArgumentRanges(self._s[2149]!, self._r[2149]!, [_0]) } public func Channel_AdminLog_MessageChangedLinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2149]!, self._r[2149]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2150]!, self._r[2150]!, [_1, _2]) } - public var Passport_Email_EnterOtherEmail: String { return self._s[2150]! } - public var Login_InfoAvatarPhoto: String { return self._s[2151]! } - public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[2152]! } - public var Tour_Title4: String { return self._s[2153]! } - public var Passport_Identity_Translation: String { return self._s[2154]! } - public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[2155]! } - public var Login_TermsOfServiceLabel: String { return self._s[2157]! } - public var Passport_Language_it: String { return self._s[2158]! } - public var KeyCommand_JumpToNextUnreadChat: String { return self._s[2159]! } - public var Passport_Identity_SelfieHelp: String { return self._s[2160]! } - public var Conversation_ClearAll: String { return self._s[2162]! } - public var Wallet_Send_UninitializedText: String { return self._s[2164]! } - public var Channel_OwnershipTransfer_Title: String { return self._s[2165]! } - public var TwoStepAuth_FloodError: String { return self._s[2166]! } + public var Passport_Email_EnterOtherEmail: String { return self._s[2151]! } + public var Login_InfoAvatarPhoto: String { return self._s[2152]! } + public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[2153]! } + public var Tour_Title4: String { return self._s[2154]! } + public var Passport_Identity_Translation: String { return self._s[2155]! } + public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[2156]! } + public var Login_TermsOfServiceLabel: String { return self._s[2158]! } + public var Passport_Language_it: String { return self._s[2159]! } + public var KeyCommand_JumpToNextUnreadChat: String { return self._s[2160]! } + public var Passport_Identity_SelfieHelp: String { return self._s[2161]! } + public var Conversation_ClearAll: String { return self._s[2163]! } + public var Wallet_Send_UninitializedText: String { return self._s[2165]! } + public var Channel_OwnershipTransfer_Title: String { return self._s[2166]! } + public var TwoStepAuth_FloodError: String { return self._s[2167]! } public func PUSH_CHANNEL_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2167]!, self._r[2167]!, [_1]) + return formatWithArgumentRanges(self._s[2168]!, self._r[2168]!, [_1]) } - public var Paint_Delete: String { return self._s[2168]! } + public var Paint_Delete: String { return self._s[2169]! } public func Wallet_Sent_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2169]!, self._r[2169]!, [_0]) + return formatWithArgumentRanges(self._s[2170]!, self._r[2170]!, [_0]) } - public var Privacy_AddNewPeer: String { return self._s[2170]! } + public var Privacy_AddNewPeer: String { return self._s[2171]! } public func Channel_AdminLog_MessageRank(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2171]!, self._r[2171]!, [_1]) + return formatWithArgumentRanges(self._s[2172]!, self._r[2172]!, [_1]) } - public var LogoutOptions_SetPasscodeText: String { return self._s[2172]! } + public var LogoutOptions_SetPasscodeText: String { return self._s[2173]! } public func Passport_AcceptHelp(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2173]!, self._r[2173]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2174]!, self._r[2174]!, [_1, _2]) } - public var Message_PinnedAudioMessage: String { return self._s[2174]! } + public var Message_PinnedAudioMessage: String { return self._s[2175]! } public func Watch_Time_ShortTodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2175]!, self._r[2175]!, [_0]) + return formatWithArgumentRanges(self._s[2176]!, self._r[2176]!, [_0]) } - public var Notification_Mute1hMin: String { return self._s[2176]! } - public var Notifications_GroupNotificationsSound: String { return self._s[2177]! } - public var Wallet_Month_GenNovember: String { return self._s[2178]! } - public var SocksProxySetup_ShareProxyList: String { return self._s[2179]! } - public var Conversation_MessageEditedLabel: String { return self._s[2180]! } + public var Notification_Mute1hMin: String { return self._s[2177]! } + public var Notifications_GroupNotificationsSound: String { return self._s[2178]! } + public var Wallet_Month_GenNovember: String { return self._s[2179]! } + public var SocksProxySetup_ShareProxyList: String { return self._s[2180]! } + public var Conversation_MessageEditedLabel: String { return self._s[2181]! } public func ClearCache_Success(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2181]!, self._r[2181]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2182]!, self._r[2182]!, [_0, _1]) } - public var Notification_Exceptions_AlwaysOff: String { return self._s[2182]! } - public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[2183]! } + public var Notification_Exceptions_AlwaysOff: String { return self._s[2183]! } + public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[2184]! } public func Channel_AdminLog_MessageAdmin(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2184]!, self._r[2184]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[2185]!, self._r[2185]!, [_0, _1, _2]) } - public var NetworkUsageSettings_ResetStats: String { return self._s[2185]! } + public var NetworkUsageSettings_ResetStats: String { return self._s[2186]! } public func PUSH_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2186]!, self._r[2186]!, [_1]) + return formatWithArgumentRanges(self._s[2187]!, self._r[2187]!, [_1]) } - public var AccessDenied_LocationTracking: String { return self._s[2187]! } - public var Month_GenOctober: String { return self._s[2188]! } - public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[2189]! } - public var EnterPasscode_EnterPasscode: String { return self._s[2190]! } - public var MediaPicker_TimerTooltip: String { return self._s[2192]! } - public var SharedMedia_TitleAll: String { return self._s[2193]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[2196]! } - public var Conversation_RestrictedMedia: String { return self._s[2197]! } - public var AccessDenied_PhotosRestricted: String { return self._s[2198]! } - public var Privacy_Forwards_WhoCanForward: String { return self._s[2200]! } - public var ChangePhoneNumberCode_Called: String { return self._s[2201]! } + public var AccessDenied_LocationTracking: String { return self._s[2188]! } + public var Month_GenOctober: String { return self._s[2189]! } + public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[2190]! } + public var EnterPasscode_EnterPasscode: String { return self._s[2191]! } + public var MediaPicker_TimerTooltip: String { return self._s[2193]! } + public var SharedMedia_TitleAll: String { return self._s[2194]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[2197]! } + public var Conversation_RestrictedMedia: String { return self._s[2198]! } + public var AccessDenied_PhotosRestricted: String { return self._s[2199]! } + public var Privacy_Forwards_WhoCanForward: String { return self._s[2201]! } + public var ChangePhoneNumberCode_Called: String { return self._s[2202]! } public func Notification_PinnedDocumentMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2202]!, self._r[2202]!, [_0]) + return formatWithArgumentRanges(self._s[2203]!, self._r[2203]!, [_0]) } - public var Conversation_SavedMessages: String { return self._s[2205]! } - public var Your_cards_expiration_month_is_invalid: String { return self._s[2207]! } - public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[2208]! } + public var Conversation_SavedMessages: String { return self._s[2206]! } + public var Your_cards_expiration_month_is_invalid: String { return self._s[2208]! } + public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[2209]! } public func Target_ShareGameConfirmationGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2210]!, self._r[2210]!, [_0]) + return formatWithArgumentRanges(self._s[2211]!, self._r[2211]!, [_0]) } - public var VoiceOver_Chat_YourMessage: String { return self._s[2211]! } + public var VoiceOver_Chat_YourMessage: String { return self._s[2212]! } public func VoiceOver_Chat_Title(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2212]!, self._r[2212]!, [_0]) + return formatWithArgumentRanges(self._s[2213]!, self._r[2213]!, [_0]) } - public var ReportPeer_AlertSuccess: String { return self._s[2213]! } - public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[2214]! } + public var ReportPeer_AlertSuccess: String { return self._s[2214]! } + public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[2215]! } public func InstantPage_RelatedArticleAuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2215]!, self._r[2215]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2216]!, self._r[2216]!, [_1, _2]) } - public var Checkout_PasswordEntry_Title: String { return self._s[2216]! } - public var PhotoEditor_FadeTool: String { return self._s[2217]! } - public var Privacy_ContactsReset: String { return self._s[2218]! } + public var Checkout_PasswordEntry_Title: String { return self._s[2217]! } + public var PhotoEditor_FadeTool: String { return self._s[2218]! } + public var Privacy_ContactsReset: String { return self._s[2219]! } public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2220]!, self._r[2220]!, [_0]) + return formatWithArgumentRanges(self._s[2221]!, self._r[2221]!, [_0]) } - public var Message_PinnedVideoMessage: String { return self._s[2221]! } - public var ChatList_Mute: String { return self._s[2222]! } + public var Message_PinnedVideoMessage: String { return self._s[2222]! } + public var ChatList_Mute: String { return self._s[2223]! } public func Wallet_Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2223]!, self._r[2223]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2224]!, self._r[2224]!, [_1, _2, _3]) } - public var Permissions_CellularDataText_v0: String { return self._s[2224]! } - public var ShareMenu_SelectChats: String { return self._s[2227]! } - public var ChatList_Context_Unarchive: String { return self._s[2228]! } - public var MusicPlayer_VoiceNote: String { return self._s[2229]! } - public var Conversation_RestrictedText: String { return self._s[2230]! } - public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[2231]! } - public var Wallet_Month_GenApril: String { return self._s[2232]! } - public var Wallet_Month_ShortMarch: String { return self._s[2233]! } - public var TwoStepAuth_DisableSuccess: String { return self._s[2234]! } - public var Cache_Videos: String { return self._s[2235]! } - public var PrivacySettings_PhoneNumber: String { return self._s[2236]! } - public var Wallet_Month_GenFebruary: String { return self._s[2237]! } - public var FeatureDisabled_Oops: String { return self._s[2239]! } - public var Passport_Address_PostcodePlaceholder: String { return self._s[2240]! } + public var Permissions_CellularDataText_v0: String { return self._s[2225]! } + public var ShareMenu_SelectChats: String { return self._s[2228]! } + public var ChatList_Context_Unarchive: String { return self._s[2229]! } + public var MusicPlayer_VoiceNote: String { return self._s[2230]! } + public var Conversation_RestrictedText: String { return self._s[2231]! } + public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[2232]! } + public var Wallet_Month_GenApril: String { return self._s[2233]! } + public var Wallet_Month_ShortMarch: String { return self._s[2234]! } + public var TwoStepAuth_DisableSuccess: String { return self._s[2235]! } + public var Cache_Videos: String { return self._s[2236]! } + public var PrivacySettings_PhoneNumber: String { return self._s[2237]! } + public var Wallet_Month_GenFebruary: String { return self._s[2238]! } + public var FeatureDisabled_Oops: String { return self._s[2240]! } + public var Passport_Address_PostcodePlaceholder: String { return self._s[2241]! } public func AddContact_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2241]!, self._r[2241]!, [_0]) + return formatWithArgumentRanges(self._s[2242]!, self._r[2242]!, [_0]) } - public var Stickers_GroupStickersHelp: String { return self._s[2242]! } - public var GroupPermission_NoSendPolls: String { return self._s[2243]! } - public var Wallet_Qr_ScanCode: String { return self._s[2244]! } - public var Message_VideoExpired: String { return self._s[2246]! } - public var GroupInfo_GroupHistoryVisible: String { return self._s[2247]! } - public var Notifications_Badge: String { return self._s[2248]! } - public var Wallet_Receive_AddressCopied: String { return self._s[2249]! } - public var CreatePoll_OptionPlaceholder: String { return self._s[2250]! } - public var Username_InvalidTooShort: String { return self._s[2251]! } - public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[2252]! } - public var Channel_AdminLog_PinMessages: String { return self._s[2253]! } - public var ArchivedChats_IntroTitle3: String { return self._s[2254]! } + public var Stickers_GroupStickersHelp: String { return self._s[2243]! } + public var GroupPermission_NoSendPolls: String { return self._s[2244]! } + public var Wallet_Qr_ScanCode: String { return self._s[2245]! } + public var Message_VideoExpired: String { return self._s[2247]! } + public var GroupInfo_GroupHistoryVisible: String { return self._s[2248]! } + public var Notifications_Badge: String { return self._s[2249]! } + public var Wallet_Receive_AddressCopied: String { return self._s[2250]! } + public var CreatePoll_OptionPlaceholder: String { return self._s[2251]! } + public var Username_InvalidTooShort: String { return self._s[2252]! } + public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[2253]! } + public var Channel_AdminLog_PinMessages: String { return self._s[2254]! } + public var ArchivedChats_IntroTitle3: String { return self._s[2255]! } public func Notification_MessageLifetimeRemoved(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2255]!, self._r[2255]!, [_1]) + return formatWithArgumentRanges(self._s[2256]!, self._r[2256]!, [_1]) } - public var Permissions_SiriAllowInSettings_v0: String { return self._s[2256]! } - public var Conversation_DefaultRestrictedText: String { return self._s[2257]! } - public var SharedMedia_CategoryDocs: String { return self._s[2260]! } + public var Permissions_SiriAllowInSettings_v0: String { return self._s[2257]! } + public var Conversation_DefaultRestrictedText: String { return self._s[2258]! } + public var SharedMedia_CategoryDocs: String { return self._s[2261]! } public func PUSH_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2261]!, self._r[2261]!, [_1]) + return formatWithArgumentRanges(self._s[2262]!, self._r[2262]!, [_1]) } - public var Wallet_Send_UninitializedTitle: String { return self._s[2262]! } - public var StickerPackActionInfo_ArchivedTitle: String { return self._s[2263]! } - public var Privacy_Forwards_NeverLink: String { return self._s[2265]! } + public var Wallet_Send_UninitializedTitle: String { return self._s[2263]! } + public var StickerPackActionInfo_ArchivedTitle: String { return self._s[2264]! } + public var Privacy_Forwards_NeverLink: String { return self._s[2266]! } public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2266]!, self._r[2266]!, [_1]) + return formatWithArgumentRanges(self._s[2267]!, self._r[2267]!, [_1]) } - public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[2267]! } + public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[2268]! } public func Time_MonthOfYear_m12(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2268]!, self._r[2268]!, [_0]) + return formatWithArgumentRanges(self._s[2269]!, self._r[2269]!, [_0]) } - public var ChatSettings_PrivateChats: String { return self._s[2269]! } - public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[2270]! } - public var Conversation_PrivateMessageLinkCopied: String { return self._s[2271]! } - public var Channel_UpdatePhotoItem: String { return self._s[2272]! } - public var GroupInfo_LeftStatus: String { return self._s[2273]! } - public var Watch_MessageView_Forward: String { return self._s[2275]! } - public var ReportPeer_ReasonChildAbuse: String { return self._s[2276]! } - public var Cache_ClearEmpty: String { return self._s[2278]! } - public var Localization_LanguageName: String { return self._s[2279]! } - public var Wallet_AccessDenied_Title: String { return self._s[2280]! } - public var WebSearch_GIFs: String { return self._s[2281]! } - public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2282]! } - public var Wallet_AccessDenied_Settings: String { return self._s[2283]! } - public var Username_InvalidStartsWithNumber: String { return self._s[2284]! } - public var Common_Back: String { return self._s[2285]! } - public var GroupInfo_Permissions_EditingDisabled: String { return self._s[2286]! } - public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2287]! } - public var Wallet_Send_Send: String { return self._s[2288]! } + public var ChatSettings_PrivateChats: String { return self._s[2270]! } + public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[2271]! } + public var Conversation_PrivateMessageLinkCopied: String { return self._s[2272]! } + public var Channel_UpdatePhotoItem: String { return self._s[2273]! } + public var GroupInfo_LeftStatus: String { return self._s[2274]! } + public var Watch_MessageView_Forward: String { return self._s[2276]! } + public var ReportPeer_ReasonChildAbuse: String { return self._s[2277]! } + public var Cache_ClearEmpty: String { return self._s[2279]! } + public var Localization_LanguageName: String { return self._s[2280]! } + public var Wallet_AccessDenied_Title: String { return self._s[2281]! } + public var WebSearch_GIFs: String { return self._s[2282]! } + public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2283]! } + public var Wallet_AccessDenied_Settings: String { return self._s[2284]! } + public var Username_InvalidStartsWithNumber: String { return self._s[2285]! } + public var Common_Back: String { return self._s[2286]! } + public var GroupInfo_Permissions_EditingDisabled: String { return self._s[2287]! } + public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2288]! } + public var Wallet_Send_Send: String { return self._s[2289]! } public func PUSH_CHANNEL_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2290]!, self._r[2290]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2291]!, self._r[2291]!, [_1, _2]) } - public var Wallet_Info_RefreshErrorTitle: String { return self._s[2291]! } - public var Wallet_Month_GenJune: String { return self._s[2292]! } - public var Passport_Email_Help: String { return self._s[2293]! } - public var Watch_Conversation_Reply: String { return self._s[2295]! } - public var Conversation_EditingMessageMediaChange: String { return self._s[2298]! } - public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2299]! } - public var Channel_BanUser_Unban: String { return self._s[2301]! } - public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2302]! } - public var Group_Username_CreatePublicLinkHelp: String { return self._s[2303]! } - public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2305]! } - public var Wallet_Send_AddressHeader: String { return self._s[2306]! } - public var Passport_Identity_Name: String { return self._s[2307]! } + public var Wallet_Info_RefreshErrorTitle: String { return self._s[2292]! } + public var Wallet_Month_GenJune: String { return self._s[2293]! } + public var Passport_Email_Help: String { return self._s[2294]! } + public var Watch_Conversation_Reply: String { return self._s[2296]! } + public var Conversation_EditingMessageMediaChange: String { return self._s[2299]! } + public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2300]! } + public var Channel_BanUser_Unban: String { return self._s[2302]! } + public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2303]! } + public var Group_Username_CreatePublicLinkHelp: String { return self._s[2304]! } + public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2306]! } + public var Wallet_Send_AddressHeader: String { return self._s[2307]! } + public var Passport_Identity_Name: String { return self._s[2308]! } public func Channel_DiscussionGroup_HeaderGroupSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2308]!, self._r[2308]!, [_0]) + return formatWithArgumentRanges(self._s[2309]!, self._r[2309]!, [_0]) } - public var GroupRemoved_ViewUserInfo: String { return self._s[2309]! } - public var Conversation_BlockUser: String { return self._s[2310]! } - public var Month_GenJanuary: String { return self._s[2311]! } - public var ChatSettings_TextSize: String { return self._s[2312]! } - public var Notification_PassportValuePhone: String { return self._s[2313]! } - public var MediaPlayer_UnknownArtist: String { return self._s[2314]! } - public var Passport_Language_ne: String { return self._s[2315]! } - public var Notification_CallBack: String { return self._s[2316]! } - public var Wallet_SecureStorageReset_BiometryTouchId: String { return self._s[2317]! } - public var TwoStepAuth_EmailHelp: String { return self._s[2318]! } + public var GroupRemoved_ViewUserInfo: String { return self._s[2310]! } + public var Conversation_BlockUser: String { return self._s[2311]! } + public var Month_GenJanuary: String { return self._s[2312]! } + public var ChatSettings_TextSize: String { return self._s[2313]! } + public var Notification_PassportValuePhone: String { return self._s[2314]! } + public var MediaPlayer_UnknownArtist: String { return self._s[2315]! } + public var Passport_Language_ne: String { return self._s[2316]! } + public var Notification_CallBack: String { return self._s[2317]! } + public var Wallet_SecureStorageReset_BiometryTouchId: String { return self._s[2318]! } + public var TwoStepAuth_EmailHelp: String { return self._s[2319]! } public func Time_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2319]!, self._r[2319]!, [_0]) + return formatWithArgumentRanges(self._s[2320]!, self._r[2320]!, [_0]) } - public var Channel_Info_Management: String { return self._s[2320]! } - public var Passport_FieldIdentityUploadHelp: String { return self._s[2321]! } - public var Stickers_FrequentlyUsed: String { return self._s[2322]! } - public var Channel_BanUser_PermissionSendMessages: String { return self._s[2323]! } - public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2325]! } + public var Channel_Info_Management: String { return self._s[2321]! } + public var Passport_FieldIdentityUploadHelp: String { return self._s[2322]! } + public var Stickers_FrequentlyUsed: String { return self._s[2323]! } + public var Channel_BanUser_PermissionSendMessages: String { return self._s[2324]! } + public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2326]! } public func LOCAL_CHANNEL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2326]!, self._r[2326]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[2327]!, self._r[2327]!, [_1, "\(_2)"]) } - public var TwoFactorSetup_Password_Title: String { return self._s[2327]! } - public var Passport_Address_EditResidentialAddress: String { return self._s[2328]! } - public var PrivacyPolicy_DeclineTitle: String { return self._s[2329]! } - public var CreatePoll_TextHeader: String { return self._s[2330]! } + public var TwoFactorSetup_Password_Title: String { return self._s[2328]! } + public var Passport_Address_EditResidentialAddress: String { return self._s[2329]! } + public var PrivacyPolicy_DeclineTitle: String { return self._s[2330]! } + public var CreatePoll_TextHeader: String { return self._s[2331]! } public func Checkout_SavePasswordTimeoutAndTouchId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2331]!, self._r[2331]!, [_0]) + return formatWithArgumentRanges(self._s[2332]!, self._r[2332]!, [_0]) } - public var PhotoEditor_QualityMedium: String { return self._s[2332]! } - public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2333]! } - public var Conversation_StatusKickedFromChannel: String { return self._s[2335]! } - public var CheckoutInfo_ReceiverInfoName: String { return self._s[2336]! } - public var Group_ErrorSendRestrictedStickers: String { return self._s[2337]! } + public var PhotoEditor_QualityMedium: String { return self._s[2333]! } + public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2334]! } + public var Conversation_StatusKickedFromChannel: String { return self._s[2336]! } + public var CheckoutInfo_ReceiverInfoName: String { return self._s[2337]! } + public var Group_ErrorSendRestrictedStickers: String { return self._s[2338]! } public func Conversation_RestrictedInlineTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2338]!, self._r[2338]!, [_0]) + return formatWithArgumentRanges(self._s[2339]!, self._r[2339]!, [_0]) } public func Channel_AdminLog_MessageTransferedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2339]!, self._r[2339]!, [_1]) + return formatWithArgumentRanges(self._s[2340]!, self._r[2340]!, [_1]) } - public var LogoutOptions_LogOutWalletInfo: String { return self._s[2340]! } - public var TwoFactorSetup_Email_SkipConfirmationTitle: String { return self._s[2341]! } - public var Conversation_LinkDialogOpen: String { return self._s[2343]! } - public var TwoFactorSetup_Hint_Title: String { return self._s[2344]! } - public var VoiceOver_Chat_PollNoVotes: String { return self._s[2345]! } - public var Settings_Username: String { return self._s[2347]! } - public var Conversation_Block: String { return self._s[2349]! } - public var Wallpaper_Wallpaper: String { return self._s[2350]! } - public var SocksProxySetup_UseProxy: String { return self._s[2352]! } - public var Wallet_Send_Confirmation: String { return self._s[2353]! } - public var EditTheme_UploadEditedTheme: String { return self._s[2354]! } - public var UserInfo_ShareMyContactInfo: String { return self._s[2355]! } - public var MessageTimer_Forever: String { return self._s[2356]! } - public var Privacy_Calls_WhoCanCallMe: String { return self._s[2357]! } - public var PhotoEditor_DiscardChanges: String { return self._s[2358]! } - public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2359]! } - public var Passport_Language_da: String { return self._s[2360]! } - public var SocksProxySetup_PortPlaceholder: String { return self._s[2361]! } + public var LogoutOptions_LogOutWalletInfo: String { return self._s[2341]! } + public var TwoFactorSetup_Email_SkipConfirmationTitle: String { return self._s[2342]! } + public var Conversation_LinkDialogOpen: String { return self._s[2344]! } + public var TwoFactorSetup_Hint_Title: String { return self._s[2345]! } + public var VoiceOver_Chat_PollNoVotes: String { return self._s[2346]! } + public var Settings_Username: String { return self._s[2348]! } + public var Conversation_Block: String { return self._s[2350]! } + public var Wallpaper_Wallpaper: String { return self._s[2351]! } + public var SocksProxySetup_UseProxy: String { return self._s[2353]! } + public var Wallet_Send_Confirmation: String { return self._s[2354]! } + public var EditTheme_UploadEditedTheme: String { return self._s[2355]! } + public var UserInfo_ShareMyContactInfo: String { return self._s[2356]! } + public var MessageTimer_Forever: String { return self._s[2357]! } + public var Privacy_Calls_WhoCanCallMe: String { return self._s[2358]! } + public var PhotoEditor_DiscardChanges: String { return self._s[2359]! } + public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2360]! } + public var Passport_Language_da: String { return self._s[2361]! } + public var SocksProxySetup_PortPlaceholder: String { return self._s[2362]! } public func SecretGIF_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2362]!, self._r[2362]!, [_0]) + return formatWithArgumentRanges(self._s[2363]!, self._r[2363]!, [_0]) } - public var Passport_Address_EditPassportRegistration: String { return self._s[2363]! } + public var Passport_Address_EditPassportRegistration: String { return self._s[2364]! } public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2365]!, self._r[2365]!, [_0]) + return formatWithArgumentRanges(self._s[2366]!, self._r[2366]!, [_0]) } - public var Settings_AddDevice: String { return self._s[2366]! } - public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2368]! } - public var AuthSessions_AddDeviceIntro_Text1: String { return self._s[2369]! } - public var Conversation_SearchByName_Prefix: String { return self._s[2370]! } - public var Conversation_PinnedPoll: String { return self._s[2371]! } - public var AuthSessions_AddDeviceIntro_Text2: String { return self._s[2372]! } - public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2373]! } - public var AuthSessions_AddDeviceIntro_Text3: String { return self._s[2374]! } + public var Settings_AddDevice: String { return self._s[2367]! } + public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2369]! } + public var AuthSessions_AddDeviceIntro_Text1: String { return self._s[2370]! } + public var Conversation_SearchByName_Prefix: String { return self._s[2371]! } + public var Conversation_PinnedPoll: String { return self._s[2372]! } + public var AuthSessions_AddDeviceIntro_Text2: String { return self._s[2373]! } + public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2374]! } + public var AuthSessions_AddDeviceIntro_Text3: String { return self._s[2375]! } public func PUSH_ENCRYPTION_ACCEPT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2375]!, self._r[2375]!, [_1]) + return formatWithArgumentRanges(self._s[2376]!, self._r[2376]!, [_1]) } - public var WallpaperSearch_ColorPurple: String { return self._s[2376]! } - public var Cache_ByPeerHeader: String { return self._s[2377]! } + public var WallpaperSearch_ColorPurple: String { return self._s[2377]! } + public var Cache_ByPeerHeader: String { return self._s[2378]! } public func Conversation_EncryptedPlaceholderTitleIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2378]!, self._r[2378]!, [_0]) + return formatWithArgumentRanges(self._s[2379]!, self._r[2379]!, [_0]) } - public var ChatSettings_AutoDownloadDocuments: String { return self._s[2379]! } - public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2382]! } - public var Wallet_Completed_Title: String { return self._s[2383]! } - public var Notification_PinnedMessage: String { return self._s[2384]! } - public var TwoFactorSetup_EmailVerification_Placeholder: String { return self._s[2385]! } - public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2387]! } - public var Contacts_SortBy: String { return self._s[2388]! } + public var ChatSettings_AutoDownloadDocuments: String { return self._s[2380]! } + public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2383]! } + public var Wallet_Completed_Title: String { return self._s[2384]! } + public var Notification_PinnedMessage: String { return self._s[2385]! } + public var TwoFactorSetup_EmailVerification_Placeholder: String { return self._s[2386]! } + public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2388]! } + public var Contacts_SortBy: String { return self._s[2389]! } public func PUSH_CHANNEL_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2389]!, self._r[2389]!, [_1]) + return formatWithArgumentRanges(self._s[2390]!, self._r[2390]!, [_1]) } - public var Appearance_ColorThemeNight: String { return self._s[2391]! } + public var Appearance_ColorThemeNight: String { return self._s[2392]! } public func PUSH_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2392]!, self._r[2392]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2393]!, self._r[2393]!, [_1, _2]) } - public var Call_EncryptionKey_Title: String { return self._s[2393]! } - public var Watch_UserInfo_Service: String { return self._s[2394]! } - public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2396]! } - public var Conversation_Unpin: String { return self._s[2398]! } - public var CancelResetAccount_Title: String { return self._s[2399]! } - public var Map_LiveLocationFor15Minutes: String { return self._s[2400]! } + public var Call_EncryptionKey_Title: String { return self._s[2394]! } + public var Watch_UserInfo_Service: String { return self._s[2395]! } + public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2397]! } + public var Conversation_Unpin: String { return self._s[2399]! } + public var CancelResetAccount_Title: String { return self._s[2400]! } + public var Map_LiveLocationFor15Minutes: String { return self._s[2401]! } public func Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2402]!, self._r[2402]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2403]!, self._r[2403]!, [_1, _2, _3]) } - public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2403]! } - public var CallSettings_Title: String { return self._s[2404]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2405]! } - public var PasscodeSettings_EncryptDataHelp: String { return self._s[2407]! } - public var AutoDownloadSettings_Contacts: String { return self._s[2408]! } + public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2404]! } + public var CallSettings_Title: String { return self._s[2405]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2406]! } + public var PasscodeSettings_EncryptDataHelp: String { return self._s[2408]! } + public var AutoDownloadSettings_Contacts: String { return self._s[2409]! } public func Channel_AdminLog_MessageRankName(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2409]!, self._r[2409]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2410]!, self._r[2410]!, [_1, _2]) } - public var Passport_Identity_DocumentDetails: String { return self._s[2410]! } - public var LoginPassword_PasswordHelp: String { return self._s[2411]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2412]! } - public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2413]! } - public var ChatContextMenu_TextSelectionTip: String { return self._s[2414]! } - public var Checkout_TotalPaidAmount: String { return self._s[2415]! } + public var Passport_Identity_DocumentDetails: String { return self._s[2411]! } + public var LoginPassword_PasswordHelp: String { return self._s[2412]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2413]! } + public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2414]! } + public var ChatContextMenu_TextSelectionTip: String { return self._s[2415]! } + public var Checkout_TotalPaidAmount: String { return self._s[2416]! } public func FileSize_KB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2416]!, self._r[2416]!, [_0]) + return formatWithArgumentRanges(self._s[2417]!, self._r[2417]!, [_0]) } - public var PasscodeSettings_ChangePasscode: String { return self._s[2417]! } - public var Conversation_SecretLinkPreviewAlert: String { return self._s[2419]! } - public var Privacy_SecretChatsLinkPreviews: String { return self._s[2420]! } + public var PasscodeSettings_ChangePasscode: String { return self._s[2418]! } + public var Conversation_SecretLinkPreviewAlert: String { return self._s[2420]! } + public var Privacy_SecretChatsLinkPreviews: String { return self._s[2421]! } public func PUSH_CHANNEL_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2421]!, self._r[2421]!, [_1]) + return formatWithArgumentRanges(self._s[2422]!, self._r[2422]!, [_1]) } - public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2422]! } - public var Contacts_InviteFriends: String { return self._s[2424]! } - public var Map_ChooseLocationTitle: String { return self._s[2425]! } - public var Conversation_StopPoll: String { return self._s[2427]! } + public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2423]! } + public var Contacts_InviteFriends: String { return self._s[2425]! } + public var Map_ChooseLocationTitle: String { return self._s[2426]! } + public var Conversation_StopPoll: String { return self._s[2428]! } public func WebSearch_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2428]!, self._r[2428]!, [_0]) + return formatWithArgumentRanges(self._s[2429]!, self._r[2429]!, [_0]) } - public var Call_Camera: String { return self._s[2429]! } - public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2430]! } - public var AppWallet_Intro_Text: String { return self._s[2431]! } - public var Calls_RatingFeedback: String { return self._s[2432]! } - public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2434]! } - public var Wallet_Alert_OK: String { return self._s[2435]! } - public var NotificationsSound_Pulse: String { return self._s[2436]! } - public var Watch_LastSeen_Lately: String { return self._s[2437]! } - public var ReportGroupLocation_Report: String { return self._s[2440]! } - public var Widget_NoUsers: String { return self._s[2441]! } - public var Conversation_UnvotePoll: String { return self._s[2442]! } - public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2444]! } - public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2445]! } - public var NotificationsSound_Circles: String { return self._s[2446]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2449]! } - public var Wallet_Settings_DeleteWallet: String { return self._s[2450]! } - public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2451]! } - public var Proxy_TooltipUnavailable: String { return self._s[2452]! } - public var Passport_Identity_CountryPlaceholder: String { return self._s[2454]! } - public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2456]! } - public var Conversation_FileDropbox: String { return self._s[2457]! } - public var Notifications_ExceptionsUnmuted: String { return self._s[2458]! } - public var Tour_Text3: String { return self._s[2460]! } - public var Login_ResetAccountProtected_Title: String { return self._s[2462]! } - public var GroupPermission_NoSendMessages: String { return self._s[2463]! } - public var WallpaperSearch_ColorTitle: String { return self._s[2464]! } - public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2465]! } + public var Call_Camera: String { return self._s[2430]! } + public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2431]! } + public var AppWallet_Intro_Text: String { return self._s[2432]! } + public var Calls_RatingFeedback: String { return self._s[2433]! } + public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2435]! } + public var Wallet_Alert_OK: String { return self._s[2436]! } + public var NotificationsSound_Pulse: String { return self._s[2437]! } + public var Watch_LastSeen_Lately: String { return self._s[2438]! } + public var ReportGroupLocation_Report: String { return self._s[2441]! } + public var Widget_NoUsers: String { return self._s[2442]! } + public var Conversation_UnvotePoll: String { return self._s[2443]! } + public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2445]! } + public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2446]! } + public var NotificationsSound_Circles: String { return self._s[2447]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2450]! } + public var Wallet_Settings_DeleteWallet: String { return self._s[2451]! } + public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2452]! } + public var Proxy_TooltipUnavailable: String { return self._s[2453]! } + public var Passport_Identity_CountryPlaceholder: String { return self._s[2455]! } + public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2457]! } + public var Conversation_FileDropbox: String { return self._s[2458]! } + public var Notifications_ExceptionsUnmuted: String { return self._s[2459]! } + public var Tour_Text3: String { return self._s[2461]! } + public var Login_ResetAccountProtected_Title: String { return self._s[2463]! } + public var GroupPermission_NoSendMessages: String { return self._s[2464]! } + public var WallpaperSearch_ColorTitle: String { return self._s[2465]! } + public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2466]! } public func Conversation_LiveLocationYouAnd(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2467]!, self._r[2467]!, [_0]) + return formatWithArgumentRanges(self._s[2468]!, self._r[2468]!, [_0]) } - public var GroupInfo_AddParticipantTitle: String { return self._s[2468]! } - public var Checkout_ShippingOption_Title: String { return self._s[2469]! } - public var ChatSettings_AutoDownloadTitle: String { return self._s[2470]! } + public var GroupInfo_AddParticipantTitle: String { return self._s[2469]! } + public var Checkout_ShippingOption_Title: String { return self._s[2470]! } + public var ChatSettings_AutoDownloadTitle: String { return self._s[2471]! } public func DialogList_SingleTypingSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2471]!, self._r[2471]!, [_0]) - } - public func ChatSettings_AutoDownloadSettings_TypeVideo(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2472]!, self._r[2472]!, [_0]) } - public var Channel_Management_LabelAdministrator: String { return self._s[2473]! } - public var EditTheme_FileReadError: String { return self._s[2474]! } - public var OwnershipTransfer_ComeBackLater: String { return self._s[2475]! } - public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2476]! } - public var AutoDownloadSettings_Photos: String { return self._s[2478]! } - public var Appearance_PreviewIncomingText: String { return self._s[2479]! } - public var ChatList_Context_MarkAllAsRead: String { return self._s[2480]! } - public var ChannelInfo_ConfirmLeave: String { return self._s[2481]! } - public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2482]! } - public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2483]! } - public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2484]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2485]! } - public var GroupInfo_SetGroupPhotoStop: String { return self._s[2486]! } - public var Notification_SecretChatScreenshot: String { return self._s[2487]! } - public var AccessDenied_Wallpapers: String { return self._s[2488]! } - public var ChatList_Context_Mute: String { return self._s[2490]! } - public var Passport_Address_City: String { return self._s[2491]! } - public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2492]! } - public var Appearance_ThemeCarouselClassic: String { return self._s[2493]! } - public var SocksProxySetup_SecretPlaceholder: String { return self._s[2494]! } - public var AccessDenied_LocationDisabled: String { return self._s[2495]! } - public var Group_Location_Title: String { return self._s[2496]! } - public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2498]! } - public var GroupInfo_Sound: String { return self._s[2499]! } - public var SettingsSearch_Synonyms_ChatSettings_OpenLinksIn: String { return self._s[2500]! } - public var ChannelInfo_ScamChannelWarning: String { return self._s[2501]! } - public var Stickers_RemoveFromFavorites: String { return self._s[2502]! } - public var Contacts_Title: String { return self._s[2503]! } - public var EditTheme_ThemeTemplateAlertText: String { return self._s[2504]! } - public var Passport_Language_fr: String { return self._s[2505]! } - public var TwoFactorSetup_EmailVerification_Action: String { return self._s[2506]! } - public var Notifications_ResetAllNotifications: String { return self._s[2507]! } - public var IntentsSettings_SuggestedChats: String { return self._s[2509]! } - public var PrivacySettings_SecurityTitle: String { return self._s[2511]! } - public var Checkout_NewCard_Title: String { return self._s[2512]! } - public var Login_HaveNotReceivedCodeInternal: String { return self._s[2513]! } - public var Conversation_ForwardChats: String { return self._s[2514]! } - public var Wallet_SecureStorageReset_PasscodeText: String { return self._s[2516]! } - public var PasscodeSettings_4DigitCode: String { return self._s[2517]! } - public var Settings_FAQ: String { return self._s[2519]! } - public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2520]! } - public var Conversation_ContextMenuForward: String { return self._s[2521]! } - public var VoiceOver_Chat_YourPhoto: String { return self._s[2524]! } - public var PrivacyPolicy_Title: String { return self._s[2527]! } - public var Notifications_TextTone: String { return self._s[2528]! } - public var Profile_CreateNewContact: String { return self._s[2529]! } - public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2530]! } - public var TwoFactorSetup_EmailVerification_Title: String { return self._s[2532]! } - public var Call_Speaker: String { return self._s[2533]! } - public var AutoNightTheme_AutomaticSection: String { return self._s[2534]! } - public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2536]! } - public var Channel_Username_InvalidCharacters: String { return self._s[2537]! } + public func ChatSettings_AutoDownloadSettings_TypeVideo(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2473]!, self._r[2473]!, [_0]) + } + public var Channel_Management_LabelAdministrator: String { return self._s[2474]! } + public var EditTheme_FileReadError: String { return self._s[2475]! } + public var OwnershipTransfer_ComeBackLater: String { return self._s[2476]! } + public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2477]! } + public var AutoDownloadSettings_Photos: String { return self._s[2479]! } + public var Appearance_PreviewIncomingText: String { return self._s[2480]! } + public var ChatList_Context_MarkAllAsRead: String { return self._s[2481]! } + public var ChannelInfo_ConfirmLeave: String { return self._s[2482]! } + public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2483]! } + public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2484]! } + public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2485]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2486]! } + public var GroupInfo_SetGroupPhotoStop: String { return self._s[2487]! } + public var Notification_SecretChatScreenshot: String { return self._s[2488]! } + public var AccessDenied_Wallpapers: String { return self._s[2489]! } + public var ChatList_Context_Mute: String { return self._s[2491]! } + public var Passport_Address_City: String { return self._s[2492]! } + public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2493]! } + public var Appearance_ThemeCarouselClassic: String { return self._s[2494]! } + public var SocksProxySetup_SecretPlaceholder: String { return self._s[2495]! } + public var AccessDenied_LocationDisabled: String { return self._s[2496]! } + public var Group_Location_Title: String { return self._s[2497]! } + public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2499]! } + public var GroupInfo_Sound: String { return self._s[2500]! } + public var SettingsSearch_Synonyms_ChatSettings_OpenLinksIn: String { return self._s[2501]! } + public var ChannelInfo_ScamChannelWarning: String { return self._s[2502]! } + public var Stickers_RemoveFromFavorites: String { return self._s[2503]! } + public var Contacts_Title: String { return self._s[2504]! } + public var EditTheme_ThemeTemplateAlertText: String { return self._s[2505]! } + public var Passport_Language_fr: String { return self._s[2506]! } + public var TwoFactorSetup_EmailVerification_Action: String { return self._s[2507]! } + public var Notifications_ResetAllNotifications: String { return self._s[2508]! } + public var IntentsSettings_SuggestedChats: String { return self._s[2510]! } + public var PrivacySettings_SecurityTitle: String { return self._s[2512]! } + public var Checkout_NewCard_Title: String { return self._s[2513]! } + public var Login_HaveNotReceivedCodeInternal: String { return self._s[2514]! } + public var Conversation_ForwardChats: String { return self._s[2515]! } + public var Wallet_SecureStorageReset_PasscodeText: String { return self._s[2517]! } + public var PasscodeSettings_4DigitCode: String { return self._s[2518]! } + public var Settings_FAQ: String { return self._s[2520]! } + public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2521]! } + public var Conversation_ContextMenuForward: String { return self._s[2522]! } + public var VoiceOver_Chat_YourPhoto: String { return self._s[2525]! } + public var PrivacyPolicy_Title: String { return self._s[2528]! } + public var Notifications_TextTone: String { return self._s[2529]! } + public var Profile_CreateNewContact: String { return self._s[2530]! } + public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2531]! } + public var TwoFactorSetup_EmailVerification_Title: String { return self._s[2533]! } + public var Call_Speaker: String { return self._s[2534]! } + public var AutoNightTheme_AutomaticSection: String { return self._s[2535]! } + public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2537]! } + public var Channel_Username_InvalidCharacters: String { return self._s[2538]! } public func Channel_AdminLog_MessageChangedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2538]!, self._r[2538]!, [_0]) + return formatWithArgumentRanges(self._s[2539]!, self._r[2539]!, [_0]) } - public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2539]! } - public var PrivacySettings_LastSeenTitle: String { return self._s[2540]! } - public var Channel_AdminLog_CanInviteUsers: String { return self._s[2541]! } - public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2542]! } - public var OwnershipTransfer_SecurityCheck: String { return self._s[2543]! } - public var Conversation_MessageDeliveryFailed: String { return self._s[2544]! } - public var Watch_ChatList_NoConversationsText: String { return self._s[2545]! } - public var Bot_Unblock: String { return self._s[2546]! } - public var TextFormat_Italic: String { return self._s[2547]! } - public var WallpaperSearch_ColorPink: String { return self._s[2548]! } - public var Settings_About_Help: String { return self._s[2550]! } - public var SearchImages_Title: String { return self._s[2551]! } - public var Weekday_Wednesday: String { return self._s[2552]! } - public var Conversation_ClousStorageInfo_Description1: String { return self._s[2553]! } - public var ExplicitContent_AlertTitle: String { return self._s[2554]! } + public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2540]! } + public var PrivacySettings_LastSeenTitle: String { return self._s[2541]! } + public var Channel_AdminLog_CanInviteUsers: String { return self._s[2542]! } + public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2543]! } + public var OwnershipTransfer_SecurityCheck: String { return self._s[2544]! } + public var Conversation_MessageDeliveryFailed: String { return self._s[2545]! } + public var Watch_ChatList_NoConversationsText: String { return self._s[2546]! } + public var Bot_Unblock: String { return self._s[2547]! } + public var TextFormat_Italic: String { return self._s[2548]! } + public var WallpaperSearch_ColorPink: String { return self._s[2549]! } + public var Settings_About_Help: String { return self._s[2551]! } + public var SearchImages_Title: String { return self._s[2552]! } + public var Weekday_Wednesday: String { return self._s[2553]! } + public var Conversation_ClousStorageInfo_Description1: String { return self._s[2554]! } + public var ExplicitContent_AlertTitle: String { return self._s[2555]! } public func Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2555]!, self._r[2555]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2556]!, self._r[2556]!, [_1, _2, _3]) } - public var Channel_DiscussionGroup_Create: String { return self._s[2556]! } - public var Weekday_Thursday: String { return self._s[2557]! } - public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2558]! } - public var Channel_Members_AddMembersHelp: String { return self._s[2559]! } + public var Channel_DiscussionGroup_Create: String { return self._s[2557]! } + public var Weekday_Thursday: String { return self._s[2558]! } + public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2559]! } + public var Channel_Members_AddMembersHelp: String { return self._s[2560]! } public func Checkout_SavePasswordTimeout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2560]!, self._r[2560]!, [_0]) + return formatWithArgumentRanges(self._s[2561]!, self._r[2561]!, [_0]) } - public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2561]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2562]! } - public var Passport_RequestedInformation: String { return self._s[2563]! } - public var Login_PhoneAndCountryHelp: String { return self._s[2564]! } - public var Conversation_EncryptionProcessing: String { return self._s[2566]! } - public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2567]! } - public var PhotoEditor_EnhanceTool: String { return self._s[2569]! } - public var Channel_Setup_Title: String { return self._s[2570]! } - public var Conversation_SearchPlaceholder: String { return self._s[2571]! } - public var OldChannels_GroupEmptyFormat: String { return self._s[2572]! } - public var AccessDenied_LocationAlwaysDenied: String { return self._s[2573]! } - public var Checkout_ErrorGeneric: String { return self._s[2574]! } - public var Passport_Language_hu: String { return self._s[2575]! } - public var GroupPermission_EditingDisabled: String { return self._s[2576]! } - public var Wallet_Month_ShortSeptember: String { return self._s[2578]! } + public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2562]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2563]! } + public var Passport_RequestedInformation: String { return self._s[2564]! } + public var Login_PhoneAndCountryHelp: String { return self._s[2565]! } + public var Conversation_EncryptionProcessing: String { return self._s[2567]! } + public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2568]! } + public var PhotoEditor_EnhanceTool: String { return self._s[2570]! } + public var Channel_Setup_Title: String { return self._s[2571]! } + public var Conversation_SearchPlaceholder: String { return self._s[2572]! } + public var OldChannels_GroupEmptyFormat: String { return self._s[2573]! } + public var AccessDenied_LocationAlwaysDenied: String { return self._s[2574]! } + public var Checkout_ErrorGeneric: String { return self._s[2575]! } + public var Passport_Language_hu: String { return self._s[2576]! } + public var GroupPermission_EditingDisabled: String { return self._s[2577]! } + public var Wallet_Month_ShortSeptember: String { return self._s[2579]! } public func Passport_Identity_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2579]!, self._r[2579]!, [_0]) + return formatWithArgumentRanges(self._s[2580]!, self._r[2580]!, [_0]) } public func PUSH_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2582]!, self._r[2582]!, [_1]) + return formatWithArgumentRanges(self._s[2583]!, self._r[2583]!, [_1]) } - public var ChatList_DeleteSavedMessagesConfirmationTitle: String { return self._s[2583]! } + public var ChatList_DeleteSavedMessagesConfirmationTitle: String { return self._s[2584]! } public func UserInfo_BlockConfirmationTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2584]!, self._r[2584]!, [_0]) + return formatWithArgumentRanges(self._s[2585]!, self._r[2585]!, [_0]) } - public var Conversation_CloudStorageInfo_Title: String { return self._s[2585]! } - public var Group_Location_Info: String { return self._s[2586]! } - public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2587]! } - public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2588]! } + public var Conversation_CloudStorageInfo_Title: String { return self._s[2586]! } + public var Group_Location_Info: String { return self._s[2587]! } + public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2588]! } + public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2589]! } public func Notification_Exceptions_MutedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2589]!, self._r[2589]!, [_0]) + return formatWithArgumentRanges(self._s[2590]!, self._r[2590]!, [_0]) } - public var Conversation_ClearPrivateHistory: String { return self._s[2590]! } - public var ContactInfo_PhoneLabelHome: String { return self._s[2591]! } - public var Appearance_RemoveThemeConfirmation: String { return self._s[2592]! } - public var PrivacySettings_LastSeenContacts: String { return self._s[2593]! } + public var Conversation_ClearPrivateHistory: String { return self._s[2591]! } + public var ContactInfo_PhoneLabelHome: String { return self._s[2592]! } + public var Appearance_RemoveThemeConfirmation: String { return self._s[2593]! } + public var PrivacySettings_LastSeenContacts: String { return self._s[2594]! } public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2594]!, self._r[2594]!, [_0]) + return formatWithArgumentRanges(self._s[2595]!, self._r[2595]!, [_0]) } - public var Passport_Language_cs: String { return self._s[2595]! } - public var Message_PinnedAnimationMessage: String { return self._s[2597]! } - public var Passport_Identity_ReverseSideHelp: String { return self._s[2599]! } - public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2600]! } - public var Wallet_Info_TransactionTo: String { return self._s[2602]! } - public var ChatList_DeleteForEveryoneConfirmationText: String { return self._s[2603]! } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2604]! } - public var Embed_PlayingInPIP: String { return self._s[2605]! } - public var Appearance_ThemePreview_Chat_3_TextWithLink: String { return self._s[2606]! } - public var AutoNightTheme_ScheduleSection: String { return self._s[2607]! } + public var Passport_Language_cs: String { return self._s[2596]! } + public var Message_PinnedAnimationMessage: String { return self._s[2598]! } + public var Passport_Identity_ReverseSideHelp: String { return self._s[2600]! } + public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2601]! } + public var Wallet_Info_TransactionTo: String { return self._s[2603]! } + public var ChatList_DeleteForEveryoneConfirmationText: String { return self._s[2604]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2605]! } + public var Embed_PlayingInPIP: String { return self._s[2606]! } + public var Appearance_ThemePreview_Chat_3_TextWithLink: String { return self._s[2607]! } + public var AutoNightTheme_ScheduleSection: String { return self._s[2608]! } public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2608]!, self._r[2608]!, [_0]) + return formatWithArgumentRanges(self._s[2609]!, self._r[2609]!, [_0]) } - public var MediaPicker_LivePhotoDescription: String { return self._s[2609]! } + public var MediaPicker_LivePhotoDescription: String { return self._s[2610]! } public func Channel_AdminLog_MessageRestrictedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2610]!, self._r[2610]!, [_1]) + return formatWithArgumentRanges(self._s[2611]!, self._r[2611]!, [_1]) } - public var Notification_PaymentSent: String { return self._s[2611]! } - public var PhotoEditor_CurvesGreen: String { return self._s[2612]! } - public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2613]! } - public var AutoNightTheme_System: String { return self._s[2614]! } - public var SaveIncomingPhotosSettings_Title: String { return self._s[2615]! } - public var CreatePoll_QuizTitle: String { return self._s[2616]! } - public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2617]! } - public var VoiceOver_Chat_PagePreview: String { return self._s[2618]! } + public var Notification_PaymentSent: String { return self._s[2612]! } + public var PhotoEditor_CurvesGreen: String { return self._s[2613]! } + public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2614]! } + public var AutoNightTheme_System: String { return self._s[2615]! } + public var SaveIncomingPhotosSettings_Title: String { return self._s[2616]! } + public var CreatePoll_QuizTitle: String { return self._s[2617]! } + public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2618]! } + public var VoiceOver_Chat_PagePreview: String { return self._s[2619]! } public func PUSH_MESSAGE_SCREENSHOT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2621]!, self._r[2621]!, [_1]) - } - public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2622]!, self._r[2622]!, [_1]) } - public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { + public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2623]!, self._r[2623]!, [_1]) } - public var NetworkUsageSettings_CallDataSection: String { return self._s[2625]! } - public var PasscodeSettings_HelpTop: String { return self._s[2626]! } - public var Conversation_WalletRequiredTitle: String { return self._s[2627]! } - public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2628]! } - public var Passport_Address_TypeRentalAgreement: String { return self._s[2629]! } - public var EditTheme_ShortLink: String { return self._s[2630]! } - public var Theme_Colors_ColorWallpaperWarning: String { return self._s[2631]! } - public var ProxyServer_VoiceOver_Active: String { return self._s[2632]! } - public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2633]! } - public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2634]! } - public var Call_Accept: String { return self._s[2636]! } - public var GroupRemoved_RemoveInfo: String { return self._s[2637]! } - public var Month_GenMarch: String { return self._s[2639]! } - public var PhotoEditor_ShadowsTool: String { return self._s[2640]! } - public var LoginPassword_Title: String { return self._s[2641]! } - public var Call_End: String { return self._s[2642]! } - public var Watch_Conversation_GroupInfo: String { return self._s[2643]! } - public var VoiceOver_Chat_Contact: String { return self._s[2644]! } - public var EditTheme_Create_Preview_IncomingText: String { return self._s[2645]! } - public var CallSettings_Always: String { return self._s[2646]! } - public var CallFeedback_Success: String { return self._s[2647]! } - public var TwoStepAuth_SetupHint: String { return self._s[2648]! } + public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2624]!, self._r[2624]!, [_1]) + } + public var NetworkUsageSettings_CallDataSection: String { return self._s[2626]! } + public var PasscodeSettings_HelpTop: String { return self._s[2627]! } + public var Conversation_WalletRequiredTitle: String { return self._s[2628]! } + public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2629]! } + public var Passport_Address_TypeRentalAgreement: String { return self._s[2630]! } + public var EditTheme_ShortLink: String { return self._s[2631]! } + public var Theme_Colors_ColorWallpaperWarning: String { return self._s[2632]! } + public var ProxyServer_VoiceOver_Active: String { return self._s[2633]! } + public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2634]! } + public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2635]! } + public var Call_Accept: String { return self._s[2637]! } + public var GroupRemoved_RemoveInfo: String { return self._s[2638]! } + public var Month_GenMarch: String { return self._s[2640]! } + public var PhotoEditor_ShadowsTool: String { return self._s[2641]! } + public var LoginPassword_Title: String { return self._s[2642]! } + public var Call_End: String { return self._s[2643]! } + public var Watch_Conversation_GroupInfo: String { return self._s[2644]! } + public var VoiceOver_Chat_Contact: String { return self._s[2645]! } + public var EditTheme_Create_Preview_IncomingText: String { return self._s[2646]! } + public var CallSettings_Always: String { return self._s[2647]! } + public var CallFeedback_Success: String { return self._s[2648]! } + public var TwoStepAuth_SetupHint: String { return self._s[2649]! } public func AddContact_ContactWillBeSharedAfterMutual(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2649]!, self._r[2649]!, [_1]) + return formatWithArgumentRanges(self._s[2650]!, self._r[2650]!, [_1]) } - public var ConversationProfile_UsersTooMuchError: String { return self._s[2650]! } - public var Login_PhoneTitle: String { return self._s[2651]! } - public var Passport_FieldPhoneHelp: String { return self._s[2652]! } - public var Weekday_ShortSunday: String { return self._s[2653]! } - public var Passport_InfoFAQ_URL: String { return self._s[2654]! } - public var ContactInfo_Job: String { return self._s[2656]! } - public var UserInfo_InviteBotToGroup: String { return self._s[2657]! } - public var Appearance_ThemeCarouselNightBlue: String { return self._s[2658]! } - public var CreatePoll_QuizTip: String { return self._s[2659]! } - public var TwoFactorSetup_Email_Text: String { return self._s[2660]! } - public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2661]! } - public var Invite_ChannelsTooMuch: String { return self._s[2662]! } - public var Wallet_Send_ConfirmationConfirm: String { return self._s[2663]! } - public var Wallet_TransactionInfo_OtherFeeInfo: String { return self._s[2664]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2665]! } - public var Wallet_Receive_AmountText: String { return self._s[2666]! } - public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2667]! } - public var CallFeedback_ReasonNoise: String { return self._s[2668]! } - public var Appearance_AppIconDefault: String { return self._s[2670]! } - public var Passport_Identity_AddInternalPassport: String { return self._s[2671]! } - public var MediaPicker_AddCaption: String { return self._s[2672]! } - public var CallSettings_TabIconDescription: String { return self._s[2673]! } + public var ConversationProfile_UsersTooMuchError: String { return self._s[2651]! } + public var Login_PhoneTitle: String { return self._s[2652]! } + public var Passport_FieldPhoneHelp: String { return self._s[2653]! } + public var Weekday_ShortSunday: String { return self._s[2654]! } + public var Passport_InfoFAQ_URL: String { return self._s[2655]! } + public var ContactInfo_Job: String { return self._s[2657]! } + public var UserInfo_InviteBotToGroup: String { return self._s[2658]! } + public var Appearance_ThemeCarouselNightBlue: String { return self._s[2659]! } + public var CreatePoll_QuizTip: String { return self._s[2660]! } + public var TwoFactorSetup_Email_Text: String { return self._s[2661]! } + public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2662]! } + public var Invite_ChannelsTooMuch: String { return self._s[2663]! } + public var Wallet_Send_ConfirmationConfirm: String { return self._s[2664]! } + public var Wallet_TransactionInfo_OtherFeeInfo: String { return self._s[2665]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2666]! } + public var Wallet_Receive_AmountText: String { return self._s[2667]! } + public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2668]! } + public var CallFeedback_ReasonNoise: String { return self._s[2669]! } + public var Appearance_AppIconDefault: String { return self._s[2671]! } + public var Passport_Identity_AddInternalPassport: String { return self._s[2672]! } + public var MediaPicker_AddCaption: String { return self._s[2673]! } + public var CallSettings_TabIconDescription: String { return self._s[2674]! } public func VoiceOver_Chat_Caption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2674]!, self._r[2674]!, [_0]) + return formatWithArgumentRanges(self._s[2675]!, self._r[2675]!, [_0]) } - public var IntentsSettings_SuggestedChatsGroups: String { return self._s[2675]! } + public var IntentsSettings_SuggestedChatsGroups: String { return self._s[2676]! } public func Map_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2676]!, self._r[2676]!, [_0]) + return formatWithArgumentRanges(self._s[2677]!, self._r[2677]!, [_0]) } - public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2677]! } - public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2678]! } - public var Passport_Identity_TypePersonalDetails: String { return self._s[2679]! } - public var DialogList_SearchSectionRecent: String { return self._s[2680]! } - public var PrivacyPolicy_DeclineMessage: String { return self._s[2681]! } - public var CreatePoll_Anonymous: String { return self._s[2682]! } - public var LogoutOptions_ClearCacheText: String { return self._s[2685]! } - public var LastSeen_WithinAWeek: String { return self._s[2686]! } - public var ChannelMembers_GroupAdminsTitle: String { return self._s[2687]! } - public var Conversation_CloudStorage_ChatStatus: String { return self._s[2689]! } - public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2690]! } + public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2678]! } + public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2679]! } + public var Passport_Identity_TypePersonalDetails: String { return self._s[2680]! } + public var DialogList_SearchSectionRecent: String { return self._s[2681]! } + public var PrivacyPolicy_DeclineMessage: String { return self._s[2682]! } + public var CreatePoll_Anonymous: String { return self._s[2683]! } + public var LogoutOptions_ClearCacheText: String { return self._s[2686]! } + public var LastSeen_WithinAWeek: String { return self._s[2687]! } + public var ChannelMembers_GroupAdminsTitle: String { return self._s[2688]! } + public var Conversation_CloudStorage_ChatStatus: String { return self._s[2690]! } + public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2691]! } public func AddContact_SharedContactExceptionInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2691]!, self._r[2691]!, [_0]) + return formatWithArgumentRanges(self._s[2692]!, self._r[2692]!, [_0]) } - public var Passport_Address_TypeResidentialAddress: String { return self._s[2692]! } - public var Conversation_StatusLeftGroup: String { return self._s[2693]! } - public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2694]! } - public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2696]! } - public var GroupPermission_AddSuccess: String { return self._s[2697]! } - public var PhotoEditor_BlurToolRadial: String { return self._s[2699]! } - public var Conversation_ContextMenuCopy: String { return self._s[2700]! } - public var AccessDenied_CallMicrophone: String { return self._s[2701]! } + public var Passport_Address_TypeResidentialAddress: String { return self._s[2693]! } + public var Conversation_StatusLeftGroup: String { return self._s[2694]! } + public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2695]! } + public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2697]! } + public var GroupPermission_AddSuccess: String { return self._s[2698]! } + public var PhotoEditor_BlurToolRadial: String { return self._s[2700]! } + public var Conversation_ContextMenuCopy: String { return self._s[2701]! } + public var AccessDenied_CallMicrophone: String { return self._s[2702]! } public func Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2702]!, self._r[2702]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2703]!, self._r[2703]!, [_1, _2, _3]) } - public var Login_InvalidFirstNameError: String { return self._s[2703]! } - public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2704]! } - public var Checkout_PaymentMethod_New: String { return self._s[2705]! } - public var ShareMenu_CopyShareLinkGame: String { return self._s[2706]! } - public var PhotoEditor_QualityTool: String { return self._s[2707]! } - public var Login_SendCodeViaSms: String { return self._s[2708]! } - public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2709]! } - public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2710]! } - public var Wallet_Receive_CopyAddress: String { return self._s[2711]! } - public var Login_EmailNotConfiguredError: String { return self._s[2712]! } - public var SocksProxySetup_Status: String { return self._s[2713]! } - public var Conversation_ScheduleMessage_SendWhenOnline: String { return self._s[2714]! } - public var PrivacyPolicy_Accept: String { return self._s[2715]! } - public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2716]! } - public var Appearance_AppIconClassicX: String { return self._s[2717]! } + public var Login_InvalidFirstNameError: String { return self._s[2704]! } + public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2705]! } + public var Checkout_PaymentMethod_New: String { return self._s[2706]! } + public var ShareMenu_CopyShareLinkGame: String { return self._s[2707]! } + public var PhotoEditor_QualityTool: String { return self._s[2708]! } + public var Login_SendCodeViaSms: String { return self._s[2709]! } + public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2710]! } + public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2711]! } + public var Wallet_Receive_CopyAddress: String { return self._s[2712]! } + public var Login_EmailNotConfiguredError: String { return self._s[2713]! } + public var SocksProxySetup_Status: String { return self._s[2714]! } + public var Conversation_ScheduleMessage_SendWhenOnline: String { return self._s[2715]! } + public var PrivacyPolicy_Accept: String { return self._s[2716]! } + public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2717]! } + public var Appearance_AppIconClassicX: String { return self._s[2718]! } public func PUSH_CHAT_MESSAGE_TEXT(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2718]!, self._r[2718]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2719]!, self._r[2719]!, [_1, _2, _3]) } - public var OwnershipTransfer_SecurityRequirements: String { return self._s[2719]! } - public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2721]! } - public var AutoNightTheme_Automatic: String { return self._s[2722]! } - public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2723]! } - public var Privacy_ContactsSyncHelp: String { return self._s[2724]! } - public var Cache_Help: String { return self._s[2725]! } - public var Group_ErrorAccessDenied: String { return self._s[2726]! } - public var Passport_Language_fa: String { return self._s[2727]! } - public var Wallet_Intro_Text: String { return self._s[2728]! } - public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2729]! } - public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2730]! } - public var PrivacySettings_LastSeen: String { return self._s[2731]! } + public var OwnershipTransfer_SecurityRequirements: String { return self._s[2720]! } + public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2722]! } + public var AutoNightTheme_Automatic: String { return self._s[2723]! } + public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2724]! } + public var Privacy_ContactsSyncHelp: String { return self._s[2725]! } + public var Cache_Help: String { return self._s[2726]! } + public var Group_ErrorAccessDenied: String { return self._s[2727]! } + public var Passport_Language_fa: String { return self._s[2728]! } + public var Wallet_Intro_Text: String { return self._s[2729]! } + public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2730]! } + public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2731]! } + public var PrivacySettings_LastSeen: String { return self._s[2732]! } public func DialogList_MultipleTyping(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2732]!, self._r[2732]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2733]!, self._r[2733]!, [_0, _1]) } - public var Wallet_Configuration_Apply: String { return self._s[2736]! } - public var Preview_SaveGif: String { return self._s[2737]! } - public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2738]! } - public var Profile_About: String { return self._s[2739]! } - public var Channel_About_Placeholder: String { return self._s[2740]! } - public var Login_InfoTitle: String { return self._s[2741]! } + public var Wallet_Configuration_Apply: String { return self._s[2737]! } + public var Preview_SaveGif: String { return self._s[2738]! } + public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2739]! } + public var Profile_About: String { return self._s[2740]! } + public var Channel_About_Placeholder: String { return self._s[2741]! } + public var Login_InfoTitle: String { return self._s[2742]! } public func TwoStepAuth_SetupPendingEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2742]!, self._r[2742]!, [_0]) + return formatWithArgumentRanges(self._s[2743]!, self._r[2743]!, [_0]) } - public var EditTheme_Expand_Preview_IncomingReplyText: String { return self._s[2743]! } - public var Watch_Suggestion_CantTalk: String { return self._s[2745]! } - public var ContactInfo_Title: String { return self._s[2746]! } - public var Media_ShareThisVideo: String { return self._s[2747]! } - public var Weekday_ShortFriday: String { return self._s[2748]! } - public var AccessDenied_Contacts: String { return self._s[2750]! } - public var Notification_CallIncomingShort: String { return self._s[2751]! } - public var Group_Setup_TypePublic: String { return self._s[2752]! } - public var Notifications_MessageNotificationsExceptions: String { return self._s[2753]! } - public var Notifications_Badge_IncludeChannels: String { return self._s[2754]! } - public var Notifications_MessageNotificationsPreview: String { return self._s[2757]! } - public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2758]! } - public var Group_ErrorAddTooMuchBots: String { return self._s[2759]! } - public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2760]! } - public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2761]! } + public var EditTheme_Expand_Preview_IncomingReplyText: String { return self._s[2744]! } + public var Watch_Suggestion_CantTalk: String { return self._s[2746]! } + public var ContactInfo_Title: String { return self._s[2747]! } + public var Media_ShareThisVideo: String { return self._s[2748]! } + public var Weekday_ShortFriday: String { return self._s[2749]! } + public var AccessDenied_Contacts: String { return self._s[2751]! } + public var Notification_CallIncomingShort: String { return self._s[2752]! } + public var Group_Setup_TypePublic: String { return self._s[2753]! } + public var Notifications_MessageNotificationsExceptions: String { return self._s[2754]! } + public var Notifications_Badge_IncludeChannels: String { return self._s[2755]! } + public var Notifications_MessageNotificationsPreview: String { return self._s[2758]! } + public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2759]! } + public var Group_ErrorAddTooMuchBots: String { return self._s[2760]! } + public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2761]! } + public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2762]! } public func Wallet_SecureStorageChanged_BiometryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2762]!, self._r[2762]!, [_0]) + return formatWithArgumentRanges(self._s[2763]!, self._r[2763]!, [_0]) } - public var DialogList_Typing: String { return self._s[2763]! } - public var CallFeedback_IncludeLogs: String { return self._s[2765]! } - public var Checkout_Phone: String { return self._s[2767]! } - public var Login_InfoFirstNamePlaceholder: String { return self._s[2770]! } - public var Privacy_Calls_Integration: String { return self._s[2771]! } - public var Notifications_PermissionsAllow: String { return self._s[2772]! } - public var TwoStepAuth_AddHintDescription: String { return self._s[2776]! } - public var Settings_ChatSettings: String { return self._s[2777]! } - public var Conversation_SendingOptionsTooltip: String { return self._s[2778]! } + public var DialogList_Typing: String { return self._s[2764]! } + public var CallFeedback_IncludeLogs: String { return self._s[2766]! } + public var Checkout_Phone: String { return self._s[2768]! } + public var Login_InfoFirstNamePlaceholder: String { return self._s[2771]! } + public var Privacy_Calls_Integration: String { return self._s[2772]! } + public var Notifications_PermissionsAllow: String { return self._s[2773]! } + public var TwoStepAuth_AddHintDescription: String { return self._s[2777]! } + public var Settings_ChatSettings: String { return self._s[2778]! } + public var Conversation_SendingOptionsTooltip: String { return self._s[2779]! } public func UserInfo_StartSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2780]!, self._r[2780]!, [_0]) + return formatWithArgumentRanges(self._s[2781]!, self._r[2781]!, [_0]) } public func Channel_AdminLog_MessageInvitedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2781]!, self._r[2781]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2782]!, self._r[2782]!, [_1, _2]) } - public var GroupRemoved_DeleteUser: String { return self._s[2783]! } + public var GroupRemoved_DeleteUser: String { return self._s[2784]! } public func Channel_AdminLog_PollStopped(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2784]!, self._r[2784]!, [_0]) + return formatWithArgumentRanges(self._s[2785]!, self._r[2785]!, [_0]) } public func PUSH_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2785]!, self._r[2785]!, [_1]) + return formatWithArgumentRanges(self._s[2786]!, self._r[2786]!, [_1]) } - public var Login_ContinueWithLocalization: String { return self._s[2786]! } - public var Watch_Message_ForwardedFrom: String { return self._s[2787]! } - public var TwoStepAuth_EnterEmailCode: String { return self._s[2789]! } - public var Conversation_Unblock: String { return self._s[2790]! } - public var PrivacySettings_DataSettings: String { return self._s[2791]! } - public var WallpaperPreview_PatternPaternApply: String { return self._s[2792]! } - public var Group_PublicLink_Info: String { return self._s[2793]! } + public var Login_ContinueWithLocalization: String { return self._s[2787]! } + public var Watch_Message_ForwardedFrom: String { return self._s[2788]! } + public var TwoStepAuth_EnterEmailCode: String { return self._s[2790]! } + public var Conversation_Unblock: String { return self._s[2791]! } + public var PrivacySettings_DataSettings: String { return self._s[2792]! } + public var WallpaperPreview_PatternPaternApply: String { return self._s[2793]! } + public var Group_PublicLink_Info: String { return self._s[2794]! } public func Wallet_Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2794]!, self._r[2794]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2795]!, self._r[2795]!, [_1, _2, _3]) } - public var Notifications_InAppNotificationsVibrate: String { return self._s[2795]! } + public var Notifications_InAppNotificationsVibrate: String { return self._s[2796]! } public func Privacy_GroupsAndChannels_InviteToChannelError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2796]!, self._r[2796]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2797]!, self._r[2797]!, [_0, _1]) } - public var OldChannels_ChannelsHeader: String { return self._s[2798]! } - public var Wallet_RestoreFailed_CreateWallet: String { return self._s[2799]! } - public var PrivacySettings_Passcode: String { return self._s[2801]! } - public var Call_Mute: String { return self._s[2802]! } - public var Wallet_Weekday_Yesterday: String { return self._s[2803]! } - public var Passport_Language_dz: String { return self._s[2804]! } - public var Wallet_Receive_AmountHeader: String { return self._s[2805]! } - public var Wallet_TransactionInfo_OtherFeeInfoUrl: String { return self._s[2806]! } - public var Passport_Language_tk: String { return self._s[2807]! } + public var OldChannels_ChannelsHeader: String { return self._s[2799]! } + public var Wallet_RestoreFailed_CreateWallet: String { return self._s[2800]! } + public var PrivacySettings_Passcode: String { return self._s[2802]! } + public var Call_Mute: String { return self._s[2803]! } + public var Wallet_Weekday_Yesterday: String { return self._s[2804]! } + public var Passport_Language_dz: String { return self._s[2805]! } + public var Wallet_Receive_AmountHeader: String { return self._s[2806]! } + public var Wallet_TransactionInfo_OtherFeeInfoUrl: String { return self._s[2807]! } + public var Passport_Language_tk: String { return self._s[2808]! } public func Login_EmailCodeSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2808]!, self._r[2808]!, [_0]) + return formatWithArgumentRanges(self._s[2809]!, self._r[2809]!, [_0]) } - public var Settings_Search: String { return self._s[2809]! } - public var Wallet_Month_ShortFebruary: String { return self._s[2810]! } - public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2811]! } - public var Wallet_Configuration_SourceJSON: String { return self._s[2812]! } - public var Conversation_ContextMenuReply: String { return self._s[2813]! } - public var WallpaperSearch_ColorBrown: String { return self._s[2814]! } - public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2815]! } - public var Tour_Title1: String { return self._s[2816]! } - public var Wallet_Alert_Cancel: String { return self._s[2817]! } - public var Conversation_ClearGroupHistory: String { return self._s[2819]! } - public var Wallet_TransactionInfo_RecipientHeader: String { return self._s[2820]! } - public var WallpaperPreview_Motion: String { return self._s[2821]! } + public var Settings_Search: String { return self._s[2810]! } + public var Wallet_Month_ShortFebruary: String { return self._s[2811]! } + public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2812]! } + public var Wallet_Configuration_SourceJSON: String { return self._s[2813]! } + public var Conversation_ContextMenuReply: String { return self._s[2814]! } + public var WallpaperSearch_ColorBrown: String { return self._s[2815]! } + public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2816]! } + public var Tour_Title1: String { return self._s[2817]! } + public var Wallet_Alert_Cancel: String { return self._s[2818]! } + public var Conversation_ClearGroupHistory: String { return self._s[2820]! } + public var Wallet_TransactionInfo_RecipientHeader: String { return self._s[2821]! } + public var WallpaperPreview_Motion: String { return self._s[2822]! } public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2822]!, self._r[2822]!, [_0]) + return formatWithArgumentRanges(self._s[2823]!, self._r[2823]!, [_0]) } - public var Wallet_Configuration_ApplyErrorTextJSONInvalidData: String { return self._s[2823]! } - public var Call_RateCall: String { return self._s[2824]! } - public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2825]! } - public var Passport_PasswordCompleteSetup: String { return self._s[2826]! } - public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2827]! } - public var UserInfo_LastNamePlaceholder: String { return self._s[2829]! } + public var Wallet_Configuration_ApplyErrorTextJSONInvalidData: String { return self._s[2824]! } + public var Call_RateCall: String { return self._s[2825]! } + public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2826]! } + public var Passport_PasswordCompleteSetup: String { return self._s[2827]! } + public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2828]! } + public var UserInfo_LastNamePlaceholder: String { return self._s[2830]! } public func Login_WillCallYou(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2831]!, self._r[2831]!, [_0]) + return formatWithArgumentRanges(self._s[2832]!, self._r[2832]!, [_0]) } - public var Compose_Create: String { return self._s[2832]! } - public var Contacts_InviteToTelegram: String { return self._s[2833]! } - public var GroupInfo_Notifications: String { return self._s[2834]! } - public var ChatList_DeleteSavedMessagesConfirmationAction: String { return self._s[2836]! } - public var Message_PinnedLiveLocationMessage: String { return self._s[2837]! } - public var Month_GenApril: String { return self._s[2838]! } - public var Appearance_AutoNightTheme: String { return self._s[2839]! } - public var ChatSettings_AutomaticAudioDownload: String { return self._s[2841]! } - public var Login_CodeSentSms: String { return self._s[2843]! } + public var Compose_Create: String { return self._s[2833]! } + public var Contacts_InviteToTelegram: String { return self._s[2834]! } + public var GroupInfo_Notifications: String { return self._s[2835]! } + public var ChatList_DeleteSavedMessagesConfirmationAction: String { return self._s[2837]! } + public var Message_PinnedLiveLocationMessage: String { return self._s[2838]! } + public var Month_GenApril: String { return self._s[2839]! } + public var Appearance_AutoNightTheme: String { return self._s[2840]! } + public var ChatSettings_AutomaticAudioDownload: String { return self._s[2842]! } + public var Login_CodeSentSms: String { return self._s[2844]! } public func UserInfo_UnblockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2844]!, self._r[2844]!, [_0]) + return formatWithArgumentRanges(self._s[2845]!, self._r[2845]!, [_0]) } - public var EmptyGroupInfo_Line3: String { return self._s[2845]! } - public var LogoutOptions_ContactSupportText: String { return self._s[2846]! } - public var Passport_Language_hr: String { return self._s[2847]! } - public var Common_ActionNotAllowedError: String { return self._s[2848]! } + public var EmptyGroupInfo_Line3: String { return self._s[2846]! } + public var LogoutOptions_ContactSupportText: String { return self._s[2847]! } + public var Passport_Language_hr: String { return self._s[2848]! } + public var Common_ActionNotAllowedError: String { return self._s[2849]! } public func Channel_AdminLog_MessageRestrictedNewSetting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2849]!, self._r[2849]!, [_0]) + return formatWithArgumentRanges(self._s[2850]!, self._r[2850]!, [_0]) } - public var GroupInfo_InviteLink_CopyLink: String { return self._s[2850]! } - public var Wallet_Info_TransactionFrom: String { return self._s[2851]! } - public var Wallet_Send_ErrorDecryptionFailed: String { return self._s[2852]! } - public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2853]! } - public var Privacy_SecretChatsTitle: String { return self._s[2854]! } - public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2856]! } - public var GroupInfo_AddUserLeftError: String { return self._s[2857]! } - public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2858]! } - public var LogoutOptions_ContactSupportTitle: String { return self._s[2859]! } - public var Appearance_ThemePreview_Chat_7_Text: String { return self._s[2860]! } - public var Channel_AddBotErrorHaveRights: String { return self._s[2861]! } - public var Preview_DeleteGif: String { return self._s[2862]! } - public var GroupInfo_Permissions_Exceptions: String { return self._s[2863]! } - public var Group_ErrorNotMutualContact: String { return self._s[2864]! } - public var Notification_MessageLifetime5s: String { return self._s[2865]! } - public var Wallet_Send_OwnAddressAlertText: String { return self._s[2866]! } - public var OldChannels_ChannelFormat: String { return self._s[2867]! } + public var GroupInfo_InviteLink_CopyLink: String { return self._s[2851]! } + public var Wallet_Info_TransactionFrom: String { return self._s[2852]! } + public var Wallet_Send_ErrorDecryptionFailed: String { return self._s[2853]! } + public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2854]! } + public var Privacy_SecretChatsTitle: String { return self._s[2855]! } + public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2857]! } + public var GroupInfo_AddUserLeftError: String { return self._s[2858]! } + public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2859]! } + public var LogoutOptions_ContactSupportTitle: String { return self._s[2860]! } + public var Appearance_ThemePreview_Chat_7_Text: String { return self._s[2861]! } + public var Channel_AddBotErrorHaveRights: String { return self._s[2862]! } + public var Preview_DeleteGif: String { return self._s[2863]! } + public var GroupInfo_Permissions_Exceptions: String { return self._s[2864]! } + public var Group_ErrorNotMutualContact: String { return self._s[2865]! } + public var Notification_MessageLifetime5s: String { return self._s[2866]! } + public var Wallet_Send_OwnAddressAlertText: String { return self._s[2867]! } + public var OldChannels_ChannelFormat: String { return self._s[2868]! } public func Watch_LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2868]!, self._r[2868]!, [_0]) + return formatWithArgumentRanges(self._s[2869]!, self._r[2869]!, [_0]) } - public var VoiceOver_Chat_Video: String { return self._s[2869]! } - public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2871]! } - public var ReportSpam_DeleteThisChat: String { return self._s[2872]! } - public var Passport_Address_AddBankStatement: String { return self._s[2873]! } - public var Notification_CallIncoming: String { return self._s[2874]! } - public var Wallet_Words_NotDoneTitle: String { return self._s[2875]! } - public var Compose_NewGroupTitle: String { return self._s[2876]! } - public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2878]! } - public var Passport_Address_Postcode: String { return self._s[2880]! } + public var VoiceOver_Chat_Video: String { return self._s[2870]! } + public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2872]! } + public var ReportSpam_DeleteThisChat: String { return self._s[2873]! } + public var Passport_Address_AddBankStatement: String { return self._s[2874]! } + public var Notification_CallIncoming: String { return self._s[2875]! } + public var Wallet_Words_NotDoneTitle: String { return self._s[2876]! } + public var Compose_NewGroupTitle: String { return self._s[2877]! } + public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2879]! } + public var Passport_Address_Postcode: String { return self._s[2881]! } public func LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2881]!, self._r[2881]!, [_0]) + return formatWithArgumentRanges(self._s[2882]!, self._r[2882]!, [_0]) } - public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2882]! } - public var Wallet_Month_ShortOctober: String { return self._s[2883]! } - public var VoiceOver_Chat_YourMusic: String { return self._s[2884]! } - public var WallpaperColors_Title: String { return self._s[2885]! } - public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2886]! } - public var VoiceOver_MessageContextForward: String { return self._s[2887]! } - public var GroupPermission_Duration: String { return self._s[2888]! } + public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2883]! } + public var Wallet_Month_ShortOctober: String { return self._s[2884]! } + public var VoiceOver_Chat_YourMusic: String { return self._s[2885]! } + public var WallpaperColors_Title: String { return self._s[2886]! } + public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2887]! } + public var VoiceOver_MessageContextForward: String { return self._s[2888]! } + public var GroupPermission_Duration: String { return self._s[2889]! } public func Cache_Clear(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2889]!, self._r[2889]!, [_0]) + return formatWithArgumentRanges(self._s[2890]!, self._r[2890]!, [_0]) } - public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2890]! } - public var Username_Placeholder: String { return self._s[2891]! } - public var CallFeedback_WhatWentWrong: String { return self._s[2892]! } - public var Passport_FieldAddressUploadHelp: String { return self._s[2893]! } - public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2894]! } + public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2891]! } + public var Username_Placeholder: String { return self._s[2892]! } + public var CallFeedback_WhatWentWrong: String { return self._s[2893]! } + public var Passport_FieldAddressUploadHelp: String { return self._s[2894]! } + public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2895]! } public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2896]!, self._r[2896]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2897]!, self._r[2897]!, [_1, _2]) } - public var Passport_PasswordDescription: String { return self._s[2897]! } - public var Channel_MessagePhotoUpdated: String { return self._s[2898]! } - public var MediaPicker_TapToUngroupDescription: String { return self._s[2899]! } - public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2900]! } - public var AttachmentMenu_PhotoOrVideo: String { return self._s[2901]! } - public var Conversation_ContextMenuMore: String { return self._s[2902]! } - public var Privacy_PaymentsClearInfo: String { return self._s[2903]! } - public var CallSettings_TabIcon: String { return self._s[2904]! } - public var KeyCommand_Find: String { return self._s[2905]! } - public var ClearCache_FreeSpaceDescription: String { return self._s[2906]! } - public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2907]! } - public var EditTheme_Edit_Preview_IncomingText: String { return self._s[2908]! } - public var Message_PinnedGame: String { return self._s[2909]! } - public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2910]! } - public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2912]! } - public var Login_CallRequestState2: String { return self._s[2914]! } - public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2916]! } + public var Passport_PasswordDescription: String { return self._s[2898]! } + public var Channel_MessagePhotoUpdated: String { return self._s[2899]! } + public var MediaPicker_TapToUngroupDescription: String { return self._s[2900]! } + public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2901]! } + public var AttachmentMenu_PhotoOrVideo: String { return self._s[2902]! } + public var Conversation_ContextMenuMore: String { return self._s[2903]! } + public var Privacy_PaymentsClearInfo: String { return self._s[2904]! } + public var CallSettings_TabIcon: String { return self._s[2905]! } + public var KeyCommand_Find: String { return self._s[2906]! } + public var ClearCache_FreeSpaceDescription: String { return self._s[2907]! } + public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2908]! } + public var EditTheme_Edit_Preview_IncomingText: String { return self._s[2909]! } + public var Message_PinnedGame: String { return self._s[2910]! } + public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2911]! } + public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2913]! } + public var Login_CallRequestState2: String { return self._s[2915]! } + public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2917]! } public func VoiceOver_Chat_PhotoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2917]!, self._r[2917]!, [_0]) + return formatWithArgumentRanges(self._s[2918]!, self._r[2918]!, [_0]) } public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2919]!, self._r[2919]!, [_0]) + return formatWithArgumentRanges(self._s[2920]!, self._r[2920]!, [_0]) } - public var AuthSessions_AddDevice: String { return self._s[2920]! } - public var WallpaperPreview_Blurred: String { return self._s[2921]! } - public var Conversation_InstantPagePreview: String { return self._s[2922]! } + public var AuthSessions_AddDevice: String { return self._s[2921]! } + public var WallpaperPreview_Blurred: String { return self._s[2922]! } + public var Conversation_InstantPagePreview: String { return self._s[2923]! } public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2923]!, self._r[2923]!, [_0]) + return formatWithArgumentRanges(self._s[2924]!, self._r[2924]!, [_0]) } - public var SecretTimer_VideoDescription: String { return self._s[2926]! } - public var WallpaperSearch_ColorRed: String { return self._s[2927]! } - public var GroupPermission_NoPinMessages: String { return self._s[2928]! } - public var Passport_Language_es: String { return self._s[2929]! } - public var Permissions_ContactsAllow_v0: String { return self._s[2931]! } - public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2932]! } + public var SecretTimer_VideoDescription: String { return self._s[2927]! } + public var WallpaperSearch_ColorRed: String { return self._s[2928]! } + public var GroupPermission_NoPinMessages: String { return self._s[2929]! } + public var Passport_Language_es: String { return self._s[2930]! } + public var Permissions_ContactsAllow_v0: String { return self._s[2932]! } + public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2933]! } public func PUSH_CHAT_MESSAGE_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2933]!, self._r[2933]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2934]!, self._r[2934]!, [_1, _2]) } - public var Privacy_Forwards_CustomHelp: String { return self._s[2934]! } - public var WebPreview_GettingLinkInfo: String { return self._s[2935]! } - public var Watch_UserInfo_Unmute: String { return self._s[2936]! } - public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2937]! } - public var AccessDenied_CameraRestricted: String { return self._s[2939]! } + public var Privacy_Forwards_CustomHelp: String { return self._s[2935]! } + public var WebPreview_GettingLinkInfo: String { return self._s[2936]! } + public var Watch_UserInfo_Unmute: String { return self._s[2937]! } + public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2938]! } + public var AccessDenied_CameraRestricted: String { return self._s[2940]! } public func Conversation_Kilobytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2940]!, self._r[2940]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[2941]!, self._r[2941]!, ["\(_0)"]) } - public var ChatList_ReadAll: String { return self._s[2942]! } - public var Settings_CopyUsername: String { return self._s[2943]! } - public var Contacts_SearchLabel: String { return self._s[2944]! } - public var Map_OpenInYandexNavigator: String { return self._s[2946]! } - public var PasscodeSettings_EncryptData: String { return self._s[2947]! } - public var Settings_Wallet: String { return self._s[2948]! } - public var Group_ErrorSupergroupConversionNotPossible: String { return self._s[2949]! } - public var WallpaperSearch_ColorPrefix: String { return self._s[2950]! } - public var Notifications_GroupNotificationsPreview: String { return self._s[2951]! } - public var DialogList_AdNoticeAlert: String { return self._s[2952]! } - public var Wallet_Month_GenMay: String { return self._s[2954]! } - public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2955]! } - public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2956]! } - public var Localization_LanguageCustom: String { return self._s[2957]! } - public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2958]! } - public var CallFeedback_Title: String { return self._s[2959]! } - public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2962]! } - public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2963]! } - public var Wallet_Intro_CreateErrorTitle: String { return self._s[2964]! } - public var Conversation_InfoGroup: String { return self._s[2965]! } - public var Compose_NewMessage: String { return self._s[2966]! } - public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2967]! } - public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2968]! } - public var Wallet_SecureStorageReset_BiometryFaceId: String { return self._s[2969]! } - public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2970]! } + public var ChatList_ReadAll: String { return self._s[2943]! } + public var Settings_CopyUsername: String { return self._s[2944]! } + public var Contacts_SearchLabel: String { return self._s[2945]! } + public var Map_OpenInYandexNavigator: String { return self._s[2947]! } + public var PasscodeSettings_EncryptData: String { return self._s[2948]! } + public var Settings_Wallet: String { return self._s[2949]! } + public var Group_ErrorSupergroupConversionNotPossible: String { return self._s[2950]! } + public var WallpaperSearch_ColorPrefix: String { return self._s[2951]! } + public var Notifications_GroupNotificationsPreview: String { return self._s[2952]! } + public var DialogList_AdNoticeAlert: String { return self._s[2953]! } + public var Wallet_Month_GenMay: String { return self._s[2955]! } + public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2956]! } + public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2957]! } + public var Localization_LanguageCustom: String { return self._s[2958]! } + public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2959]! } + public var CallFeedback_Title: String { return self._s[2960]! } + public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2963]! } + public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2964]! } + public var Wallet_Intro_CreateErrorTitle: String { return self._s[2965]! } + public var Conversation_InfoGroup: String { return self._s[2966]! } + public var Compose_NewMessage: String { return self._s[2967]! } + public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2968]! } + public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2969]! } + public var Wallet_SecureStorageReset_BiometryFaceId: String { return self._s[2970]! } + public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2971]! } public func Passport_Scans_ScanIndex(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2971]!, self._r[2971]!, [_0]) + return formatWithArgumentRanges(self._s[2972]!, self._r[2972]!, [_0]) } - public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2972]! } - public var Login_CancelSignUpConfirmation: String { return self._s[2973]! } - public var ChangePhoneNumberCode_Help: String { return self._s[2974]! } - public var PrivacySettings_DeleteAccountHelp: String { return self._s[2975]! } - public var Channel_BlackList_Title: String { return self._s[2976]! } - public var UserInfo_PhoneCall: String { return self._s[2977]! } - public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2979]! } - public var Wallet_Month_ShortJanuary: String { return self._s[2980]! } - public var State_connecting: String { return self._s[2981]! } - public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2982]! } - public var Wallet_Month_GenMarch: String { return self._s[2983]! } - public var EditTheme_Expand_BottomInfo: String { return self._s[2984]! } - public var AuthSessions_AddedDeviceTerminate: String { return self._s[2985]! } + public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2973]! } + public var Login_CancelSignUpConfirmation: String { return self._s[2974]! } + public var ChangePhoneNumberCode_Help: String { return self._s[2975]! } + public var PrivacySettings_DeleteAccountHelp: String { return self._s[2976]! } + public var Channel_BlackList_Title: String { return self._s[2977]! } + public var UserInfo_PhoneCall: String { return self._s[2978]! } + public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2980]! } + public var Wallet_Month_ShortJanuary: String { return self._s[2981]! } + public var State_connecting: String { return self._s[2982]! } + public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2983]! } + public var Wallet_Month_GenMarch: String { return self._s[2984]! } + public var EditTheme_Expand_BottomInfo: String { return self._s[2985]! } + public var AuthSessions_AddedDeviceTerminate: String { return self._s[2986]! } public func LastSeen_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2986]!, self._r[2986]!, [_0]) - } - public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2987]!, self._r[2987]!, [_0]) } - public var Notifications_GroupNotifications: String { return self._s[2988]! } - public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[2989]! } - public var Passport_Identity_EditPassport: String { return self._s[2990]! } - public var EnterPasscode_RepeatNewPasscode: String { return self._s[2992]! } - public var Localization_EnglishLanguageName: String { return self._s[2993]! } - public var Share_AuthDescription: String { return self._s[2994]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2995]! } - public var Passport_Identity_Surname: String { return self._s[2996]! } - public var Compose_TokenListPlaceholder: String { return self._s[2997]! } - public var Wallet_AccessDenied_Camera: String { return self._s[2998]! } - public var Passport_Identity_OneOfTypePassport: String { return self._s[2999]! } - public var Settings_AboutEmpty: String { return self._s[3000]! } - public var Conversation_Unmute: String { return self._s[3001]! } - public var CreateGroup_ChannelsTooMuch: String { return self._s[3003]! } - public var Wallet_Sending_Text: String { return self._s[3004]! } - public func PUSH_CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3005]!, self._r[3005]!, [_1]) + public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2988]!, self._r[2988]!, [_0]) } - public var Login_CodeSentCall: String { return self._s[3006]! } - public var ContactInfo_PhoneLabelHomeFax: String { return self._s[3008]! } - public var ChatSettings_Appearance: String { return self._s[3009]! } - public var ClearCache_StorageUsage: String { return self._s[3010]! } - public var Appearance_PickAccentColor: String { return self._s[3011]! } + public var Notifications_GroupNotifications: String { return self._s[2989]! } + public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[2990]! } + public var Passport_Identity_EditPassport: String { return self._s[2991]! } + public var EnterPasscode_RepeatNewPasscode: String { return self._s[2993]! } + public var Localization_EnglishLanguageName: String { return self._s[2994]! } + public var Share_AuthDescription: String { return self._s[2995]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2996]! } + public var Passport_Identity_Surname: String { return self._s[2997]! } + public var Compose_TokenListPlaceholder: String { return self._s[2998]! } + public var Wallet_AccessDenied_Camera: String { return self._s[2999]! } + public var Passport_Identity_OneOfTypePassport: String { return self._s[3000]! } + public var Settings_AboutEmpty: String { return self._s[3001]! } + public var Conversation_Unmute: String { return self._s[3002]! } + public var CreateGroup_ChannelsTooMuch: String { return self._s[3004]! } + public var Wallet_Sending_Text: String { return self._s[3005]! } + public func PUSH_CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3006]!, self._r[3006]!, [_1]) + } + public var Login_CodeSentCall: String { return self._s[3007]! } + public var ContactInfo_PhoneLabelHomeFax: String { return self._s[3009]! } + public var ChatSettings_Appearance: String { return self._s[3010]! } + public var ClearCache_StorageUsage: String { return self._s[3011]! } + public var Appearance_PickAccentColor: String { return self._s[3012]! } public func PUSH_CHAT_MESSAGE_NOTEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3012]!, self._r[3012]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3013]!, self._r[3013]!, [_1, _2]) } public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3013]!, self._r[3013]!, [_1]) + return formatWithArgumentRanges(self._s[3014]!, self._r[3014]!, [_1]) } - public var Notification_CallMissed: String { return self._s[3014]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[3015]! } - public var Channel_AdminLogFilter_EventsInfo: String { return self._s[3016]! } - public var Wallet_Month_GenOctober: String { return self._s[3018]! } - public var ChatAdmins_AdminLabel: String { return self._s[3019]! } - public var KeyCommand_JumpToNextChat: String { return self._s[3020]! } - public var Conversation_StopPollConfirmationTitle: String { return self._s[3022]! } - public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[3023]! } - public var Month_GenJune: String { return self._s[3024]! } - public var IntentsSettings_MainAccountInfo: String { return self._s[3025]! } - public var Watch_Location_Current: String { return self._s[3026]! } - public var Wallet_Receive_CopyInvoiceUrl: String { return self._s[3027]! } - public var Conversation_TitleMute: String { return self._s[3028]! } - public var Map_PlacesInThisArea: String { return self._s[3029]! } + public var Notification_CallMissed: String { return self._s[3015]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[3016]! } + public var Channel_AdminLogFilter_EventsInfo: String { return self._s[3017]! } + public var Wallet_Month_GenOctober: String { return self._s[3019]! } + public var ChatAdmins_AdminLabel: String { return self._s[3020]! } + public var KeyCommand_JumpToNextChat: String { return self._s[3021]! } + public var Conversation_StopPollConfirmationTitle: String { return self._s[3023]! } + public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[3024]! } + public var Month_GenJune: String { return self._s[3025]! } + public var IntentsSettings_MainAccountInfo: String { return self._s[3026]! } + public var Watch_Location_Current: String { return self._s[3027]! } + public var Wallet_Receive_CopyInvoiceUrl: String { return self._s[3028]! } + public var Conversation_TitleMute: String { return self._s[3029]! } + public var Map_PlacesInThisArea: String { return self._s[3030]! } public func PUSH_CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3030]!, self._r[3030]!, [_1]) + return formatWithArgumentRanges(self._s[3031]!, self._r[3031]!, [_1]) } - public var GroupInfo_DeleteAndExit: String { return self._s[3031]! } + public var GroupInfo_DeleteAndExit: String { return self._s[3032]! } public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3032]!, self._r[3032]!, [_0]) + return formatWithArgumentRanges(self._s[3033]!, self._r[3033]!, [_0]) } - public var Call_ReportPlaceholder: String { return self._s[3033]! } - public var Chat_SlowmodeSendError: String { return self._s[3034]! } - public var MaskStickerSettings_Info: String { return self._s[3035]! } - public var EditTheme_Expand_TopInfo: String { return self._s[3036]! } + public var Call_ReportPlaceholder: String { return self._s[3034]! } + public var Chat_SlowmodeSendError: String { return self._s[3035]! } + public var MaskStickerSettings_Info: String { return self._s[3036]! } + public var EditTheme_Expand_TopInfo: String { return self._s[3037]! } public func GroupInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3037]!, self._r[3037]!, [_0]) + return formatWithArgumentRanges(self._s[3038]!, self._r[3038]!, [_0]) } - public var Checkout_NewCard_PostcodeTitle: String { return self._s[3038]! } - public var Passport_Address_RegionPlaceholder: String { return self._s[3040]! } - public var Contacts_ShareTelegram: String { return self._s[3041]! } - public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[3042]! } - public var Map_AddressOnMap: String { return self._s[3043]! } - public var Channel_ErrorAccessDenied: String { return self._s[3044]! } - public var UserInfo_ScamBotWarning: String { return self._s[3046]! } - public var Stickers_GroupChooseStickerPack: String { return self._s[3047]! } - public var Call_ConnectionErrorTitle: String { return self._s[3048]! } - public var UserInfo_NotificationsEnable: String { return self._s[3049]! } - public var ArchivedChats_IntroText1: String { return self._s[3050]! } - public var Tour_Text4: String { return self._s[3053]! } - public var WallpaperSearch_Recent: String { return self._s[3054]! } - public var GroupInfo_ScamGroupWarning: String { return self._s[3055]! } - public var Profile_MessageLifetime2s: String { return self._s[3057]! } - public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[3058]! } - public var Notification_MessageLifetime2s: String { return self._s[3059]! } + public var Checkout_NewCard_PostcodeTitle: String { return self._s[3039]! } + public var Passport_Address_RegionPlaceholder: String { return self._s[3041]! } + public var Contacts_ShareTelegram: String { return self._s[3042]! } + public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[3043]! } + public var Map_AddressOnMap: String { return self._s[3044]! } + public var Channel_ErrorAccessDenied: String { return self._s[3045]! } + public var UserInfo_ScamBotWarning: String { return self._s[3047]! } + public var Stickers_GroupChooseStickerPack: String { return self._s[3048]! } + public var Call_ConnectionErrorTitle: String { return self._s[3049]! } + public var UserInfo_NotificationsEnable: String { return self._s[3050]! } + public var ArchivedChats_IntroText1: String { return self._s[3051]! } + public var Tour_Text4: String { return self._s[3054]! } + public var WallpaperSearch_Recent: String { return self._s[3055]! } + public var GroupInfo_ScamGroupWarning: String { return self._s[3056]! } + public var Profile_MessageLifetime2s: String { return self._s[3058]! } + public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[3059]! } + public var Notification_MessageLifetime2s: String { return self._s[3060]! } public func Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3060]!, self._r[3060]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3061]!, self._r[3061]!, [_1, _2, _3]) } - public var Cache_ClearCache: String { return self._s[3061]! } - public var AutoNightTheme_UpdateLocation: String { return self._s[3062]! } - public var Permissions_NotificationsUnreachableText_v0: String { return self._s[3063]! } + public var Cache_ClearCache: String { return self._s[3062]! } + public var AutoNightTheme_UpdateLocation: String { return self._s[3063]! } + public var Permissions_NotificationsUnreachableText_v0: String { return self._s[3064]! } public func Channel_AdminLog_MessageChangedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3067]!, self._r[3067]!, [_0]) + return formatWithArgumentRanges(self._s[3068]!, self._r[3068]!, [_0]) } public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3069]!, self._r[3069]!, [_0]) + return formatWithArgumentRanges(self._s[3070]!, self._r[3070]!, [_0]) } - public var LocalGroup_Text: String { return self._s[3070]! } - public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[3071]! } - public var SocksProxySetup_TypeSocks: String { return self._s[3072]! } - public var ChatList_UnarchiveAction: String { return self._s[3073]! } - public var AutoNightTheme_Title: String { return self._s[3074]! } - public var InstantPage_FeedbackButton: String { return self._s[3075]! } - public var Passport_FieldAddress: String { return self._s[3076]! } + public var LocalGroup_Text: String { return self._s[3071]! } + public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[3072]! } + public var SocksProxySetup_TypeSocks: String { return self._s[3073]! } + public var ChatList_UnarchiveAction: String { return self._s[3074]! } + public var AutoNightTheme_Title: String { return self._s[3075]! } + public var InstantPage_FeedbackButton: String { return self._s[3076]! } + public var Passport_FieldAddress: String { return self._s[3077]! } public func Channel_AdminLog_SetSlowmode(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3077]!, self._r[3077]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3078]!, self._r[3078]!, [_1, _2]) } - public var Month_ShortMarch: String { return self._s[3078]! } + public var Month_ShortMarch: String { return self._s[3079]! } public func PUSH_MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3079]!, self._r[3079]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3080]!, self._r[3080]!, [_1, _2]) } - public var SocksProxySetup_UsernamePlaceholder: String { return self._s[3080]! } - public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[3081]! } - public var Passport_FloodError: String { return self._s[3082]! } - public var SecretGif_Title: String { return self._s[3083]! } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[3084]! } - public var ChatList_Context_UnhideArchive: String { return self._s[3085]! } - public var Passport_Language_th: String { return self._s[3087]! } - public var Passport_Address_Address: String { return self._s[3088]! } - public var Login_InvalidLastNameError: String { return self._s[3089]! } - public var Notifications_InAppNotificationsPreview: String { return self._s[3090]! } - public var Notifications_PermissionsUnreachableTitle: String { return self._s[3091]! } - public var ChatList_Context_Archive: String { return self._s[3092]! } - public var SettingsSearch_FAQ: String { return self._s[3093]! } - public var ShareMenu_Send: String { return self._s[3094]! } - public var WallpaperSearch_ColorYellow: String { return self._s[3096]! } - public var Month_GenNovember: String { return self._s[3098]! } - public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[3100]! } + public var SocksProxySetup_UsernamePlaceholder: String { return self._s[3081]! } + public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[3082]! } + public var Passport_FloodError: String { return self._s[3083]! } + public var SecretGif_Title: String { return self._s[3084]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[3085]! } + public var ChatList_Context_UnhideArchive: String { return self._s[3086]! } + public var Passport_Language_th: String { return self._s[3088]! } + public var Passport_Address_Address: String { return self._s[3089]! } + public var Login_InvalidLastNameError: String { return self._s[3090]! } + public var Notifications_InAppNotificationsPreview: String { return self._s[3091]! } + public var Notifications_PermissionsUnreachableTitle: String { return self._s[3092]! } + public var ChatList_Context_Archive: String { return self._s[3093]! } + public var SettingsSearch_FAQ: String { return self._s[3094]! } + public var ShareMenu_Send: String { return self._s[3095]! } + public var WallpaperSearch_ColorYellow: String { return self._s[3097]! } + public var Month_GenNovember: String { return self._s[3099]! } + public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[3101]! } public func Conversation_ShareMyPhoneNumberConfirmation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3101]!, self._r[3101]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3102]!, self._r[3102]!, [_1, _2]) } - public var Conversation_SwipeToReplyHintText: String { return self._s[3102]! } - public var Checkout_Email: String { return self._s[3103]! } - public var NotificationsSound_Tritone: String { return self._s[3104]! } - public var StickerPacksSettings_ManagingHelp: String { return self._s[3106]! } - public var Wallet_ContextMenuCopy: String { return self._s[3108]! } + public var Conversation_SwipeToReplyHintText: String { return self._s[3103]! } + public var Checkout_Email: String { return self._s[3104]! } + public var NotificationsSound_Tritone: String { return self._s[3105]! } + public var StickerPacksSettings_ManagingHelp: String { return self._s[3107]! } + public var Wallet_ContextMenuCopy: String { return self._s[3109]! } public func Wallet_Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3110]!, self._r[3110]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3111]!, self._r[3111]!, [_1, _2, _3]) } - public var Appearance_TextSize_Automatic: String { return self._s[3111]! } + public var Appearance_TextSize_Automatic: String { return self._s[3112]! } public func PUSH_PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3112]!, self._r[3112]!, [_1]) + return formatWithArgumentRanges(self._s[3113]!, self._r[3113]!, [_1]) } public func StickerPackActionInfo_AddedText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3113]!, self._r[3113]!, [_0]) + return formatWithArgumentRanges(self._s[3114]!, self._r[3114]!, [_0]) } - public var ChangePhoneNumberNumber_Help: String { return self._s[3114]! } + public var ChangePhoneNumberNumber_Help: String { return self._s[3115]! } public func Checkout_LiabilityAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3115]!, self._r[3115]!, [_1, _1, _1, _2]) + return formatWithArgumentRanges(self._s[3116]!, self._r[3116]!, [_1, _1, _1, _2]) } - public var ChatList_UndoArchiveTitle: String { return self._s[3116]! } - public var Notification_Exceptions_Add: String { return self._s[3117]! } - public var DialogList_You: String { return self._s[3118]! } - public var MediaPicker_Send: String { return self._s[3121]! } - public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[3122]! } - public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[3123]! } - public var Call_AudioRouteSpeaker: String { return self._s[3124]! } - public var Watch_UserInfo_Title: String { return self._s[3125]! } - public var VoiceOver_Chat_PollFinalResults: String { return self._s[3126]! } - public var Appearance_AccentColor: String { return self._s[3128]! } + public var ChatList_UndoArchiveTitle: String { return self._s[3117]! } + public var Notification_Exceptions_Add: String { return self._s[3118]! } + public var DialogList_You: String { return self._s[3119]! } + public var MediaPicker_Send: String { return self._s[3122]! } + public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[3123]! } + public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[3124]! } + public var Call_AudioRouteSpeaker: String { return self._s[3125]! } + public var Watch_UserInfo_Title: String { return self._s[3126]! } + public var VoiceOver_Chat_PollFinalResults: String { return self._s[3127]! } + public var Appearance_AccentColor: String { return self._s[3129]! } public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3129]!, self._r[3129]!, [_0]) + return formatWithArgumentRanges(self._s[3130]!, self._r[3130]!, [_0]) } - public var Permissions_ContactsAllowInSettings_v0: String { return self._s[3130]! } + public var Permissions_ContactsAllowInSettings_v0: String { return self._s[3131]! } public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3131]!, self._r[3131]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3132]!, self._r[3132]!, [_1, _2]) } - public var Conversation_ClousStorageInfo_Description2: String { return self._s[3132]! } - public var WebSearch_RecentClearConfirmation: String { return self._s[3133]! } - public var Notification_CallOutgoing: String { return self._s[3134]! } - public var PrivacySettings_PasscodeAndFaceId: String { return self._s[3135]! } - public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[3136]! } - public var Call_RecordingDisabledMessage: String { return self._s[3137]! } - public var Message_Game: String { return self._s[3138]! } - public var Conversation_PressVolumeButtonForSound: String { return self._s[3139]! } - public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[3140]! } - public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[3141]! } - public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[3142]! } - public var Date_DialogDateFormat: String { return self._s[3144]! } - public var WallpaperColors_SetCustomColor: String { return self._s[3145]! } - public var Notifications_InAppNotifications: String { return self._s[3146]! } + public var Conversation_ClousStorageInfo_Description2: String { return self._s[3133]! } + public var WebSearch_RecentClearConfirmation: String { return self._s[3134]! } + public var Notification_CallOutgoing: String { return self._s[3135]! } + public var PrivacySettings_PasscodeAndFaceId: String { return self._s[3136]! } + public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[3137]! } + public var Call_RecordingDisabledMessage: String { return self._s[3138]! } + public var Message_Game: String { return self._s[3139]! } + public var Conversation_PressVolumeButtonForSound: String { return self._s[3140]! } + public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[3141]! } + public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[3142]! } + public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[3143]! } + public var Date_DialogDateFormat: String { return self._s[3145]! } + public var WallpaperColors_SetCustomColor: String { return self._s[3146]! } + public var Notifications_InAppNotifications: String { return self._s[3147]! } public func Channel_Management_RemovedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3147]!, self._r[3147]!, [_0]) + return formatWithArgumentRanges(self._s[3148]!, self._r[3148]!, [_0]) } public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3148]!, self._r[3148]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3149]!, self._r[3149]!, [_1, _2]) } - public var NewContact_Title: String { return self._s[3149]! } + public var NewContact_Title: String { return self._s[3150]! } public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3150]!, self._r[3150]!, [_0]) + return formatWithArgumentRanges(self._s[3151]!, self._r[3151]!, [_0]) } - public var Conversation_ViewContactDetails: String { return self._s[3151]! } + public var Conversation_ViewContactDetails: String { return self._s[3152]! } public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3153]!, self._r[3153]!, [_1]) + return formatWithArgumentRanges(self._s[3154]!, self._r[3154]!, [_1]) } - public var Checkout_NewCard_CardholderNameTitle: String { return self._s[3154]! } - public var Passport_Identity_ExpiryDateNone: String { return self._s[3155]! } - public var PrivacySettings_Title: String { return self._s[3156]! } - public var Conversation_SilentBroadcastTooltipOff: String { return self._s[3159]! } - public var GroupRemoved_UsersSectionTitle: String { return self._s[3160]! } - public var VoiceOver_Chat_ContactEmail: String { return self._s[3161]! } - public var Contacts_PhoneNumber: String { return self._s[3162]! } - public var TwoFactorSetup_Password_PlaceholderConfirmPassword: String { return self._s[3164]! } - public var Map_ShowPlaces: String { return self._s[3165]! } - public var ChatAdmins_Title: String { return self._s[3166]! } - public var InstantPage_Reference: String { return self._s[3168]! } - public var Wallet_Info_Updating: String { return self._s[3169]! } - public var ReportGroupLocation_Text: String { return self._s[3170]! } + public var Checkout_NewCard_CardholderNameTitle: String { return self._s[3155]! } + public var Passport_Identity_ExpiryDateNone: String { return self._s[3156]! } + public var PrivacySettings_Title: String { return self._s[3157]! } + public var Conversation_SilentBroadcastTooltipOff: String { return self._s[3160]! } + public var GroupRemoved_UsersSectionTitle: String { return self._s[3161]! } + public var VoiceOver_Chat_ContactEmail: String { return self._s[3162]! } + public var Contacts_PhoneNumber: String { return self._s[3163]! } + public var TwoFactorSetup_Password_PlaceholderConfirmPassword: String { return self._s[3165]! } + public var Map_ShowPlaces: String { return self._s[3166]! } + public var ChatAdmins_Title: String { return self._s[3167]! } + public var InstantPage_Reference: String { return self._s[3169]! } + public var Wallet_Info_Updating: String { return self._s[3170]! } + public var ReportGroupLocation_Text: String { return self._s[3171]! } public func PUSH_CHAT_MESSAGE_FWD(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3171]!, self._r[3171]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3172]!, self._r[3172]!, [_1, _2]) } - public var Camera_FlashOff: String { return self._s[3172]! } - public var Watch_UserInfo_Block: String { return self._s[3173]! } - public var ChatSettings_Stickers: String { return self._s[3174]! } - public var ChatSettings_DownloadInBackground: String { return self._s[3175]! } - public var Appearance_ThemeCarouselTintedNight: String { return self._s[3176]! } + public var Camera_FlashOff: String { return self._s[3173]! } + public var Watch_UserInfo_Block: String { return self._s[3174]! } + public var ChatSettings_Stickers: String { return self._s[3175]! } + public var ChatSettings_DownloadInBackground: String { return self._s[3176]! } + public var Appearance_ThemeCarouselTintedNight: String { return self._s[3177]! } public func UserInfo_BlockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3177]!, self._r[3177]!, [_0]) + return formatWithArgumentRanges(self._s[3178]!, self._r[3178]!, [_0]) } - public var Settings_ViewPhoto: String { return self._s[3178]! } - public var Login_CheckOtherSessionMessages: String { return self._s[3179]! } - public var AutoDownloadSettings_Cellular: String { return self._s[3180]! } - public var Wallet_Created_ExportErrorTitle: String { return self._s[3181]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[3182]! } - public var VoiceOver_MessageContextShare: String { return self._s[3183]! } + public var Settings_ViewPhoto: String { return self._s[3179]! } + public var Login_CheckOtherSessionMessages: String { return self._s[3180]! } + public var AutoDownloadSettings_Cellular: String { return self._s[3181]! } + public var Wallet_Created_ExportErrorTitle: String { return self._s[3182]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[3183]! } + public var VoiceOver_MessageContextShare: String { return self._s[3184]! } public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3185]!, self._r[3185]!, [_0]) + return formatWithArgumentRanges(self._s[3186]!, self._r[3186]!, [_0]) } - public var Privacy_DeleteDrafts: String { return self._s[3186]! } - public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[3187]! } + public var Privacy_DeleteDrafts: String { return self._s[3187]! } + public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[3188]! } public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3188]!, self._r[3188]!, [_0]) + return formatWithArgumentRanges(self._s[3189]!, self._r[3189]!, [_0]) } - public var DialogList_SavedMessagesHelp: String { return self._s[3189]! } - public var Wallet_SecureStorageNotAvailable_Title: String { return self._s[3190]! } - public var DialogList_SavedMessages: String { return self._s[3191]! } - public var GroupInfo_UpgradeButton: String { return self._s[3192]! } - public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[3194]! } - public var DialogList_Pin: String { return self._s[3195]! } + public var DialogList_SavedMessagesHelp: String { return self._s[3190]! } + public var Wallet_SecureStorageNotAvailable_Title: String { return self._s[3191]! } + public var DialogList_SavedMessages: String { return self._s[3192]! } + public var GroupInfo_UpgradeButton: String { return self._s[3193]! } + public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[3195]! } + public var DialogList_Pin: String { return self._s[3196]! } public func ForwardedAuthors2(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3196]!, self._r[3196]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3197]!, self._r[3197]!, [_0, _1]) } public func Login_PhoneGenericEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3197]!, self._r[3197]!, [_0]) + return formatWithArgumentRanges(self._s[3198]!, self._r[3198]!, [_0]) } - public var Notification_Exceptions_AlwaysOn: String { return self._s[3198]! } - public var UserInfo_NotificationsDisable: String { return self._s[3199]! } - public var Conversation_ContextMenuCancelEditing: String { return self._s[3200]! } - public var Paint_Outlined: String { return self._s[3201]! } - public var Activity_PlayingGame: String { return self._s[3202]! } - public var SearchImages_NoImagesFound: String { return self._s[3203]! } - public var SocksProxySetup_ProxyType: String { return self._s[3204]! } - public var AppleWatch_ReplyPresetsHelp: String { return self._s[3206]! } - public var Conversation_ContextMenuCancelSending: String { return self._s[3207]! } - public var Settings_AppLanguage: String { return self._s[3208]! } - public var TwoStepAuth_ResetAccountHelp: String { return self._s[3209]! } - public var Common_ChoosePhoto: String { return self._s[3210]! } - public var AuthSessions_AddDevice_InvalidQRCode: String { return self._s[3211]! } - public var CallFeedback_ReasonEcho: String { return self._s[3212]! } + public var Notification_Exceptions_AlwaysOn: String { return self._s[3199]! } + public var UserInfo_NotificationsDisable: String { return self._s[3200]! } + public var Conversation_ContextMenuCancelEditing: String { return self._s[3201]! } + public var Paint_Outlined: String { return self._s[3202]! } + public var Activity_PlayingGame: String { return self._s[3203]! } + public var SearchImages_NoImagesFound: String { return self._s[3204]! } + public var SocksProxySetup_ProxyType: String { return self._s[3205]! } + public var AppleWatch_ReplyPresetsHelp: String { return self._s[3207]! } + public var Conversation_ContextMenuCancelSending: String { return self._s[3208]! } + public var Settings_AppLanguage: String { return self._s[3209]! } + public var TwoStepAuth_ResetAccountHelp: String { return self._s[3210]! } + public var Common_ChoosePhoto: String { return self._s[3211]! } + public var AuthSessions_AddDevice_InvalidQRCode: String { return self._s[3212]! } + public var CallFeedback_ReasonEcho: String { return self._s[3213]! } public func PUSH_PINNED_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3213]!, self._r[3213]!, [_1]) + return formatWithArgumentRanges(self._s[3214]!, self._r[3214]!, [_1]) } - public var Privacy_Calls_AlwaysAllow: String { return self._s[3214]! } - public var PollResults_Collapse: String { return self._s[3215]! } - public var Activity_UploadingVideo: String { return self._s[3216]! } - public var Conversation_WalletRequiredNotNow: String { return self._s[3217]! } - public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[3218]! } - public var NetworkUsageSettings_Wifi: String { return self._s[3219]! } - public var VoiceOver_Editing_ClearText: String { return self._s[3220]! } - public var PUSH_SENDER_YOU: String { return self._s[3221]! } - public var Channel_BanUser_PermissionReadMessages: String { return self._s[3222]! } - public var Checkout_PayWithTouchId: String { return self._s[3223]! } - public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[3224]! } + public var Privacy_Calls_AlwaysAllow: String { return self._s[3215]! } + public var PollResults_Collapse: String { return self._s[3216]! } + public var Activity_UploadingVideo: String { return self._s[3217]! } + public var Conversation_WalletRequiredNotNow: String { return self._s[3218]! } + public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[3219]! } + public var NetworkUsageSettings_Wifi: String { return self._s[3220]! } + public var VoiceOver_Editing_ClearText: String { return self._s[3221]! } + public var PUSH_SENDER_YOU: String { return self._s[3222]! } + public var Channel_BanUser_PermissionReadMessages: String { return self._s[3223]! } + public var Checkout_PayWithTouchId: String { return self._s[3224]! } + public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[3225]! } public func PUSH_LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3226]!, self._r[3226]!, [_1]) + return formatWithArgumentRanges(self._s[3227]!, self._r[3227]!, [_1]) } - public var Notifications_ExceptionsNone: String { return self._s[3227]! } + public var Notifications_ExceptionsNone: String { return self._s[3228]! } public func Message_ForwardedMessageShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3228]!, self._r[3228]!, [_0]) + return formatWithArgumentRanges(self._s[3229]!, self._r[3229]!, [_0]) } public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3229]!, self._r[3229]!, [_1]) + return formatWithArgumentRanges(self._s[3230]!, self._r[3230]!, [_1]) } - public var AuthSessions_IncompleteAttempts: String { return self._s[3231]! } - public var Passport_Address_Region: String { return self._s[3234]! } - public var ChatList_DeleteChat: String { return self._s[3235]! } - public var LogoutOptions_ClearCacheTitle: String { return self._s[3236]! } - public var PhotoEditor_TiltShift: String { return self._s[3237]! } - public var Settings_FAQ_URL: String { return self._s[3238]! } - public var TwoFactorSetup_EmailVerification_ChangeAction: String { return self._s[3239]! } - public var Passport_Language_sl: String { return self._s[3240]! } - public var Settings_PrivacySettings: String { return self._s[3242]! } - public var SharedMedia_TitleLink: String { return self._s[3243]! } - public var Passport_Identity_TypePassportUploadScan: String { return self._s[3244]! } - public var Settings_SetProfilePhoto: String { return self._s[3245]! } - public var Channel_About_Help: String { return self._s[3246]! } - public var Contacts_PermissionsEnable: String { return self._s[3247]! } - public var Wallet_Sending_Title: String { return self._s[3248]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[3249]! } - public var AttachmentMenu_SendAsFiles: String { return self._s[3250]! } - public var CallFeedback_ReasonInterruption: String { return self._s[3252]! } - public var Passport_Address_AddTemporaryRegistration: String { return self._s[3253]! } - public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[3254]! } - public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[3255]! } - public var OldChannels_Title: String { return self._s[3256]! } - public var PrivacySettings_DeleteAccountTitle: String { return self._s[3257]! } - public var AccessDenied_VideoMessageCamera: String { return self._s[3259]! } - public var Map_OpenInYandexMaps: String { return self._s[3261]! } - public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[3262]! } - public var VoiceOver_MessageContextReply: String { return self._s[3263]! } - public var PhotoEditor_SaturationTool: String { return self._s[3265]! } + public var AuthSessions_IncompleteAttempts: String { return self._s[3232]! } + public var Passport_Address_Region: String { return self._s[3235]! } + public var ChatList_DeleteChat: String { return self._s[3236]! } + public var LogoutOptions_ClearCacheTitle: String { return self._s[3237]! } + public var PhotoEditor_TiltShift: String { return self._s[3238]! } + public var Settings_FAQ_URL: String { return self._s[3239]! } + public var TwoFactorSetup_EmailVerification_ChangeAction: String { return self._s[3240]! } + public var Passport_Language_sl: String { return self._s[3241]! } + public var Settings_PrivacySettings: String { return self._s[3243]! } + public var SharedMedia_TitleLink: String { return self._s[3244]! } + public var Passport_Identity_TypePassportUploadScan: String { return self._s[3245]! } + public var Settings_SetProfilePhoto: String { return self._s[3246]! } + public var Channel_About_Help: String { return self._s[3247]! } + public var Contacts_PermissionsEnable: String { return self._s[3248]! } + public var Wallet_Sending_Title: String { return self._s[3249]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[3250]! } + public var AttachmentMenu_SendAsFiles: String { return self._s[3251]! } + public var CallFeedback_ReasonInterruption: String { return self._s[3253]! } + public var Passport_Address_AddTemporaryRegistration: String { return self._s[3254]! } + public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[3255]! } + public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[3256]! } + public var OldChannels_Title: String { return self._s[3257]! } + public var PrivacySettings_DeleteAccountTitle: String { return self._s[3258]! } + public var AccessDenied_VideoMessageCamera: String { return self._s[3260]! } + public var Map_OpenInYandexMaps: String { return self._s[3262]! } + public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[3263]! } + public var VoiceOver_MessageContextReply: String { return self._s[3264]! } + public var PhotoEditor_SaturationTool: String { return self._s[3266]! } public func PUSH_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3266]!, self._r[3266]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3267]!, self._r[3267]!, [_1, _2]) } - public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[3267]! } - public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[3268]! } - public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[3269]! } + public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[3268]! } + public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[3269]! } + public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[3270]! } public func LOCAL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3270]!, self._r[3270]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3271]!, self._r[3271]!, [_1, "\(_2)"]) } - public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[3271]! } - public var Channel_Username_InvalidTooShort: String { return self._s[3273]! } - public var SettingsSearch_Synonyms_Wallet: String { return self._s[3274]! } + public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[3272]! } + public var Channel_Username_InvalidTooShort: String { return self._s[3274]! } + public var SettingsSearch_Synonyms_Wallet: String { return self._s[3275]! } public func Group_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3275]!, self._r[3275]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3276]!, self._r[3276]!, [_1, _2]) } - public var Forward_ErrorPublicPollDisabledInChannels: String { return self._s[3276]! } + public var Forward_ErrorPublicPollDisabledInChannels: String { return self._s[3277]! } public func PUSH_CHAT_MESSAGE_GAME(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3277]!, self._r[3277]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3278]!, self._r[3278]!, [_1, _2, _3]) } - public var WallpaperPreview_PatternTitle: String { return self._s[3278]! } - public var GroupInfo_PublicLinkAdd: String { return self._s[3279]! } - public var Passport_PassportInformation: String { return self._s[3282]! } - public var Theme_Unsupported: String { return self._s[3283]! } - public var WatchRemote_AlertTitle: String { return self._s[3284]! } - public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[3285]! } - public var ConvertToSupergroup_HelpText: String { return self._s[3287]! } + public var WallpaperPreview_PatternTitle: String { return self._s[3279]! } + public var GroupInfo_PublicLinkAdd: String { return self._s[3280]! } + public var Passport_PassportInformation: String { return self._s[3283]! } + public var Theme_Unsupported: String { return self._s[3284]! } + public var WatchRemote_AlertTitle: String { return self._s[3285]! } + public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[3286]! } + public var ConvertToSupergroup_HelpText: String { return self._s[3288]! } public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3288]!, self._r[3288]!, [_0]) + return formatWithArgumentRanges(self._s[3289]!, self._r[3289]!, [_0]) } public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3289]!, self._r[3289]!, [_1]) + return formatWithArgumentRanges(self._s[3290]!, self._r[3290]!, [_1]) } - public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[3290]! } - public var Wallet_Navigation_Done: String { return self._s[3292]! } - public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[3293]! } - public var AccessDenied_CameraDisabled: String { return self._s[3294]! } + public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[3291]! } + public var Wallet_Navigation_Done: String { return self._s[3293]! } + public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[3294]! } + public var AccessDenied_CameraDisabled: String { return self._s[3295]! } public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3295]!, self._r[3295]!, [_0]) + return formatWithArgumentRanges(self._s[3296]!, self._r[3296]!, [_0]) } - public var ClearCache_Forever: String { return self._s[3296]! } - public var AuthSessions_AddDeviceIntro_Title: String { return self._s[3297]! } - public var CreatePoll_Quiz: String { return self._s[3298]! } - public var PhotoEditor_ContrastTool: String { return self._s[3301]! } + public var ClearCache_Forever: String { return self._s[3297]! } + public var AuthSessions_AddDeviceIntro_Title: String { return self._s[3298]! } + public var CreatePoll_Quiz: String { return self._s[3299]! } + public var PhotoEditor_ContrastTool: String { return self._s[3302]! } public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3302]!, self._r[3302]!, [_1]) + return formatWithArgumentRanges(self._s[3303]!, self._r[3303]!, [_1]) } - public var DialogList_Draft: String { return self._s[3303]! } - public var Wallet_Configuration_BlockchainIdInfo: String { return self._s[3304]! } - public var Privacy_TopPeersDelete: String { return self._s[3306]! } - public var LoginPassword_PasswordPlaceholder: String { return self._s[3307]! } - public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[3308]! } - public var WebSearch_RecentSectionClear: String { return self._s[3309]! } - public var EditTheme_ErrorInvalidCharacters: String { return self._s[3310]! } - public var Watch_ChatList_NoConversationsTitle: String { return self._s[3312]! } - public var Common_Done: String { return self._s[3314]! } - public var Shortcut_SwitchAccount: String { return self._s[3315]! } - public var AuthSessions_EmptyText: String { return self._s[3316]! } - public var Wallet_Configuration_BlockchainNameChangedTitle: String { return self._s[3317]! } - public var Conversation_ShareBotContactConfirmation: String { return self._s[3318]! } - public var Tour_Title5: String { return self._s[3319]! } - public var Wallet_Settings_Title: String { return self._s[3320]! } + public var DialogList_Draft: String { return self._s[3304]! } + public var Wallet_Configuration_BlockchainIdInfo: String { return self._s[3305]! } + public var Privacy_TopPeersDelete: String { return self._s[3307]! } + public var LoginPassword_PasswordPlaceholder: String { return self._s[3308]! } + public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[3309]! } + public var WebSearch_RecentSectionClear: String { return self._s[3310]! } + public var EditTheme_ErrorInvalidCharacters: String { return self._s[3311]! } + public var Watch_ChatList_NoConversationsTitle: String { return self._s[3313]! } + public var Common_Done: String { return self._s[3315]! } + public var Shortcut_SwitchAccount: String { return self._s[3316]! } + public var AuthSessions_EmptyText: String { return self._s[3317]! } + public var Wallet_Configuration_BlockchainNameChangedTitle: String { return self._s[3318]! } + public var Conversation_ShareBotContactConfirmation: String { return self._s[3319]! } + public var Tour_Title5: String { return self._s[3320]! } + public var Wallet_Settings_Title: String { return self._s[3321]! } public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3321]!, self._r[3321]!, [_0]) + return formatWithArgumentRanges(self._s[3322]!, self._r[3322]!, [_0]) } - public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[3322]! } - public var Conversation_LinkDialogSave: String { return self._s[3323]! } - public var GroupInfo_ActionRestrict: String { return self._s[3324]! } - public var Checkout_Title: String { return self._s[3325]! } - public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[3327]! } - public var Channel_AdminLog_CanChangeInfo: String { return self._s[3329]! } - public var Notification_RenamedGroup: String { return self._s[3330]! } - public var PeopleNearby_Groups: String { return self._s[3331]! } - public var Checkout_PayWithFaceId: String { return self._s[3332]! } - public var Channel_BanList_BlockedTitle: String { return self._s[3333]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[3335]! } - public var Checkout_WebConfirmation_Title: String { return self._s[3336]! } - public var Notifications_MessageNotificationsAlert: String { return self._s[3337]! } + public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[3323]! } + public var Conversation_LinkDialogSave: String { return self._s[3324]! } + public var GroupInfo_ActionRestrict: String { return self._s[3325]! } + public var Checkout_Title: String { return self._s[3326]! } + public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[3328]! } + public var Channel_AdminLog_CanChangeInfo: String { return self._s[3330]! } + public var Notification_RenamedGroup: String { return self._s[3331]! } + public var PeopleNearby_Groups: String { return self._s[3332]! } + public var Checkout_PayWithFaceId: String { return self._s[3333]! } + public var Channel_BanList_BlockedTitle: String { return self._s[3334]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[3336]! } + public var Checkout_WebConfirmation_Title: String { return self._s[3337]! } + public var Notifications_MessageNotificationsAlert: String { return self._s[3338]! } public func Activity_RemindAboutGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3338]!, self._r[3338]!, [_0]) + return formatWithArgumentRanges(self._s[3339]!, self._r[3339]!, [_0]) } - public var Profile_AddToExisting: String { return self._s[3340]! } + public var Profile_AddToExisting: String { return self._s[3341]! } public func Profile_CreateEncryptedChatOutdatedError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3341]!, self._r[3341]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3342]!, self._r[3342]!, [_0, _1]) } - public var Cache_Files: String { return self._s[3343]! } - public var Permissions_PrivacyPolicy: String { return self._s[3344]! } - public var SocksProxySetup_ConnectAndSave: String { return self._s[3345]! } - public var UserInfo_NotificationsDefaultDisabled: String { return self._s[3346]! } - public var AutoDownloadSettings_TypeContacts: String { return self._s[3348]! } - public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[3350]! } - public var Calls_NoCallsPlaceholder: String { return self._s[3351]! } + public var Cache_Files: String { return self._s[3344]! } + public var Permissions_PrivacyPolicy: String { return self._s[3345]! } + public var SocksProxySetup_ConnectAndSave: String { return self._s[3346]! } + public var UserInfo_NotificationsDefaultDisabled: String { return self._s[3347]! } + public var AutoDownloadSettings_TypeContacts: String { return self._s[3349]! } + public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[3351]! } + public var Calls_NoCallsPlaceholder: String { return self._s[3352]! } public func Wallet_Receive_ShareInvoiceUrlInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3352]!, self._r[3352]!, [_0]) + return formatWithArgumentRanges(self._s[3353]!, self._r[3353]!, [_0]) } - public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[3353]! } - public var VoiceOver_AttachMedia: String { return self._s[3356]! } - public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[3357]! } + public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[3354]! } + public var VoiceOver_AttachMedia: String { return self._s[3357]! } + public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[3358]! } public func PUSH_CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3358]!, self._r[3358]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3359]!, self._r[3359]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[3359]! } - public var Conversation_SetReminder_Title: String { return self._s[3360]! } - public var Passport_FieldAddressHelp: String { return self._s[3361]! } - public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[3362]! } - public var PUSH_REMINDER_TITLE: String { return self._s[3363]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[3360]! } + public var Conversation_SetReminder_Title: String { return self._s[3361]! } + public var Passport_FieldAddressHelp: String { return self._s[3362]! } + public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[3363]! } + public var PUSH_REMINDER_TITLE: String { return self._s[3364]! } public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3364]!, self._r[3364]!, [_0]) + return formatWithArgumentRanges(self._s[3365]!, self._r[3365]!, [_0]) } - public var Channel_AdminLog_EmptyTitle: String { return self._s[3365]! } - public var Privacy_Calls_NeverAllow_Title: String { return self._s[3366]! } - public var Login_UnknownError: String { return self._s[3367]! } - public var Group_UpgradeNoticeText2: String { return self._s[3370]! } - public var Watch_Compose_AddContact: String { return self._s[3371]! } - public var ClearCache_StorageServiceFiles: String { return self._s[3372]! } - public var Web_Error: String { return self._s[3373]! } - public var Gif_Search: String { return self._s[3374]! } - public var Profile_MessageLifetime1h: String { return self._s[3375]! } - public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[3376]! } - public var Channel_Username_CheckingUsername: String { return self._s[3377]! } - public var CallFeedback_ReasonSilentRemote: String { return self._s[3378]! } - public var AutoDownloadSettings_TypeChannels: String { return self._s[3379]! } - public var Channel_AboutItem: String { return self._s[3380]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[3382]! } - public var VoiceOver_Chat_VoiceMessage: String { return self._s[3383]! } - public var GroupInfo_SharedMedia: String { return self._s[3384]! } + public var Channel_AdminLog_EmptyTitle: String { return self._s[3366]! } + public var Privacy_Calls_NeverAllow_Title: String { return self._s[3367]! } + public var Login_UnknownError: String { return self._s[3368]! } + public var Group_UpgradeNoticeText2: String { return self._s[3371]! } + public var Watch_Compose_AddContact: String { return self._s[3372]! } + public var ClearCache_StorageServiceFiles: String { return self._s[3373]! } + public var Web_Error: String { return self._s[3374]! } + public var Gif_Search: String { return self._s[3375]! } + public var Profile_MessageLifetime1h: String { return self._s[3376]! } + public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[3377]! } + public var Channel_Username_CheckingUsername: String { return self._s[3378]! } + public var CallFeedback_ReasonSilentRemote: String { return self._s[3379]! } + public var AutoDownloadSettings_TypeChannels: String { return self._s[3380]! } + public var Channel_AboutItem: String { return self._s[3381]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[3383]! } + public var VoiceOver_Chat_VoiceMessage: String { return self._s[3384]! } + public var GroupInfo_SharedMedia: String { return self._s[3385]! } public func Channel_AdminLog_MessagePromotedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3385]!, self._r[3385]!, [_1]) + return formatWithArgumentRanges(self._s[3386]!, self._r[3386]!, [_1]) } - public var Call_PhoneCallInProgressMessage: String { return self._s[3386]! } + public var Call_PhoneCallInProgressMessage: String { return self._s[3387]! } public func PUSH_CHANNEL_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3387]!, self._r[3387]!, [_1]) + return formatWithArgumentRanges(self._s[3388]!, self._r[3388]!, [_1]) } - public var ChatList_UndoArchiveRevealedText: String { return self._s[3388]! } - public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[3389]! } - public var Conversation_SearchByName_Placeholder: String { return self._s[3390]! } - public var CreatePoll_AddOption: String { return self._s[3391]! } - public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[3392]! } - public var Group_UpgradeNoticeHeader: String { return self._s[3393]! } - public var Channel_Management_AddModerator: String { return self._s[3394]! } - public var AutoDownloadSettings_MaxFileSize: String { return self._s[3395]! } - public var StickerPacksSettings_ShowStickersButton: String { return self._s[3396]! } - public var Wallet_Info_RefreshErrorNetworkText: String { return self._s[3397]! } - public var Theme_Colors_Background: String { return self._s[3398]! } - public var NotificationsSound_Hello: String { return self._s[3400]! } - public var SocksProxySetup_SavedProxies: String { return self._s[3401]! } - public var Channel_Stickers_Placeholder: String { return self._s[3403]! } + public var ChatList_UndoArchiveRevealedText: String { return self._s[3389]! } + public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[3390]! } + public var Conversation_SearchByName_Placeholder: String { return self._s[3391]! } + public var CreatePoll_AddOption: String { return self._s[3392]! } + public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[3393]! } + public var Group_UpgradeNoticeHeader: String { return self._s[3394]! } + public var Channel_Management_AddModerator: String { return self._s[3395]! } + public var AutoDownloadSettings_MaxFileSize: String { return self._s[3396]! } + public var StickerPacksSettings_ShowStickersButton: String { return self._s[3397]! } + public var Wallet_Info_RefreshErrorNetworkText: String { return self._s[3398]! } + public var Theme_Colors_Background: String { return self._s[3399]! } + public var NotificationsSound_Hello: String { return self._s[3401]! } + public var SocksProxySetup_SavedProxies: String { return self._s[3402]! } + public var Channel_Stickers_Placeholder: String { return self._s[3404]! } public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3404]!, self._r[3404]!, [_0]) + return formatWithArgumentRanges(self._s[3405]!, self._r[3405]!, [_0]) } - public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[3405]! } - public var Channel_Management_AddModeratorHelp: String { return self._s[3406]! } - public var ContactInfo_BirthdayLabel: String { return self._s[3407]! } - public var ChangePhoneNumberCode_RequestingACall: String { return self._s[3408]! } - public var AutoDownloadSettings_Channels: String { return self._s[3409]! } - public var Passport_Language_mn: String { return self._s[3410]! } - public var Notifications_ResetAllNotificationsHelp: String { return self._s[3413]! } - public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[3414]! } - public var Passport_Language_ja: String { return self._s[3416]! } - public var Settings_About_Title: String { return self._s[3417]! } - public var Settings_NotificationsAndSounds: String { return self._s[3418]! } - public var ChannelInfo_DeleteGroup: String { return self._s[3419]! } - public var Settings_BlockedUsers: String { return self._s[3420]! } + public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[3406]! } + public var Channel_Management_AddModeratorHelp: String { return self._s[3407]! } + public var ContactInfo_BirthdayLabel: String { return self._s[3408]! } + public var ChangePhoneNumberCode_RequestingACall: String { return self._s[3409]! } + public var AutoDownloadSettings_Channels: String { return self._s[3410]! } + public var Passport_Language_mn: String { return self._s[3411]! } + public var Notifications_ResetAllNotificationsHelp: String { return self._s[3414]! } + public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[3415]! } + public var Passport_Language_ja: String { return self._s[3417]! } + public var Settings_About_Title: String { return self._s[3418]! } + public var Settings_NotificationsAndSounds: String { return self._s[3419]! } + public var ChannelInfo_DeleteGroup: String { return self._s[3420]! } + public var Settings_BlockedUsers: String { return self._s[3421]! } public func Time_MonthOfYear_m4(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3421]!, self._r[3421]!, [_0]) + return formatWithArgumentRanges(self._s[3422]!, self._r[3422]!, [_0]) } - public var EditTheme_Create_Preview_OutgoingText: String { return self._s[3422]! } - public var Wallet_Weekday_Today: String { return self._s[3423]! } - public var AutoDownloadSettings_PreloadVideo: String { return self._s[3424]! } - public var Widget_ApplicationLocked: String { return self._s[3425]! } - public var Passport_Address_AddResidentialAddress: String { return self._s[3426]! } - public var Channel_Username_Title: String { return self._s[3427]! } + public var EditTheme_Create_Preview_OutgoingText: String { return self._s[3423]! } + public var Wallet_Weekday_Today: String { return self._s[3424]! } + public var AutoDownloadSettings_PreloadVideo: String { return self._s[3425]! } + public var Widget_ApplicationLocked: String { return self._s[3426]! } + public var Passport_Address_AddResidentialAddress: String { return self._s[3427]! } + public var Channel_Username_Title: String { return self._s[3428]! } public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3428]!, self._r[3428]!, [_0]) + return formatWithArgumentRanges(self._s[3429]!, self._r[3429]!, [_0]) } - public var AttachmentMenu_File: String { return self._s[3430]! } - public var AppleWatch_Title: String { return self._s[3431]! } - public var Activity_RecordingVideoMessage: String { return self._s[3432]! } + public var AttachmentMenu_File: String { return self._s[3431]! } + public var AppleWatch_Title: String { return self._s[3432]! } + public var Activity_RecordingVideoMessage: String { return self._s[3433]! } public func Channel_DiscussionGroup_PublicChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3433]!, self._r[3433]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3434]!, self._r[3434]!, [_1, _2]) } - public var Theme_Colors_Messages: String { return self._s[3434]! } - public var Weekday_Saturday: String { return self._s[3435]! } - public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3436]! } - public var Profile_CreateEncryptedChatError: String { return self._s[3437]! } - public var Common_Next: String { return self._s[3439]! } - public var Channel_Stickers_YourStickers: String { return self._s[3441]! } - public var Message_Theme: String { return self._s[3442]! } - public var Call_AudioRouteHeadphones: String { return self._s[3443]! } - public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3445]! } - public var Watch_Contacts_NoResults: String { return self._s[3447]! } - public var PhotoEditor_TintTool: String { return self._s[3450]! } - public var LoginPassword_ResetAccount: String { return self._s[3452]! } - public var Settings_SavedMessages: String { return self._s[3453]! } - public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3454]! } - public var Bot_GenericSupportStatus: String { return self._s[3455]! } - public var StickerPack_Add: String { return self._s[3456]! } - public var Checkout_TotalAmount: String { return self._s[3457]! } - public var Your_cards_number_is_invalid: String { return self._s[3458]! } - public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3459]! } - public var VoiceOver_Chat_VideoMessage: String { return self._s[3460]! } + public var Theme_Colors_Messages: String { return self._s[3435]! } + public var Weekday_Saturday: String { return self._s[3436]! } + public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3437]! } + public var Profile_CreateEncryptedChatError: String { return self._s[3438]! } + public var Common_Next: String { return self._s[3440]! } + public var Channel_Stickers_YourStickers: String { return self._s[3442]! } + public var Message_Theme: String { return self._s[3443]! } + public var Call_AudioRouteHeadphones: String { return self._s[3444]! } + public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3446]! } + public var Watch_Contacts_NoResults: String { return self._s[3448]! } + public var PhotoEditor_TintTool: String { return self._s[3451]! } + public var LoginPassword_ResetAccount: String { return self._s[3453]! } + public var Settings_SavedMessages: String { return self._s[3454]! } + public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3455]! } + public var Bot_GenericSupportStatus: String { return self._s[3456]! } + public var StickerPack_Add: String { return self._s[3457]! } + public var Checkout_TotalAmount: String { return self._s[3458]! } + public var Your_cards_number_is_invalid: String { return self._s[3459]! } + public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3460]! } + public var VoiceOver_Chat_VideoMessage: String { return self._s[3461]! } public func ChangePhoneNumberCode_CallTimer(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3461]!, self._r[3461]!, [_0]) + return formatWithArgumentRanges(self._s[3462]!, self._r[3462]!, [_0]) } public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3462]!, self._r[3462]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3463]!, self._r[3463]!, [_1, _2]) } - public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3463]! } + public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3464]! } public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3465]!, self._r[3465]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3466]!, self._r[3466]!, [_1, _2]) } public func Conversation_RestrictedTextTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3466]!, self._r[3466]!, [_0]) + return formatWithArgumentRanges(self._s[3467]!, self._r[3467]!, [_0]) } - public var GroupInfo_InviteLink_ShareLink: String { return self._s[3467]! } - public var StickerPack_Share: String { return self._s[3468]! } - public var Passport_DeleteAddress: String { return self._s[3469]! } - public var Settings_Passport: String { return self._s[3470]! } - public var SharedMedia_EmptyFilesText: String { return self._s[3471]! } - public var Conversation_DeleteMessagesForMe: String { return self._s[3472]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3473]! } - public var Contacts_PermissionsText: String { return self._s[3474]! } - public var Group_Setup_HistoryVisible: String { return self._s[3475]! } - public var Wallet_Month_ShortDecember: String { return self._s[3477]! } - public var Channel_EditAdmin_PermissionEnabledByDefault: String { return self._s[3478]! } - public var Passport_Address_AddRentalAgreement: String { return self._s[3479]! } - public var SocksProxySetup_Title: String { return self._s[3480]! } - public var Notification_Mute1h: String { return self._s[3481]! } + public var GroupInfo_InviteLink_ShareLink: String { return self._s[3468]! } + public var StickerPack_Share: String { return self._s[3469]! } + public var Passport_DeleteAddress: String { return self._s[3470]! } + public var Settings_Passport: String { return self._s[3471]! } + public var SharedMedia_EmptyFilesText: String { return self._s[3472]! } + public var Conversation_DeleteMessagesForMe: String { return self._s[3473]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3474]! } + public var Contacts_PermissionsText: String { return self._s[3475]! } + public var Group_Setup_HistoryVisible: String { return self._s[3476]! } + public var Wallet_Month_ShortDecember: String { return self._s[3478]! } + public var Channel_EditAdmin_PermissionEnabledByDefault: String { return self._s[3479]! } + public var Passport_Address_AddRentalAgreement: String { return self._s[3480]! } + public var SocksProxySetup_Title: String { return self._s[3481]! } + public var Notification_Mute1h: String { return self._s[3482]! } public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3482]!, self._r[3482]!, [_0]) + return formatWithArgumentRanges(self._s[3483]!, self._r[3483]!, [_0]) } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3483]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3484]! } public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3484]!, self._r[3484]!, [_1]) + return formatWithArgumentRanges(self._s[3485]!, self._r[3485]!, [_1]) } - public var FastTwoStepSetup_PasswordSection: String { return self._s[3485]! } - public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3488]! } - public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3490]! } - public var DialogList_NoMessagesText: String { return self._s[3491]! } - public var Privacy_ContactsResetConfirmation: String { return self._s[3492]! } - public var Privacy_Calls_P2PHelp: String { return self._s[3493]! } - public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3495]! } - public var Your_cards_expiration_year_is_invalid: String { return self._s[3496]! } - public var Common_TakePhotoOrVideo: String { return self._s[3497]! } - public var Wallet_Words_Text: String { return self._s[3498]! } - public var Call_StatusBusy: String { return self._s[3499]! } - public var Conversation_PinnedMessage: String { return self._s[3500]! } - public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3501]! } - public var Wallet_Configuration_BlockchainNameChangedProceed: String { return self._s[3502]! } - public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3503]! } - public var Undo_ChatCleared: String { return self._s[3504]! } - public var AppleWatch_ReplyPresets: String { return self._s[3505]! } - public var Passport_DiscardMessageDescription: String { return self._s[3507]! } - public var Login_NetworkError: String { return self._s[3508]! } + public var FastTwoStepSetup_PasswordSection: String { return self._s[3486]! } + public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3489]! } + public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3491]! } + public var DialogList_NoMessagesText: String { return self._s[3492]! } + public var Privacy_ContactsResetConfirmation: String { return self._s[3493]! } + public var Privacy_Calls_P2PHelp: String { return self._s[3494]! } + public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3496]! } + public var Your_cards_expiration_year_is_invalid: String { return self._s[3497]! } + public var Common_TakePhotoOrVideo: String { return self._s[3498]! } + public var Wallet_Words_Text: String { return self._s[3499]! } + public var Call_StatusBusy: String { return self._s[3500]! } + public var Conversation_PinnedMessage: String { return self._s[3501]! } + public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3502]! } + public var Wallet_Configuration_BlockchainNameChangedProceed: String { return self._s[3503]! } + public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3504]! } + public var Undo_ChatCleared: String { return self._s[3505]! } + public var AppleWatch_ReplyPresets: String { return self._s[3506]! } + public var Passport_DiscardMessageDescription: String { return self._s[3508]! } + public var Login_NetworkError: String { return self._s[3509]! } public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3509]!, self._r[3509]!, [_0]) - } - public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3510]!, self._r[3510]!, [_0]) } - public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3511]! } - public var Wallet_WordCheck_ViewWords: String { return self._s[3513]! } - public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3514]! } + public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3511]!, self._r[3511]!, [_0]) + } + public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3512]! } + public var Wallet_WordCheck_ViewWords: String { return self._s[3514]! } + public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3515]! } public func Watch_LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3516]!, self._r[3516]!, [_0]) + return formatWithArgumentRanges(self._s[3517]!, self._r[3517]!, [_0]) } - public var Call_ConnectionErrorMessage: String { return self._s[3517]! } - public var VoiceOver_Chat_Music: String { return self._s[3518]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3519]! } - public var Compose_GroupTokenListPlaceholder: String { return self._s[3521]! } - public var ConversationMedia_Title: String { return self._s[3522]! } - public var EncryptionKey_Title: String { return self._s[3524]! } - public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3525]! } - public var Notification_Exceptions_AddException: String { return self._s[3526]! } - public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3527]! } - public var Profile_MessageLifetime1m: String { return self._s[3528]! } + public var Call_ConnectionErrorMessage: String { return self._s[3518]! } + public var VoiceOver_Chat_Music: String { return self._s[3519]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3520]! } + public var Compose_GroupTokenListPlaceholder: String { return self._s[3522]! } + public var ConversationMedia_Title: String { return self._s[3523]! } + public var EncryptionKey_Title: String { return self._s[3525]! } + public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3526]! } + public var Notification_Exceptions_AddException: String { return self._s[3527]! } + public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3528]! } + public var Profile_MessageLifetime1m: String { return self._s[3529]! } public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3529]!, self._r[3529]!, [_1]) + return formatWithArgumentRanges(self._s[3530]!, self._r[3530]!, [_1]) } - public var Month_GenMay: String { return self._s[3530]! } + public var Month_GenMay: String { return self._s[3531]! } public func LiveLocationUpdated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3531]!, self._r[3531]!, [_0]) + return formatWithArgumentRanges(self._s[3532]!, self._r[3532]!, [_0]) } - public var PeopleNearby_Users: String { return self._s[3532]! } - public var Wallet_Send_AddressInfo: String { return self._s[3533]! } - public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3534]! } - public var AutoDownloadSettings_ResetSettings: String { return self._s[3535]! } + public var PeopleNearby_Users: String { return self._s[3533]! } + public var Wallet_Send_AddressInfo: String { return self._s[3534]! } + public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3535]! } + public var AutoDownloadSettings_ResetSettings: String { return self._s[3536]! } public func Wallet_Updated_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3537]!, self._r[3537]!, [_0]) + return formatWithArgumentRanges(self._s[3538]!, self._r[3538]!, [_0]) } - public var Conversation_EmptyPlaceholder: String { return self._s[3538]! } - public var Passport_Address_AddPassportRegistration: String { return self._s[3539]! } - public var Notifications_ChannelNotificationsAlert: String { return self._s[3540]! } - public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3541]! } - public var Camera_TapAndHoldForVideo: String { return self._s[3542]! } - public var Channel_JoinChannel: String { return self._s[3544]! } - public var Appearance_Animations: String { return self._s[3547]! } + public var Conversation_EmptyPlaceholder: String { return self._s[3539]! } + public var Passport_Address_AddPassportRegistration: String { return self._s[3540]! } + public var Notifications_ChannelNotificationsAlert: String { return self._s[3541]! } + public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3542]! } + public var Camera_TapAndHoldForVideo: String { return self._s[3543]! } + public var Channel_JoinChannel: String { return self._s[3545]! } + public var Appearance_Animations: String { return self._s[3548]! } public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3548]!, self._r[3548]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3549]!, self._r[3549]!, [_1, _2]) } - public var Stickers_GroupStickers: String { return self._s[3550]! } - public var Appearance_ShareTheme: String { return self._s[3551]! } - public var TwoFactorSetup_Hint_Placeholder: String { return self._s[3552]! } - public var ConvertToSupergroup_HelpTitle: String { return self._s[3554]! } - public var StickerPackActionInfo_RemovedTitle: String { return self._s[3555]! } - public var Passport_Address_Street: String { return self._s[3556]! } - public var Conversation_AddContact: String { return self._s[3557]! } - public var Login_PhonePlaceholder: String { return self._s[3558]! } - public var Channel_Members_InviteLink: String { return self._s[3560]! } - public var Bot_Stop: String { return self._s[3561]! } - public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3563]! } - public var Notification_PassportValueAddress: String { return self._s[3564]! } - public var Month_ShortJuly: String { return self._s[3565]! } - public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3566]! } - public var Channel_AdminLog_BanSendMedia: String { return self._s[3567]! } - public var Passport_Identity_ReverseSide: String { return self._s[3568]! } - public var Watch_Stickers_Recents: String { return self._s[3571]! } - public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3573]! } - public var Map_SendThisLocation: String { return self._s[3574]! } + public var Stickers_GroupStickers: String { return self._s[3551]! } + public var Appearance_ShareTheme: String { return self._s[3552]! } + public var TwoFactorSetup_Hint_Placeholder: String { return self._s[3553]! } + public var ConvertToSupergroup_HelpTitle: String { return self._s[3555]! } + public var StickerPackActionInfo_RemovedTitle: String { return self._s[3556]! } + public var Passport_Address_Street: String { return self._s[3557]! } + public var Conversation_AddContact: String { return self._s[3558]! } + public var Login_PhonePlaceholder: String { return self._s[3559]! } + public var Channel_Members_InviteLink: String { return self._s[3561]! } + public var Bot_Stop: String { return self._s[3562]! } + public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3564]! } + public var Notification_PassportValueAddress: String { return self._s[3565]! } + public var Month_ShortJuly: String { return self._s[3566]! } + public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3567]! } + public var Channel_AdminLog_BanSendMedia: String { return self._s[3568]! } + public var Passport_Identity_ReverseSide: String { return self._s[3569]! } + public var Watch_Stickers_Recents: String { return self._s[3572]! } + public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3574]! } + public var Map_SendThisLocation: String { return self._s[3575]! } public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3575]!, self._r[3575]!, [_0]) - } - public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3576]!, self._r[3576]!, [_0]) } - public var ConvertToSupergroup_Note: String { return self._s[3577]! } - public var Wallet_Intro_NotNow: String { return self._s[3578]! } + public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3577]!, self._r[3577]!, [_0]) + } + public var ConvertToSupergroup_Note: String { return self._s[3578]! } + public var Wallet_Intro_NotNow: String { return self._s[3579]! } public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3579]!, self._r[3579]!, [_0]) + return formatWithArgumentRanges(self._s[3580]!, self._r[3580]!, [_0]) } - public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3580]! } + public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3581]! } public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3581]!, self._r[3581]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3582]!, self._r[3582]!, [_0, _1]) } - public var Login_CallRequestState3: String { return self._s[3583]! } - public var Wallpaper_SearchShort: String { return self._s[3584]! } - public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3586]! } - public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3587]! } - public var Channel_BotDoesntSupportGroups: String { return self._s[3588]! } + public var Login_CallRequestState3: String { return self._s[3584]! } + public var Wallpaper_SearchShort: String { return self._s[3585]! } + public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3587]! } + public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3588]! } + public var Channel_BotDoesntSupportGroups: String { return self._s[3589]! } public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3589]!, self._r[3589]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3590]!, self._r[3590]!, [_1, _2]) } - public var Channel_AdminLogFilter_Title: String { return self._s[3590]! } - public var Appearance_ThemePreview_Chat_4_Text: String { return self._s[3592]! } - public var Notifications_GroupNotificationsExceptions: String { return self._s[3595]! } + public var Channel_AdminLogFilter_Title: String { return self._s[3591]! } + public var Appearance_ThemePreview_Chat_4_Text: String { return self._s[3593]! } + public var Notifications_GroupNotificationsExceptions: String { return self._s[3596]! } public func FileSize_B(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3596]!, self._r[3596]!, [_0]) + return formatWithArgumentRanges(self._s[3597]!, self._r[3597]!, [_0]) } - public var Passport_CorrectErrors: String { return self._s[3597]! } - public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3598]! } + public var Passport_CorrectErrors: String { return self._s[3598]! } + public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3599]! } public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3599]!, self._r[3599]!, [_0]) + return formatWithArgumentRanges(self._s[3600]!, self._r[3600]!, [_0]) } - public var Map_SendMyCurrentLocation: String { return self._s[3600]! } - public var Channel_DiscussionGroup: String { return self._s[3601]! } - public var TwoFactorSetup_Email_SkipConfirmationSkip: String { return self._s[3602]! } + public var Map_SendMyCurrentLocation: String { return self._s[3601]! } + public var Channel_DiscussionGroup: String { return self._s[3602]! } + public var TwoFactorSetup_Email_SkipConfirmationSkip: String { return self._s[3603]! } public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3603]!, self._r[3603]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3604]!, self._r[3604]!, [_1, _2]) } - public var SharedMedia_SearchNoResults: String { return self._s[3604]! } - public var Permissions_NotificationsText_v0: String { return self._s[3605]! } - public var Channel_EditAdmin_PermissionDeleteMessagesOfOthers: String { return self._s[3606]! } - public var Appearance_AppIcon: String { return self._s[3607]! } - public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3608]! } - public var LoginPassword_FloodError: String { return self._s[3609]! } - public var Wallet_Send_OwnAddressAlertProceed: String { return self._s[3611]! } - public var Group_Setup_HistoryHiddenHelp: String { return self._s[3612]! } + public var SharedMedia_SearchNoResults: String { return self._s[3605]! } + public var Permissions_NotificationsText_v0: String { return self._s[3606]! } + public var Channel_EditAdmin_PermissionDeleteMessagesOfOthers: String { return self._s[3607]! } + public var Appearance_AppIcon: String { return self._s[3608]! } + public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3609]! } + public var LoginPassword_FloodError: String { return self._s[3610]! } + public var Wallet_Send_OwnAddressAlertProceed: String { return self._s[3612]! } + public var Group_Setup_HistoryHiddenHelp: String { return self._s[3613]! } public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3613]!, self._r[3613]!, [_0]) + return formatWithArgumentRanges(self._s[3614]!, self._r[3614]!, [_0]) } - public var Passport_Language_bn: String { return self._s[3614]! } + public var Passport_Language_bn: String { return self._s[3615]! } public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3615]!, self._r[3615]!, [_0]) + return formatWithArgumentRanges(self._s[3616]!, self._r[3616]!, [_0]) } - public var ChatList_Context_Pin: String { return self._s[3616]! } + public var ChatList_Context_Pin: String { return self._s[3617]! } public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3617]!, self._r[3617]!, [_0]) - } - public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3618]!, self._r[3618]!, [_0]) } - public var Wallet_Navigation_Close: String { return self._s[3619]! } - public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3623]! } - public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3625]! } - public var Wallet_Month_GenDecember: String { return self._s[3626]! } - public var Contacts_PermissionsAllow: String { return self._s[3627]! } - public var ReportPeer_ReasonCopyright: String { return self._s[3628]! } - public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3629]! } - public var WallpaperPreview_Pattern: String { return self._s[3630]! } - public var Paint_Duplicate: String { return self._s[3631]! } - public var Passport_Address_Country: String { return self._s[3632]! } - public var Notification_RenamedChannel: String { return self._s[3634]! } - public var ChatList_Context_Unmute: String { return self._s[3635]! } - public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3636]! } - public var Group_MessagePhotoUpdated: String { return self._s[3637]! } - public var Channel_BanUser_PermissionSendMedia: String { return self._s[3638]! } - public var Conversation_ContextMenuBan: String { return self._s[3639]! } - public var TwoStepAuth_EmailSent: String { return self._s[3640]! } - public var MessagePoll_NoVotes: String { return self._s[3641]! } - public var Wallet_Send_ErrorNotEnoughFundsTitle: String { return self._s[3642]! } - public var Passport_Language_is: String { return self._s[3644]! } - public var PeopleNearby_UsersEmpty: String { return self._s[3646]! } - public var Tour_Text5: String { return self._s[3647]! } + public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3619]!, self._r[3619]!, [_0]) + } + public var Wallet_Navigation_Close: String { return self._s[3620]! } + public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3624]! } + public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3626]! } + public var Wallet_Month_GenDecember: String { return self._s[3627]! } + public var Contacts_PermissionsAllow: String { return self._s[3628]! } + public var ReportPeer_ReasonCopyright: String { return self._s[3629]! } + public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3630]! } + public var WallpaperPreview_Pattern: String { return self._s[3631]! } + public var Paint_Duplicate: String { return self._s[3632]! } + public var Passport_Address_Country: String { return self._s[3633]! } + public var Notification_RenamedChannel: String { return self._s[3635]! } + public var ChatList_Context_Unmute: String { return self._s[3636]! } + public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3637]! } + public var Group_MessagePhotoUpdated: String { return self._s[3638]! } + public var Channel_BanUser_PermissionSendMedia: String { return self._s[3639]! } + public var Conversation_ContextMenuBan: String { return self._s[3640]! } + public var TwoStepAuth_EmailSent: String { return self._s[3641]! } + public var MessagePoll_NoVotes: String { return self._s[3642]! } + public var Wallet_Send_ErrorNotEnoughFundsTitle: String { return self._s[3643]! } + public var Passport_Language_is: String { return self._s[3645]! } + public var PeopleNearby_UsersEmpty: String { return self._s[3647]! } + public var Tour_Text5: String { return self._s[3648]! } public func Call_GroupFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3650]!, self._r[3650]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3651]!, self._r[3651]!, [_1, _2]) } - public var Undo_SecretChatDeleted: String { return self._s[3651]! } - public var SocksProxySetup_ShareQRCode: String { return self._s[3652]! } + public var Undo_SecretChatDeleted: String { return self._s[3652]! } + public var SocksProxySetup_ShareQRCode: String { return self._s[3653]! } public func VoiceOver_Chat_Size(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3653]!, self._r[3653]!, [_0]) + return formatWithArgumentRanges(self._s[3654]!, self._r[3654]!, [_0]) } - public var Forward_ErrorDisabledForChat: String { return self._s[3654]! } - public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3655]! } - public var Paint_Edit: String { return self._s[3657]! } - public var ScheduledMessages_ReminderNotification: String { return self._s[3659]! } - public var Undo_DeletedGroup: String { return self._s[3661]! } - public var LoginPassword_ForgotPassword: String { return self._s[3662]! } - public var Wallet_WordImport_IncorrectTitle: String { return self._s[3663]! } - public var GroupInfo_GroupNamePlaceholder: String { return self._s[3664]! } + public var Forward_ErrorDisabledForChat: String { return self._s[3655]! } + public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3656]! } + public var Paint_Edit: String { return self._s[3658]! } + public var ScheduledMessages_ReminderNotification: String { return self._s[3660]! } + public var Undo_DeletedGroup: String { return self._s[3662]! } + public var LoginPassword_ForgotPassword: String { return self._s[3663]! } + public var Wallet_WordImport_IncorrectTitle: String { return self._s[3664]! } + public var GroupInfo_GroupNamePlaceholder: String { return self._s[3665]! } public func Notification_Kicked(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3665]!, self._r[3665]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3666]!, self._r[3666]!, [_0, _1]) } - public var AppWallet_TransactionInfo_FeeInfoURL: String { return self._s[3666]! } - public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3667]! } - public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3668]! } - public var Passport_Language_uz: String { return self._s[3669]! } - public var Conversation_PinMessageAlertGroup: String { return self._s[3670]! } - public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3671]! } - public var Map_StopLiveLocation: String { return self._s[3673]! } - public var VoiceOver_MessageContextSend: String { return self._s[3675]! } - public var PasscodeSettings_Help: String { return self._s[3676]! } - public var NotificationsSound_Input: String { return self._s[3677]! } - public var Share_Title: String { return self._s[3680]! } - public var LogoutOptions_Title: String { return self._s[3681]! } - public var Wallet_Send_AddressText: String { return self._s[3682]! } - public var Login_TermsOfServiceAgree: String { return self._s[3683]! } - public var Compose_NewEncryptedChatTitle: String { return self._s[3684]! } - public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3685]! } - public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3686]! } - public var EnterPasscode_EnterTitle: String { return self._s[3687]! } + public var AppWallet_TransactionInfo_FeeInfoURL: String { return self._s[3667]! } + public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3668]! } + public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3669]! } + public var Passport_Language_uz: String { return self._s[3670]! } + public var Conversation_PinMessageAlertGroup: String { return self._s[3671]! } + public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3672]! } + public var Map_StopLiveLocation: String { return self._s[3674]! } + public var VoiceOver_MessageContextSend: String { return self._s[3676]! } + public var PasscodeSettings_Help: String { return self._s[3677]! } + public var NotificationsSound_Input: String { return self._s[3678]! } + public var Share_Title: String { return self._s[3681]! } + public var LogoutOptions_Title: String { return self._s[3682]! } + public var Wallet_Send_AddressText: String { return self._s[3683]! } + public var Login_TermsOfServiceAgree: String { return self._s[3684]! } + public var Compose_NewEncryptedChatTitle: String { return self._s[3685]! } + public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3686]! } + public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3687]! } + public var EnterPasscode_EnterTitle: String { return self._s[3688]! } public func Call_PrivacyErrorMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3688]!, self._r[3688]!, [_0]) + return formatWithArgumentRanges(self._s[3689]!, self._r[3689]!, [_0]) } - public var Settings_CopyPhoneNumber: String { return self._s[3689]! } - public var Conversation_AddToContacts: String { return self._s[3690]! } + public var Settings_CopyPhoneNumber: String { return self._s[3690]! } + public var Conversation_AddToContacts: String { return self._s[3691]! } public func VoiceOver_Chat_ReplyFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3691]!, self._r[3691]!, [_0]) + return formatWithArgumentRanges(self._s[3692]!, self._r[3692]!, [_0]) } - public var NotificationsSound_Keys: String { return self._s[3692]! } + public var NotificationsSound_Keys: String { return self._s[3693]! } public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3693]!, self._r[3693]!, [_0]) + return formatWithArgumentRanges(self._s[3694]!, self._r[3694]!, [_0]) } - public var Notification_MessageLifetime1w: String { return self._s[3694]! } - public var Message_Video: String { return self._s[3695]! } - public var AutoDownloadSettings_CellularTitle: String { return self._s[3696]! } + public var Notification_MessageLifetime1w: String { return self._s[3695]! } + public var Message_Video: String { return self._s[3696]! } + public var AutoDownloadSettings_CellularTitle: String { return self._s[3697]! } public func PUSH_CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3697]!, self._r[3697]!, [_1]) + return formatWithArgumentRanges(self._s[3698]!, self._r[3698]!, [_1]) } - public var Wallet_Receive_AmountInfo: String { return self._s[3700]! } + public var Wallet_Receive_AmountInfo: String { return self._s[3701]! } public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3701]!, self._r[3701]!, [_0]) - } - public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3702]!, self._r[3702]!, [_0]) } - public var Passport_Language_mk: String { return self._s[3703]! } - public func Wallet_Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3704]!, self._r[3704]!, [_1, _2, _3]) + public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3703]!, self._r[3703]!, [_0]) } - public var CreatePoll_CancelConfirmation: String { return self._s[3705]! } - public var MessagePoll_LabelAnonymousQuiz: String { return self._s[3706]! } - public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3708]! } - public var PrivacyPolicy_Decline: String { return self._s[3709]! } - public var Passport_Identity_DoesNotExpire: String { return self._s[3710]! } - public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3711]! } - public var AuthSessions_AddDeviceIntro_Action: String { return self._s[3712]! } - public var Permissions_SiriAllow_v0: String { return self._s[3714]! } - public var Wallet_Month_ShortAugust: String { return self._s[3715]! } - public var Appearance_ThemeCarouselNight: String { return self._s[3716]! } + public var Passport_Language_mk: String { return self._s[3704]! } + public func Wallet_Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3705]!, self._r[3705]!, [_1, _2, _3]) + } + public var CreatePoll_CancelConfirmation: String { return self._s[3706]! } + public var MessagePoll_LabelAnonymousQuiz: String { return self._s[3707]! } + public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3709]! } + public var PrivacyPolicy_Decline: String { return self._s[3710]! } + public var Passport_Identity_DoesNotExpire: String { return self._s[3711]! } + public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3712]! } + public var AuthSessions_AddDeviceIntro_Action: String { return self._s[3713]! } + public var Permissions_SiriAllow_v0: String { return self._s[3715]! } + public var Wallet_Month_ShortAugust: String { return self._s[3716]! } + public var Appearance_ThemeCarouselNight: String { return self._s[3717]! } public func LOCAL_CHAT_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3717]!, self._r[3717]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3718]!, self._r[3718]!, [_1, "\(_2)"]) } public func Notification_RenamedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3718]!, self._r[3718]!, [_0]) + return formatWithArgumentRanges(self._s[3719]!, self._r[3719]!, [_0]) } - public var Paint_Regular: String { return self._s[3719]! } - public var ChatSettings_AutoDownloadReset: String { return self._s[3720]! } - public var SocksProxySetup_ShareLink: String { return self._s[3721]! } - public var Wallet_Qr_Title: String { return self._s[3722]! } - public var BlockedUsers_SelectUserTitle: String { return self._s[3723]! } - public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3725]! } - public var Wallet_Settings_Configuration: String { return self._s[3726]! } - public var GroupInfo_InviteByLink: String { return self._s[3727]! } - public var MessageTimer_Custom: String { return self._s[3728]! } - public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3729]! } - public var Conversation_StopQuizConfirmationTitle: String { return self._s[3730]! } - public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3732]! } - public var Conversation_SendMessage_SetReminder: String { return self._s[3733]! } - public var VoiceOver_Chat_Selected: String { return self._s[3734]! } - public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3735]! } - public var Channel_Username_InvalidTaken: String { return self._s[3736]! } - public var Conversation_ClousStorageInfo_Description3: String { return self._s[3737]! } - public var Wallet_WordCheck_TryAgain: String { return self._s[3738]! } - public var Wallet_Info_TransactionPendingHeader: String { return self._s[3739]! } - public var Settings_ChatBackground: String { return self._s[3740]! } - public var Channel_Subscribers_Title: String { return self._s[3741]! } - public var Wallet_Receive_InvoiceUrlHeader: String { return self._s[3742]! } - public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3743]! } - public var Watch_ConnectionDescription: String { return self._s[3744]! } - public var OldChannels_NoticeText: String { return self._s[3747]! } - public var Wallet_Configuration_ApplyErrorTitle: String { return self._s[3748]! } - public var IntentsSettings_SuggestBy: String { return self._s[3750]! } - public var Theme_ThemeChangedText: String { return self._s[3751]! } - public var ChatList_ArchivedChatsTitle: String { return self._s[3752]! } - public var Wallpaper_ResetWallpapers: String { return self._s[3753]! } - public var Wallet_Send_TransactionInProgress: String { return self._s[3754]! } - public var EditProfile_Title: String { return self._s[3755]! } - public var NotificationsSound_Bamboo: String { return self._s[3757]! } - public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3759]! } - public var Login_SmsRequestState2: String { return self._s[3760]! } - public var Passport_Language_ar: String { return self._s[3761]! } + public var Paint_Regular: String { return self._s[3720]! } + public var ChatSettings_AutoDownloadReset: String { return self._s[3721]! } + public var SocksProxySetup_ShareLink: String { return self._s[3722]! } + public var Wallet_Qr_Title: String { return self._s[3723]! } + public var BlockedUsers_SelectUserTitle: String { return self._s[3724]! } + public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3726]! } + public var Wallet_Settings_Configuration: String { return self._s[3727]! } + public var GroupInfo_InviteByLink: String { return self._s[3728]! } + public var MessageTimer_Custom: String { return self._s[3729]! } + public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3730]! } + public var Conversation_StopQuizConfirmationTitle: String { return self._s[3731]! } + public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3733]! } + public var Conversation_SendMessage_SetReminder: String { return self._s[3734]! } + public var VoiceOver_Chat_Selected: String { return self._s[3735]! } + public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3736]! } + public var Channel_Username_InvalidTaken: String { return self._s[3737]! } + public var Conversation_ClousStorageInfo_Description3: String { return self._s[3738]! } + public var Wallet_WordCheck_TryAgain: String { return self._s[3739]! } + public var Wallet_Info_TransactionPendingHeader: String { return self._s[3740]! } + public var Settings_ChatBackground: String { return self._s[3741]! } + public var Channel_Subscribers_Title: String { return self._s[3742]! } + public var Wallet_Receive_InvoiceUrlHeader: String { return self._s[3743]! } + public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3744]! } + public var Watch_ConnectionDescription: String { return self._s[3745]! } + public var OldChannels_NoticeText: String { return self._s[3748]! } + public var Wallet_Configuration_ApplyErrorTitle: String { return self._s[3749]! } + public var IntentsSettings_SuggestBy: String { return self._s[3751]! } + public var Theme_ThemeChangedText: String { return self._s[3752]! } + public var ChatList_ArchivedChatsTitle: String { return self._s[3753]! } + public var Wallpaper_ResetWallpapers: String { return self._s[3754]! } + public var Wallet_Send_TransactionInProgress: String { return self._s[3755]! } + public var EditProfile_Title: String { return self._s[3756]! } + public var NotificationsSound_Bamboo: String { return self._s[3758]! } + public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3760]! } + public var Login_SmsRequestState2: String { return self._s[3761]! } + public var Passport_Language_ar: String { return self._s[3762]! } public func Message_AuthorPinnedGame(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3762]!, self._r[3762]!, [_0]) + return formatWithArgumentRanges(self._s[3763]!, self._r[3763]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3763]! } - public var Wallet_Created_Text: String { return self._s[3764]! } - public var Conversation_MessageDialogEdit: String { return self._s[3766]! } - public var Wallet_Created_Proceed: String { return self._s[3767]! } - public var Wallet_Words_Done: String { return self._s[3768]! } - public var VoiceOver_Media_PlaybackPause: String { return self._s[3769]! } + public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3764]! } + public var Wallet_Created_Text: String { return self._s[3765]! } + public var Conversation_MessageDialogEdit: String { return self._s[3767]! } + public var Wallet_Created_Proceed: String { return self._s[3768]! } + public var Wallet_Words_Done: String { return self._s[3769]! } + public var VoiceOver_Media_PlaybackPause: String { return self._s[3770]! } public func PUSH_AUTH_UNKNOWN(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3770]!, self._r[3770]!, [_1]) + return formatWithArgumentRanges(self._s[3771]!, self._r[3771]!, [_1]) } - public var Common_Close: String { return self._s[3771]! } - public var GroupInfo_PublicLink: String { return self._s[3772]! } - public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3773]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3774]! } + public var Common_Close: String { return self._s[3772]! } + public var GroupInfo_PublicLink: String { return self._s[3773]! } + public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3774]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3775]! } public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3778]!, self._r[3778]!, [_0]) + return formatWithArgumentRanges(self._s[3779]!, self._r[3779]!, [_0]) } - public var UserInfo_About_Placeholder: String { return self._s[3779]! } + public var UserInfo_About_Placeholder: String { return self._s[3780]! } public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3780]!, self._r[3780]!, [_0]) + return formatWithArgumentRanges(self._s[3781]!, self._r[3781]!, [_0]) } - public var GroupInfo_Permissions_SectionTitle: String { return self._s[3781]! } - public var Channel_Info_Banned: String { return self._s[3783]! } + public var GroupInfo_Permissions_SectionTitle: String { return self._s[3782]! } + public var Channel_Info_Banned: String { return self._s[3784]! } public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3784]!, self._r[3784]!, [_0]) + return formatWithArgumentRanges(self._s[3785]!, self._r[3785]!, [_0]) } - public var Appearance_Other: String { return self._s[3785]! } - public var Passport_Language_my: String { return self._s[3786]! } - public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3787]! } + public var Appearance_Other: String { return self._s[3786]! } + public var Passport_Language_my: String { return self._s[3787]! } + public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3788]! } public func Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3788]!, self._r[3788]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3789]!, self._r[3789]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3789]! } - public var IntentsSettings_SuggestedAndSpotlightChatsInfo: String { return self._s[3790]! } - public var Preview_CopyAddress: String { return self._s[3791]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3790]! } + public var IntentsSettings_SuggestedAndSpotlightChatsInfo: String { return self._s[3791]! } + public var Preview_CopyAddress: String { return self._s[3792]! } public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3792]!, self._r[3792]!, [_0]) + return formatWithArgumentRanges(self._s[3793]!, self._r[3793]!, [_0]) } - public var KeyCommand_JumpToPreviousChat: String { return self._s[3793]! } - public var UserInfo_BotSettings: String { return self._s[3794]! } - public var LiveLocation_MenuStopAll: String { return self._s[3796]! } - public var Passport_PasswordCreate: String { return self._s[3797]! } - public var StickerSettings_MaskContextInfo: String { return self._s[3798]! } - public var Message_PinnedLocationMessage: String { return self._s[3799]! } - public var Map_Satellite: String { return self._s[3800]! } - public var Watch_Message_Unsupported: String { return self._s[3801]! } - public var Username_TooManyPublicUsernamesError: String { return self._s[3802]! } - public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3803]! } + public var KeyCommand_JumpToPreviousChat: String { return self._s[3794]! } + public var UserInfo_BotSettings: String { return self._s[3795]! } + public var LiveLocation_MenuStopAll: String { return self._s[3797]! } + public var Passport_PasswordCreate: String { return self._s[3798]! } + public var StickerSettings_MaskContextInfo: String { return self._s[3799]! } + public var Message_PinnedLocationMessage: String { return self._s[3800]! } + public var Map_Satellite: String { return self._s[3801]! } + public var Watch_Message_Unsupported: String { return self._s[3802]! } + public var Username_TooManyPublicUsernamesError: String { return self._s[3803]! } + public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3804]! } public func Notification_PinnedTextMessage(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3804]!, self._r[3804]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3805]!, self._r[3805]!, [_0, _1]) } public func Conversation_OpenBotLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3805]!, self._r[3805]!, [_0]) + return formatWithArgumentRanges(self._s[3806]!, self._r[3806]!, [_0]) } - public var Wallet_WordImport_Continue: String { return self._s[3806]! } + public var Wallet_WordImport_Continue: String { return self._s[3807]! } public func TwoFactorSetup_EmailVerification_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3807]!, self._r[3807]!, [_0]) + return formatWithArgumentRanges(self._s[3808]!, self._r[3808]!, [_0]) } - public var Notifications_ChannelNotificationsHelp: String { return self._s[3808]! } - public var Privacy_Calls_P2PContacts: String { return self._s[3809]! } - public var NotificationsSound_None: String { return self._s[3810]! } - public var Wallet_TransactionInfo_StorageFeeHeader: String { return self._s[3811]! } - public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3813]! } - public var AccessDenied_VoiceMicrophone: String { return self._s[3814]! } + public var Notifications_ChannelNotificationsHelp: String { return self._s[3809]! } + public var Privacy_Calls_P2PContacts: String { return self._s[3810]! } + public var NotificationsSound_None: String { return self._s[3811]! } + public var Wallet_TransactionInfo_StorageFeeHeader: String { return self._s[3812]! } + public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3814]! } + public var AccessDenied_VoiceMicrophone: String { return self._s[3815]! } public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3815]!, self._r[3815]!, [_1]) + return formatWithArgumentRanges(self._s[3816]!, self._r[3816]!, [_1]) } - public var Cache_Indexing: String { return self._s[3816]! } - public var DialogList_RecentTitlePeople: String { return self._s[3818]! } - public var DialogList_EncryptionRejected: String { return self._s[3819]! } - public var GroupInfo_Administrators: String { return self._s[3820]! } - public var Passport_ScanPassportHelp: String { return self._s[3821]! } - public var Application_Name: String { return self._s[3822]! } - public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3823]! } - public var Appearance_ThemeCarouselDay: String { return self._s[3825]! } - public var Passport_Identity_TranslationHelp: String { return self._s[3826]! } + public var Cache_Indexing: String { return self._s[3817]! } + public var DialogList_RecentTitlePeople: String { return self._s[3819]! } + public var DialogList_EncryptionRejected: String { return self._s[3820]! } + public var GroupInfo_Administrators: String { return self._s[3821]! } + public var Passport_ScanPassportHelp: String { return self._s[3822]! } + public var Application_Name: String { return self._s[3823]! } + public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3824]! } + public var Appearance_ThemeCarouselDay: String { return self._s[3826]! } + public var Passport_Identity_TranslationHelp: String { return self._s[3827]! } public func VoiceOver_Chat_VideoMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3827]!, self._r[3827]!, [_0]) - } - public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3828]!, self._r[3828]!, [_0]) } - public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { + public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3829]!, self._r[3829]!, [_0]) } - public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3830]! } - public var Privacy_ChatsTitle: String { return self._s[3831]! } - public var DialogList_ClearHistoryConfirmation: String { return self._s[3832]! } - public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3833]! } - public var Watch_Suggestion_HoldOn: String { return self._s[3834]! } - public var Group_EditAdmin_TransferOwnership: String { return self._s[3835]! } - public var WebBrowser_Title: String { return self._s[3836]! } - public var Group_LinkedChannel: String { return self._s[3837]! } - public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3838]! } - public var SocksProxySetup_RequiredCredentials: String { return self._s[3839]! } - public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3840]! } - public var Appearance_TextSize_UseSystem: String { return self._s[3841]! } - public var TwoStepAuth_EmailSkipAlert: String { return self._s[3842]! } - public var ScheduledMessages_RemindersTitle: String { return self._s[3844]! } - public var Channel_Setup_TypePublic: String { return self._s[3846]! } + public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3830]!, self._r[3830]!, [_0]) + } + public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3831]! } + public var Privacy_ChatsTitle: String { return self._s[3832]! } + public var DialogList_ClearHistoryConfirmation: String { return self._s[3833]! } + public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3834]! } + public var Watch_Suggestion_HoldOn: String { return self._s[3835]! } + public var Group_EditAdmin_TransferOwnership: String { return self._s[3836]! } + public var WebBrowser_Title: String { return self._s[3837]! } + public var Group_LinkedChannel: String { return self._s[3838]! } + public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3839]! } + public var SocksProxySetup_RequiredCredentials: String { return self._s[3840]! } + public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3841]! } + public var Appearance_TextSize_UseSystem: String { return self._s[3842]! } + public var TwoStepAuth_EmailSkipAlert: String { return self._s[3843]! } + public var ScheduledMessages_RemindersTitle: String { return self._s[3845]! } + public var Channel_Setup_TypePublic: String { return self._s[3847]! } public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3847]!, self._r[3847]!, [_0]) + return formatWithArgumentRanges(self._s[3848]!, self._r[3848]!, [_0]) } - public var Channel_TypeSetup_Title: String { return self._s[3849]! } - public var MessagePoll_ViewResults: String { return self._s[3850]! } - public var Map_OpenInMaps: String { return self._s[3852]! } + public var Channel_TypeSetup_Title: String { return self._s[3850]! } + public var MessagePoll_ViewResults: String { return self._s[3851]! } + public var Map_OpenInMaps: String { return self._s[3853]! } public func PUSH_PINNED_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3853]!, self._r[3853]!, [_1]) + return formatWithArgumentRanges(self._s[3854]!, self._r[3854]!, [_1]) } - public var NotificationsSound_Tremolo: String { return self._s[3855]! } + public var NotificationsSound_Tremolo: String { return self._s[3856]! } public func Date_ChatDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3856]!, self._r[3856]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3857]!, self._r[3857]!, [_1, _2, _3]) } - public var ConversationProfile_UnknownAddMemberError: String { return self._s[3857]! } - public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3858]! } - public var Passport_PasswordHelp: String { return self._s[3859]! } - public var Login_CodeExpiredError: String { return self._s[3860]! } - public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3861]! } - public var Conversation_TitleUnmute: String { return self._s[3862]! } - public var Passport_Identity_ScansHelp: String { return self._s[3863]! } - public var Passport_Language_lo: String { return self._s[3864]! } - public var Camera_FlashAuto: String { return self._s[3865]! } - public var Conversation_OpenBotLinkOpen: String { return self._s[3866]! } - public var Common_Cancel: String { return self._s[3867]! } - public var DialogList_SavedMessagesTooltip: String { return self._s[3868]! } - public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3869]! } - public var Appearance_TintAllColors: String { return self._s[3870]! } + public var ConversationProfile_UnknownAddMemberError: String { return self._s[3858]! } + public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3859]! } + public var Passport_PasswordHelp: String { return self._s[3860]! } + public var Login_CodeExpiredError: String { return self._s[3861]! } + public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3862]! } + public var Conversation_TitleUnmute: String { return self._s[3863]! } + public var Passport_Identity_ScansHelp: String { return self._s[3864]! } + public var Passport_Language_lo: String { return self._s[3865]! } + public var Camera_FlashAuto: String { return self._s[3866]! } + public var Conversation_OpenBotLinkOpen: String { return self._s[3867]! } + public var Common_Cancel: String { return self._s[3868]! } + public var DialogList_SavedMessagesTooltip: String { return self._s[3869]! } + public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3870]! } + public var Appearance_TintAllColors: String { return self._s[3871]! } public func PUSH_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3871]!, self._r[3871]!, [_1]) + return formatWithArgumentRanges(self._s[3872]!, self._r[3872]!, [_1]) } - public var Conversation_ReportSpamConfirmation: String { return self._s[3872]! } - public var ChatSettings_Title: String { return self._s[3874]! } - public var Passport_PasswordReset: String { return self._s[3875]! } - public var SocksProxySetup_TypeNone: String { return self._s[3876]! } - public var EditTheme_Title: String { return self._s[3879]! } - public var PhoneNumberHelp_Help: String { return self._s[3880]! } - public var Checkout_EnterPassword: String { return self._s[3881]! } - public var Share_AuthTitle: String { return self._s[3883]! } - public var Activity_UploadingDocument: String { return self._s[3884]! } - public var State_Connecting: String { return self._s[3885]! } - public var Profile_MessageLifetime1w: String { return self._s[3886]! } - public var Conversation_ContextMenuReport: String { return self._s[3887]! } - public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3888]! } - public var AutoNightTheme_ScheduledTo: String { return self._s[3889]! } + public var Conversation_ReportSpamConfirmation: String { return self._s[3873]! } + public var ChatSettings_Title: String { return self._s[3875]! } + public var Passport_PasswordReset: String { return self._s[3876]! } + public var SocksProxySetup_TypeNone: String { return self._s[3877]! } + public var EditTheme_Title: String { return self._s[3880]! } + public var PhoneNumberHelp_Help: String { return self._s[3881]! } + public var Checkout_EnterPassword: String { return self._s[3882]! } + public var Share_AuthTitle: String { return self._s[3884]! } + public var Activity_UploadingDocument: String { return self._s[3885]! } + public var State_Connecting: String { return self._s[3886]! } + public var Profile_MessageLifetime1w: String { return self._s[3887]! } + public var Conversation_ContextMenuReport: String { return self._s[3888]! } + public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3889]! } + public var AutoNightTheme_ScheduledTo: String { return self._s[3890]! } public func VoiceOver_Chat_AnonymousPollFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3890]!, self._r[3890]!, [_0]) + return formatWithArgumentRanges(self._s[3891]!, self._r[3891]!, [_0]) } - public var AuthSessions_Terminate: String { return self._s[3891]! } - public var Wallet_WordImport_CanNotRemember: String { return self._s[3892]! } - public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3894]! } - public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3895]! } - public var PhotoEditor_Set: String { return self._s[3896]! } - public var EmptyGroupInfo_Title: String { return self._s[3897]! } - public var Login_PadPhoneHelp: String { return self._s[3898]! } - public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3900]! } - public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3902]! } - public var NotificationsSound_Complete: String { return self._s[3903]! } - public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3904]! } - public var Group_Info_AdminLog: String { return self._s[3905]! } - public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3906]! } + public var AuthSessions_Terminate: String { return self._s[3892]! } + public var Wallet_WordImport_CanNotRemember: String { return self._s[3893]! } + public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3895]! } + public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3896]! } + public var PhotoEditor_Set: String { return self._s[3897]! } + public var EmptyGroupInfo_Title: String { return self._s[3898]! } + public var Login_PadPhoneHelp: String { return self._s[3899]! } + public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3901]! } + public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3903]! } + public var NotificationsSound_Complete: String { return self._s[3904]! } + public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3905]! } + public var Group_Info_AdminLog: String { return self._s[3906]! } + public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3907]! } public func Wallet_Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3907]!, self._r[3907]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3908]!, self._r[3908]!, [_1, _2, _3]) } - public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3908]! } - public var Group_Location_CreateInThisPlace: String { return self._s[3910]! } - public var Conversation_Admin: String { return self._s[3911]! } - public var Conversation_GifTooltip: String { return self._s[3912]! } - public var Passport_NotLoggedInMessage: String { return self._s[3913]! } + public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3909]! } + public var Group_Location_CreateInThisPlace: String { return self._s[3911]! } + public var Conversation_Admin: String { return self._s[3912]! } + public var Conversation_GifTooltip: String { return self._s[3913]! } + public var Passport_NotLoggedInMessage: String { return self._s[3914]! } public func AutoDownloadSettings_OnFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3915]!, self._r[3915]!, [_0]) + return formatWithArgumentRanges(self._s[3916]!, self._r[3916]!, [_0]) } - public var Profile_MessageLifetimeForever: String { return self._s[3916]! } - public var SharedMedia_EmptyTitle: String { return self._s[3918]! } - public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3920]! } - public var Username_Help: String { return self._s[3921]! } - public var DialogList_LanguageTooltip: String { return self._s[3923]! } - public var Map_LoadError: String { return self._s[3924]! } - public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3925]! } - public var Channel_AdminLog_AddMembers: String { return self._s[3926]! } - public var ArchivedChats_IntroTitle2: String { return self._s[3927]! } - public var Notification_Exceptions_NewException: String { return self._s[3928]! } - public var TwoStepAuth_EmailTitle: String { return self._s[3929]! } - public var WatchRemote_AlertText: String { return self._s[3930]! } + public var Profile_MessageLifetimeForever: String { return self._s[3917]! } + public var SharedMedia_EmptyTitle: String { return self._s[3919]! } + public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3921]! } + public var Username_Help: String { return self._s[3922]! } + public var DialogList_LanguageTooltip: String { return self._s[3924]! } + public var Map_LoadError: String { return self._s[3925]! } + public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3926]! } + public var Channel_AdminLog_AddMembers: String { return self._s[3927]! } + public var ArchivedChats_IntroTitle2: String { return self._s[3928]! } + public var Notification_Exceptions_NewException: String { return self._s[3929]! } + public var TwoStepAuth_EmailTitle: String { return self._s[3930]! } + public var WatchRemote_AlertText: String { return self._s[3931]! } public func Wallet_Send_ConfirmationText(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3931]!, self._r[3931]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3932]!, self._r[3932]!, [_1, _2, _3]) } - public var ChatSettings_ConnectionType_Title: String { return self._s[3935]! } - public var WebBrowser_DefaultBrowser: String { return self._s[3936]! } + public var ChatSettings_ConnectionType_Title: String { return self._s[3936]! } + public var WebBrowser_DefaultBrowser: String { return self._s[3937]! } public func Settings_CheckPhoneNumberTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3937]!, self._r[3937]!, [_0]) + return formatWithArgumentRanges(self._s[3938]!, self._r[3938]!, [_0]) } - public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3938]! } - public var Passport_Address_CountryPlaceholder: String { return self._s[3939]! } + public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3939]! } + public var Passport_Address_CountryPlaceholder: String { return self._s[3940]! } public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3940]!, self._r[3940]!, [_0]) + return formatWithArgumentRanges(self._s[3941]!, self._r[3941]!, [_0]) } public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3941]!, self._r[3941]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3942]!, self._r[3942]!, [_1, _2, _3]) } - public var Group_AdminLog_EmptyText: String { return self._s[3942]! } - public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3943]! } - public var Conversation_PrivateChannelTooltip: String { return self._s[3945]! } - public var Wallet_Created_ExportErrorText: String { return self._s[3946]! } - public var ChatList_UndoArchiveText1: String { return self._s[3947]! } - public var AccessDenied_VideoMicrophone: String { return self._s[3948]! } - public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3949]! } - public var Cache_ClearNone: String { return self._s[3950]! } - public var SocksProxySetup_FailedToConnect: String { return self._s[3951]! } - public var Permissions_NotificationsTitle_v0: String { return self._s[3952]! } + public var Group_AdminLog_EmptyText: String { return self._s[3943]! } + public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3944]! } + public var Conversation_PrivateChannelTooltip: String { return self._s[3946]! } + public var Wallet_Created_ExportErrorText: String { return self._s[3947]! } + public var ChatList_UndoArchiveText1: String { return self._s[3948]! } + public var AccessDenied_VideoMicrophone: String { return self._s[3949]! } + public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3950]! } + public var Cache_ClearNone: String { return self._s[3951]! } + public var SocksProxySetup_FailedToConnect: String { return self._s[3952]! } + public var Permissions_NotificationsTitle_v0: String { return self._s[3953]! } public func Channel_AdminLog_MessageEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3953]!, self._r[3953]!, [_0]) + return formatWithArgumentRanges(self._s[3954]!, self._r[3954]!, [_0]) } - public var Passport_Identity_Country: String { return self._s[3954]! } + public var Passport_Identity_Country: String { return self._s[3955]! } public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3955]!, self._r[3955]!, [_0]) - } - public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3956]!, self._r[3956]!, [_0]) } - public var Exceptions_AddToExceptions: String { return self._s[3957]! } - public var AccessDenied_Settings: String { return self._s[3958]! } - public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3959]! } - public var Month_ShortMay: String { return self._s[3960]! } - public var Compose_NewGroup: String { return self._s[3962]! } - public var Group_Setup_TypePrivate: String { return self._s[3964]! } - public var Login_PadPhoneHelpTitle: String { return self._s[3966]! } - public var Appearance_ThemeDayClassic: String { return self._s[3967]! } - public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3968]! } - public var AutoDownloadSettings_OffForAll: String { return self._s[3969]! } - public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3970]! } - public var Conversation_typing: String { return self._s[3972]! } - public var Undo_ScheduledMessagesCleared: String { return self._s[3973]! } - public var Paint_Masks: String { return self._s[3974]! } - public var Contacts_DeselectAll: String { return self._s[3975]! } - public func Wallet_Updated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3976]!, self._r[3976]!, [_0]) + public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3957]!, self._r[3957]!, [_0]) } - public var CreatePoll_MultipleChoiceQuizAlert: String { return self._s[3977]! } - public var Username_InvalidTaken: String { return self._s[3978]! } - public var Call_StatusNoAnswer: String { return self._s[3979]! } - public var TwoStepAuth_EmailAddSuccess: String { return self._s[3980]! } - public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3981]! } - public var Passport_Identity_Selfie: String { return self._s[3982]! } - public var Login_InfoLastNamePlaceholder: String { return self._s[3983]! } - public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3984]! } - public var Conversation_ClearSecretHistory: String { return self._s[3985]! } - public var PeopleNearby_Description: String { return self._s[3987]! } - public var NetworkUsageSettings_Title: String { return self._s[3988]! } - public var Your_cards_security_code_is_invalid: String { return self._s[3990]! } + public var Exceptions_AddToExceptions: String { return self._s[3958]! } + public var AccessDenied_Settings: String { return self._s[3959]! } + public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3960]! } + public var Month_ShortMay: String { return self._s[3961]! } + public var Compose_NewGroup: String { return self._s[3963]! } + public var Group_Setup_TypePrivate: String { return self._s[3965]! } + public var Login_PadPhoneHelpTitle: String { return self._s[3967]! } + public var Appearance_ThemeDayClassic: String { return self._s[3968]! } + public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3969]! } + public var AutoDownloadSettings_OffForAll: String { return self._s[3970]! } + public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3971]! } + public var Conversation_typing: String { return self._s[3973]! } + public var Undo_ScheduledMessagesCleared: String { return self._s[3974]! } + public var Paint_Masks: String { return self._s[3975]! } + public var Contacts_DeselectAll: String { return self._s[3976]! } + public func Wallet_Updated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3977]!, self._r[3977]!, [_0]) + } + public var CreatePoll_MultipleChoiceQuizAlert: String { return self._s[3978]! } + public var Username_InvalidTaken: String { return self._s[3979]! } + public var Call_StatusNoAnswer: String { return self._s[3980]! } + public var TwoStepAuth_EmailAddSuccess: String { return self._s[3981]! } + public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3982]! } + public var Passport_Identity_Selfie: String { return self._s[3983]! } + public var Login_InfoLastNamePlaceholder: String { return self._s[3984]! } + public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3985]! } + public var Conversation_ClearSecretHistory: String { return self._s[3986]! } + public var PeopleNearby_Description: String { return self._s[3988]! } + public var NetworkUsageSettings_Title: String { return self._s[3989]! } + public var Your_cards_security_code_is_invalid: String { return self._s[3991]! } public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3992]!, self._r[3992]!, [_0]) + return formatWithArgumentRanges(self._s[3993]!, self._r[3993]!, [_0]) } public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3993]!, self._r[3993]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3994]!, self._r[3994]!, [_1, _2]) } - public var SaveIncomingPhotosSettings_From: String { return self._s[3995]! } - public var VoiceOver_Navigation_Search: String { return self._s[3996]! } - public var Map_LiveLocationTitle: String { return self._s[3997]! } - public var Login_InfoAvatarAdd: String { return self._s[3998]! } - public var Passport_Identity_FilesView: String { return self._s[3999]! } - public var UserInfo_GenericPhoneLabel: String { return self._s[4000]! } - public var Privacy_Calls_NeverAllow: String { return self._s[4001]! } - public var VoiceOver_Chat_File: String { return self._s[4002]! } - public var Wallet_Settings_DeleteWalletInfo: String { return self._s[4003]! } + public var SaveIncomingPhotosSettings_From: String { return self._s[3996]! } + public var VoiceOver_Navigation_Search: String { return self._s[3997]! } + public var Map_LiveLocationTitle: String { return self._s[3998]! } + public var Login_InfoAvatarAdd: String { return self._s[3999]! } + public var Passport_Identity_FilesView: String { return self._s[4000]! } + public var UserInfo_GenericPhoneLabel: String { return self._s[4001]! } + public var Privacy_Calls_NeverAllow: String { return self._s[4002]! } + public var VoiceOver_Chat_File: String { return self._s[4003]! } + public var Wallet_Settings_DeleteWalletInfo: String { return self._s[4004]! } public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4004]!, self._r[4004]!, [_0]) + return formatWithArgumentRanges(self._s[4005]!, self._r[4005]!, [_0]) } - public var ContactInfo_PhoneNumberHidden: String { return self._s[4005]! } - public var TwoStepAuth_ConfirmationText: String { return self._s[4006]! } - public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[4007]! } + public var ContactInfo_PhoneNumberHidden: String { return self._s[4006]! } + public var TwoStepAuth_ConfirmationText: String { return self._s[4007]! } + public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[4008]! } public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4008]!, self._r[4008]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4009]!, self._r[4009]!, [_1, _2, _3]) } - public var Channel_AdminLogFilter_AdminsAll: String { return self._s[4009]! } - public var Wallet_Intro_CreateErrorText: String { return self._s[4010]! } - public var Tour_Title2: String { return self._s[4011]! } - public var Wallet_Sent_ViewWallet: String { return self._s[4012]! } - public var Conversation_FileOpenIn: String { return self._s[4013]! } - public var Checkout_ErrorPrecheckoutFailed: String { return self._s[4014]! } - public var Wallet_Send_ErrorInvalidAddress: String { return self._s[4015]! } - public var Wallpaper_Set: String { return self._s[4016]! } - public var Passport_Identity_Translations: String { return self._s[4018]! } + public var Channel_AdminLogFilter_AdminsAll: String { return self._s[4010]! } + public var Wallet_Intro_CreateErrorText: String { return self._s[4011]! } + public var Tour_Title2: String { return self._s[4012]! } + public var Wallet_Sent_ViewWallet: String { return self._s[4013]! } + public var Conversation_FileOpenIn: String { return self._s[4014]! } + public var Checkout_ErrorPrecheckoutFailed: String { return self._s[4015]! } + public var Wallet_Send_ErrorInvalidAddress: String { return self._s[4016]! } + public var Wallpaper_Set: String { return self._s[4017]! } + public var Passport_Identity_Translations: String { return self._s[4019]! } public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4019]!, self._r[4019]!, [_0]) + return formatWithArgumentRanges(self._s[4020]!, self._r[4020]!, [_0]) } - public var Channel_LeaveChannel: String { return self._s[4020]! } + public var Channel_LeaveChannel: String { return self._s[4021]! } public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4021]!, self._r[4021]!, [_1]) + return formatWithArgumentRanges(self._s[4022]!, self._r[4022]!, [_1]) } - public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[4023]! } - public var PhotoEditor_HighlightsTint: String { return self._s[4024]! } - public var MessagePoll_LabelPoll: String { return self._s[4025]! } - public var Passport_Email_Delete: String { return self._s[4026]! } - public var Conversation_Mute: String { return self._s[4028]! } - public var Channel_AddBotAsAdmin: String { return self._s[4029]! } - public var Channel_AdminLog_CanSendMessages: String { return self._s[4031]! } - public var Wallet_Configuration_BlockchainNameChangedText: String { return self._s[4032]! } - public var ChatSettings_IntentsSettings: String { return self._s[4034]! } - public var Channel_Management_LabelOwner: String { return self._s[4035]! } + public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[4024]! } + public var PhotoEditor_HighlightsTint: String { return self._s[4025]! } + public var MessagePoll_LabelPoll: String { return self._s[4026]! } + public var Passport_Email_Delete: String { return self._s[4027]! } + public var Conversation_Mute: String { return self._s[4029]! } + public var Channel_AddBotAsAdmin: String { return self._s[4030]! } + public var Channel_AdminLog_CanSendMessages: String { return self._s[4032]! } + public var Wallet_Configuration_BlockchainNameChangedText: String { return self._s[4033]! } + public var ChatSettings_IntentsSettings: String { return self._s[4035]! } + public var Channel_Management_LabelOwner: String { return self._s[4036]! } public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4036]!, self._r[4036]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4037]!, self._r[4037]!, [_1, _2]) } - public var Calls_CallTabDescription: String { return self._s[4037]! } - public var Passport_Identity_NativeNameHelp: String { return self._s[4038]! } - public var Common_No: String { return self._s[4039]! } - public var Weekday_Sunday: String { return self._s[4040]! } - public var Notification_Reply: String { return self._s[4041]! } - public var Conversation_ViewMessage: String { return self._s[4042]! } + public var Calls_CallTabDescription: String { return self._s[4038]! } + public var Passport_Identity_NativeNameHelp: String { return self._s[4039]! } + public var Common_No: String { return self._s[4040]! } + public var Weekday_Sunday: String { return self._s[4041]! } + public var Notification_Reply: String { return self._s[4042]! } + public var Conversation_ViewMessage: String { return self._s[4043]! } public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4043]!, self._r[4043]!, [_0]) - } - public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4044]!, self._r[4044]!, [_0]) } + public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4045]!, self._r[4045]!, [_0]) + } public func Wallet_Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4045]!, self._r[4045]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4046]!, self._r[4046]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[4046]! } - public var Wallet_Send_Title: String { return self._s[4047]! } - public var Message_PinnedDocumentMessage: String { return self._s[4048]! } - public var Wallet_Info_RefreshErrorText: String { return self._s[4049]! } - public var DialogList_TabTitle: String { return self._s[4051]! } - public var ChatSettings_AutoPlayTitle: String { return self._s[4052]! } - public var Passport_FieldEmail: String { return self._s[4053]! } - public var Conversation_UnpinMessageAlert: String { return self._s[4054]! } - public var Passport_Address_TypeBankStatement: String { return self._s[4055]! } - public var Wallet_SecureStorageReset_Title: String { return self._s[4056]! } - public var Passport_Identity_ExpiryDate: String { return self._s[4057]! } - public var Privacy_Calls_P2P: String { return self._s[4058]! } + public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[4047]! } + public var Wallet_Send_Title: String { return self._s[4048]! } + public var Message_PinnedDocumentMessage: String { return self._s[4049]! } + public var Wallet_Info_RefreshErrorText: String { return self._s[4050]! } + public var DialogList_TabTitle: String { return self._s[4052]! } + public var ChatSettings_AutoPlayTitle: String { return self._s[4053]! } + public var Passport_FieldEmail: String { return self._s[4054]! } + public var Conversation_UnpinMessageAlert: String { return self._s[4055]! } + public var Passport_Address_TypeBankStatement: String { return self._s[4056]! } + public var Wallet_SecureStorageReset_Title: String { return self._s[4057]! } + public var Passport_Identity_ExpiryDate: String { return self._s[4058]! } + public var Privacy_Calls_P2P: String { return self._s[4059]! } public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4060]!, self._r[4060]!, [_0]) + return formatWithArgumentRanges(self._s[4061]!, self._r[4061]!, [_0]) } - public var SocksProxySetup_UseForCallsHelp: String { return self._s[4061]! } + public var SocksProxySetup_UseForCallsHelp: String { return self._s[4062]! } public func PUSH_CHAT_ALBUM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4062]!, self._r[4062]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4063]!, self._r[4063]!, [_1, _2]) } - public var Stickers_ClearRecent: String { return self._s[4063]! } - public var EnterPasscode_ChangeTitle: String { return self._s[4064]! } - public var TwoFactorSetup_Email_Title: String { return self._s[4065]! } - public var Passport_InfoText: String { return self._s[4066]! } - public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[4067]! } + public var Stickers_ClearRecent: String { return self._s[4064]! } + public var EnterPasscode_ChangeTitle: String { return self._s[4065]! } + public var TwoFactorSetup_Email_Title: String { return self._s[4066]! } + public var Passport_InfoText: String { return self._s[4067]! } + public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[4068]! } public func Login_InvalidPhoneEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4068]!, self._r[4068]!, [_0]) + return formatWithArgumentRanges(self._s[4069]!, self._r[4069]!, [_0]) } public func Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4069]!, self._r[4069]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4070]!, self._r[4070]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[4070]! } - public var ScheduledMessages_PollUnavailable: String { return self._s[4071]! } - public var VoiceOver_Navigation_Compose: String { return self._s[4072]! } - public var Passport_Identity_EditDriversLicense: String { return self._s[4073]! } - public var Conversation_TapAndHoldToRecord: String { return self._s[4075]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[4076]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[4071]! } + public var ScheduledMessages_PollUnavailable: String { return self._s[4072]! } + public var VoiceOver_Navigation_Compose: String { return self._s[4073]! } + public var Passport_Identity_EditDriversLicense: String { return self._s[4074]! } + public var Conversation_TapAndHoldToRecord: String { return self._s[4076]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[4077]! } public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4077]!, self._r[4077]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4078]!, self._r[4078]!, [_1, _2]) } - public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[4079]! } - public var ChatSettings_OpenLinksIn: String { return self._s[4080]! } - public var Map_HomeAndWorkTitle: String { return self._s[4081]! } + public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[4080]! } + public var ChatSettings_OpenLinksIn: String { return self._s[4081]! } + public var Map_HomeAndWorkTitle: String { return self._s[4082]! } public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4083]!, self._r[4083]!, [_0]) + return formatWithArgumentRanges(self._s[4084]!, self._r[4084]!, [_0]) } - public var DialogList_Unread: String { return self._s[4084]! } + public var DialogList_Unread: String { return self._s[4085]! } public func PUSH_CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4085]!, self._r[4085]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4086]!, self._r[4086]!, [_1, _2]) } - public var User_DeletedAccount: String { return self._s[4086]! } - public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[4087]! } + public var User_DeletedAccount: String { return self._s[4087]! } + public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[4088]! } public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4088]!, self._r[4088]!, [_0]) + return formatWithArgumentRanges(self._s[4089]!, self._r[4089]!, [_0]) } - public var UserInfo_NotificationsDefault: String { return self._s[4089]! } - public var SharedMedia_CategoryMedia: String { return self._s[4090]! } - public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[4091]! } - public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[4092]! } - public var Watch_ChatList_Compose: String { return self._s[4093]! } - public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[4094]! } - public var AutoDownloadSettings_Delimeter: String { return self._s[4095]! } - public var Watch_Microphone_Access: String { return self._s[4096]! } - public var Group_Setup_HistoryHeader: String { return self._s[4097]! } - public var Map_SetThisLocation: String { return self._s[4098]! } - public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[4099]! } - public var Activity_UploadingPhoto: String { return self._s[4100]! } - public var Conversation_Edit: String { return self._s[4102]! } - public var Group_ErrorSendRestrictedMedia: String { return self._s[4103]! } - public var Login_TermsOfServiceDecline: String { return self._s[4104]! } - public var Message_PinnedContactMessage: String { return self._s[4105]! } + public var UserInfo_NotificationsDefault: String { return self._s[4090]! } + public var SharedMedia_CategoryMedia: String { return self._s[4091]! } + public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[4092]! } + public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[4093]! } + public var Watch_ChatList_Compose: String { return self._s[4094]! } + public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[4095]! } + public var AutoDownloadSettings_Delimeter: String { return self._s[4096]! } + public var Watch_Microphone_Access: String { return self._s[4097]! } + public var Group_Setup_HistoryHeader: String { return self._s[4098]! } + public var Map_SetThisLocation: String { return self._s[4099]! } + public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[4100]! } + public var Activity_UploadingPhoto: String { return self._s[4101]! } + public var Conversation_Edit: String { return self._s[4103]! } + public var Group_ErrorSendRestrictedMedia: String { return self._s[4104]! } + public var Login_TermsOfServiceDecline: String { return self._s[4105]! } + public var Message_PinnedContactMessage: String { return self._s[4106]! } public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4106]!, self._r[4106]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4107]!, self._r[4107]!, [_1, _2]) } public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4107]!, self._r[4107]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[4108]!, self._r[4108]!, [_1, _2, _3, _4, _5]) } - public var Appearance_LargeEmoji: String { return self._s[4108]! } - public var TwoStepAuth_AdditionalPassword: String { return self._s[4110]! } - public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[4111]! } + public var Appearance_LargeEmoji: String { return self._s[4109]! } + public var TwoStepAuth_AdditionalPassword: String { return self._s[4111]! } + public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[4112]! } public func PUSH_CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4112]!, self._r[4112]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4113]!, self._r[4113]!, [_1, _2]) } - public var Passport_Phone_EnterOtherNumber: String { return self._s[4113]! } - public var Message_PinnedPhotoMessage: String { return self._s[4114]! } - public var Passport_FieldPhone: String { return self._s[4115]! } - public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[4116]! } - public var ChatSettings_AutoPlayGifs: String { return self._s[4117]! } - public var InfoPlist_NSCameraUsageDescription: String { return self._s[4119]! } - public var Conversation_Call: String { return self._s[4120]! } - public var Common_TakePhoto: String { return self._s[4122]! } - public var Group_EditAdmin_RankTitle: String { return self._s[4123]! } - public var Wallet_Receive_CommentHeader: String { return self._s[4124]! } - public var Channel_NotificationLoading: String { return self._s[4125]! } + public var Passport_Phone_EnterOtherNumber: String { return self._s[4114]! } + public var Message_PinnedPhotoMessage: String { return self._s[4115]! } + public var Passport_FieldPhone: String { return self._s[4116]! } + public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[4117]! } + public var ChatSettings_AutoPlayGifs: String { return self._s[4118]! } + public var InfoPlist_NSCameraUsageDescription: String { return self._s[4120]! } + public var Conversation_Call: String { return self._s[4121]! } + public var Common_TakePhoto: String { return self._s[4123]! } + public var Group_EditAdmin_RankTitle: String { return self._s[4124]! } + public var Wallet_Receive_CommentHeader: String { return self._s[4125]! } + public var Channel_NotificationLoading: String { return self._s[4126]! } public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4126]!, self._r[4126]!, [_0]) - } - public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4127]!, self._r[4127]!, [_0]) } + public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4128]!, self._r[4128]!, [_0]) + } public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4128]!, self._r[4128]!, [_1]) + return formatWithArgumentRanges(self._s[4129]!, self._r[4129]!, [_1]) } - public var Permissions_SiriTitle_v0: String { return self._s[4129]! } + public var Permissions_SiriTitle_v0: String { return self._s[4130]! } public func VoiceOver_Chat_VoiceMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4130]!, self._r[4130]!, [_0]) - } - public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4131]!, self._r[4131]!, [_0]) } - public var Channel_MessagePhotoRemoved: String { return self._s[4132]! } - public var Wallet_Info_ReceiveGrams: String { return self._s[4133]! } - public var ClearCache_FreeSpace: String { return self._s[4134]! } - public var Common_edit: String { return self._s[4135]! } - public var PrivacySettings_AuthSessions: String { return self._s[4136]! } - public var Month_ShortJune: String { return self._s[4137]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[4138]! } - public var Call_ReportSend: String { return self._s[4139]! } - public var Watch_LastSeen_JustNow: String { return self._s[4140]! } - public var Notifications_MessageNotifications: String { return self._s[4141]! } - public var WallpaperSearch_ColorGreen: String { return self._s[4142]! } - public var BroadcastListInfo_AddRecipient: String { return self._s[4144]! } - public var Group_Status: String { return self._s[4145]! } + public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4132]!, self._r[4132]!, [_0]) + } + public var Channel_MessagePhotoRemoved: String { return self._s[4133]! } + public var Wallet_Info_ReceiveGrams: String { return self._s[4134]! } + public var ClearCache_FreeSpace: String { return self._s[4135]! } + public var Common_edit: String { return self._s[4136]! } + public var PrivacySettings_AuthSessions: String { return self._s[4137]! } + public var Month_ShortJune: String { return self._s[4138]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[4139]! } + public var Call_ReportSend: String { return self._s[4140]! } + public var Watch_LastSeen_JustNow: String { return self._s[4141]! } + public var Notifications_MessageNotifications: String { return self._s[4142]! } + public var WallpaperSearch_ColorGreen: String { return self._s[4143]! } + public var BroadcastListInfo_AddRecipient: String { return self._s[4145]! } + public var Group_Status: String { return self._s[4146]! } public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4146]!, self._r[4146]!, [_0, _1]) + return formatWithArgumentRanges(self._s[4147]!, self._r[4147]!, [_0, _1]) } - public var TextFormat_AddLinkTitle: String { return self._s[4147]! } - public var ShareMenu_ShareTo: String { return self._s[4148]! } - public var Conversation_Moderate_Ban: String { return self._s[4149]! } + public var TextFormat_AddLinkTitle: String { return self._s[4148]! } + public var ShareMenu_ShareTo: String { return self._s[4149]! } + public var Conversation_Moderate_Ban: String { return self._s[4150]! } public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4150]!, self._r[4150]!, [_0]) + return formatWithArgumentRanges(self._s[4151]!, self._r[4151]!, [_0]) } - public var SharedMedia_ViewInChat: String { return self._s[4151]! } - public var Map_LiveLocationFor8Hours: String { return self._s[4152]! } + public var SharedMedia_ViewInChat: String { return self._s[4152]! } + public var Map_LiveLocationFor8Hours: String { return self._s[4153]! } public func PUSH_PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4153]!, self._r[4153]!, [_1]) + return formatWithArgumentRanges(self._s[4154]!, self._r[4154]!, [_1]) } public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4154]!, self._r[4154]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4155]!, self._r[4155]!, [_1, _2]) } public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4156]!, self._r[4156]!, [_0]) + return formatWithArgumentRanges(self._s[4157]!, self._r[4157]!, [_0]) } - public var Map_OpenInHereMaps: String { return self._s[4157]! } - public var Appearance_ReduceMotion: String { return self._s[4158]! } + public var Map_OpenInHereMaps: String { return self._s[4158]! } + public var Appearance_ReduceMotion: String { return self._s[4159]! } public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4159]!, self._r[4159]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4160]!, self._r[4160]!, [_1, _2]) } - public var Channel_Setup_TypePublicHelp: String { return self._s[4160]! } - public var Passport_Identity_EditInternalPassport: String { return self._s[4161]! } - public var PhotoEditor_Skip: String { return self._s[4162]! } - public func MuteExpires_Minutes(_ value: Int32) -> String { + public var Channel_Setup_TypePublicHelp: String { return self._s[4161]! } + public var Passport_Identity_EditInternalPassport: String { return self._s[4162]! } + public var PhotoEditor_Skip: String { return self._s[4163]! } + public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + public func GroupInfo_ShowMoreMembers(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatList_SelectedChats(_ value: Int32) -> String { + public func Call_Minutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortDays(_ value: Int32) -> String { + public func MessageTimer_ShortWeeks(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatList_DeleteConfirmation(_ value: Int32) -> String { + public func LastSeen_MinutesAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortSeconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreExtended(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) - } - public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedGifs(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedPolls(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessagePoll_VotedCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_SharePhoto(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, _2, _1, _3) } public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MuteFor_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedPhotos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Contacts_ImportersCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedContacts(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_ShortMinutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Conversation_StatusOnline(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_UserInfo_Mute(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func InviteText_ContactsCountText(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessagePoll_QuizCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Video(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Passport_Scans(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortWeeks(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_Exceptions(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MessageTimer_Weeks(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortMinutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) - } - public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) - } - public func OldChannels_InactiveWeek(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusSubscribers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendVideo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareVideo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_File(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Generic(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) } public func ForwardedStickers(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) } - public func GroupInfo_ShowMoreMembers(_ value: Int32) -> String { + public func ForwardedPhotos(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_DeletedChats(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_SelectedMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Years(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSimple(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) - } - public func OldChannels_Leave(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PollResults_ShowMore(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) - } - public func OldChannels_InactiveMonth(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func SharedMedia_Link(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MessageTimer_Seconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) - } - public func UserCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAHours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MessageTimer_ShortHours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddMaskCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Seconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusMembers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddStickerCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) - } - public func OldChannels_InactiveYear(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideoMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendItem(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, _0, _1) - } - public func ForwardedFiles(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Contacts_InviteContacts(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Invitation_Members(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Theme_UsersCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_ShortSeconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Months(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Map_ETAMinutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) } public func QuickSend_Photos(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) } - public func LastSeen_MinutesAgo(_ value: Int32) -> String { + public func MessageTimer_Minutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) } - public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { + public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[113 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedAudios(_ value: Int32) -> String { + public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[114 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Hours(_ value: Int32) -> String { + public func Map_ETAMinutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[115 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) } public func MuteFor_Days(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[116 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) } - public func LastSeen_HoursAgo(_ value: Int32) -> String { + public func ChatList_DeleteConfirmation(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[117 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) } - public func AttachmentMenu_SendGif(_ value: Int32) -> String { + public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[118 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortHours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Generic(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Contacts_InviteContacts(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) } public func GroupInfo_ParticipantCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[119 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) + } + public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PollResults_ShowMore(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) } public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[120 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, _1, _2) } - public func StickerPack_StickerCount(_ value: Int32) -> String { + public func MessageTimer_Months(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[121 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) } - public func OldChannels_GroupFormat(_ value: Int32) -> String { + public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func InviteText_ContactsCountText(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[122 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_ShortMinutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_ShareVideo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_SelectedMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Years(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Passport_Scans(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, _0, _1) + } + public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessagePoll_QuizCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func SharedMedia_Video(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) + } + public func OldChannels_InactiveYear(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) + } + public func OldChannels_InactiveWeek(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) + } + public func UserCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_ShortSeconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Weeks(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Theme_UsersCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendItem(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_Exceptions(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortDays(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedFiles(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Contacts_ImportersCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideoMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_SelectedChats(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_SharePhoto(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedGifs(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_AddStickerCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_DeletedChats(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendGif(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) } public func Media_ShareItem(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[123 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Seconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) + } + public func OldChannels_InactiveMonth(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_AddMaskCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessagePoll_VotedCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_File(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_UserInfo_Mute(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Notification_GameScoreExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_StickerCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusOnline(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Seconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusMembers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedLocations(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) + } + public func OldChannels_GroupFormat(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func ForwardedAudios(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LastSeen_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortSeconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, _1, _2) } public func SharedMedia_Photo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[124 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedLocations(_ value: Int32) -> String { + public func OldChannels_Leave(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendVideo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func MessageTimer_ShortMinutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusSubscribers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[113 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedPolls(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[114 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[115 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[116 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Map_ETAHours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[117 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteFor_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[118 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[119 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedContacts(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[120 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[121 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[122 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Link(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[123 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[124 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Invitation_Members(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[125 * 6 + Int(form.rawValue)]!, stringValue) diff --git a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping index 7adbe8a6e4e7f15e6e162ac5d7527016541fb600..0e740b4a155b225542e28dac2235e57e003820bf 100644 GIT binary patch delta 35643 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 Ze&i$wJNrMu*CRVKS;+Xqc)ChC{~u+SEO`I` delta 35728 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 B9ufcm From f2ca7b00efcafed34c1c76821a1c25db6d678480 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Tue, 11 Feb 2020 10:34:00 +0400 Subject: [PATCH 2/4] Various improvements --- NotificationService/Serialization.m | 2 +- Telegram-iOS/Resources/Compass.tgs | Bin 0 -> 11211 bytes Telegram-iOS/Resources/Dice_1.tgs | Bin 0 -> 63935 bytes Telegram-iOS/Resources/Dice_2.tgs | Bin 0 -> 61430 bytes Telegram-iOS/Resources/Dice_3.tgs | Bin 0 -> 64600 bytes Telegram-iOS/Resources/Dice_4.tgs | Bin 0 -> 65388 bytes Telegram-iOS/Resources/Dice_5.tgs | Bin 0 -> 65287 bytes Telegram-iOS/Resources/Dice_6.tgs | Bin 0 -> 65369 bytes Telegram-iOS/en.lproj/Localizable.strings | 19 + .../Sources/AnimatedStickerNode.swift | 27 +- .../Sources/CallListController.swift | 7 +- submodules/Charts/BUCK | 31 + submodules/Charts/Info.plist | 22 + .../Chart Screen/ChartDetailsView.swift | 258 + .../Chart Screen/ChartStackSection.swift | 199 + .../Chart Screen/ChartStackSection.xib | 149 + .../Sources/Chart Screen/ChartView.swift | 158 + .../ChartVisibilityItemView.swift | 95 + .../Chart Screen/ChartVisibilityView.swift | 147 + .../Chart Screen/ChartsDataLoader.swift | 51 + .../ChartsStackViewController.swift | 222 + .../Sources/Chart Screen/RangeChartView.swift | 291 + submodules/Charts/Sources/ChartNode.swift | 48 + .../Charts Reader/ChartsCollection.swift | 91 + .../Charts Reader/ChartsDataManager.swift | 191 + .../Sources/Charts Reader/ChartsError.swift | 14 + .../Sources/Charts Reader/Convert.swift | 42 + submodules/Charts/Sources/Charts.h | 19 + .../Controllers/BaseChartController.swift | 166 + .../GeneralChartComponentController.swift | 328 + .../Lines/BaseLinesChartController.swift | 236 + .../Lines/GeneralLinesChartController.swift | 247 + .../Lines/TwoAxisLinesChartController.swift | 306 + .../PercentChartComponentController.swift | 195 + .../PercentPieChartController.swift | 281 + .../PieChartComponentController.swift | 198 + .../BarsComponentController.swift | 226 + .../DailyBarsChartController.swift | 249 + .../LinesComponentController.swift | 210 + .../StackedBarsChartController.swift | 243 + .../Charts/Renderes/BarChartRenderer.swift | 293 + .../Charts/Renderes/BaseChartRenderer.swift | 116 + .../Renderes/ChartDetailsRenderer.swift | 147 + .../Renderes/HorizontalScalesRenderer.swift | 99 + .../Charts/Renderes/LineBulletsRenerer.swift | 67 + .../Charts/Renderes/LinesChartRenderer.swift | 538 ++ .../Charts/Renderes/PecentChartRenderer.swift | 132 + .../PercentPieAnimationRenderer.swift | 202 + .../Charts/Renderes/PerformanceRenderer.swift | 31 + .../Charts/Renderes/PieChartRenderer.swift | 191 + .../Renderes/VerticalLinesRenderer.swift | 42 + .../Renderes/VerticalScalesRenderer.swift | 162 + .../Sources/Helpers/AnimationController.swift | 178 + .../Charts/Sources/Helpers/Array+Utils.swift | 18 + .../Charts/Sources/Helpers/CGFloat.swift | 17 + .../Sources/Helpers/CGPoint+Extensions.swift | 219 + .../Sources/Helpers/ClosedRange+Utils.swift | 15 + .../Helpers/CustomNavigationController.swift | 19 + .../Sources/Helpers/DisplayLinkService.swift | 114 + .../Sources/Helpers/GlobalHelpers.swift | 12 + .../Helpers/NumberFormatter+Utils.swift | 19 + .../Sources/Helpers/OnePixelConstraint.swift | 17 + .../Helpers/ScalesNumberFormatter.swift | 32 + .../Sources/Helpers/TimeInterval+Utils.swift | 27 + .../Charts/Sources/Helpers/TimeZone.swift | 36 + .../Sources/Helpers/UIColor+Utils.swift | 64 + .../Sources/Helpers/UIImage+Utils.swift | 28 + .../Sources/Helpers/UIImageView+Utils.swift | 24 + .../Sources/Helpers/UILabel+Utils.swift | 37 + .../Sources/Helpers/UIView+Extensions.swift | 57 + .../Charts/Sources/Models/ChartLineData.swift | 76 + .../Charts/Sources/Models/ColorMode.swift | 175 + .../Sources/Models/LinesChartLabel.swift | 25 + .../Sources/Models/LinesSelectionLabel.swift | 15 + .../Sources/ChatListController.swift | 8 +- .../Sources/ChatListSearchContainerNode.swift | 27 +- .../Sources/ContactsController.swift | 7 +- submodules/Display/Display/TabBarNode.swift | 2 +- .../GalleryUI/Sources/GalleryController.swift | 6 +- .../Sources/GalleryControllerNode.swift | 8 +- .../GalleryControllerPresentationState.swift | 11 +- .../Sources/GalleryFooterContentNode.swift | 17 + .../GalleryUI/Sources/GalleryFooterNode.swift | 70 +- .../GalleryUI/Sources/GalleryItemNode.swift | 6 +- .../GalleryUI/Sources/GalleryPagerNode.swift | 16 +- .../Items/ChatAnimationGalleryItem.swift | 4 +- .../Items/ChatDocumentGalleryItem.swift | 4 +- .../Items/ChatExternalFileGalleryItem.swift | 4 +- .../Sources/Items/ChatImageGalleryItem.swift | 4 +- .../Items/UniversalVideoGalleryItem.swift | 91 +- .../ZoomableContentGalleryItemNode.swift | 117 +- .../Sources/InstantImageGalleryItem.swift | 4 +- .../InstantPageGalleryController.swift | 4 +- .../Sources/ItemListPeerActionItem.swift | 19 +- .../Sources/ItemListStickerPackItem.swift | 7 + .../SecureIdDocumentGalleryController.swift | 4 +- .../SecureIdDocumentImageGalleryItem.swift | 4 +- .../Sources/AvatarGalleryController.swift | 4 +- .../Sources/PeerAvatarImageGalleryItem.swift | 4 +- submodules/PeerInfoUI/BUCK | 1 + submodules/PeersNearbyUI/BUCK | 2 + .../Sources/PeersNearbyController.swift | 214 +- .../Sources/PeersNearbyHeaderItem.swift | 37 +- .../Sources/SpecialTabBarIcons.swift | 5 + .../Sources/SettingsController.swift | 8 +- submodules/StatisticsUI/BUCK | 31 + submodules/StatisticsUI/Info.plist | 22 + .../StatisticsUI/Sources/StatisticsUI.h | 19 + .../Sources/StatsController.swift | 351 + .../StatisticsUI/Sources/StatsGraphItem.swift | 205 + .../Sources/StatsOverviewItem.swift | 292 + .../SyncCore/Sources/CachedChannelData.swift | 51 +- .../TextEntitiesMessageAttribute.swift | 5 + submodules/TelegramApi/Sources/Api0.swift | 33 +- submodules/TelegramApi/Sources/Api1.swift | 294 + submodules/TelegramApi/Sources/Api2.swift | 304 +- submodules/TelegramApi/Sources/Api3.swift | 105 +- .../Sources/AccountStateManagementUtils.swift | 9 +- .../TelegramCore/Sources/BankCards.swift | 34 + .../Sources/ChannelStatistics.swift | 424 + submodules/TelegramCore/Sources/JSON.swift | 3 +- .../ManagedSecretChatOutgoingOperations.swift | 4 + .../TelegramCore/Sources/PeersNearby.swift | 101 +- .../TelegramCore/Sources/Serialization.swift | 2 +- .../Sources/StoreMessage_Telegram.swift | 2 + .../TextEntitiesMessageAttribute.swift | 2 + .../Sources/UpdateCachedPeerData.swift | 1 + .../Sources/PresentationStrings.swift | 7882 +++++++++-------- .../Resources/PresentationResourceKey.swift | 2 + .../PresentationResourcesItemList.swift | 12 + .../Sources/PresenceStrings.swift | 20 +- .../Images.xcassets/Chart/Contents.json | 9 + .../Chart/arrow_left.imageset/Contents.json | 12 + .../Chart/arrow_left.imageset/arrow_left.pdf | Bin 0 -> 4081 bytes .../Chart/arrow_right.imageset/Contents.json | 12 + .../arrow_right.imageset/arrow_right.pdf | Bin 0 -> 874 bytes .../Contents.json | 23 + .../selection_frame_dark.pdf | 61 + .../Contents.json | 23 + .../selection_frame_light.pdf | 62 + .../Chat List/Tabs/Holiday/Contents.json | 9 + .../Holiday/IconCalls.imageset/Contents.json | 12 + .../Holiday/IconCalls.imageset/ic_calls.pdf | Bin 0 -> 4945 bytes .../Holiday/IconChats.imageset/Contents.json | 12 + .../IconChats.imageset/ic_messages.pdf | Bin 0 -> 4626 bytes .../IconContacts.imageset/Contents.json | 12 + .../IconContacts.imageset/ic_contacts.pdf | Bin 0 -> 5894 bytes .../IconSettings.imageset/Contents.json | 12 + .../IconSettings.imageset/ic_settings.pdf | Bin 0 -> 4550 bytes .../MakeInvisibleIcon.imageset/Contents.json | 12 + .../ic_stopshowme.pdf | Bin 0 -> 4829 bytes .../MakeVisibleIcon.imageset/Contents.json | 12 + .../MakeVisibleIcon.imageset/ic_showme.pdf | Bin 0 -> 4748 bytes .../SoundOff.imageset/Contents.json | 12 + .../SoundOff.imageset/soundoff (2).pdf | Bin 0 -> 4533 bytes .../SoundOn.imageset/Contents.json | 12 + .../SoundOn.imageset/soundon (2).pdf | Bin 0 -> 4774 bytes .../TelegramUI/ChatBotInfoItem.swift | 2 +- .../TelegramUI/ChatController.swift | 27 + .../ChatControllerInteraction.swift | 2 + .../TelegramUI/ChatHistoryListNode.swift | 23 +- .../ChatMessageAnimatedStickerItemNode.swift | 114 +- .../ChatMessageAttachedContentNode.swift | 3 +- .../ChatMessageBubbleContentNode.swift | 1 + .../ChatMessageBubbleItemNode.swift | 10 +- .../TelegramUI/ChatMessageItem.swift | 4 +- .../ChatMessageTextBubbleContentNode.swift | 5 +- .../ChatRecentActionsControllerNode.swift | 2 + .../ChatScheduleTimeControllerNode.swift | 2 +- .../TelegramUI/GifPaneSearchContentNode.swift | 2 +- .../TelegramUI/ListMessageDateHeader.swift | 1 - .../Resources/PresentationStrings.mapping | Bin 144219 -> 144524 bytes .../Sources/StringWithAppliedEntities.swift | 9 + .../Sources/TelegramAttributes.swift | 1 + .../UrlHandling/Sources/UrlHandling.swift | 7 +- .../Sources/WebSearchGalleryController.swift | 4 +- .../Sources/WebSearchVideoGalleryItem.swift | 4 +- submodules/ffmpeg/gas-preprocessor.pl | 1210 +++ 178 files changed, 16610 insertions(+), 4271 deletions(-) create mode 100644 Telegram-iOS/Resources/Compass.tgs create mode 100644 Telegram-iOS/Resources/Dice_1.tgs create mode 100644 Telegram-iOS/Resources/Dice_2.tgs create mode 100644 Telegram-iOS/Resources/Dice_3.tgs create mode 100644 Telegram-iOS/Resources/Dice_4.tgs create mode 100644 Telegram-iOS/Resources/Dice_5.tgs create mode 100644 Telegram-iOS/Resources/Dice_6.tgs create mode 100644 submodules/Charts/BUCK create mode 100644 submodules/Charts/Info.plist create mode 100644 submodules/Charts/Sources/Chart Screen/ChartDetailsView.swift create mode 100644 submodules/Charts/Sources/Chart Screen/ChartStackSection.swift create mode 100644 submodules/Charts/Sources/Chart Screen/ChartStackSection.xib create mode 100644 submodules/Charts/Sources/Chart Screen/ChartView.swift create mode 100644 submodules/Charts/Sources/Chart Screen/ChartVisibilityItemView.swift create mode 100644 submodules/Charts/Sources/Chart Screen/ChartVisibilityView.swift create mode 100644 submodules/Charts/Sources/Chart Screen/ChartsDataLoader.swift create mode 100644 submodules/Charts/Sources/Chart Screen/ChartsStackViewController.swift create mode 100644 submodules/Charts/Sources/Chart Screen/RangeChartView.swift create mode 100644 submodules/Charts/Sources/ChartNode.swift create mode 100644 submodules/Charts/Sources/Charts Reader/ChartsCollection.swift create mode 100644 submodules/Charts/Sources/Charts Reader/ChartsDataManager.swift create mode 100644 submodules/Charts/Sources/Charts Reader/ChartsError.swift create mode 100644 submodules/Charts/Sources/Charts Reader/Convert.swift create mode 100644 submodules/Charts/Sources/Charts.h create mode 100644 submodules/Charts/Sources/Charts/Controllers/BaseChartController.swift create mode 100644 submodules/Charts/Sources/Charts/Controllers/GeneralChartComponentController.swift create mode 100644 submodules/Charts/Sources/Charts/Controllers/Lines/BaseLinesChartController.swift create mode 100644 submodules/Charts/Sources/Charts/Controllers/Lines/GeneralLinesChartController.swift create mode 100644 submodules/Charts/Sources/Charts/Controllers/Lines/TwoAxisLinesChartController.swift create mode 100644 submodules/Charts/Sources/Charts/Controllers/Percent And Pie/PercentChartComponentController.swift create mode 100644 submodules/Charts/Sources/Charts/Controllers/Percent And Pie/PercentPieChartController.swift create mode 100644 submodules/Charts/Sources/Charts/Controllers/Percent And Pie/PieChartComponentController.swift create mode 100644 submodules/Charts/Sources/Charts/Controllers/Stacked Bars/BarsComponentController.swift create mode 100644 submodules/Charts/Sources/Charts/Controllers/Stacked Bars/DailyBarsChartController.swift create mode 100644 submodules/Charts/Sources/Charts/Controllers/Stacked Bars/LinesComponentController.swift create mode 100644 submodules/Charts/Sources/Charts/Controllers/Stacked Bars/StackedBarsChartController.swift create mode 100644 submodules/Charts/Sources/Charts/Renderes/BarChartRenderer.swift create mode 100644 submodules/Charts/Sources/Charts/Renderes/BaseChartRenderer.swift create mode 100644 submodules/Charts/Sources/Charts/Renderes/ChartDetailsRenderer.swift create mode 100644 submodules/Charts/Sources/Charts/Renderes/HorizontalScalesRenderer.swift create mode 100644 submodules/Charts/Sources/Charts/Renderes/LineBulletsRenerer.swift create mode 100644 submodules/Charts/Sources/Charts/Renderes/LinesChartRenderer.swift create mode 100644 submodules/Charts/Sources/Charts/Renderes/PecentChartRenderer.swift create mode 100644 submodules/Charts/Sources/Charts/Renderes/PercentPieAnimationRenderer.swift create mode 100644 submodules/Charts/Sources/Charts/Renderes/PerformanceRenderer.swift create mode 100644 submodules/Charts/Sources/Charts/Renderes/PieChartRenderer.swift create mode 100644 submodules/Charts/Sources/Charts/Renderes/VerticalLinesRenderer.swift create mode 100644 submodules/Charts/Sources/Charts/Renderes/VerticalScalesRenderer.swift create mode 100644 submodules/Charts/Sources/Helpers/AnimationController.swift create mode 100644 submodules/Charts/Sources/Helpers/Array+Utils.swift create mode 100644 submodules/Charts/Sources/Helpers/CGFloat.swift create mode 100644 submodules/Charts/Sources/Helpers/CGPoint+Extensions.swift create mode 100644 submodules/Charts/Sources/Helpers/ClosedRange+Utils.swift create mode 100644 submodules/Charts/Sources/Helpers/CustomNavigationController.swift create mode 100644 submodules/Charts/Sources/Helpers/DisplayLinkService.swift create mode 100644 submodules/Charts/Sources/Helpers/GlobalHelpers.swift create mode 100644 submodules/Charts/Sources/Helpers/NumberFormatter+Utils.swift create mode 100644 submodules/Charts/Sources/Helpers/OnePixelConstraint.swift create mode 100644 submodules/Charts/Sources/Helpers/ScalesNumberFormatter.swift create mode 100644 submodules/Charts/Sources/Helpers/TimeInterval+Utils.swift create mode 100644 submodules/Charts/Sources/Helpers/TimeZone.swift create mode 100644 submodules/Charts/Sources/Helpers/UIColor+Utils.swift create mode 100644 submodules/Charts/Sources/Helpers/UIImage+Utils.swift create mode 100644 submodules/Charts/Sources/Helpers/UIImageView+Utils.swift create mode 100644 submodules/Charts/Sources/Helpers/UILabel+Utils.swift create mode 100644 submodules/Charts/Sources/Helpers/UIView+Extensions.swift create mode 100644 submodules/Charts/Sources/Models/ChartLineData.swift create mode 100644 submodules/Charts/Sources/Models/ColorMode.swift create mode 100644 submodules/Charts/Sources/Models/LinesChartLabel.swift create mode 100644 submodules/Charts/Sources/Models/LinesSelectionLabel.swift create mode 100644 submodules/PresentationDataUtils/Sources/SpecialTabBarIcons.swift create mode 100644 submodules/StatisticsUI/BUCK create mode 100644 submodules/StatisticsUI/Info.plist create mode 100644 submodules/StatisticsUI/Sources/StatisticsUI.h create mode 100644 submodules/StatisticsUI/Sources/StatsController.swift create mode 100644 submodules/StatisticsUI/Sources/StatsGraphItem.swift create mode 100644 submodules/StatisticsUI/Sources/StatsOverviewItem.swift create mode 100644 submodules/TelegramCore/Sources/BankCards.swift create mode 100644 submodules/TelegramCore/Sources/ChannelStatistics.swift create mode 100644 submodules/TelegramUI/Images.xcassets/Chart/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Chart/arrow_left.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Chart/arrow_left.imageset/arrow_left.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Chart/arrow_right.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Chart/arrow_right.imageset/arrow_right.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Chart/selection_frame_dark.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Chart/selection_frame_dark.imageset/selection_frame_dark.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Chart/selection_frame_light.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Chart/selection_frame_light.imageset/selection_frame_light.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconCalls.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconCalls.imageset/ic_calls.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconChats.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconChats.imageset/ic_messages.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconContacts.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconContacts.imageset/ic_contacts.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconSettings.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconSettings.imageset/ic_settings.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Contact List/MakeInvisibleIcon.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Contact List/MakeInvisibleIcon.imageset/ic_stopshowme.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Contact List/MakeVisibleIcon.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Contact List/MakeVisibleIcon.imageset/ic_showme.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Media Gallery/SoundOff.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Media Gallery/SoundOff.imageset/soundoff (2).pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Media Gallery/SoundOn.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Media Gallery/SoundOn.imageset/soundon (2).pdf create mode 100755 submodules/ffmpeg/gas-preprocessor.pl diff --git a/NotificationService/Serialization.m b/NotificationService/Serialization.m index 00a0621e3e..f7eea7807e 100644 --- a/NotificationService/Serialization.m +++ b/NotificationService/Serialization.m @@ -3,7 +3,7 @@ @implementation Serialization - (NSUInteger)currentLayer { - return 109; + return 110; } - (id _Nullable)parseMessage:(NSData * _Nullable)data { diff --git a/Telegram-iOS/Resources/Compass.tgs b/Telegram-iOS/Resources/Compass.tgs new file mode 100644 index 0000000000000000000000000000000000000000..d9ec83eb7741d23487187cafe49dc52d7109fca7 GIT binary patch literal 11211 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 literal 0 HcmV?d00001 diff --git a/Telegram-iOS/Resources/Dice_1.tgs b/Telegram-iOS/Resources/Dice_1.tgs new file mode 100644 index 0000000000000000000000000000000000000000..e078e6b6de72e46f09ae9cc14485052b8a73bd18 GIT binary patch literal 63935 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�BP%RDld@T0#%*;9MM|6od4QZ8OOeQ(0 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 z zQAv^R+0Rw`GzqNo*sG7@`bdrqti9+pdgg+7m&Eyib7UV^Z6EQh|XBD?5P7oVUw`{t5@H0n_M zvGAwuu$M@13#Gzs1A-iCI^ARz7z1flcv8nk*QhKg{ak;qwcxbpWrWBV-n9=KsCUf9?*JCQC8T(LtT0Fv4&~H?FyUNwpanC z)w7SdU18g@9%@EpQF1tN_qdT8&Mj3Mk}X>Bhs*~YGnxl7EBF>RV-DCAFS3}LSte`- zJ=1^`7T|b=hF-Ho4(WUEVJs)#8{jhGNDR`=Bi74Ml?CXOB_8AY2a^%zot~(HPw^gq zNh`w6@sQ?3L0&$nbW)wSHwhtePXG^Uk*;^!m9bXl(29U}nlus)(O^1$6g|ue_t56U zR~>92a_H%r(8HZMtlR01{VpL8b_Wc_%Q8E`sebP3EE6&JEQ0jUwP25?P);GLQzXNq z<_H(8x!D(e-7e<&T%_7^MjP;nX6Py%OD&(k_llt5xvh+wR8P5(5C-pCAD-LyX^$Dq z8H$A^l-FoOEkLX;NewbT3pkksDVG-zQrFXVGcEKG4(fA(#jMzXyOXBv#dx_SLh2qe zCEPEQ`^vpb}7A45!w-Q(>Ji+B+UY0HHcd5dmVu7r1;Wni0Dz}fc^iO0E z-4+j>oq=qjzzHoOjC5w%hL@LQ0fmX!o+55n*dV|#l%l-$N)&;+;-*RCAuaLTm(&h{ zyW+N)9zYUWYS=arx_jgj#=Dhbrdu&aVY{NnAYcg5mz-rp$gYUd^e9!1E4NOd%DhB^c8MdN|c;SnQ=1B7b4z9_z!ts}Dc($|Z4zI=5kQtQi5D zs9M6Q6@b;GxSV?+f%d#Kv3pL=WEe8E5N+G3HI4I$vEN{7Dd%}8i2f7%^L#fH9Bl?T z&w>y_8Kp#Q!F9=RZ9aU4JP3{~A`IiP7rz*#QsoLqZ2L(XwAzgz5^7|MwlsN7##CPS zMOWjNnIR?LVUscq#Lgo{Q*qEdmpd0LSa$_6WV|tNE80PCTOZDszW&gSV95%r`5&ss zOY9aYtfi&KHe88jPjKyu#Xdoyq4}SQ;7;(d&q@n?%?g|?n!Eb&VXvpiU4fJL!pxc2^Lyk&irf{rP1bcc zmBW_PQsnM|Q})~#4Os0d!gfVXMB5XdjNMyS$gYS<9a>x;_g)3%FZQ&sZ+b(RHxdf% zcR2M)*8l^PaDE&XUj~k}!1Ht#R0kAwm+uTY#4Kwd=0kroQ`!maNuuY*P~EGM-e($1 z)u+jd5KspMn4rSKrw;AOJ+xmB7pig6h`33r4x0AJmcNye|>{g=)6)>yAjaW6V7Kfv*etH$Dr-WY)t~-)X z8KJ$Y%6MPw+8-^uh?##s-%(`W$LO5LZE4swc$h`a~ z`-_G}{lGmR95XMgaek^o`Yn@EkOyFs9r?K`mAH8YQ)Bhuv>G(*tRe zMhn807OMjlrk7AinthzIg z&bfs6n>?Hlrgno`bEhur6AM3r0f3J|E4sQa51Pj=zU$M{kWtS&!mP`Y8<*gR-r!~w z+IEWd@Lv~V$!X8wr9SF{8i zpDzskJ36jwr1HSnj9gk0&P~1lvu;U;3HY3KGZK|6nNX0#achbzfjgT z?wkQxIn>oO>;eh>f9+k#ZY0T-{FMUFnS}4|(YM(lU;qt9b88eDl!~RInne~!wx&lw z|NDg5Gml)zU@^0Ul@!z$E=gvj`|}9*x0zY@4RO?S)xjMv%zeW(EFH1EF*uezy(UG= zO@><=M=CZ3FJ=!}ZZaGUg#09UnZ$==fqNBS}B3rb;|(I%UL zi@gxnlT!!f!(fxWFzbd$&vn>7oPQEJi}0Jx0jLkbiEg&qnN>6FYIb_V#i1_;+K*l~ zc8H3ZfqKE3kQXg4Ni*f3?dvOK#Fa`-E||Y?0_HvXJzb!wPe1JaN;Fk zKalQh#fHWHz*CbD-MOl?*tRgh(xfiw`$8f>fjxY>>CkLMm1Cq{1r|chvXC_oU4qJs zgV%w|EzF^a3KnW%9`GUCL6L!s=vPS0Z)6eU4b)D<(O9%EG*SXn&s|LIknBTqeBhH} zWSN!(Sto$p!(+fcp7y%e84RuxBhC^T*g3UNyZSYuCDspUp9_88Y>RJP3P|6W<}`%2 z4X{TMn$#I!Oj-*~*Ot2j+lp3W=uNd$I%Bt6)%lp&`R_U^23@no)KQ%gJ|@CO!>V zE*QOi6>$Wl#PEVxzsz=ZMblOFNdUtRBA+Z>J=ktC-P*|A(?l6!w%eF4kVFEkV0PZg zZj;#{M-vGhEXGtSn@uLG>hFxor64z-jLu!ujYQCUEBqPNZe*p{dIPm(f=q_3CZ!|W z5n<(EjmCLf{xn)Ds-}$~G+-27$pqaH>@E{e36hka#PE2wC2DMFo(NyM%R&I+Lr$&@ zSliJL>koKk6LKcOnOd1p(OnJ9eYBo;02cuPydrF>6n#cQ+Ig{tuVZ6~g#I8X)L9BG zA!(SopCAoB+Q)h?bEm9_H?nFLMz|tGk|#+`GyYrTMe6Q@J3hK+H=obGJNvJThfnYP z+3M`mhqLcKUR>W_@}VA&^RtJ$@#QZ#<}b#>eRcNZXlgg!_jvEc{>u)p-tWE&SDkFn z_}ksi-(2?~rdP(e1y}g-(ZAhaJbH;E|DU^yoBNNqcc0IGd9RoLsSFPzOEKlA?| zPwM{RjCR-=J-P%&-zT?*kc;)*mLk$InZMRFdR=Y2>5;d2KQr|I-Ft0(>3aO2Fn;?B zziCVy=^q~MZhySoGyFJ>t1o!#=sexxhlZ5w1K-6rV-_DieBcXLH{VS=|A7Cv`Ih3`}6M5R`BAdPsy)ldNBMFX_?7~iL183#1bTLcUBP*b^vmz=aTuiHhAIaV; zRCeov+C0ub(#Q*vuyl49z*j`plslYpCh1c3 z(ol>S?}Jp8a7qwz>?|6&nM8UQJZ9P6C?$)q)=bnoa!{O0oRIKIxK2jDlck@<`A9I7 z%}ErO%{u~GtcP~UW1sgl?X`*XRE9z3+vQ^17{Cmh;}S@O7AQ7Zy71)~c0)8kLgL8L z#}(^ECNhpq20dy9b|D>$!M>xoTTDz=vd**}Ok;!uNlv>d+~bDn?B)b^C(COkS=>3x zmH`!;x5eJESb}ZcM$anQ<`43$BEUAgfn4fXiD=!w#w|1udc(SZ6e(6*CD=&B zSiB9AI4^Y;1n;mFFGq9d;=VW=v9V}0Qq|38%V}Fj*I>mB)T|AYMa|E_YA;RHc+P07 za6gLe2~Y->V&i$2Bq#7D<=z$N8KU!uC@OK)b7XR0AM`m7tURC zgq+4`ekm$80Ek_Bo@Z#(AIH7PYoLBq*o9~2#Qx2CBR)%%HzfaOSZ>%^NHf7xLMbb1 zLqrDw`ygEEb%U6S+8jD+W=N*)UA9x+INHVWQ%qPGO=VuXJyc@Su9Ho`XJU%QHXQWy zxxwhX5);{~geN2UbG?6U&CX>b8SvOb>_MQIoT;LX=e=-1kRuPAab$6dP~I1;k8Q$kXwC zXx~-Y^${pd9E^w`h_yn&GVVO!L~sK^F}-rs3{)a&7ibM8GZSqI$hbt(E#P4nA(afU zi`1^ZMC#1Ia`?vWr+=%mm@&ySNvobh&>%#tH>7{WsXaJ}j!}(LUM`MPAd^BTQ^RgP zKyj+SXJumc@a_l+<6(#0$Z@lPr^=Aix1kiJXOW|dN=vlbsp==G|pV^Q9VVQ&qkC{i>9$)sX;bHM9I zYo7tWXZ#(hPYKu{YY)!8C@cxIVemAhC=CI)5ugb){XO`gVIY#Wqn1&$E+i5xafj9r zRKm485J;|qMho3RrB@BXGaeY#7ByZX$cMupq)bH81j8+`cG%!%bwL2M0E~A5Nbq<8 zWLe>nIQ0*ahp1V}xKz}%IvSPP&mGZL&3}M zC+`Sd(nz4933)WJ$?*DMM1$l(Ym%rgTo*5N3L-V)@}1o=ku2*HdyYm!zHZPc8cu2Y9Z;K+Ezi61@QiO8J3aj6BvOEA z}kT3P!(2_v%aZMR60M>d=hk01pk6JGKZk=i&& zIUA`w81p;z50$Z`Y{iZ-6;IgE=@oz%P-C@;7~2>kfGCv$B%!-rf>qe>IS@cbn+3w4 zvJ~!@87_pJWLMxCVONm&0#*-U0d;?$DyX^Lz8Yp7R$xCJ)MrT^BghoWpA3X_ffLGi z1;-}MbT{-$HwjBYkEXqxO%ur;11pG;KL)ifQIH~L&E&L_pgo%@JsByxvP)xYDn47B z%BUvQC~vH zkpPbr0su}V3(FHfHUQj!ppaQtd4VC=rbD(Yt1LS07Nol0kXPYuRp$#fMwYfp?pZji zb@|@X1ETKEPz5%Ro)?Pac3%ZdDHKkvV*6^%SZAtgM(nL0m&kl|OqA58mH_kCNoHF+ zf|ev<9FwoGuo*$F8-A-W{ryy!oGMHxH9cElDptaYy6VTDKiodtzuT@ag}PT@x_xBL z-Iehb$MoK^dnT?b>*P`(V;=r%>*3uSpGek3v?8+$GWw}+ zdm>&-60{_Keoew#pNbYGXi@z9s>C-wm7rCLT9q)rD(S6HMXM6EDq((A@*AH@)T$({ zN}OMn^46!KRY_WvIKL|OjZY=@!%?e}=2zvdAM;78lC>&nepTN3NuRYUMXQo$S0%jp zvtFxG`e8r2Dq;S#-}d**-cDFe!U>sZQ81?R}iby5l_VQ$u=zldti&XPRQS{&lbAZxm&Th%nK)cDe^WgYF8 ztLc}QmZhpb!LA;s%dcBF;QB8eeRO{HjO8~MP<{_Z_;_2rW21;HjT1rn73&@?MS0+ z8fDWsZ_{$(k;BMJLkxh$iTIOwf;xnrB)QxOf=52c7Gpfp_wdVllZF=G}s>-IVyHfKu zJ@FaUx^F6*wt1VL_>5|@=^&f7d7Ga2jOxjPo~xSA6{LmEsHJl)!|+6^#qXqAjy6t@ zGMv_Nm|w@ebMg0I9gV-y>7Knd6`*CxQwc0;2cFO5uj2Rzw1mGA?DsDAkNF3F?VW==ub7Z~Fe+?M zwwEet+JS7q;4N>jg-dzK;39EMpxiQDa*)NfK!N*Lf(pE3RA{O-rn&P>J`J+(fkPyx z1#z79;DJ%;DNv_am>e(}X40UAu;9>!BZh|VaUuvsh)Ob}O2Bd0C*b%MWAleU0>E1W z@Ct1NS0yD3E$9`9p}~Q>*x=&9gQI*Enfvq5m8MCYMwsn#keT2Q9@-F%6&kd%q3;}! zGk~r`Sk7wU@FhjlHu#BaSJ#H7E^srToUO|tPQ&552Rogirx7V|VW=3#M}z3E#fDZ6 zzt;w~%40#R1l0opb9|*Nhd>F3?``O<2j?#sK7!iW9e92QM*{7|bbQ^xL#rV7NGmAB zR3mV51b?qW0pIF!OPUUU5Xih3sKRSF4dB=T`@-()mwOP>;Sa*N#{zW@HnqT^0auL| zfS6wp444kT*`Vl~35^>D-?alFoENA}@k&DQFB%ys`Jf2uh!`5TwU%hIupo17I{bi# zC+r)6i-rsVWp6-ZdR*=<%SRZ@(XU;B)wtHasR2_KfUa%J;jYUOC#VUZ2k0g^(S<<$ zcm>s!QsdKnf`>n95DA6IbIU?q;{!q42h{!H$dso+9K$Y%W2hmgVSK{D4v7b8LUqKK zf;eJ39K`WFdd9sRJmZ|f4!#X^<`0M%pN7s%u$1s(;xqp^688UKk?`Tic!2j~;&V1LP)F%RygjnezY3ZaEDVS z4}g?yWuPoj=rSFM4*@$}bVU!}kiq>BJY7a(?*ttP&UGq6zY@^-lVsUc(${6Q|HaNkJblvygWeu32~h4bvh{0^QQ z;-AO!;go5rftrCW!ubX- z33ZrE!DRrUOr$gnIGYw5*%5AJBKJBpUQI`PD7NQ9;%~v6OFW|91EPGm86}Gz2NjHg z9O>i`K4DT61)ov}#w*j%qTmA}c#I87=44X?mlsqjAw0AoA>|PXJ}OXyGA0Mn z%YonvWNOHhF6giwk>f+{2?UjpZ!bk`zLa19$xdESjrWK(4gMSj9}sU2qFtqI`OxX{ zmKoU*A##YMWA+uoFWz+Ez%7EituC1zJz@t*U|$@~MAobz;mXmDxso6Ksr+N9M?G)} z)YYYmD-;});6Z~rtgCM^1-Tq(N-j=pOJIJczJR>Y<+Mc=x6I{+MJL;Xab0e^z(0Bg zyi1ZhrXw)5V9&UD~2&p>aMx&JIKWrm-sl6^*CtxOOHUgeZDwyGDKL zVH+2E`l5Sd+?ci=-099)ZGGLoi~8%k=sU=j##QgD+r2|qTVJ>DR=vLe*$vx@zVv?= z&}$plR@|z%r#^9XN2f1~OtCCK$I&gCzC1C<4t}e7Rr5EQ~p5P1C@G7`fV8p z`*lh_;OpLhtoQz9KV$Kge_uWKp&LMj1O2hd#I5*4b?AFHVX6Mp^vCt)4fylg{@#Du zN{qZ9EAsLBsjNun&W)bF-*dmtW<@L*+>WmQ{p$MqfY^FX((zvtUN23;;-R~@BnwNa zd6^taXW5DQahTDAi`RUp`L;eb9Zf`NMNb zgTg?nOxAcDf<=Z$akDV{`GL)?x7d|?8Vd~^EiHNF@Op!euQurPdV|i-4thUWKIF>f z`9VJuhtK5z9!LLA@N6Atpci~bzb7GMtf sx-u8nuedF3onYC$0qT9_hu590cghd1(dJ_r;`hJ&Kf=9|;Fkvl0DRGpGXMYp literal 0 HcmV?d00001 diff --git a/Telegram-iOS/Resources/Dice_2.tgs b/Telegram-iOS/Resources/Dice_2.tgs new file mode 100644 index 0000000000000000000000000000000000000000..c350c4d88c6e83a4181e3e24466a35744a2c459e GIT binary patch literal 61430 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\CX;!Wla34T; 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∋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%0A(z3a9Rlc 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 literal 0 HcmV?d00001 diff --git a/Telegram-iOS/Resources/Dice_4.tgs b/Telegram-iOS/Resources/Dice_4.tgs new file mode 100644 index 0000000000000000000000000000000000000000..0cc05f7cea2686e3f1ec7bc61ff16552bb9b0969 GIT binary patch literal 65388 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

$W>hNA?ZKI*E9GA7vQtwB4b3 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 literal 0 HcmV?d00001 diff --git a/Telegram-iOS/en.lproj/Localizable.strings b/Telegram-iOS/en.lproj/Localizable.strings index c2aade54e4..67b8058d9d 100644 --- a/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram-iOS/en.lproj/Localizable.strings @@ -5284,3 +5284,22 @@ Any member of this group will be able to see messages in the channel."; "Map.PlacesInThisArea" = "Places In This Area"; "Conversation.LiveLocationYouAndOther" = "**You** and %@"; + +"PeopleNearby.MakeVisible" = "Make Myself Visible"; +"PeopleNearby.MakeInvisible" = "Stop Showing Me"; + +"PeopleNearby.ShowMorePeople_0" = "Show %@ More People"; +"PeopleNearby.ShowMorePeople_1" = "Show %@ More People"; +"PeopleNearby.ShowMorePeople_2" = "Show %@ More People"; +"PeopleNearby.ShowMorePeople_3_10" = "Show %@ More People"; +"PeopleNearby.ShowMorePeople_many" = "Show %@ More People"; +"PeopleNearby.ShowMorePeople_any" = "Show %@ More People"; + +"PeopleNearby.VisibleUntil" = "visible until %@"; + +"PeopleNearby.MakeVisibleTitle" = "Make Myself Visible"; +"PeopleNearby.MakeVisibleDescription" = "Allow people nearby to view your profile for 24 hours?\n\nYour phone number will remain hidden."; + +"PeopleNearby.DiscoverDescription" = "Exchange contact info with people nearby\nand find new friends."; + +"Time.TomorrowAt" = "tomorrow at %@"; diff --git a/submodules/AnimatedStickerNode/Sources/AnimatedStickerNode.swift b/submodules/AnimatedStickerNode/Sources/AnimatedStickerNode.swift index f21f09f4a8..173646c596 100644 --- a/submodules/AnimatedStickerNode/Sources/AnimatedStickerNode.swift +++ b/submodules/AnimatedStickerNode/Sources/AnimatedStickerNode.swift @@ -42,9 +42,15 @@ public enum AnimatedStickerMode { case direct } +public enum AnimatedStickerPlaybackPosition { + case start + case end +} + public enum AnimatedStickerPlaybackMode { case once case loop + case still(AnimatedStickerPlaybackPosition) } private final class AnimatedStickerFrame { @@ -72,6 +78,7 @@ private protocol AnimatedStickerFrameSource: class { var frameCount: Int { get } func takeFrame() -> AnimatedStickerFrame? + func skipToEnd() } private final class AnimatedStickerFrameSourceWrapper { @@ -244,6 +251,9 @@ private final class AnimatedStickerCachedFrameSource: AnimatedStickerFrameSource self.data = data self.dataComplete = complete } + + func skipToEnd() { + } } private final class AnimatedStickerDirectFrameSource: AnimatedStickerFrameSource { @@ -289,6 +299,10 @@ private final class AnimatedStickerDirectFrameSource: AnimatedStickerFrameSource } return AnimatedStickerFrame(data: frameData, type: .argb, width: self.width, height: self.height, bytesPerRow: self.bytesPerRow, index: frameIndex, isLastFrame: frameIndex == self.frameCount - 1) } + + func skipToEnd() { + self.currentFrame = self.frameCount - 1 + } } private final class AnimatedStickerFrameQueue { @@ -383,7 +397,7 @@ public final class AnimatedStickerNode: ASDisplayNode { private var renderer: (AnimationRenderer & ASDisplayNode)? - private var isPlaying: Bool = false + public var isPlaying: Bool = false private var canDisplayFirstFrame: Bool = false private var playbackMode: AnimatedStickerPlaybackMode = .loop @@ -456,7 +470,9 @@ public final class AnimatedStickerNode: ASDisplayNode { if let directData = try? Data(contentsOf: URL(fileURLWithPath: path), options: [.mappedRead]) { strongSelf.directData = (directData, path, width, height) } - if strongSelf.isPlaying { + if case let .still(position) = playbackMode { + strongSelf.seekTo(position) + } else if strongSelf.isPlaying { strongSelf.play() } else if strongSelf.canDisplayFirstFrame { strongSelf.play(firstFrame: true) @@ -597,11 +613,11 @@ public final class AnimatedStickerNode: ASDisplayNode { self.reportedStarted = false self.timer.swap(nil)?.invalidate() if self.playToCompletionOnStop { - self.seekToStart() + self.seekTo(.start) } } - public func seekToStart() { + public func seekTo(_ position: AnimatedStickerPlaybackPosition) { self.isPlaying = false let directData = self.directData @@ -612,6 +628,9 @@ public final class AnimatedStickerNode: ASDisplayNode { var maybeFrameSource: AnimatedStickerFrameSource? if let directData = directData { maybeFrameSource = AnimatedStickerDirectFrameSource(queue: queue, data: directData.0, width: directData.2, height: directData.3) + if position == .end { + maybeFrameSource?.skipToEnd() + } } else if let (cachedData, cachedDataComplete) = cachedData { if #available(iOS 9.0, *) { maybeFrameSource = AnimatedStickerCachedFrameSource(queue: queue, data: cachedData, complete: cachedDataComplete, notifyUpdated: {}) diff --git a/submodules/CallListUI/Sources/CallListController.swift b/submodules/CallListUI/Sources/CallListController.swift index 8de824eba8..974cd94fc7 100644 --- a/submodules/CallListUI/Sources/CallListController.swift +++ b/submodules/CallListUI/Sources/CallListController.swift @@ -59,7 +59,12 @@ public final class CallListController: ViewController { if case .tab = self.mode { self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: PresentationResourcesRootController.navigationCallIcon(self.presentationData.theme), style: .plain, target: self, action: #selector(self.callPressed)) - let icon = UIImage(bundleImageName: "Chat List/Tabs/IconCalls") + let icon: UIImage? + if useSpecialTabBarIcons() { + icon = UIImage(bundleImageName: "Chat List/Tabs/Holiday/IconCalls") + } else { + icon = UIImage(bundleImageName: "Chat List/Tabs/IconCalls") + } self.tabBarItem.title = self.presentationData.strings.Calls_TabTitle self.tabBarItem.image = icon self.tabBarItem.selectedImage = icon diff --git a/submodules/Charts/BUCK b/submodules/Charts/BUCK new file mode 100644 index 0000000000..79bf8180b8 --- /dev/null +++ b/submodules/Charts/BUCK @@ -0,0 +1,31 @@ +load("//Config:buck_rule_macros.bzl", "static_library") + +static_library( + name = "Charts", + srcs = glob([ + "Sources/**/*.swift", + ]), + deps = [ + "//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit#shared", + "//submodules/AsyncDisplayKit:AsyncDisplayKit#shared", + "//submodules/Display:Display#shared", + "//submodules/Postbox:Postbox#shared", + "//submodules/TelegramCore:TelegramCore#shared", + "//submodules/SyncCore:SyncCore#shared", + "//submodules/TelegramPresentationData:TelegramPresentationData", + "//submodules/TelegramUIPreferences:TelegramUIPreferences", + "//submodules/AccountContext:AccountContext", + "//submodules/ItemListUI:ItemListUI", + "//submodules/AvatarNode:AvatarNode", + "//submodules/TelegramStringFormatting:TelegramStringFormatting", + "//submodules/AlertUI:AlertUI", + "//submodules/PresentationDataUtils:PresentationDataUtils", + "//submodules/TelegramNotices:TelegramNotices", + "//submodules/MergeLists:MergeLists", + "//submodules/AppBundle:AppBundle", + ], + frameworks = [ + "$SDKROOT/System/Library/Frameworks/Foundation.framework", + "$SDKROOT/System/Library/Frameworks/UIKit.framework", + ], +) diff --git a/submodules/Charts/Info.plist b/submodules/Charts/Info.plist new file mode 100644 index 0000000000..e1fe4cfb7b --- /dev/null +++ b/submodules/Charts/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + + diff --git a/submodules/Charts/Sources/Chart Screen/ChartDetailsView.swift b/submodules/Charts/Sources/Chart Screen/ChartDetailsView.swift new file mode 100644 index 0000000000..7232c594c3 --- /dev/null +++ b/submodules/Charts/Sources/Chart Screen/ChartDetailsView.swift @@ -0,0 +1,258 @@ +// +// ChartDetailsView.swift +// GraphTest +// +// Created by Andrew Solovey on 14/03/2019. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +private let cornerRadius: CGFloat = 5 +private let verticalMargins: CGFloat = 8 +private var labelHeight: CGFloat = 18 +private var margin: CGFloat = 10 +private var prefixLabelWidth: CGFloat = 27 +private var textLabelWidth: CGFloat = 60 +private var valueLabelWidth: CGFloat = 65 + +struct ChartDetailsViewModel { + struct Value { + let prefix: String? + let title: String + let value: String + let color: UIColor + let visible: Bool + } + + var title: String + var showArrow: Bool + var showPrefixes: Bool + var values: [Value] + var totalValue: Value? + var tapAction: (() -> Void)? + + static let blank = ChartDetailsViewModel(title: "", showArrow: false, showPrefixes: false, values: [], totalValue: nil, tapAction: nil) +} + +class ChartDetailsView: UIControl { + let titleLabel = UILabel() + let arrowView = UIImageView() + + var prefixViews: [UILabel] = [] + var labelsViews: [UILabel] = [] + var valuesViews: [UILabel] = [] + + private var viewModel: ChartDetailsViewModel? + private var colorMode: ColorMode = .day + + static func fromNib() -> ChartDetailsView { + return Bundle.main.loadNibNamed("ChartDetailsView", owner: nil, options: nil)?.first as! ChartDetailsView + } + + override init(frame: CGRect) { + super.init(frame: frame) + + layer.cornerRadius = cornerRadius + clipsToBounds = true + + addTarget(self, action: #selector(didTap), for: .touchUpInside) + titleLabel.font = UIFont.systemFont(ofSize: 12, weight: .bold) + arrowView.image = UIImage.arrowRight + arrowView.contentMode = .scaleAspectFill + + addSubview(titleLabel) + addSubview(arrowView) + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setup(viewModel: ChartDetailsViewModel, animated: Bool) { + self.viewModel = viewModel + + titleLabel.setText(viewModel.title, animated: animated) + titleLabel.setVisible(!viewModel.title.isEmpty, animated: animated) + arrowView.setVisible(viewModel.showArrow, animated: animated) + + let width: CGFloat = margin * 2 + (viewModel.showPrefixes ? (prefixLabelWidth + margin) : 0) + textLabelWidth + valueLabelWidth + var y: CGFloat = verticalMargins + + if (!viewModel.title.isEmpty || viewModel.showArrow) { + titleLabel.frame = CGRect(x: margin, y: y, width: width, height: labelHeight) + arrowView.frame = CGRect(x: width - 6 - margin, y: margin, width: 6, height: 10) + y += labelHeight + } + let labelsCount: Int = viewModel.values.count + ((viewModel.totalValue == nil) ? 0 : 1) + + setLabelsCount(array: &prefixViews, + count: viewModel.showPrefixes ? labelsCount : 0, + font: UIFont.systemFont(ofSize: 12, weight: .bold)) + setLabelsCount(array: &labelsViews, + count: labelsCount, + font: UIFont.systemFont(ofSize: 12, weight: .regular), + textAlignment: .left) + setLabelsCount(array: &valuesViews, + count: labelsCount, + font: UIFont.systemFont(ofSize: 12, weight: .bold)) + + UIView.perform(animated: animated, animations: { + for (index, value) in viewModel.values.enumerated() { + var x: CGFloat = margin + if viewModel.showPrefixes { + let prefixLabel = self.prefixViews[index] + prefixLabel.textColor = self.colorMode.chartDetailsTextColor + prefixLabel.setText(value.prefix, animated: false) + prefixLabel.frame = CGRect(x: x, y: y, width: prefixLabelWidth, height: labelHeight) + x += prefixLabelWidth + margin + prefixLabel.alpha = value.visible ? 1 : 0 + } + let titleLabel = self.labelsViews[index] + titleLabel.setTextColor(self.colorMode.chartDetailsTextColor, animated: false) + titleLabel.setText(value.title, animated: false) + titleLabel.frame = CGRect(x: x, y: y, width: textLabelWidth, height: labelHeight) + titleLabel.alpha = value.visible ? 1 : 0 + x += textLabelWidth + + let valueLabel = self.valuesViews[index] + valueLabel.setTextColor(value.color, animated: false) + valueLabel.setText(value.value, animated: false) + valueLabel.frame = CGRect(x: x, y: y, width: valueLabelWidth, height: labelHeight) + valueLabel.alpha = value.visible ? 1 : 0 + + if value.visible { + y += labelHeight + } + } + if let value = viewModel.totalValue { + var x: CGFloat = margin + if viewModel.showPrefixes { + let prefixLabel = self.prefixViews[viewModel.values.count] + prefixLabel.textColor = self.colorMode.chartDetailsTextColor + prefixLabel.setText(value.prefix, animated: false) + prefixLabel.frame = CGRect(x: x, y: y, width: prefixLabelWidth, height: labelHeight) + prefixLabel.alpha = value.visible ? 1 : 0 + x += prefixLabelWidth + margin + } + let titleLabel = self.labelsViews[viewModel.values.count] + titleLabel.setTextColor(self.colorMode.chartDetailsTextColor, animated: false) + titleLabel.setText(value.title, animated: false) + titleLabel.frame = CGRect(x: x, y: y, width: textLabelWidth, height: labelHeight) + titleLabel.alpha = value.visible ? 1 : 0 + x += textLabelWidth + + let valueLabel = self.valuesViews[viewModel.values.count] + valueLabel.setTextColor(self.colorMode.chartDetailsTextColor, animated: false) + valueLabel.setText(value.value, animated: false) + valueLabel.frame = CGRect(x: x, y: y, width: valueLabelWidth, height: labelHeight) + valueLabel.alpha = value.visible ? 1 : 0 + } + }) + } + + override var intrinsicContentSize: CGSize { + if let viewModel = viewModel { + let height = ((!viewModel.title.isEmpty || viewModel.showArrow) ? labelHeight : 0) + + (CGFloat(viewModel.values.filter({ $0.visible }).count) * labelHeight) + + (viewModel.totalValue?.visible == true ? labelHeight : 0) + + verticalMargins * 2 + let width: CGFloat = margin * 2 + + (viewModel.showPrefixes ? (prefixLabelWidth + margin) : 0) + + textLabelWidth + + valueLabelWidth + + return CGSize(width: width, + height: height) + } else { + return CGSize(width: 140, + height: labelHeight + verticalMargins) + } + } + + @objc private func didTap() { + viewModel?.tapAction?() + } + + func setLabelsCount(array: inout [UILabel], + count: Int, + font: UIFont, + textAlignment: NSTextAlignment = .right) { + while array.count > count { + let subview = array.removeLast() + subview.removeFromSuperview() + } + while array.count < count { + let label = UILabel() + label.font = font + label.adjustsFontSizeToFitWidth = true + label.minimumScaleFactor = 0.5 + label.textAlignment = textAlignment + addSubview(label) + array.append(label) + } + } +} + +extension ChartDetailsView: ColorModeContainer { + func apply(colorMode: ColorMode, animated: Bool) { + self.colorMode = colorMode + self.titleLabel.setTextColor(colorMode.chartDetailsTextColor, animated: animated) + if let viewModel = self.viewModel { + self.setup(viewModel: viewModel, animated: animated) + } + UIView.perform(animated: animated) { + self.arrowView.tintColor = colorMode.chartDetailsArrowColor + self.backgroundColor = colorMode.chartDetailsViewColor + } + } +} + +// MARK: UIStackView+removeAllArrangedSubviews +public extension UIStackView { + func setLabelsCount(_ count: Int, + font: UIFont, + huggingPriority: UILayoutPriority, + textAlignment: NSTextAlignment = .right) { + while arrangedSubviews.count > count { + let subview = arrangedSubviews.last! + removeArrangedSubview(subview) + subview.removeFromSuperview() + } + while arrangedSubviews.count < count { + let label = UILabel() + label.font = font + label.textAlignment = textAlignment + label.setContentHuggingPriority(huggingPriority, for: .horizontal) + label.setContentHuggingPriority(huggingPriority, for: .vertical) + label.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 999), for: .horizontal) + label.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 999), for: .vertical) + addArrangedSubview(label) + } + } + + func label(at index: Int) -> UILabel { + return arrangedSubviews[index] as! UILabel + } + + func removeAllArrangedSubviews() { + for subview in arrangedSubviews { + removeArrangedSubview(subview) + subview.removeFromSuperview() + } + } +} + +// MARK: UIStackView+addArrangedSubviews +public extension UIStackView { + func addArrangedSubviews(_ views: [UIView]) { + views.forEach({ addArrangedSubview($0) }) + } +} + +// MARK: UIStackView+insertArrangedSubviews +public extension UIStackView { + func insertArrangedSubviews(_ views: [UIView], at index: Int) { + views.reversed().forEach({ insertArrangedSubview($0, at: index) }) + } +} diff --git a/submodules/Charts/Sources/Chart Screen/ChartStackSection.swift b/submodules/Charts/Sources/Chart Screen/ChartStackSection.swift new file mode 100644 index 0000000000..bef1a574f4 --- /dev/null +++ b/submodules/Charts/Sources/Chart Screen/ChartStackSection.swift @@ -0,0 +1,199 @@ +// +// ChartStackSection.swift +// GraphTest +// +// Created by Andrei Salavei on 4/13/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +private enum Constants { + static let chartViewHeightFraction: CGFloat = 0.55 +} + +class ChartStackSection: UIView, ColorModeContainer { + var chartView: ChartView + var rangeView: RangeChartView + var visibilityView: ChartVisibilityView + var sectionContainerView: UIView + var separators: [UIView] = [] + + var headerLabel: UILabel! + var titleLabel: UILabel! + var backButton: UIButton! + + var controller: BaseChartController! + + init() { + sectionContainerView = UIView() + chartView = ChartView() + rangeView = RangeChartView() + visibilityView = ChartVisibilityView() + headerLabel = UILabel() + titleLabel = UILabel() + backButton = UIButton() + + super.init(frame: CGRect()) + + self.addSubview(sectionContainerView) + sectionContainerView.addSubview(chartView) + sectionContainerView.addSubview(rangeView) + sectionContainerView.addSubview(visibilityView) + + headerLabel.font = UIFont.systemFont(ofSize: 14, weight: .regular) + titleLabel.font = UIFont.systemFont(ofSize: 14, weight: .bold) + visibilityView.clipsToBounds = true + backButton.isExclusiveTouch = true + + backButton.setVisible(false, animated: false) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func awakeFromNib() { + super.awakeFromNib() + + headerLabel.font = UIFont.systemFont(ofSize: 14, weight: .regular) + titleLabel.font = UIFont.systemFont(ofSize: 14, weight: .bold) + visibilityView.clipsToBounds = true + backButton.isExclusiveTouch = true + + backButton.setVisible(false, animated: false) + } + + func apply(colorMode: ColorMode, animated: Bool) { + UIView.perform(animated: animated && self.isVisibleInWindow) { + self.backgroundColor = colorMode.tableBackgroundColor + + self.sectionContainerView.backgroundColor = colorMode.chartBackgroundColor + self.rangeView.backgroundColor = colorMode.chartBackgroundColor + self.visibilityView.backgroundColor = colorMode.chartBackgroundColor + + self.backButton.tintColor = colorMode.actionButtonColor + self.backButton.setTitleColor(colorMode.actionButtonColor, for: .normal) + + for separator in self.separators { + separator.backgroundColor = colorMode.tableSeparatorColor + } + } + + if rangeView.isVisibleInWindow || chartView.isVisibleInWindow { + chartView.loadDetailsViewIfNeeded() + chartView.apply(colorMode: colorMode, animated: animated && chartView.isVisibleInWindow) + controller.apply(colorMode: colorMode, animated: animated) + rangeView.apply(colorMode: colorMode, animated: animated && rangeView.isVisibleInWindow) + } else { + DispatchQueue.main.asyncAfter(deadline: .now() + TimeInterval.random(in: 0...0.1)) { + self.chartView.loadDetailsViewIfNeeded() + self.controller.apply(colorMode: colorMode, animated: false) + self.chartView.apply(colorMode: colorMode, animated: false) + self.rangeView.apply(colorMode: colorMode, animated: false) + } + } + + self.titleLabel.setTextColor(colorMode.chartTitleColor, animated: animated && titleLabel.isVisibleInWindow) + self.headerLabel.setTextColor(colorMode.sectionTitleColor, animated: animated && headerLabel.isVisibleInWindow) + } + + @IBAction func didTapBackButton() { + controller.didTapZoomOut() + } + + func setBackButtonVisible(_ visible: Bool, animated: Bool) { + backButton.setVisible(visible, animated: animated) + layoutIfNeeded(animated: animated) + } + + func updateToolViews(animated: Bool) { + rangeView.setRange(controller.currentChartHorizontalRangeFraction, animated: animated) + rangeView.setRangePaging(enabled: controller.isChartRangePagingEnabled, + minimumSize: controller.minimumSelectedChartRange) + visibilityView.setVisible(controller.drawChartVisibity, animated: animated) + if controller.drawChartVisibity { + visibilityView.isExpanded = true + visibilityView.items = controller.actualChartsCollection.chartValues.map { value in + return ChartVisibilityItem(title: value.name, color: value.color) + } + visibilityView.setItemsSelection(controller.actualChartVisibility) + visibilityView.setNeedsLayout() + visibilityView.layoutIfNeeded() + } else { + visibilityView.isExpanded = false + } + superview?.superview?.layoutIfNeeded(animated: animated) + } + + override func layoutSubviews() { + super.layoutSubviews() + + let bounds = self.bounds + self.sectionContainerView.frame = CGRect(origin: CGPoint(), size: CGSize(width: bounds.width, height: 350.0)) + self.chartView.frame = CGRect(origin: CGPoint(), size: CGSize(width: bounds.width, height: 250.0)) + self.rangeView.frame = CGRect(origin: CGPoint(x: 0.0, y: 250.0), size: CGSize(width: bounds.width, height: 48.0)) + self.visibilityView.frame = CGRect(origin: CGPoint(x: 0.0, y: 308.0), size: CGSize(width: bounds.width, height: 122.0)) + } + + func setup(controller: BaseChartController, title: String) { + self.controller = controller + self.headerLabel.text = title + + // Chart + chartView.renderers = controller.mainChartRenderers + chartView.userDidSelectCoordinateClosure = { [unowned self] point in + self.controller.chartInteractionDidBegin(point: point) + } + chartView.userDidDeselectCoordinateClosure = { [unowned self] in + self.controller.chartInteractionDidEnd() + } + controller.cartViewBounds = { [unowned self] in + return self.chartView.bounds + } + controller.chartFrame = { [unowned self] in + return self.chartView.chartFrame + } + controller.setDetailsViewModel = { [unowned self] viewModel, animated in + self.chartView.setDetailsViewModel(viewModel: viewModel, animated: animated) + } + controller.setDetailsChartVisibleClosure = { [unowned self] visible, animated in + self.chartView.setDetailsChartVisible(visible, animated: animated) + } + controller.setDetailsViewPositionClosure = { [unowned self] position in + self.chartView.detailsViewPosition = position + } + controller.setChartTitleClosure = { [unowned self] title, animated in + self.titleLabel.setText(title, animated: animated) + } + controller.setBackButtonVisibilityClosure = { [unowned self] visible, animated in + self.setBackButtonVisible(visible, animated: animated) + } + controller.refreshChartToolsClosure = { [unowned self] animated in + self.updateToolViews(animated: animated) + } + + // Range view + rangeView.chartView.renderers = controller.navigationRenderers + rangeView.rangeDidChangeClosure = { range in + controller.updateChartRange(range) + } + rangeView.touchedOutsideClosure = { + controller.cancelChartInteraction() + } + controller.chartRangeUpdatedClosure = { [unowned self] (range, animated) in + self.rangeView.setRange(range, animated: animated) + } + controller.chartRangePagingClosure = { [unowned self] (isEnabled, pageSize) in + self.rangeView.setRangePaging(enabled: isEnabled, minimumSize: pageSize) + } + + // Visibility view + visibilityView.selectionCallbackClosure = { [unowned self] visibility in + self.controller.updateChartsVisibility(visibility: visibility, animated: true) + } + + controller.initializeChart() + updateToolViews(animated: false) + } +} diff --git a/submodules/Charts/Sources/Chart Screen/ChartStackSection.xib b/submodules/Charts/Sources/Chart Screen/ChartStackSection.xib new file mode 100644 index 0000000000..fc883dd96c --- /dev/null +++ b/submodules/Charts/Sources/Chart Screen/ChartStackSection.xib @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/submodules/Charts/Sources/Chart Screen/ChartView.swift b/submodules/Charts/Sources/Chart Screen/ChartView.swift new file mode 100644 index 0000000000..39b93d9fa0 --- /dev/null +++ b/submodules/Charts/Sources/Chart Screen/ChartView.swift @@ -0,0 +1,158 @@ +// +// ChartView.swift +// GraphTest +// +// Created by Andrei Salavei on 4/7/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +public protocol ChartViewRenderer: class { + var containerViews: [UIView] { get set } + func render(context: CGContext, bounds: CGRect, chartFrame: CGRect) +} + +class ChartView: UIView { + override init(frame: CGRect) { + super.init(frame: frame) + + setupView() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + + setupView() + } + + var chartInsets: UIEdgeInsets = UIEdgeInsets(top: 40, left: 16, bottom: 35, right: 16) { + didSet { + setNeedsDisplay() + } + } + + var renderers: [ChartViewRenderer] = [] { + willSet { + renderers.forEach { $0.containerViews.removeAll(where: { $0 == self }) } + } + didSet { + renderers.forEach { $0.containerViews.append(self) } + setNeedsDisplay() + } + } + + var chartFrame: CGRect { + let chartBound = self.bounds + return CGRect(x: chartInsets.left, + y: chartInsets.top, + width: max(1, chartBound.width - chartInsets.left - chartInsets.right), + height: max(1, chartBound.height - chartInsets.top - chartInsets.bottom)) + } + + override func draw(_ rect: CGRect) { + guard let context = UIGraphicsGetCurrentContext() else { return } + let chartBounds = self.bounds + let chartFrame = self.chartFrame + + for renderer in renderers { + renderer.render(context: context, bounds: chartBounds, chartFrame: chartFrame) + } + } + + var userDidSelectCoordinateClosure: ((CGPoint) -> Void)? + var userDidDeselectCoordinateClosure: (() -> Void)? + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + if let point = touches.first?.location(in: self) { + let fractionPoint = CGPoint(x: (point.x - chartFrame.origin.x) / chartFrame.width, + y: (point.y - chartFrame.origin.y) / chartFrame.height) + userDidSelectCoordinateClosure?(fractionPoint) + } + } + + override func touchesMoved(_ touches: Set, with event: UIEvent?) { + if let point = touches.first?.location(in: self) { + let fractionPoint = CGPoint(x: (point.x - chartFrame.origin.x) / chartFrame.width, + y: (point.y - chartFrame.origin.y) / chartFrame.height) + userDidSelectCoordinateClosure?(fractionPoint) + } + } + + override func touchesEnded(_ touches: Set, with event: UIEvent?) { + userDidDeselectCoordinateClosure?() + } + + override func touchesCancelled(_ touches: Set, with event: UIEvent?) { + userDidDeselectCoordinateClosure?() + } + + // MARK: Details View + + private var detailsView: ChartDetailsView! + private var maxDetailsViewWidth: CGFloat = 0 + func loadDetailsViewIfNeeded() { + if detailsView == nil { + let detailsView = ChartDetailsView(frame: bounds) + addSubview(detailsView) + detailsView.alpha = 0 + self.detailsView = detailsView + } + } + + private var detailsTableTopOffset: CGFloat = 5 + private var detailsTableLeftOffset: CGFloat = 8 + private var isDetailsViewVisible: Bool = false + + var detailsViewPosition: CGFloat = 0 { + didSet { + loadDetailsViewIfNeeded() + let detailsViewSize = detailsView.intrinsicContentSize + maxDetailsViewWidth = max(maxDetailsViewWidth, detailsViewSize.width) + if maxDetailsViewWidth + detailsTableLeftOffset > detailsViewPosition { + detailsView.frame = CGRect(x: min(detailsViewPosition + detailsTableLeftOffset, bounds.width - maxDetailsViewWidth), + y: chartInsets.top + detailsTableTopOffset, + width: maxDetailsViewWidth, + height: detailsViewSize.height) + } else { + detailsView.frame = CGRect(x: detailsViewPosition - maxDetailsViewWidth - detailsTableLeftOffset, + y: chartInsets.top + detailsTableTopOffset, + width: maxDetailsViewWidth, + height: detailsViewSize.height) + } + } + } + + func setDetailsChartVisible(_ visible: Bool, animated: Bool) { + guard isDetailsViewVisible != visible else { + return + } + isDetailsViewVisible = visible + loadDetailsViewIfNeeded() + detailsView.setVisible(visible, animated: animated) + if !visible { + maxDetailsViewWidth = 0 + } + } + + func setDetailsViewModel(viewModel: ChartDetailsViewModel, animated: Bool) { + loadDetailsViewIfNeeded() + detailsView.setup(viewModel: viewModel, animated: animated) + UIView.perform(animated: animated, animations: { + let position = self.detailsViewPosition + self.detailsViewPosition = position + }) + } + + func setupView() { + backgroundColor = .clear + layer.drawsAsynchronously = true + } +} + + +extension ChartView: ColorModeContainer { + func apply(colorMode: ColorMode, animated: Bool) { + detailsView?.apply(colorMode: colorMode, animated: animated && (detailsView?.isVisibleInWindow ?? false)) + } +} diff --git a/submodules/Charts/Sources/Chart Screen/ChartVisibilityItemView.swift b/submodules/Charts/Sources/Chart Screen/ChartVisibilityItemView.swift new file mode 100644 index 0000000000..2476526f1a --- /dev/null +++ b/submodules/Charts/Sources/Chart Screen/ChartVisibilityItemView.swift @@ -0,0 +1,95 @@ +// +// ChartVisibilityItemCell.swift +// GraphTest +// +// Created by Andrei Salavei on 4/7/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +class ChartVisibilityItemView: UIView { + static let textFont = UIFont.systemFont(ofSize: 14, weight: .medium) + + let checkButton: UIButton = UIButton(type: .system) + + override init(frame: CGRect) { + super.init(frame: frame) + + setupView() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + override func awakeFromNib() { + super.awakeFromNib() + setupView() + } + + func setupView() { + checkButton.frame = bounds + checkButton.titleLabel?.font = ChartVisibilityItemView.textFont + checkButton.layer.cornerRadius = 6 + checkButton.layer.masksToBounds = true + checkButton.addTarget(self, action: #selector(didTapButton), for: .touchUpInside) + let pressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(didRecognizedLongPress(recognizer:))) + pressRecognizer.cancelsTouchesInView = true + checkButton.addGestureRecognizer(pressRecognizer) + addSubview(checkButton) + } + + var tapClosure: (() -> Void)? + var longTapClosure: (() -> Void)? + + private func updateStyle(animated: Bool) { + guard let item = item else { + return + } + UIView.perform(animated: animated, animations: { + if self.isChecked { + self.checkButton.setTitleColor(.white, for: .normal) + self.checkButton.backgroundColor = item.color + self.checkButton.layer.borderColor = nil + self.checkButton.layer.borderWidth = 0 + self.checkButton.setTitle("âś“ " + item.title, for: .normal) + } else { + self.checkButton.backgroundColor = .clear + self.checkButton.layer.borderColor = item.color.cgColor + self.checkButton.layer.borderWidth = 1 + self.checkButton.setTitleColor(item.color, for: .normal) + self.checkButton.setTitle(item.title, for: .normal) + } + + }) + } + + override func layoutSubviews() { + super.layoutSubviews() + + checkButton.frame = bounds + } + + @objc private func didTapButton() { + tapClosure?() + } + + @objc private func didRecognizedLongPress(recognizer: UIGestureRecognizer) { + if recognizer.state == .began { + longTapClosure?() + } + } + + var item: ChartVisibilityItem? = nil { + didSet { + updateStyle(animated: false) + } + } + + private(set) var isChecked: Bool = true + func setChecked(isChecked: Bool, animated: Bool) { + self.isChecked = isChecked + updateStyle(animated: true) + } +} diff --git a/submodules/Charts/Sources/Chart Screen/ChartVisibilityView.swift b/submodules/Charts/Sources/Chart Screen/ChartVisibilityView.swift new file mode 100644 index 0000000000..fda3c3901f --- /dev/null +++ b/submodules/Charts/Sources/Chart Screen/ChartVisibilityView.swift @@ -0,0 +1,147 @@ +// +// ChartVisibilityView.swift +// GraphTest +// +// Created by Andrei Salavei on 4/13/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +private enum Constants { + static let itemHeight: CGFloat = 30 + static let itemSpacing: CGFloat = 8 + static let labelTextApproxInsets: CGFloat = 40 + static let insets = UIEdgeInsets(top: 0, left: 16, bottom: 16, right: 16) +} + +struct ChartVisibilityItem { + var title: String + var color: UIColor +} + +class ChartVisibilityView: UIView { + var items: [ChartVisibilityItem] = [] { + didSet { + selectedItems = items.map { _ in true } + while selectionViews.count > selectedItems.count { + selectionViews.last?.removeFromSuperview() + selectionViews.removeLast() + } + while selectionViews.count < selectedItems.count { + let view = ChartVisibilityItemView(frame: bounds) + addSubview(view) + selectionViews.append(view) + } + + for (index, item) in items.enumerated() { + let view = selectionViews[index] + view.item = item + view.tapClosure = { [weak self] in + guard let self = self else { return } + self.setItemSelected(!self.selectedItems[index], at: index, animated: true) + self.notifyItemSelection() + } + + view.longTapClosure = { [weak self] in + guard let self = self else { return } + let hasSelectedItem = self.selectedItems.enumerated().contains(where: { $0.element && $0.offset != index }) + if hasSelectedItem { + for (itemIndex, _) in self.items.enumerated() { + self.setItemSelected(itemIndex == index, at: itemIndex, animated: true) + } + } else { + for (itemIndex, _) in self.items.enumerated() { + self.setItemSelected(true, at: itemIndex, animated: true) + } + } + self.notifyItemSelection() + } + } + } + } + + private (set) var selectedItems: [Bool] = [] + var isExpanded: Bool = true { + didSet { + invalidateIntrinsicContentSize() + setNeedsUpdateConstraints() + } + } + + private var selectionViews: [ChartVisibilityItemView] = [] + + private func generateItemsFrames(frame: CGRect) -> [CGRect] { + var previousPoint = CGPoint(x: Constants.insets.left, y: Constants.insets.top) + var frames: [CGRect] = [] + + for item in items { + let labelSize = (item.title as NSString).size(withAttributes: [.font: ChartVisibilityItemView.textFont]) + let width = (labelSize.width + Constants.labelTextApproxInsets).rounded(.up) + if previousPoint.x + width < (frame.width - Constants.insets.left - Constants.insets.right) { + frames.append(CGRect(origin: previousPoint, size: CGSize(width: width, height: Constants.itemHeight))) + } else if previousPoint.x <= Constants.insets.left { + frames.append(CGRect(origin: previousPoint, size: CGSize(width: width, height: Constants.itemHeight))) + } else { + previousPoint.y += Constants.itemHeight + Constants.itemSpacing + previousPoint.x = Constants.insets.left + frames.append(CGRect(origin: previousPoint, size: CGSize(width: width, height: Constants.itemHeight))) + } + previousPoint.x += width + Constants.itemSpacing + } + + return frames + } + + var selectionCallbackClosure: (([Bool]) -> Void)? + + func setItemSelected(_ selected: Bool, at index: Int, animated: Bool) { + self.selectedItems[index] = selected + self.selectionViews[index].setChecked(isChecked: selected, animated: animated) + } + + func setItemsSelection(_ selection: [Bool]) { + assert(selection.count == items.count) + self.selectedItems = selection + for (index, selected) in self.selectedItems.enumerated() { + selectionViews[index].setChecked(isChecked: selected, animated: false) + } + } + + private func notifyItemSelection() { + selectionCallbackClosure?(selectedItems) + } + + override func layoutSubviews() { + super.layoutSubviews() + + updateFrames() + } + + private func updateFrames() { + for (index, frame) in generateItemsFrames(frame: bounds).enumerated() { + selectionViews[index].frame = frame + } + } + + override var intrinsicContentSize: CGSize { + guard isExpanded else { + var size = self.bounds.size + size.height = 0 + return size + } + let frames = generateItemsFrames(frame: UIScreen.main.bounds) + guard let lastFrame = frames.last else { return .zero } + let size = CGSize(width: frame.width, height: lastFrame.maxY + Constants.insets.bottom) + return size + } +} + +extension ChartVisibilityView: ColorModeContainer { + func apply(colorMode: ColorMode, animated: Bool) { + UIView.perform(animated: animated) { + self.backgroundColor = colorMode.chartBackgroundColor + self.tintColor = colorMode.descriptionActionColor + } + } +} diff --git a/submodules/Charts/Sources/Chart Screen/ChartsDataLoader.swift b/submodules/Charts/Sources/Chart Screen/ChartsDataLoader.swift new file mode 100644 index 0000000000..085e4689bd --- /dev/null +++ b/submodules/Charts/Sources/Chart Screen/ChartsDataLoader.swift @@ -0,0 +1,51 @@ +// +// ChartsDataLoader.swift +// GraphTest +// +// Created by Andrei Salavei on 4/8/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import Foundation + +enum ChartsDataType: String { + case generalLines = "1" + case twoAxisLines = "2" + case stackedBars = "3" + case dailyBars = "4" + case percentPie = "5" +} + +private enum Constants { + static let overviewFilename = "overview.json" + static let dataDir = "data" +} + +class ChartsDataLoader { + static var documentDirectoryURL: URL { + let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) + let documentsDirectory = paths[0] + return documentsDirectory + } + + static func overviewData(type: ChartsDataType, extraCopiesCount: Int = 0, sync: Bool = false, success: @escaping (ChartsCollection) -> Void) { + let path = Bundle.main.bundleURL + .appendingPathComponent(Constants.dataDir) + .appendingPathComponent(type.rawValue) + .appendingPathComponent(Constants.overviewFilename) + ChartsDataManager().readChart(file: path, extraCopiesCount: extraCopiesCount, sync: sync, success: success, failure: { _ in }) + } + + static func detaildData(type: ChartsDataType, extraCopiesCount: Int = 0, date: Date, success: @escaping (ChartsCollection) -> Void, failure: @escaping (Error) -> Void) { + let dateComponents = Calendar.utc.dateComponents([.day, .month, .year], from: date) + let yearMonth = String(format: "%04d-%02d", dateComponents.year ?? 0, dateComponents.month ?? 0) + let day = String(format: "%02d.json", dateComponents.day ?? 0) + + let path = Bundle.main.bundleURL + .appendingPathComponent(Constants.dataDir) + .appendingPathComponent(type.rawValue) + .appendingPathComponent(yearMonth) + .appendingPathComponent(day) + ChartsDataManager().readChart(file: path, extraCopiesCount: extraCopiesCount, sync: false, success: success, failure: failure) + } +} diff --git a/submodules/Charts/Sources/Chart Screen/ChartsStackViewController.swift b/submodules/Charts/Sources/Chart Screen/ChartsStackViewController.swift new file mode 100644 index 0000000000..e8c22e6453 --- /dev/null +++ b/submodules/Charts/Sources/Chart Screen/ChartsStackViewController.swift @@ -0,0 +1,222 @@ +// +// ChartsStackViewController.swift +// GraphTest +// +// Created by Andrei Salavei on 4/13/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +class ChartsStackViewController: UIViewController { + @IBOutlet private var stackView: UIStackView! + @IBOutlet private var scrollView: UIScrollView! + @IBOutlet private var psLabel: UILabel! + @IBOutlet private var ppsLabel: UILabel! + @IBOutlet private var animationButton: ChartVisibilityItemView! + + private var sections: [ChartStackSection] = [] + + private var colorMode: ColorMode = .night + private var colorModeButton: UIBarButtonItem! + private var performFastAnimation: Bool = false + + override func viewDidLoad() { + super.viewDidLoad() + + title = "Statistics" + colorModeButton = UIBarButtonItem(title: colorMode.switchTitle, style: .plain, target: self, action: #selector(didTapSwitchColorMode)) + navigationItem.rightBarButtonItem = colorModeButton + + apply(colorMode: colorMode, animated: false) + + self.navigationController?.navigationBar.barStyle = .black + self.navigationController?.navigationBar.isTranslucent = false + + self.view.isUserInteractionEnabled = false + animationButton.backgroundColor = .clear + animationButton.tapClosure = { [weak self] in + guard let self = self else { return } + self.setSlowAnimationEnabled(!self.animationButton.isChecked) + } + self.setSlowAnimationEnabled(false) + + loadChart1() + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + + DispatchQueue.main.async { + self.view.setNeedsUpdateConstraints() + self.view.setNeedsLayout() + } + } + + func loadChart1() { + ChartsDataLoader.overviewData(type: .generalLines, sync: true, success: { collection in + let generalLinesChartController = GeneralLinesChartController(chartsCollection: collection) + self.addSection(controller: generalLinesChartController, title: "FOLLOWERS") + generalLinesChartController.getDetailsData = { date, completion in + ChartsDataLoader.detaildData(type: .generalLines, date: date, success: { collection in + completion(collection) + }, failure: { error in + completion(nil) + }) + } + DispatchQueue.main.async { + self.loadChart2() + } + }) + } + + func loadChart2() { + ChartsDataLoader.overviewData(type: .twoAxisLines, success: { collection in + let twoAxisLinesChartController = TwoAxisLinesChartController(chartsCollection: collection) + self.addSection(controller: twoAxisLinesChartController, title: "INTERACTIONS") + twoAxisLinesChartController.getDetailsData = { date, completion in + ChartsDataLoader.detaildData(type: .twoAxisLines, date: date, success: { collection in + completion(collection) + }, failure: { error in + completion(nil) + }) + } + DispatchQueue.main.async { + self.loadChart3() + } + }) + } + + func loadChart3() { + ChartsDataLoader.overviewData(type: .stackedBars, success: { collection in + let stackedBarsChartController = StackedBarsChartController(chartsCollection: collection) + self.addSection(controller: stackedBarsChartController, title: "FRUITS") + stackedBarsChartController.getDetailsData = { date, completion in + ChartsDataLoader.detaildData(type: .stackedBars, date: date, success: { collection in + completion(collection) + }, failure: { error in + completion(nil) + }) + } + DispatchQueue.main.async { + self.loadChart4() + } + }) + } + + func loadChart4() { + ChartsDataLoader.overviewData(type: .dailyBars, success: { collection in + let dailyBarsChartController = DailyBarsChartController(chartsCollection: collection) + self.addSection(controller: dailyBarsChartController, title: "VIEWS") + dailyBarsChartController.getDetailsData = { date, completion in + ChartsDataLoader.detaildData(type: .dailyBars, date: date, success: { collection in + completion(collection) + }, failure: { error in + completion(nil) + }) + } + DispatchQueue.main.async { + self.loadChart5() + } + }) + } + + func loadChart5() { + ChartsDataLoader.overviewData(type: .percentPie, success: { collection in + let percentPieChartController = PercentPieChartController(chartsCollection: collection) + self.addSection(controller: percentPieChartController, title: "MORE FRUITS") + self.finalizeChartsLoading() + }) + } + + func setSlowAnimationEnabled(_ isEnabled: Bool) { + animationButton.setChecked(isChecked: isEnabled, animated: true) + if isEnabled { + TimeInterval.animationDurationMultipler = 5 + } else { + TimeInterval.animationDurationMultipler = 1 + } + } + + func finalizeChartsLoading() { + self.view.isUserInteractionEnabled = true + } + + func addSection(controller: BaseChartController, title: String) { + let section = Bundle.main.loadNibNamed("ChartStackSection", owner: nil, options: nil)?.first as! ChartStackSection + section.frame = UIScreen.main.bounds + section.layoutIfNeeded() + section.setup(controller: controller, title: title) + section.apply(colorMode: colorMode, animated: false) + stackView.addArrangedSubview(section) + sections.append(section) + } + + override var preferredStatusBarStyle: UIStatusBarStyle { + return (colorMode == .day) ? .default : .lightContent + } + + override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { + return .fade + } + + @objc private func didTapSwitchColorMode() { + self.colorMode = self.colorMode == .day ? .night : .day + apply(colorMode: self.colorMode, animated: !performFastAnimation) + colorModeButton.title = colorMode.switchTitle + } +} + +extension ChartsStackViewController: UIScrollViewDelegate { + func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { + performFastAnimation = decelerate + } + + func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { + performFastAnimation = false + } +} + +extension ChartsStackViewController: ColorModeContainer { + func apply(colorMode: ColorMode, animated: Bool) { + + UIView.perform(animated: animated) { + self.psLabel.setTextColor(colorMode.sectionTitleColor, animated: animated && self.psLabel.isVisibleInWindow) + self.ppsLabel.setTextColor(colorMode.sectionTitleColor, animated: animated && self.ppsLabel.isVisibleInWindow) + self.animationButton.item = ChartVisibilityItem(title: "Enable slow animations", + color: colorMode.sectionTitleColor) + + self.view.backgroundColor = colorMode.tableBackgroundColor + + if (animated) { + let animation = CATransition() + animation.timingFunction = CAMediaTimingFunction.init(name: .linear) + animation.type = .fade + animation.duration = .defaultDuration + self.navigationController?.navigationBar.layer.add(animation, forKey: "kCATransitionColorFade") + } + + self.navigationController?.navigationBar.tintColor = colorMode.actionButtonColor + self.navigationController?.navigationBar.barTintColor = colorMode.chartBackgroundColor + self.navigationController?.navigationBar.titleTextAttributes = [.font: UIFont.systemFont(ofSize: 17, weight: .medium), + .foregroundColor: colorMode.viewTintColor] + self.view.layoutIfNeeded() + } + self.setNeedsStatusBarAppearanceUpdate() + + for section in sections { + section.apply(colorMode: colorMode, animated: animated && section.isVisibleInWindow) + } + } +} + +extension ColorMode { + var switchTitle: String { + switch self { + case .day: + return "Night Mode" + case .night: + return "Day Mode" + } + } +} diff --git a/submodules/Charts/Sources/Chart Screen/RangeChartView.swift b/submodules/Charts/Sources/Chart Screen/RangeChartView.swift new file mode 100644 index 0000000000..91089c1de8 --- /dev/null +++ b/submodules/Charts/Sources/Chart Screen/RangeChartView.swift @@ -0,0 +1,291 @@ +// +// RangeChartView.swift +// GraphTest +// +// Created by Andrei Salavei on 3/11/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// +import UIKit + +private enum Constants { + static let cropIndocatorLineWidth: CGFloat = 1 + static let markerSelectionRange: CGFloat = 25 + static let defaultMinimumRangeDistance: CGFloat = 0.05 + static let titntAreaWidth: CGFloat = 10 + static let horizontalContentMargin: CGFloat = 16 + static let cornerRadius: CGFloat = 5 +} + +class RangeChartView: UIControl { + private enum Marker { + case lower + case upper + case center + } + public var lowerBound: CGFloat = 0 { + didSet { + setNeedsLayout() + } + } + public var upperBound: CGFloat = 1 { + didSet { + setNeedsLayout() + } + } + public var selectionColor: UIColor = .blue + public var defaultColor: UIColor = .lightGray + + public var minimumRangeDistance: CGFloat = Constants.defaultMinimumRangeDistance + + private let lowerBoundTintView = UIView() + private let upperBoundTintView = UIView() + private let cropFrameView = UIImageView() + + private var selectedMarker: Marker? + private var selectedMarkerHorizontalOffet: CGFloat = 0 + private var isBoundCropHighlighted: Bool = false + private var isRangePagingEnabled: Bool = false + + public let chartView = ChartView() + + override init(frame: CGRect) { + super.init(frame: frame) + + layoutMargins = UIEdgeInsets(top: Constants.cropIndocatorLineWidth, + left: Constants.horizontalContentMargin, + bottom: Constants.cropIndocatorLineWidth, + right: Constants.horizontalContentMargin) + + self.setup() + } + + func setup() { + isMultipleTouchEnabled = false + + chartView.chartInsets = .zero + chartView.backgroundColor = .clear + + addSubview(chartView) + addSubview(lowerBoundTintView) + addSubview(upperBoundTintView) + addSubview(cropFrameView) + cropFrameView.isUserInteractionEnabled = false + chartView.isUserInteractionEnabled = false + lowerBoundTintView.isUserInteractionEnabled = false + upperBoundTintView.isUserInteractionEnabled = false + + chartView.layer.cornerRadius = 5 + upperBoundTintView.layer.cornerRadius = 5 + lowerBoundTintView.layer.cornerRadius = 5 + + chartView.layer.masksToBounds = true + upperBoundTintView.layer.masksToBounds = true + lowerBoundTintView.layer.masksToBounds = true + + layoutViews() + } + + override func awakeFromNib() { + super.awakeFromNib() + + self.setup() + } + + public var rangeDidChangeClosure: ((ClosedRange) -> Void)? + public var touchedOutsideClosure: (() -> Void)? + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + func setRangePaging(enabled: Bool, minimumSize: CGFloat) { + isRangePagingEnabled = enabled + minimumRangeDistance = minimumSize + } + + func setRange(_ range: ClosedRange, animated: Bool) { + UIView.perform(animated: animated) { + self.lowerBound = range.lowerBound + self.upperBound = range.upperBound + self.layoutIfNeeded() + } + } + + override func layoutSubviews() { + super.layoutSubviews() + + layoutViews() + } + + override var isEnabled: Bool { + get { + return super.isEnabled + } + set { + if newValue == false { + selectedMarker = nil + } + super.isEnabled = newValue + } + } + + // MARK: - Touches + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + guard isEnabled else { return } + guard let point = touches.first?.location(in: self) else { return } + + if abs(locationInView(for: upperBound) - point.x + Constants.markerSelectionRange / 2) < Constants.markerSelectionRange { + selectedMarker = .upper + selectedMarkerHorizontalOffet = point.x - locationInView(for: upperBound) + isBoundCropHighlighted = true + } else if abs(locationInView(for: lowerBound) - point.x - Constants.markerSelectionRange / 2) < Constants.markerSelectionRange { + selectedMarker = .lower + selectedMarkerHorizontalOffet = point.x - locationInView(for: lowerBound) + isBoundCropHighlighted = true + } else if point.x > locationInView(for: lowerBound) && point.x < locationInView(for: upperBound) { + selectedMarker = .center + selectedMarkerHorizontalOffet = point.x - locationInView(for: lowerBound) + isBoundCropHighlighted = true + } else { + selectedMarker = nil + return + } + + sendActions(for: .touchDown) + } + + override func touchesMoved(_ touches: Set, with event: UIEvent?) { + guard isEnabled else { return } + guard let selectedMarker = selectedMarker else { return } + guard let point = touches.first?.location(in: self) else { return } + + let horizontalPosition = point.x - selectedMarkerHorizontalOffet + let fraction = fractionFor(offsetX: horizontalPosition) + updateMarkerOffset(selectedMarker, fraction: fraction) + + sendActions(for: .valueChanged) + } + + override func touchesEnded(_ touches: Set, with event: UIEvent?) { + guard isEnabled else { return } + guard let selectedMarker = selectedMarker else { + touchedOutsideClosure?() + return + } + guard let point = touches.first?.location(in: self) else { return } + + let horizontalPosition = point.x - selectedMarkerHorizontalOffet + let fraction = fractionFor(offsetX: horizontalPosition) + updateMarkerOffset(selectedMarker, fraction: fraction) + + self.selectedMarker = nil + self.isBoundCropHighlighted = false + if bounds.contains(point) { + sendActions(for: .touchUpInside) + } else { + sendActions(for: .touchUpOutside) + } + rangeDidChangeClosure?(lowerBound...upperBound) + } + + override func touchesCancelled(_ touches: Set, with event: UIEvent?) { + self.selectedMarker = nil + self.isBoundCropHighlighted = false + sendActions(for: .touchCancel) + } +} + +private extension RangeChartView { + var contentFrame: CGRect { + return CGRect(x: layoutMargins.right, + y: layoutMargins.top, + width: (bounds.width - layoutMargins.right - layoutMargins.left), + height: bounds.height - layoutMargins.top - layoutMargins.bottom) + } + + func locationInView(for fraction: CGFloat) -> CGFloat { + return contentFrame.minX + contentFrame.width * fraction + } + + func locationInView(for fraction: Double) -> CGFloat { + return locationInView(for: CGFloat(fraction)) + } + + func fractionFor(offsetX: CGFloat) -> CGFloat { + guard contentFrame.width > 0 else { + return 0 + } + + return crop(0, CGFloat((offsetX - contentFrame.minX ) / contentFrame.width), 1) + } + + private func updateMarkerOffset(_ marker: Marker, fraction: CGFloat, notifyDelegate: Bool = true) { + let fractionToCount: CGFloat + if isRangePagingEnabled { + guard let minValue = stride(from: CGFloat(0.0), through: CGFloat(1.0), by: minimumRangeDistance).min(by: { abs($0 - fraction) < abs($1 - fraction) }) else { return } + fractionToCount = minValue + } else { + fractionToCount = fraction + } + + switch marker { + case .lower: + lowerBound = min(fractionToCount, upperBound - minimumRangeDistance) + case .upper: + upperBound = max(fractionToCount, lowerBound + minimumRangeDistance) + case .center: + let distance = upperBound - lowerBound + lowerBound = max(0, min(fractionToCount, 1 - distance)) + upperBound = lowerBound + distance + } + if notifyDelegate { + rangeDidChangeClosure?(lowerBound...upperBound) + } + UIView.animate(withDuration: isRangePagingEnabled ? 0.1 : 0) { + self.layoutIfNeeded() + } + } + + // MARK: - Layout + + func layoutViews() { + cropFrameView.frame = CGRect(x: locationInView(for: lowerBound), + y: contentFrame.minY - Constants.cropIndocatorLineWidth, + width: locationInView(for: upperBound) - locationInView(for: lowerBound), + height: contentFrame.height + Constants.cropIndocatorLineWidth * 2) + + if chartView.frame != contentFrame { + chartView.frame = contentFrame + } + + lowerBoundTintView.frame = CGRect(x: contentFrame.minX, + y: contentFrame.minY, + width: max(0, locationInView(for: lowerBound) - contentFrame.minX + Constants.titntAreaWidth), + height: contentFrame.height) + + upperBoundTintView.frame = CGRect(x: locationInView(for: upperBound) - Constants.titntAreaWidth, + y: contentFrame.minY, + width: max(0, contentFrame.maxX - locationInView(for: upperBound) + Constants.titntAreaWidth), + height: contentFrame.height) + } +} + +extension RangeChartView: ColorModeContainer { + func apply(colorMode: ColorMode, animated: Bool) { + let colusre = { + self.lowerBoundTintView.backgroundColor = colorMode.rangeViewTintColor + self.upperBoundTintView.backgroundColor = colorMode.rangeViewTintColor + } + + self.cropFrameView.setImage(colorMode.rangeCropImage, animated: animated) + + // self.chartView.apply(colorMode: colorMode, animated: animated) + + if animated { + UIView.animate(withDuration: .defaultDuration, animations: colusre) + } else { + colusre() + } + } +} diff --git a/submodules/Charts/Sources/ChartNode.swift b/submodules/Charts/Sources/ChartNode.swift new file mode 100644 index 0000000000..b6c6da436c --- /dev/null +++ b/submodules/Charts/Sources/ChartNode.swift @@ -0,0 +1,48 @@ +import Foundation +import UIKit +import Display +import AsyncDisplayKit +import AppBundle + +public final class ChartNode: ASDisplayNode { + private var chartView: ChartStackSection { + return self.view as! ChartStackSection + } + + public override init() { + super.init() + + self.setViewBlock({ + return ChartStackSection() + }) + } + + public override func didLoad() { + super.didLoad() + + self.view.disablesInteractiveTransitionGestureRecognizer = true + } + + public func setup(_ data: String, bar: Bool = false) { + if let data = data.data(using: .utf8) { + ChartsDataManager().readChart(data: data, extraCopiesCount: 0, sync: true, success: { [weak self] collection in + let controller: BaseChartController + if bar { + controller = DailyBarsChartController(chartsCollection: collection) + } else { + controller = GeneralLinesChartController(chartsCollection: collection) + } + if let strongSelf = self { + strongSelf.chartView.setup(controller: controller, title: "") + strongSelf.chartView.apply(colorMode: .day, animated: false) + } + }) { error in + + } + } + } + + required public init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/submodules/Charts/Sources/Charts Reader/ChartsCollection.swift b/submodules/Charts/Sources/Charts Reader/ChartsCollection.swift new file mode 100644 index 0000000000..f3ecd8215d --- /dev/null +++ b/submodules/Charts/Sources/Charts Reader/ChartsCollection.swift @@ -0,0 +1,91 @@ +// +// ChardData.swift +// GraphTest +// +// Created by Andrei Salavei on 3/11/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import Foundation +import UIKit + +struct ChartsCollection { + struct Chart { + var color: UIColor + var name: String + var values: [Double] + } + + var axisValues: [Date] + var chartValues: [Chart] + + static let blank = ChartsCollection(axisValues: [], chartValues: []) + var isBlank: Bool { + return axisValues.isEmpty || chartValues.isEmpty + } +} + +extension ChartsCollection { + public init(from decodedData: [String: Any]) throws { + guard let columns = decodedData["columns"] as? [[Any]] else { + throw ChartsError.generalConversion("Unable to get columns from: \(decodedData)") + } + guard let types = decodedData["types"] as? [String: String] else { + throw ChartsError.generalConversion("Unable to get types from: \(decodedData)") + } + guard let names = decodedData["names"] as? [String: String] else { + throw ChartsError.generalConversion("Unable to get names from: \(decodedData)") + } + guard let colors = decodedData["colors"] as? [String: String] else { + throw ChartsError.generalConversion("Unable to get colors from: \(decodedData)") + } + +// chart.colors – Color for each variable in 6-hex-digit format (e.g. "#AAAAAA"). +// chart.names – Name for each variable. +// chart.percentage – true for percentage based values. +// chart.stacked – true for values stacking on top of each other. +// chart.y_scaled – true for charts with 2 Y axes. + + var axixValuesToSetup: [Date] = [] + var chartToSetup: [Chart] = [] + for column in columns { + guard let columnId = column.first as? String else { + throw ChartsError.generalConversion("Unable to get column name from: \(column)") + } + guard let typeString = types[columnId], let type = ColumnType(rawValue: typeString) else { + throw ChartsError.generalConversion("Unable to get column type from: \(types) - \(columnId)") + } + switch type { + case .axix: + axixValuesToSetup = try column.dropFirst().map { Date(timeIntervalSince1970: try Convert.doubleFrom($0) / 1000) } + case .chart, .bar, .area: + guard let colorString = colors[columnId], + let color = UIColor(hexString: colorString) else { + throw ChartsError.generalConversion("Unable to get color name from: \(colors) - \(columnId)") + } + guard let name = names[columnId] else { + throw ChartsError.generalConversion("Unable to get column name from: \(names) - \(columnId)") + } + let values = try column.dropFirst().map { try Convert.doubleFrom($0) } + chartToSetup.append(Chart(color: color, + name: name, + values: values)) + } + } + + guard axixValuesToSetup.isEmpty == false, + chartToSetup.isEmpty == false, + chartToSetup.firstIndex(where: { $0.values.count != axixValuesToSetup.count }) == nil else { + throw ChartsError.generalConversion("Saniazing: Invalid number of items: \(axixValuesToSetup), \(chartToSetup)") + } + self.axisValues = axixValuesToSetup + self.chartValues = chartToSetup + } +} + +private enum ColumnType: String { + case axix = "x" + case chart = "line" + case area = "area" + case bar = "bar" +} diff --git a/submodules/Charts/Sources/Charts Reader/ChartsDataManager.swift b/submodules/Charts/Sources/Charts Reader/ChartsDataManager.swift new file mode 100644 index 0000000000..1a32f9bcee --- /dev/null +++ b/submodules/Charts/Sources/Charts Reader/ChartsDataManager.swift @@ -0,0 +1,191 @@ +// +// ChartsDataManager.swift +// GraphTest +// +// Created by Andrei Salavei on 3/11/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import Foundation + +class ChartsDataManager { + func readChart(item: [String: Any], extraCopiesCount: Int = 0, sync: Bool, success: @escaping (ChartsCollection) -> Void, failure: @escaping (Error) -> Void) { + let workItem: (() -> Void) = { + do { + var collection = try ChartsCollection(from: item) + for _ in 0.. Void, failure: @escaping (Error) -> Void) { + let workItem: (() -> Void) = { + do { + let decoded = try JSONSerialization.jsonObject(with: data, options: []) + guard let item = decoded as? [String: Any] else { + throw ChartsError.invalidJson + } + var collection = try ChartsCollection(from: item) + for _ in 0.. Void, failure: @escaping (Error) -> Void) { + let workItem: (() -> Void) = { + do { + let data = try Data(contentsOf: file) + let decoded = try JSONSerialization.jsonObject(with: data, options: []) + guard let item = decoded as? [String: Any] else { + throw ChartsError.invalidJson + } + var collection = try ChartsCollection(from: item) + for _ in 0.. Void, failure: @escaping (Error) -> Void) { + let workItem: (() -> Void) = { + do { + let data = try Data(contentsOf: file) + let decoded = try JSONSerialization.jsonObject(with: data, options: []) + guard let items = decoded as? [[String: Any]] else { + throw ChartsError.invalidJson + } + var collections = try items.map { try ChartsCollection(from: $0) } + for _ in 0.. Double { + guard let double = try doubleFrom(value, lenientCast: false) else { + throw ChartsError.generalConversion("Unable to cast \(String(describing: value)) to \(Double.self)") + } + return double + } + + public static func doubleFrom(_ value: Any?, lenientCast: Bool = false) throws -> Double? { + guard let value = value else { + return nil + } + if let intValue = value as? Int { + return Double(intValue) + } else if let floatValue = value as? Float { + return Double(floatValue) + } else if let int64Value = value as? Int64 { + return Double(int64Value) + } else if let intValue = value as? Int { + return Double(intValue) + } else if let stringValue = value as? String { + if let doubleValue = Double(stringValue) { + return doubleValue + } + } + if lenientCast { + return nil + } else { + throw ChartsError.generalConversion("Unable to cast \(String(describing: value)) to \(Double.self)") + } + } +} diff --git a/submodules/Charts/Sources/Charts.h b/submodules/Charts/Sources/Charts.h new file mode 100644 index 0000000000..89573b3f16 --- /dev/null +++ b/submodules/Charts/Sources/Charts.h @@ -0,0 +1,19 @@ +// +// StatisticsUI.h +// StatisticsUI +// +// Created by Peter on 8/13/19. +// Copyright © 2019 Telegram Messenger LLP. All rights reserved. +// + +#import + +//! Project version number for StatisticsUI. +FOUNDATION_EXPORT double StatisticsUIVersionNumber; + +//! Project version string for StatisticsUI. +FOUNDATION_EXPORT const unsigned char StatisticsUIVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/submodules/Charts/Sources/Charts/Controllers/BaseChartController.swift b/submodules/Charts/Sources/Charts/Controllers/BaseChartController.swift new file mode 100644 index 0000000000..7f91e50ea5 --- /dev/null +++ b/submodules/Charts/Sources/Charts/Controllers/BaseChartController.swift @@ -0,0 +1,166 @@ +// +// BaseChartController.swift +// GraphTest +// +// Created by Andrei Salavei on 4/7/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +enum BaseConstants { + static let defaultRange: ClosedRange = 0...1 + static let minimumAxisYLabelsDistance: CGFloat = 90 + static let monthDayDateFormatter = DateFormatter.utc(format: "MMM d") + static let timeDateFormatter = DateFormatter.utc(format: "HH:mm") + static let headerFullRangeFormatter: DateFormatter = { + let formatter = DateFormatter.utc() + formatter.calendar = Calendar.utc + formatter.dateStyle = .long + return formatter + }() + static let headerMediumRangeFormatter: DateFormatter = { + let formatter = DateFormatter.utc() + formatter.dateStyle = .medium + return formatter + }() + static let headerFullZoomedFormatter: DateFormatter = { + let formatter = DateFormatter.utc() + formatter.dateStyle = .full + return formatter + }() + + static let verticalBaseAnchors: [CGFloat] = [8, 5, 2.5, 2, 1] + static let defaultVerticalBaseAnchor: CGFloat = 1 + + static let mainChartLineWidth: CGFloat = 2 + static let previewChartLineWidth: CGFloat = 1 + + static let previewLinesChartOptimizationLevel: CGFloat = 1.5 + static let linesChartOptimizationLevel: CGFloat = 1.0 + static let barsChartOptimizationLevel: CGFloat = 0.75 + + static let defaultRangePresetLength = TimeInterval.day * 60 + + static let chartNumberFormatter: ScalesNumberFormatter = { + let numberFormatter = ScalesNumberFormatter() + numberFormatter.allowsFloats = true + numberFormatter.numberStyle = .decimal + numberFormatter.usesGroupingSeparator = true + numberFormatter.groupingSeparator = " " + numberFormatter.minimumIntegerDigits = 1 + numberFormatter.minimumFractionDigits = 0 + numberFormatter.maximumFractionDigits = 2 + return numberFormatter + }() + + static let detailsNumberFormatter: NumberFormatter = { + let detailsNumberFormatter = NumberFormatter() + detailsNumberFormatter.allowsFloats = false + detailsNumberFormatter.numberStyle = .decimal + detailsNumberFormatter.usesGroupingSeparator = true + detailsNumberFormatter.groupingSeparator = " " + return detailsNumberFormatter + }() +} + +class BaseChartController: ColorModeContainer { + //let performanceRenderer = PerformanceRenderer() + var initialChartsCollection: ChartsCollection + var isZoomed: Bool = false + + var chartTitle: String = "" + + init(chartsCollection: ChartsCollection) { + self.initialChartsCollection = chartsCollection + } + + var mainChartRenderers: [ChartViewRenderer] { + fatalError("Abstract") + } + + var navigationRenderers: [ChartViewRenderer] { + fatalError("Abstract") + } + + var cartViewBounds: (() -> CGRect) = { fatalError() } + var chartFrame: (() -> CGRect) = { fatalError() } + + func initializeChart() { + fatalError("Abstract") + } + + func chartInteractionDidBegin(point: CGPoint) { + fatalError("Abstract") + } + + func chartInteractionDidEnd() { + fatalError("Abstract") + } + + func cancelChartInteraction() { + fatalError("Abstract") + } + + func didTapZoomOut() { + fatalError("Abstract") + } + + func updateChartsVisibility(visibility: [Bool], animated: Bool) { + fatalError("Abstract") + } + + var currentHorizontalRange: ClosedRange { + fatalError("Abstract") + } + + var isChartRangePagingEnabled: Bool = false + var minimumSelectedChartRange: CGFloat = 0.05 + var chartRangePagingClosure: ((Bool, CGFloat) -> Void)? // isEnabled, PageSize + func setChartRangePagingEnabled(isEnabled: Bool, minimumSelectionSize: CGFloat) { + isChartRangePagingEnabled = isEnabled + minimumSelectedChartRange = minimumSelectionSize + chartRangePagingClosure?(isChartRangePagingEnabled, minimumSelectedChartRange) + } + + var chartRangeUpdatedClosure: ((ClosedRange, Bool) -> Void)? + var currentChartHorizontalRangeFraction: ClosedRange { + fatalError("Abstract") + } + + func updateChartRange(_ rangeFraction: ClosedRange) { + fatalError("Abstract") + } + + var actualChartVisibility: [Bool] { + fatalError("Abstract") + } + + var actualChartsCollection: ChartsCollection { + fatalError("Abstract") + } + + var drawChartVisibity: Bool { + return true + } + + var drawChartNavigation: Bool { + return true + } + + var setDetailsViewPositionClosure: ((CGFloat) -> Void)? + var setDetailsChartVisibleClosure: ((Bool, Bool) -> Void)? + var setDetailsViewModel: ((ChartDetailsViewModel, Bool) -> Void)? + var getDetailsData: ((Date, @escaping (ChartsCollection?) -> Void) -> Void)? + var setChartTitleClosure: ((String, Bool) -> Void)? + var setBackButtonVisibilityClosure: ((Bool, Bool) -> Void)? + var refreshChartToolsClosure: ((Bool) -> Void)? + + func didTapZoomIn(date: Date) { + fatalError("Abstract") + } + + func apply(colorMode: ColorMode, animated: Bool) { + + } +} diff --git a/submodules/Charts/Sources/Charts/Controllers/GeneralChartComponentController.swift b/submodules/Charts/Sources/Charts/Controllers/GeneralChartComponentController.swift new file mode 100644 index 0000000000..284be92d3b --- /dev/null +++ b/submodules/Charts/Sources/Charts/Controllers/GeneralChartComponentController.swift @@ -0,0 +1,328 @@ +// +// GeneralChartComponentController.swift +// GraphTest +// +// Created by Andrei Salavei on 4/11/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +enum GeneralChartComponentConstants { + static let defaultInitialRangeLength = CGFloat(TimeInterval.day * 60) + static let defaultZoomedRangeLength = CGFloat(TimeInterval.day) +} + +class GeneralChartComponentController: ColorModeContainer { + var chartsCollection: ChartsCollection = ChartsCollection.blank + var chartVisibility: [Bool] = [] + var lastChartInteractionPoint: CGPoint = .zero + var isChartInteractionBegun: Bool = false + var isChartInteracting: Bool = false + let isZoomed: Bool + + var colorMode: ColorMode = .day + var totalHorizontalRange: ClosedRange = BaseConstants.defaultRange + var totalVerticalRange: ClosedRange = BaseConstants.defaultRange + var initialHorizontalRange: ClosedRange = BaseConstants.defaultRange + var initialVerticalRange: ClosedRange = BaseConstants.defaultRange + + var cartViewBounds: (() -> CGRect) = { fatalError() } + var chartFrame: (() -> CGRect) = { fatalError() } + + init(isZoomed: Bool) { + self.isZoomed = isZoomed + } + + func initialize(chartsCollection: ChartsCollection, + initialDate: Date, + totalHorizontalRange: ClosedRange, + totalVerticalRange: ClosedRange) { + self.chartsCollection = chartsCollection + self.chartVisibility = Array(repeating: true, count: chartsCollection.chartValues.count) + self.totalHorizontalRange = totalHorizontalRange + self.totalVerticalRange = totalVerticalRange + self.initialHorizontalRange = totalHorizontalRange + self.initialVerticalRange = totalVerticalRange + + didLoad() + setupInitialChartRange(initialDate: initialDate) + } + + func didLoad() { + hideDetailsView(animated: false) + } + func willAppear(animated: Bool) { + updateChartRangeTitle(animated: animated) + setupChartRangePaging() + } + func willDisappear(animated: Bool) { + } + + func setupInitialChartRange(initialDate: Date) { + guard let first = chartsCollection.axisValues.first?.timeIntervalSince1970, + let last = chartsCollection.axisValues.last?.timeIntervalSince1970 else { return } + + let rangeStart = CGFloat(first) + let rangeEnd = CGFloat(last) + + if isZoomed { + let initalDate = CGFloat(initialDate.timeIntervalSince1970) + + initialHorizontalRange = max(initalDate, rangeStart)...min(initalDate + GeneralChartComponentConstants.defaultZoomedRangeLength, rangeEnd) + initialVerticalRange = totalVerticalRange + } else { + initialHorizontalRange = max(rangeStart, rangeEnd - GeneralChartComponentConstants.defaultInitialRangeLength)...rangeEnd + initialVerticalRange = totalVerticalRange + } + } + func setupChartRangePaging() { + chartRangePagingClosure?(false, 0.05) + } + + var visibleHorizontalMainChartRange: ClosedRange { + return currentMainRangeRenderer.verticalRange.current + } + var visibleVerticalMainChartRange: ClosedRange { + return currentMainRangeRenderer.verticalRange.current + } + var currentHorizontalMainChartRange: ClosedRange { + return currentMainRangeRenderer.horizontalRange.end + } + var currentVerticalMainChartRange: ClosedRange { + return currentMainRangeRenderer.verticalRange.end + } + var currentMainRangeRenderer: BaseChartRenderer { + fatalError("Abstract") + } + + var visiblePreviewHorizontalRange: ClosedRange { + return currentPreviewRangeRenderer.verticalRange.current + } + var visiblePreviewVerticalRange: ClosedRange { + return currentPreviewRangeRenderer.verticalRange.current + } + var currentPreviewHorizontalRange: ClosedRange { + return currentPreviewRangeRenderer.horizontalRange.end + } + var currentPreviewVerticalRange: ClosedRange { + return currentPreviewRangeRenderer.verticalRange.end + } + var currentPreviewRangeRenderer: BaseChartRenderer { + fatalError("Abstract") + } + + var mainChartRenderers: [ChartViewRenderer] { + fatalError("Abstract") + } + var previewRenderers: [ChartViewRenderer] { + fatalError("Abstract") + } + + func updateChartsVisibility(visibility: [Bool], animated: Bool) { + self.chartVisibility = visibility + if isChartInteractionBegun { + chartInteractionDidBegin(point: lastChartInteractionPoint) + } + } + + var currentChartHorizontalRangeFraction: ClosedRange { + let lowerPercent = (currentHorizontalMainChartRange.lowerBound - totalHorizontalRange.lowerBound) / totalHorizontalRange.distance + let upperPercent = (currentHorizontalMainChartRange.upperBound - totalHorizontalRange.lowerBound) / totalHorizontalRange.distance + return lowerPercent...upperPercent + } + + func chartRangeFractionDidUpdated(_ rangeFraction: ClosedRange) { + let horizontalRange = ClosedRange(uncheckedBounds: + (lower: totalHorizontalRange.lowerBound + rangeFraction.lowerBound * totalHorizontalRange.distance, + upper: totalHorizontalRange.lowerBound + rangeFraction.upperBound * totalHorizontalRange.distance)) + chartRangeDidUpdated(horizontalRange) + updateChartRangeTitle(animated: true) + } + + func chartRangeDidUpdated(_ updatedRange: ClosedRange) { + hideDetailsView(animated: true) + + if isChartInteractionBegun { + chartInteractionDidBegin(point: lastChartInteractionPoint) + } + } + + // MARK: - Details & Interaction + func findClosestDateTo(dateToFind: Date) -> (Date, Int)? { + guard chartsCollection.axisValues.count > 0 else { return nil } + var closestDate = chartsCollection.axisValues[0] + var minIndex = 0 + for (index, date) in chartsCollection.axisValues.enumerated() { + if abs(dateToFind.timeIntervalSince(date)) < abs(dateToFind.timeIntervalSince(closestDate)) { + closestDate = date + minIndex = index + } + } + return (closestDate, minIndex) + } + + func chartInteractionDidBegin(point: CGPoint) { + let chartFrame = self.chartFrame() + guard chartFrame.width > 0 else { return } + let horizontalRange = currentHorizontalMainChartRange + let dateToFind = Date(timeIntervalSince1970: TimeInterval(horizontalRange.distance * point.x + horizontalRange.lowerBound)) + guard let (closestDate, minIndex) = findClosestDateTo(dateToFind: dateToFind) else { return } + + let chartWasInteracting = isChartInteractionBegun + lastChartInteractionPoint = point + isChartInteractionBegun = true + isChartInteracting = true + + let chartValue: CGFloat = CGFloat(closestDate.timeIntervalSince1970) + let detailsViewPosition = (chartValue - horizontalRange.lowerBound) / horizontalRange.distance * chartFrame.width + chartFrame.minX + showDetailsView(at: chartValue, detailsViewPosition: detailsViewPosition, dataIndex: minIndex, date: closestDate, animted: chartWasInteracting) + } + + func showDetailsView(at chartPosition: CGFloat, detailsViewPosition: CGFloat, dataIndex: Int, date: Date, animted: Bool) { + setDetailsViewModel?(chartDetailsViewModel(closestDate: date, pointIndex: dataIndex), animted) + setDetailsChartVisibleClosure?(true, true) + setDetailsViewPositionClosure?(detailsViewPosition) + } + + func chartInteractionDidEnd() { + isChartInteracting = false + } + + func hideDetailsView(animated: Bool) { + isChartInteractionBegun = false + setDetailsChartVisibleClosure?(false, animated) + } + + var visibleDetailsChartValues: [ChartsCollection.Chart] { + let visibleCharts: [ChartsCollection.Chart] = chartVisibility.enumerated().compactMap { args in + args.element ? chartsCollection.chartValues[args.offset] : nil + } + return visibleCharts + } + + var updatePreviewRangeClosure: ((ClosedRange, Bool) -> Void)? + var zoomInOnDateClosure: ((Date) -> Void)? + var setChartTitleClosure: ((String, Bool) -> Void)? + var setDetailsViewPositionClosure: ((CGFloat) -> Void)? + var setDetailsChartVisibleClosure: ((Bool, Bool) -> Void)? + var setDetailsViewModel: ((ChartDetailsViewModel, Bool) -> Void)? + var chartRangePagingClosure: ((Bool, CGFloat) -> Void)? // isEnabled, PageSize + + func apply(colorMode: ColorMode, animated: Bool) { + self.colorMode = colorMode + } + +// MARK: - Helpers + var prevoiusHorizontalStrideInterval: Int = -1 + func updateHorizontalLimitLabels(horizontalScalesRenderer: HorizontalScalesRenderer, + horizontalRange: ClosedRange, + scaleType: ChartScaleType, + forceUpdate: Bool, + animated: Bool) { + let scaleTimeInterval: TimeInterval + if chartsCollection.axisValues.count >= 1 { + scaleTimeInterval = chartsCollection.axisValues[1].timeIntervalSince1970 - chartsCollection.axisValues[0].timeIntervalSince1970 + } else { + scaleTimeInterval = scaleType.timeInterval + } + + let numberOfItems = horizontalRange.distance / CGFloat(scaleTimeInterval) + let maximumNumberOfItems = chartFrame().width / scaleType.minimumAxisXDistance + let tempStride = max(1, Int((numberOfItems / maximumNumberOfItems).rounded(.up))) + var strideInterval = 1 + while strideInterval < tempStride { + strideInterval *= 2 + } + + if forceUpdate || (strideInterval != prevoiusHorizontalStrideInterval && strideInterval > 0) { + var labels: [LinesChartLabel] = [] + for index in stride(from: chartsCollection.axisValues.count - 1, to: -1, by: -strideInterval).reversed() { + let date = chartsCollection.axisValues[index] + labels.append(LinesChartLabel(value: CGFloat(date.timeIntervalSince1970), + text: scaleType.dateFormatter.string(from: date))) + } + prevoiusHorizontalStrideInterval = strideInterval + horizontalScalesRenderer.setup(labels: labels, animated: animated) + } + } + + func verticalLimitsLabels(verticalRange: ClosedRange) -> (ClosedRange, [LinesChartLabel]) { + let ditance = verticalRange.distance + let chartHeight = chartFrame().height + + guard ditance > 0, chartHeight > 0 else { return (BaseConstants.defaultRange, []) } + + let approximateNumberOfChartValues = (chartHeight / BaseConstants.minimumAxisYLabelsDistance) + + var numberOfOffsetsPerItem = ditance / approximateNumberOfChartValues + var multiplier: CGFloat = 1.0 + while numberOfOffsetsPerItem > 10 { + numberOfOffsetsPerItem /= 10 + multiplier *= 10 + } + var dividor: CGFloat = 1.0 + var maximumNumberOfDecimals = 2 + while numberOfOffsetsPerItem < 1 { + numberOfOffsetsPerItem *= 10 + dividor *= 10 + maximumNumberOfDecimals += 1 + } + + var base: CGFloat = BaseConstants.verticalBaseAnchors.first { numberOfOffsetsPerItem > $0 } ?? BaseConstants.defaultVerticalBaseAnchor + base = base * multiplier / dividor + + var verticalLabels: [LinesChartLabel] = [] + var verticalValue = (verticalRange.lowerBound / base).rounded(.down) * base + let lowerBound = verticalValue + + let numberFormatter = BaseConstants.chartNumberFormatter + numberFormatter.maximumFractionDigits = maximumNumberOfDecimals + while verticalValue < verticalRange.upperBound { + let text: String = numberFormatter.string(from: NSNumber(value: Double(verticalValue))) ?? "" + + verticalLabels.append(LinesChartLabel(value: verticalValue, text: text)) + verticalValue += base + } + let updatedRange = lowerBound...verticalValue + + return (updatedRange, verticalLabels) + } + + func chartDetailsViewModel(closestDate: Date, pointIndex: Int) -> ChartDetailsViewModel { + let values: [ChartDetailsViewModel.Value] = chartsCollection.chartValues.enumerated().map { arg in + let (index, component) = arg + return ChartDetailsViewModel.Value(prefix: nil, + title: component.name, + value: BaseConstants.detailsNumberFormatter.string(from: NSNumber(value: component.values[pointIndex])) ?? "", + color: component.color, + visible: chartVisibility[index]) + } + let dateString: String + if isZoomed { + dateString = BaseConstants.timeDateFormatter.string(from: closestDate) + } else { + dateString = BaseConstants.headerMediumRangeFormatter.string(from: closestDate) + } + let viewModel = ChartDetailsViewModel(title: dateString, + showArrow: !self.isZoomed, + showPrefixes: false, + values: values, + totalValue: nil, + tapAction: { [weak self] in + self?.zoomInOnDateClosure?(closestDate) }) + return viewModel + } + + func updateChartRangeTitle(animated: Bool) { + let fromDate = Date(timeIntervalSince1970: TimeInterval(currentHorizontalMainChartRange.lowerBound) + 1) + let toDate = Date(timeIntervalSince1970: TimeInterval(currentHorizontalMainChartRange.upperBound)) + if Calendar.utc.startOfDay(for: fromDate) == Calendar.utc.startOfDay(for: toDate) { + let stirng = BaseConstants.headerFullZoomedFormatter.string(from: fromDate) + self.setChartTitleClosure?(stirng, animated) + } else { + let stirng = "\(BaseConstants.headerMediumRangeFormatter.string(from: fromDate)) - \(BaseConstants.headerMediumRangeFormatter.string(from: toDate))" + self.setChartTitleClosure?(stirng, animated) + } + } +} diff --git a/submodules/Charts/Sources/Charts/Controllers/Lines/BaseLinesChartController.swift b/submodules/Charts/Sources/Charts/Controllers/Lines/BaseLinesChartController.swift new file mode 100644 index 0000000000..60d5069d10 --- /dev/null +++ b/submodules/Charts/Sources/Charts/Controllers/Lines/BaseLinesChartController.swift @@ -0,0 +1,236 @@ +// +// BaseLinesChartController.swift +// GraphTest +// +// Created by Andrei Salavei on 4/14/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +class BaseLinesChartController: BaseChartController { + var chartVisibility: [Bool] + var zoomChartVisibility: [Bool] + var lastChartInteractionPoint: CGPoint = .zero + var isChartInteractionBegun: Bool = false + + var initialChartRange: ClosedRange = BaseConstants.defaultRange + var zoomedChartRange: ClosedRange = BaseConstants.defaultRange + + override init(chartsCollection: ChartsCollection) { + self.chartVisibility = Array(repeating: true, count: chartsCollection.chartValues.count) + self.zoomChartVisibility = [] + super.init(chartsCollection: chartsCollection) + } + + func setupChartCollection(chartsCollection: ChartsCollection, animated: Bool, isZoomed: Bool) { + if animated { + TimeInterval.setDefaultSuration(.expandAnimationDuration) + DispatchQueue.main.asyncAfter(deadline: .now() + .expandAnimationDuration) { + TimeInterval.setDefaultSuration(.osXDuration) + } + } + + self.initialChartsCollection = chartsCollection + self.isZoomed = isZoomed + + self.setBackButtonVisibilityClosure?(isZoomed, animated) + + updateChartRangeTitle(animated: animated) + } + + func updateChartRangeTitle(animated: Bool) { + let fromDate = Date(timeIntervalSince1970: TimeInterval(zoomedChartRange.lowerBound) + .hour) + let toDate = Date(timeIntervalSince1970: TimeInterval(zoomedChartRange.upperBound)) + if Calendar.utc.startOfDay(for: fromDate) == Calendar.utc.startOfDay(for: toDate) { + let stirng = BaseConstants.headerFullZoomedFormatter.string(from: fromDate) + self.setChartTitleClosure?(stirng, animated) + } else { + let stirng = "\(BaseConstants.headerMediumRangeFormatter.string(from: fromDate)) - \(BaseConstants.headerMediumRangeFormatter.string(from: toDate))" + self.setChartTitleClosure?(stirng, animated) + } + } + + override func chartInteractionDidBegin(point: CGPoint) { + lastChartInteractionPoint = point + isChartInteractionBegun = true + } + + override func chartInteractionDidEnd() { + + } + + override func cancelChartInteraction() { + isChartInteractionBegun = false + } + + override func updateChartRange(_ rangeFraction: ClosedRange) { + + } + + override var actualChartVisibility: [Bool] { + return isZoomed ? zoomChartVisibility : chartVisibility + } + + override var actualChartsCollection: ChartsCollection { + return initialChartsCollection + } + + var visibleChartValues: [ChartsCollection.Chart] { + let visibleCharts: [ChartsCollection.Chart] = actualChartVisibility.enumerated().compactMap { args in + args.element ? initialChartsCollection.chartValues[args.offset] : nil + } + return visibleCharts + } + + + func chartDetailsViewModel(closestDate: Date, pointIndex: Int) -> ChartDetailsViewModel { + let values: [ChartDetailsViewModel.Value] = actualChartsCollection.chartValues.enumerated().map { arg in + let (index, component) = arg + return ChartDetailsViewModel.Value(prefix: nil, + title: component.name, + value: BaseConstants.detailsNumberFormatter.string(from: component.values[pointIndex]), + color: component.color, + visible: actualChartVisibility[index]) + } + let dateString: String + if isZoomed { + dateString = BaseConstants.timeDateFormatter.string(from: closestDate) + } else { + dateString = BaseConstants.headerMediumRangeFormatter.string(from: closestDate) + } + let viewModel = ChartDetailsViewModel(title: dateString, + showArrow: !self.isZoomed, + showPrefixes: false, + values: values, + totalValue: nil, + tapAction: { [weak self] in self?.didTapZoomIn(date: closestDate) }) + return viewModel + } + + override func didTapZoomIn(date: Date) { + guard isZoomed == false else { return } + cancelChartInteraction() + self.getDetailsData?(date, { updatedCollection in + if let updatedCollection = updatedCollection { + self.initialChartRange = self.currentHorizontalRange + if let startDate = updatedCollection.axisValues.first, + let endDate = updatedCollection.axisValues.last { + self.zoomedChartRange = CGFloat(max(date.timeIntervalSince1970, startDate.timeIntervalSince1970))...CGFloat(min(date.timeIntervalSince1970 + .day - .hour, endDate.timeIntervalSince1970)) + } else { + self.zoomedChartRange = CGFloat(date.timeIntervalSince1970)...CGFloat(date.timeIntervalSince1970 + .day - 1) + } + self.setupChartCollection(chartsCollection: updatedCollection, animated: true, isZoomed: true) + } + }) + } + + func horizontalLimitsLabels(horizontalRange: ClosedRange, + scaleType: ChartScaleType, + prevoiusHorizontalStrideInterval: Int) -> (Int, [LinesChartLabel])? { + let numberOfItems = horizontalRange.distance / CGFloat(scaleType.timeInterval) + let maximumNumberOfItems = chartFrame().width / scaleType.minimumAxisXDistance + let tempStride = max(1, Int((numberOfItems / maximumNumberOfItems).rounded(.up))) + var strideInterval = 1 + while strideInterval < tempStride { + strideInterval *= 2 + } + + if strideInterval != prevoiusHorizontalStrideInterval && strideInterval > 0 { + var labels: [LinesChartLabel] = [] + for index in stride(from: initialChartsCollection.axisValues.count - 1, to: -1, by: -strideInterval).reversed() { + let date = initialChartsCollection.axisValues[index] + labels.append(LinesChartLabel(value: CGFloat(date.timeIntervalSince1970), + text: scaleType.dateFormatter.string(from: date))) + } + return (strideInterval, labels) + } + return nil + } + + func findClosestDateTo(dateToFind: Date) -> (Date, Int)? { + guard initialChartsCollection.axisValues.count > 0 else { return nil } + var closestDate = initialChartsCollection.axisValues[0] + var minIndex = 0 + for (index, date) in initialChartsCollection.axisValues.enumerated() { + if abs(dateToFind.timeIntervalSince(date)) < abs(dateToFind.timeIntervalSince(closestDate)) { + closestDate = date + minIndex = index + } + } + return (closestDate, minIndex) + } + + func verticalLimitsLabels(verticalRange: ClosedRange) -> (ClosedRange, [LinesChartLabel]) { + let ditance = verticalRange.distance + let chartHeight = chartFrame().height + + guard ditance > 0, chartHeight > 0 else { return (BaseConstants.defaultRange, []) } + + let approximateNumberOfChartValues = (chartHeight / BaseConstants.minimumAxisYLabelsDistance) + + var numberOfOffsetsPerItem = ditance / approximateNumberOfChartValues + var multiplier: CGFloat = 1.0 + while numberOfOffsetsPerItem > 10 { + numberOfOffsetsPerItem /= 10 + multiplier *= 10 + } + var dividor: CGFloat = 1.0 + var maximumNumberOfDecimals = 2 + while numberOfOffsetsPerItem < 1 { + numberOfOffsetsPerItem *= 10 + dividor *= 10 + maximumNumberOfDecimals += 1 + } + + var base: CGFloat = BaseConstants.verticalBaseAnchors.first { numberOfOffsetsPerItem > $0 } ?? BaseConstants.defaultVerticalBaseAnchor + base = base * multiplier / dividor + + var verticalLabels: [LinesChartLabel] = [] + var verticalValue = (verticalRange.lowerBound / base).rounded(.down) * base + let lowerBound = verticalValue + + let numberFormatter = BaseConstants.chartNumberFormatter + numberFormatter.maximumFractionDigits = maximumNumberOfDecimals + while verticalValue < verticalRange.upperBound { + let text: String = numberFormatter.string(from: NSNumber(value: Double(verticalValue))) ?? "" + + verticalLabels.append(LinesChartLabel(value: verticalValue, text: text)) + verticalValue += base + } + let updatedRange = lowerBound...verticalValue + + return (updatedRange, verticalLabels) + } +} + +enum ChartScaleType { + case day + case hour + case minutes5 +} + +extension ChartScaleType { + var timeInterval: TimeInterval { + switch self { + case .day: return .day + case .hour: return .hour + case .minutes5: return .minute * 5 + } + } + + var minimumAxisXDistance: CGFloat { + switch self { + case .day: return 50 + case .hour: return 40 + case .minutes5: return 40 + } + } + var dateFormatter: DateFormatter { + switch self { + case .day: return BaseConstants.monthDayDateFormatter + case .hour: return BaseConstants.timeDateFormatter + case .minutes5: return BaseConstants.timeDateFormatter + } + } +} diff --git a/submodules/Charts/Sources/Charts/Controllers/Lines/GeneralLinesChartController.swift b/submodules/Charts/Sources/Charts/Controllers/Lines/GeneralLinesChartController.swift new file mode 100644 index 0000000000..3d52888d72 --- /dev/null +++ b/submodules/Charts/Sources/Charts/Controllers/Lines/GeneralLinesChartController.swift @@ -0,0 +1,247 @@ +// +// LinesChartController.swift +// GraphTest +// +// Created by Andrei Salavei on 4/7/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +private enum Constants { + static let defaultRange: ClosedRange = 0...1 +} + +class GeneralLinesChartController: BaseLinesChartController { + private let initialChartCollection: ChartsCollection + + private let mainLinesRenderer = LinesChartRenderer() + private let horizontalScalesRenderer = HorizontalScalesRenderer() + private let verticalScalesRenderer = VerticalScalesRenderer() + private let verticalLineRenderer = VerticalLinesRenderer() + private let lineBulletsRenerer = LineBulletsRenerer() + + private let previewLinesRenderer = LinesChartRenderer() + + private var totalVerticalRange: ClosedRange = Constants.defaultRange + private var totalHorizontalRange: ClosedRange = Constants.defaultRange + + private var prevoiusHorizontalStrideInterval: Int = 1 + + private (set) var chartLines: [LinesChartRenderer.LineData] = [] + + override init(chartsCollection: ChartsCollection) { + self.initialChartCollection = chartsCollection + self.mainLinesRenderer.lineWidth = 2 + self.mainLinesRenderer.optimizationLevel = BaseConstants.linesChartOptimizationLevel + self.previewLinesRenderer.optimizationLevel = BaseConstants.previewLinesChartOptimizationLevel + + self.lineBulletsRenerer.isEnabled = false + + super.init(chartsCollection: chartsCollection) + self.zoomChartVisibility = chartVisibility + } + + override func setupChartCollection(chartsCollection: ChartsCollection, animated: Bool, isZoomed: Bool) { + super.setupChartCollection(chartsCollection: chartsCollection, animated: animated, isZoomed: isZoomed) + + self.chartLines = chartsCollection.chartValues.map { chart in + let points = chart.values.enumerated().map({ (arg) -> CGPoint in + return CGPoint(x: chartsCollection.axisValues[arg.offset].timeIntervalSince1970, + y: arg.element) + }) + return LinesChartRenderer.LineData(color: chart.color, points: points) + } + + self.prevoiusHorizontalStrideInterval = -1 + self.totalVerticalRange = LinesChartRenderer.LineData.verticalRange(lines: chartLines) ?? Constants.defaultRange + self.totalHorizontalRange = LinesChartRenderer.LineData.horizontalRange(lines: chartLines) ?? Constants.defaultRange + self.lineBulletsRenerer.bullets = self.chartLines.map { LineBulletsRenerer.Bullet(coordinate: $0.points.first ?? .zero, + color: $0.color)} + + let chartRange: ClosedRange + if isZoomed { + chartRange = zoomedChartRange + } else { + chartRange = initialChartRange + } + + self.previewLinesRenderer.setup(horizontalRange: totalHorizontalRange, animated: animated) + self.previewLinesRenderer.setup(verticalRange: totalVerticalRange, animated: animated) + + self.mainLinesRenderer.setLines(lines: chartLines, animated: animated) + self.previewLinesRenderer.setLines(lines: chartLines, animated: animated) + + updateHorizontalLimists(horizontalRange: chartRange, animated: animated) + updateMainChartHorizontalRange(range: chartRange, animated: animated) + updateVerticalLimitsAndRange(horizontalRange: chartRange, animated: animated) + + self.chartRangeUpdatedClosure?(currentChartHorizontalRangeFraction, animated) + } + + override func initializeChart() { + if let first = initialChartCollection.axisValues.first?.timeIntervalSince1970, + let last = initialChartCollection.axisValues.last?.timeIntervalSince1970 { + initialChartRange = CGFloat(max(first, last - BaseConstants.defaultRangePresetLength))...CGFloat(last) + } + setupChartCollection(chartsCollection: initialChartCollection, animated: false, isZoomed: false) + } + + override var mainChartRenderers: [ChartViewRenderer] { + return [//performanceRenderer, + mainLinesRenderer, + horizontalScalesRenderer, + verticalScalesRenderer, + verticalLineRenderer, + lineBulletsRenerer + ] + } + + override var navigationRenderers: [ChartViewRenderer] { + return [previewLinesRenderer] + } + + override func updateChartsVisibility(visibility: [Bool], animated: Bool) { + chartVisibility = visibility + zoomChartVisibility = visibility + for (index, isVisible) in visibility.enumerated() { + mainLinesRenderer.setLineVisible(isVisible, at: index, animated: animated) + previewLinesRenderer.setLineVisible(isVisible, at: index, animated: animated) + lineBulletsRenerer.setLineVisible(isVisible, at: index, animated: animated) + } + + updateVerticalLimitsAndRange(horizontalRange: currentHorizontalRange, animated: true) + + if isChartInteractionBegun { + chartInteractionDidBegin(point: lastChartInteractionPoint) + } + } + + override func chartInteractionDidBegin(point: CGPoint) { + let horizontalRange = mainLinesRenderer.horizontalRange.current + let chartFrame = self.chartFrame() + guard chartFrame.width > 0 else { return } + let chartInteractionWasBegin = isChartInteractionBegun + + let dateToFind = Date(timeIntervalSince1970: TimeInterval(horizontalRange.distance * point.x + horizontalRange.lowerBound)) + guard let (closestDate, minIndex) = findClosestDateTo(dateToFind: dateToFind) else { return } + + super.chartInteractionDidBegin(point: point) + + self.lineBulletsRenerer.bullets = chartLines.compactMap { chart in + return LineBulletsRenerer.Bullet(coordinate: chart.points[minIndex], color: chart.color) + } + self.lineBulletsRenerer.isEnabled = true + + let chartValue: CGFloat = CGFloat(closestDate.timeIntervalSince1970) + let detailsViewPosition = (chartValue - horizontalRange.lowerBound) / horizontalRange.distance * chartFrame.width + chartFrame.minX + self.setDetailsViewModel?(chartDetailsViewModel(closestDate: closestDate, pointIndex: minIndex), chartInteractionWasBegin) + self.setDetailsChartVisibleClosure?(true, true) + self.setDetailsViewPositionClosure?(detailsViewPosition) + self.verticalLineRenderer.values = [chartValue] + } + + + override var currentChartHorizontalRangeFraction: ClosedRange { + let lowerPercent = (currentHorizontalRange.lowerBound - totalHorizontalRange.lowerBound) / totalHorizontalRange.distance + let upperPercent = (currentHorizontalRange.upperBound - totalHorizontalRange.lowerBound) / totalHorizontalRange.distance + return lowerPercent...upperPercent + } + + override var currentHorizontalRange: ClosedRange { + return mainLinesRenderer.horizontalRange.end + } + + override func cancelChartInteraction() { + super.cancelChartInteraction() + self.lineBulletsRenerer.isEnabled = false + + self.setDetailsChartVisibleClosure?(false, true) + self.verticalLineRenderer.values = [] + } + + override func didTapZoomOut() { + cancelChartInteraction() + self.setupChartCollection(chartsCollection: initialChartCollection, animated: true, isZoomed: false) + } + + var visibleCharts: [LinesChartRenderer.LineData] { + let visibleCharts: [LinesChartRenderer.LineData] = chartVisibility.enumerated().compactMap { args in + args.element ? chartLines[args.offset] : nil + } + return visibleCharts + } + + override func updateChartRange(_ rangeFraction: ClosedRange) { + cancelChartInteraction() + + let horizontalRange = ClosedRange(uncheckedBounds: + (lower: totalHorizontalRange.lowerBound + rangeFraction.lowerBound * totalHorizontalRange.distance, + upper: totalHorizontalRange.lowerBound + rangeFraction.upperBound * totalHorizontalRange.distance)) + + zoomedChartRange = horizontalRange + updateChartRangeTitle(animated: true) + + updateMainChartHorizontalRange(range: horizontalRange, animated: false) + updateHorizontalLimists(horizontalRange: horizontalRange, animated: true) + updateVerticalLimitsAndRange(horizontalRange: horizontalRange, animated: true) + } + + func updateMainChartHorizontalRange(range: ClosedRange, animated: Bool) { + mainLinesRenderer.setup(horizontalRange: range, animated: animated) + horizontalScalesRenderer.setup(horizontalRange: range, animated: animated) + verticalScalesRenderer.setup(horizontalRange: range, animated: animated) + verticalLineRenderer.setup(horizontalRange: range, animated: animated) + lineBulletsRenerer.setup(horizontalRange: range, animated: animated) + } + + func updateMainChartVerticalRange(range: ClosedRange, animated: Bool) { + mainLinesRenderer.setup(verticalRange: range, animated: animated) + horizontalScalesRenderer.setup(verticalRange: range, animated: animated) + verticalScalesRenderer.setup(verticalRange: range, animated: animated) + verticalLineRenderer.setup(verticalRange: range, animated: animated) + lineBulletsRenerer.setup(verticalRange: range, animated: animated) + } + + func updateHorizontalLimists(horizontalRange: ClosedRange, animated: Bool) { + if let (stride, labels) = horizontalLimitsLabels(horizontalRange: horizontalRange, + scaleType: isZoomed ? .hour : .day, + prevoiusHorizontalStrideInterval: prevoiusHorizontalStrideInterval) { + self.horizontalScalesRenderer.setup(labels: labels, animated: animated) + self.prevoiusHorizontalStrideInterval = stride + } + } + + func updateVerticalLimitsAndRange(horizontalRange: ClosedRange, animated: Bool) { + if let verticalRange = LinesChartRenderer.LineData.verticalRange(lines: visibleCharts, + calculatingRange: horizontalRange, + addBounds: true) { + + + let (range, labels) = verticalLimitsLabels(verticalRange: verticalRange) + + if verticalScalesRenderer.verticalRange.end != range { + verticalScalesRenderer.setup(verticalLimitsLabels: labels, animated: animated) + updateMainChartVerticalRange(range: range, animated: animated) + } + verticalScalesRenderer.setVisible(true, animated: animated) + } else { + verticalScalesRenderer.setVisible(false, animated: animated) + } + + guard let previewVerticalRange = LinesChartRenderer.LineData.verticalRange(lines: visibleCharts) else { return } + + if previewLinesRenderer.verticalRange.end != previewVerticalRange { + previewLinesRenderer.setup(verticalRange: previewVerticalRange, animated: animated) + } + } + + override func apply(colorMode: ColorMode, animated: Bool) { + horizontalScalesRenderer.labelsColor = colorMode.chartLabelsColor + verticalScalesRenderer.labelsColor = colorMode.chartLabelsColor + verticalScalesRenderer.axisXColor = colorMode.chartStrongLinesColor + verticalScalesRenderer.horizontalLinesColor = colorMode.chartHelperLinesColor + lineBulletsRenerer.setInnerColor(colorMode.chartBackgroundColor, animated: animated) + verticalLineRenderer.linesColor = colorMode.chartStrongLinesColor + } +} diff --git a/submodules/Charts/Sources/Charts/Controllers/Lines/TwoAxisLinesChartController.swift b/submodules/Charts/Sources/Charts/Controllers/Lines/TwoAxisLinesChartController.swift new file mode 100644 index 0000000000..251e76271e --- /dev/null +++ b/submodules/Charts/Sources/Charts/Controllers/Lines/TwoAxisLinesChartController.swift @@ -0,0 +1,306 @@ +// +// TwoAxisLinesChartController.swift +// GraphTest +// +// Created by Andrei Salavei on 4/7/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +private enum Constants { + static let verticalBaseAnchors: [CGFloat] = [8, 5, 4, 2.5, 2, 1] + static let defaultRange: ClosedRange = 0...1 +} + +class TwoAxisLinesChartController: BaseLinesChartController { + class GraphController { + let mainLinesRenderer = LinesChartRenderer() + let verticalScalesRenderer = VerticalScalesRenderer() + let lineBulletsRenerer = LineBulletsRenerer() + let previewLinesRenderer = LinesChartRenderer() + + var chartLines: [LinesChartRenderer.LineData] = [] + + var totalVerticalRange: ClosedRange = Constants.defaultRange + + init() { + self.mainLinesRenderer.lineWidth = 2 + self.previewLinesRenderer.lineWidth = 1 + self.lineBulletsRenerer.isEnabled = false + + self.mainLinesRenderer.optimizationLevel = BaseConstants.linesChartOptimizationLevel + self.previewLinesRenderer.optimizationLevel = BaseConstants.previewLinesChartOptimizationLevel + } + + func updateMainChartVerticalRange(range: ClosedRange, animated: Bool) { + mainLinesRenderer.setup(verticalRange: range, animated: animated) + verticalScalesRenderer.setup(verticalRange: range, animated: animated) + lineBulletsRenerer.setup(verticalRange: range, animated: animated) + } + } + + private var graphControllers: [GraphController] = [] + private let verticalLineRenderer = VerticalLinesRenderer() + private let horizontalScalesRenderer = HorizontalScalesRenderer() + + var totalHorizontalRange: ClosedRange = Constants.defaultRange + + private let initialChartCollection: ChartsCollection + + private var prevoiusHorizontalStrideInterval: Int = 1 + + override init(chartsCollection: ChartsCollection) { + self.initialChartCollection = chartsCollection + graphControllers = chartsCollection.chartValues.map { _ in GraphController() } + + super.init(chartsCollection: chartsCollection) + self.zoomChartVisibility = chartVisibility + } + + override func setupChartCollection(chartsCollection: ChartsCollection, animated: Bool, isZoomed: Bool) { + super.setupChartCollection(chartsCollection: chartsCollection, animated: animated, isZoomed: isZoomed) + + for (index, controller) in self.graphControllers.enumerated() { + let chart = chartsCollection.chartValues[index] + let points = chart.values.enumerated().map({ (arg) -> CGPoint in + return CGPoint(x: chartsCollection.axisValues[arg.offset].timeIntervalSince1970, + y: arg.element) + }) + let chartLines = [LinesChartRenderer.LineData(color: chart.color, points: points)] + controller.chartLines = [LinesChartRenderer.LineData(color: chart.color, points: points)] + controller.verticalScalesRenderer.labelsColor = chart.color + controller.totalVerticalRange = LinesChartRenderer.LineData.verticalRange(lines: chartLines) ?? Constants.defaultRange + self.totalHorizontalRange = LinesChartRenderer.LineData.horizontalRange(lines: chartLines) ?? Constants.defaultRange + controller.lineBulletsRenerer.bullets = chartLines.map { LineBulletsRenerer.Bullet(coordinate: $0.points.first ?? .zero, + color: $0.color) } + controller.previewLinesRenderer.setup(horizontalRange: self.totalHorizontalRange, animated: animated) + controller.previewLinesRenderer.setup(verticalRange: controller.totalVerticalRange, animated: animated) + controller.mainLinesRenderer.setLines(lines: chartLines, animated: animated) + controller.previewLinesRenderer.setLines(lines: chartLines, animated: animated) + + controller.verticalScalesRenderer.setHorizontalLinesVisible((index == 0), animated: animated) + controller.verticalScalesRenderer.isRightAligned = (index != 0) + } + + self.prevoiusHorizontalStrideInterval = -1 + + let chartRange: ClosedRange + if isZoomed { + chartRange = zoomedChartRange + } else { + chartRange = initialChartRange + } + + updateHorizontalLimists(horizontalRange: chartRange, animated: animated) + updateMainChartHorizontalRange(range: chartRange, animated: animated) + updateVerticalLimitsAndRange(horizontalRange: chartRange, animated: animated) + + self.chartRangeUpdatedClosure?(currentChartHorizontalRangeFraction, animated) + } + + override func initializeChart() { + if let first = initialChartCollection.axisValues.first?.timeIntervalSince1970, + let last = initialChartCollection.axisValues.last?.timeIntervalSince1970 { + initialChartRange = CGFloat(max(first, last - BaseConstants.defaultRangePresetLength))...CGFloat(last) + } + setupChartCollection(chartsCollection: initialChartCollection, animated: false, isZoomed: false) + } + + override var mainChartRenderers: [ChartViewRenderer] { + return graphControllers.map { $0.mainLinesRenderer } + + graphControllers.flatMap { [$0.verticalScalesRenderer, $0.lineBulletsRenerer] } + + [horizontalScalesRenderer, verticalLineRenderer, +// performanceRenderer + ] + } + + override var navigationRenderers: [ChartViewRenderer] { + return graphControllers.map { $0.previewLinesRenderer } + } + + override func updateChartsVisibility(visibility: [Bool], animated: Bool) { + chartVisibility = visibility + zoomChartVisibility = visibility + let firstIndex = visibility.firstIndex(where: { $0 }) + for (index, isVisible) in visibility.enumerated() { + let graph = graphControllers[index] + for graphIndex in graph.chartLines.indices { + graph.mainLinesRenderer.setLineVisible(isVisible, at: graphIndex, animated: animated) + graph.previewLinesRenderer.setLineVisible(isVisible, at: graphIndex, animated: animated) + graph.lineBulletsRenerer.setLineVisible(isVisible, at: graphIndex, animated: animated) + } + graph.verticalScalesRenderer.setVisible(isVisible, animated: animated) + if let firstIndex = firstIndex { + graph.verticalScalesRenderer.setHorizontalLinesVisible(index == firstIndex, animated: animated) + } + } + + updateVerticalLimitsAndRange(horizontalRange: currentHorizontalRange, animated: true) + + if isChartInteractionBegun { + chartInteractionDidBegin(point: lastChartInteractionPoint) + } + } + + override func chartInteractionDidBegin(point: CGPoint) { + let horizontalRange = currentHorizontalRange + let chartFrame = self.chartFrame() + guard chartFrame.width > 0 else { return } + + let dateToFind = Date(timeIntervalSince1970: TimeInterval(horizontalRange.distance * point.x + horizontalRange.lowerBound)) + guard let (closestDate, minIndex) = findClosestDateTo(dateToFind: dateToFind) else { return } + + let chartInteractionWasBegin = isChartInteractionBegun + super.chartInteractionDidBegin(point: point) + + for graphController in graphControllers { + graphController.lineBulletsRenerer.bullets = graphController.chartLines.map { chart in + LineBulletsRenerer.Bullet(coordinate: chart.points[minIndex], color: chart.color) + } + graphController.lineBulletsRenerer.isEnabled = true + } + + let chartValue: CGFloat = CGFloat(closestDate.timeIntervalSince1970) + let detailsViewPosition = (chartValue - horizontalRange.lowerBound) / horizontalRange.distance * chartFrame.width + chartFrame.minX + self.setDetailsViewModel?(chartDetailsViewModel(closestDate: closestDate, pointIndex: minIndex), chartInteractionWasBegin) + self.setDetailsChartVisibleClosure?(true, true) + self.setDetailsViewPositionClosure?(detailsViewPosition) + self.verticalLineRenderer.values = [chartValue] + } + + override var currentChartHorizontalRangeFraction: ClosedRange { + let lowerPercent = (currentHorizontalRange.lowerBound - totalHorizontalRange.lowerBound) / totalHorizontalRange.distance + let upperPercent = (currentHorizontalRange.upperBound - totalHorizontalRange.lowerBound) / totalHorizontalRange.distance + return lowerPercent...upperPercent + } + + override var currentHorizontalRange: ClosedRange { + return graphControllers.first?.mainLinesRenderer.horizontalRange.end ?? Constants.defaultRange + } + + override func cancelChartInteraction() { + super.cancelChartInteraction() + for graphController in graphControllers { + graphController.lineBulletsRenerer.isEnabled = false + } + + self.setDetailsChartVisibleClosure?(false, true) + self.verticalLineRenderer.values = [] + } + + override func didTapZoomOut() { + cancelChartInteraction() + self.setupChartCollection(chartsCollection: initialChartCollection, animated: true, isZoomed: false) + } + + override func updateChartRange(_ rangeFraction: ClosedRange) { + cancelChartInteraction() + + let horizontalRange = ClosedRange(uncheckedBounds: + (lower: totalHorizontalRange.lowerBound + rangeFraction.lowerBound * totalHorizontalRange.distance, + upper: totalHorizontalRange.lowerBound + rangeFraction.upperBound * totalHorizontalRange.distance)) + + zoomedChartRange = horizontalRange + updateChartRangeTitle(animated: true) + + updateMainChartHorizontalRange(range: horizontalRange, animated: false) + updateHorizontalLimists(horizontalRange: horizontalRange, animated: true) + updateVerticalLimitsAndRange(horizontalRange: horizontalRange, animated: true) + } + + func updateMainChartHorizontalRange(range: ClosedRange, animated: Bool) { + for controller in graphControllers { + controller.mainLinesRenderer.setup(horizontalRange: range, animated: animated) + controller.verticalScalesRenderer.setup(horizontalRange: range, animated: animated) + controller.lineBulletsRenerer.setup(horizontalRange: range, animated: animated) + } + horizontalScalesRenderer.setup(horizontalRange: range, animated: animated) + verticalLineRenderer.setup(horizontalRange: range, animated: animated) + } + + func updateHorizontalLimists(horizontalRange: ClosedRange, animated: Bool) { + if let (stride, labels) = horizontalLimitsLabels(horizontalRange: horizontalRange, + scaleType: isZoomed ? .hour : .day, + prevoiusHorizontalStrideInterval: prevoiusHorizontalStrideInterval) { + self.horizontalScalesRenderer.setup(labels: labels, animated: animated) + self.prevoiusHorizontalStrideInterval = stride + } + } + + func updateVerticalLimitsAndRange(horizontalRange: ClosedRange, animated: Bool) { + let chartHeight = chartFrame().height + let approximateNumberOfChartValues = (chartHeight / BaseConstants.minimumAxisYLabelsDistance) + + var dividorsAndMultiplers: [(startValue: CGFloat, base: CGFloat, count: Int, maximumNumberOfDecimals: Int)] = graphControllers.enumerated().map { arg in + let (index, controller) = arg + let verticalRange = LinesChartRenderer.LineData.verticalRange(lines: controller.chartLines, + calculatingRange: horizontalRange, + addBounds: true) ?? controller.totalVerticalRange + + var numberOfOffsetsPerItem = verticalRange.distance / approximateNumberOfChartValues + + var multiplier: CGFloat = 1.0 + while numberOfOffsetsPerItem > 10 { + numberOfOffsetsPerItem /= 10 + multiplier *= 10 + } + var dividor: CGFloat = 1.0 + var maximumNumberOfDecimals = 2 + while numberOfOffsetsPerItem < 1 { + numberOfOffsetsPerItem *= 10 + dividor *= 10 + maximumNumberOfDecimals += 1 + } + + let generalBase = Constants.verticalBaseAnchors.first { numberOfOffsetsPerItem > $0 } ?? BaseConstants.defaultVerticalBaseAnchor + let base = generalBase * multiplier / dividor + + var verticalValue = (verticalRange.lowerBound / base).rounded(.down) * base + let startValue = verticalValue + var count = 0 + if chartVisibility[index] { + while verticalValue < verticalRange.upperBound { + count += 1 + verticalValue += base + } + } + return (startValue: startValue, base: base, count: count, maximumNumberOfDecimals: maximumNumberOfDecimals) + } + + let totalCount = dividorsAndMultiplers.map { $0.count }.max() ?? 0 + guard totalCount > 0 else { return } + + let numberFormatter = BaseConstants.chartNumberFormatter + for (index, controller) in graphControllers.enumerated() { + + let (startValue, base, _, maximumNumberOfDecimals) = dividorsAndMultiplers[index] + + let updatedRange = startValue...(startValue + base * CGFloat(totalCount)) + if controller.verticalScalesRenderer.verticalRange.end != updatedRange { + numberFormatter.maximumFractionDigits = maximumNumberOfDecimals + + var verticalLabels: [LinesChartLabel] = [] + for multipler in 0...(totalCount - 1) { + let verticalValue = startValue + base * CGFloat(multipler) + let text: String = numberFormatter.string(from: NSNumber(value: Double(verticalValue))) ?? "" + verticalLabels.append(LinesChartLabel(value: verticalValue, text: text)) + } + + controller.verticalScalesRenderer.setup(verticalLimitsLabels: verticalLabels, animated: animated) + controller.updateMainChartVerticalRange(range: updatedRange, animated: animated) + } + } + } + + override func apply(colorMode: ColorMode, animated: Bool) { + horizontalScalesRenderer.labelsColor = colorMode.chartLabelsColor + verticalLineRenderer.linesColor = colorMode.chartStrongLinesColor + + for controller in graphControllers { + controller.verticalScalesRenderer.horizontalLinesColor = colorMode.chartHelperLinesColor + controller.lineBulletsRenerer.setInnerColor(colorMode.chartBackgroundColor, animated: animated) + controller.verticalScalesRenderer.axisXColor = colorMode.chartStrongLinesColor + } + } +} diff --git a/submodules/Charts/Sources/Charts/Controllers/Percent And Pie/PercentChartComponentController.swift b/submodules/Charts/Sources/Charts/Controllers/Percent And Pie/PercentChartComponentController.swift new file mode 100644 index 0000000000..d75ba09d91 --- /dev/null +++ b/submodules/Charts/Sources/Charts/Controllers/Percent And Pie/PercentChartComponentController.swift @@ -0,0 +1,195 @@ +// +// PercentChartComponentController.swift +// GraphTest +// +// Created by Andrei Salavei on 4/14/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +class PercentChartComponentController: GeneralChartComponentController { + let mainPecentChartRenderer: PecentChartRenderer + let horizontalScalesRenderer: HorizontalScalesRenderer + let verticalScalesRenderer: VerticalScalesRenderer + let verticalLineRenderer: VerticalLinesRenderer + let previewPercentChartRenderer: PecentChartRenderer + var percentageData: PecentChartRenderer.PercentageData = .blank + + init(isZoomed: Bool, + mainPecentChartRenderer: PecentChartRenderer, + horizontalScalesRenderer: HorizontalScalesRenderer, + verticalScalesRenderer: VerticalScalesRenderer, + verticalLineRenderer: VerticalLinesRenderer, + previewPercentChartRenderer: PecentChartRenderer) { + self.mainPecentChartRenderer = mainPecentChartRenderer + self.horizontalScalesRenderer = horizontalScalesRenderer + self.verticalScalesRenderer = verticalScalesRenderer + self.verticalLineRenderer = verticalLineRenderer + self.previewPercentChartRenderer = previewPercentChartRenderer + + super.init(isZoomed: isZoomed) + } + + override func initialize(chartsCollection: ChartsCollection, initialDate: Date, totalHorizontalRange _: ClosedRange, totalVerticalRange _: ClosedRange) { + let components = chartsCollection.chartValues.map { PecentChartRenderer.PercentageData.Component(color: $0.color, + values: $0.values.map { CGFloat($0) }) } + self.percentageData = PecentChartRenderer.PercentageData(locations: chartsCollection.axisValues.map { CGFloat($0.timeIntervalSince1970) }, + components: components) + let totalHorizontalRange = PecentChartRenderer.PercentageData.horizontalRange(data: self.percentageData) ?? BaseConstants.defaultRange + let totalVerticalRange = BaseConstants.defaultRange + + super.initialize(chartsCollection: chartsCollection, + initialDate: initialDate, + totalHorizontalRange: totalHorizontalRange, + totalVerticalRange: totalVerticalRange) + + mainPecentChartRenderer.percentageData = self.percentageData + previewPercentChartRenderer.percentageData = self.percentageData + + let axisValues: [CGFloat] = [0, 25, 50, 75, 100] + let labels: [LinesChartLabel] = axisValues.map { value in + return LinesChartLabel(value: value / 100, text: BaseConstants.detailsNumberFormatter.string(from: NSNumber(value: Double(value))) ?? "") + } + verticalScalesRenderer.setup(verticalLimitsLabels: labels, animated: false) + + setupMainChart(horizontalRange: initialHorizontalRange, animated: false) + setupMainChart(verticalRange: initialVerticalRange, animated: false) + previewPercentChartRenderer.setup(verticalRange: totalVerticalRange, animated: false) + previewPercentChartRenderer.setup(horizontalRange: totalHorizontalRange, animated: false) + updateHorizontalLimitLabels(animated: false) + } + + override func willAppear(animated: Bool) { + previewPercentChartRenderer.setup(verticalRange: totalVerticalRange, animated: animated) + previewPercentChartRenderer.setup(horizontalRange: totalHorizontalRange, animated: animated) + + setConponentsVisible(visible: true, animated: true) + + setupMainChart(verticalRange: initialVerticalRange, animated: animated) + setupMainChart(horizontalRange: initialHorizontalRange, animated: animated) + + updatePreviewRangeClosure?(currentChartHorizontalRangeFraction, animated) + + super.willAppear(animated: animated) + } + + override func chartRangeDidUpdated(_ updatedRange: ClosedRange) { + super.chartRangeDidUpdated(updatedRange) + + initialHorizontalRange = updatedRange + setupMainChart(horizontalRange: updatedRange, animated: false) + updateHorizontalLimitLabels(animated: true) + } + + func updateHorizontalLimitLabels(animated: Bool) { + updateHorizontalLimitLabels(horizontalScalesRenderer: horizontalScalesRenderer, + horizontalRange: initialHorizontalRange, + scaleType: isZoomed ? .hour : .day, + forceUpdate: false, + animated: animated) + } + + func prepareAppearanceAnimation(horizontalRnage: ClosedRange) { + setupMainChart(horizontalRange: horizontalRnage, animated: false) + setConponentsVisible(visible: false, animated: false) + } + + func setConponentsVisible(visible: Bool, animated: Bool) { + mainPecentChartRenderer.setVisible(visible, animated: animated) + horizontalScalesRenderer.setVisible(visible, animated: animated) + verticalScalesRenderer.setVisible(visible, animated: animated) + verticalLineRenderer.setVisible(visible, animated: animated) + previewPercentChartRenderer.setVisible(visible, animated: animated) + } + + func setupMainChart(horizontalRange: ClosedRange, animated: Bool) { + mainPecentChartRenderer.setup(horizontalRange: horizontalRange, animated: animated) + horizontalScalesRenderer.setup(horizontalRange: horizontalRange, animated: animated) + verticalScalesRenderer.setup(horizontalRange: horizontalRange, animated: animated) + verticalLineRenderer.setup(horizontalRange: horizontalRange, animated: animated) + } + + func setupMainChart(verticalRange: ClosedRange, animated: Bool) { + mainPecentChartRenderer.setup(verticalRange: verticalRange, animated: animated) + horizontalScalesRenderer.setup(verticalRange: verticalRange, animated: animated) + verticalScalesRenderer.setup(verticalRange: verticalRange, animated: animated) + verticalLineRenderer.setup(verticalRange: verticalRange, animated: animated) + } + + override func updateChartsVisibility(visibility: [Bool], animated: Bool) { + super.updateChartsVisibility(visibility: visibility, animated: animated) + for (index, isVisible) in visibility.enumerated() { + mainPecentChartRenderer.setComponentVisible(isVisible, at: index, animated: animated) + previewPercentChartRenderer.setComponentVisible(isVisible, at: index, animated: animated) + } + verticalScalesRenderer.setVisible(visibility.contains(true), animated: animated) + } + + override func chartDetailsViewModel(closestDate: Date, pointIndex: Int) -> ChartDetailsViewModel { + let visibleValues = visibleDetailsChartValues + + let total = visibleValues.map { $0.values[pointIndex] }.reduce(0, +) + + let values: [ChartDetailsViewModel.Value] = chartsCollection.chartValues.enumerated().map { arg in + let (index, component) = arg + return ChartDetailsViewModel.Value(prefix: PercentConstants.percentValueFormatter.string(from: component.values[pointIndex] / total * 100), + title: component.name, + value: BaseConstants.detailsNumberFormatter.string(from: component.values[pointIndex]), + color: component.color, + visible: chartVisibility[index]) + } + let dateString: String + if isZoomed { + dateString = BaseConstants.timeDateFormatter.string(from: closestDate) + } else { + dateString = BaseConstants.headerMediumRangeFormatter.string(from: closestDate) + } + let viewModel = ChartDetailsViewModel(title: dateString, + showArrow: !self.isZoomed, + showPrefixes: true, + values: values, + totalValue: nil, + tapAction: { [weak self] in + self?.hideDetailsView(animated: true) + self?.zoomInOnDateClosure?(closestDate) }) + return viewModel + } + + var currentlyVisiblePercentageData: PecentChartRenderer.PercentageData { + var currentPercentageData = percentageData + currentPercentageData.components = chartVisibility.enumerated().compactMap { $0.element ? currentPercentageData.components[$0.offset] : nil } + return currentPercentageData + } + + override var currentMainRangeRenderer: BaseChartRenderer { + return mainPecentChartRenderer + } + + override var currentPreviewRangeRenderer: BaseChartRenderer { + return previewPercentChartRenderer + } + + override func showDetailsView(at chartPosition: CGFloat, detailsViewPosition: CGFloat, dataIndex: Int, date: Date, animted: Bool) { + super.showDetailsView(at: chartPosition, detailsViewPosition: detailsViewPosition, dataIndex: dataIndex, date: date, animted: animted) + verticalLineRenderer.values = [chartPosition] + verticalLineRenderer.isEnabled = true + } + + override func hideDetailsView(animated: Bool) { + super.hideDetailsView(animated: animated) + + verticalLineRenderer.values = [] + verticalLineRenderer.isEnabled = false + } + + override func apply(colorMode: ColorMode, animated: Bool) { + super.apply(colorMode: colorMode, animated: animated) + + horizontalScalesRenderer.labelsColor = colorMode.chartLabelsColor + verticalScalesRenderer.labelsColor = colorMode.chartLabelsColor + verticalScalesRenderer.axisXColor = colorMode.barChartStrongLinesColor + verticalScalesRenderer.horizontalLinesColor = colorMode.barChartStrongLinesColor + verticalLineRenderer.linesColor = colorMode.chartStrongLinesColor + } +} diff --git a/submodules/Charts/Sources/Charts/Controllers/Percent And Pie/PercentPieChartController.swift b/submodules/Charts/Sources/Charts/Controllers/Percent And Pie/PercentPieChartController.swift new file mode 100644 index 0000000000..484d8a2f11 --- /dev/null +++ b/submodules/Charts/Sources/Charts/Controllers/Percent And Pie/PercentPieChartController.swift @@ -0,0 +1,281 @@ +// +// PercentPieChartController.swift +// GraphTest +// +// Created by Andrei Salavei on 4/7/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +enum PercentConstants { + static let percentValueFormatter: NumberFormatter = { + let formatter = NumberFormatter() + formatter.positiveSuffix = "%" + return formatter + }() +} + +private enum Constants { + static let zoomedRange = 7 +} + +class PercentPieChartController: BaseChartController { + let percentController: PercentChartComponentController + let pieController: PieChartComponentController + let transitionRenderer: PercentPieAnimationRenderer + + override init(chartsCollection: ChartsCollection) { + transitionRenderer = PercentPieAnimationRenderer() + percentController = PercentChartComponentController(isZoomed: false, + mainPecentChartRenderer: PecentChartRenderer(), + horizontalScalesRenderer: HorizontalScalesRenderer(), + verticalScalesRenderer: VerticalScalesRenderer(), + verticalLineRenderer: VerticalLinesRenderer(), + previewPercentChartRenderer: PecentChartRenderer()) + pieController = PieChartComponentController(isZoomed: true, + pieChartRenderer: PieChartRenderer(), + previewBarChartRenderer: BarChartRenderer()) + + super.init(chartsCollection: chartsCollection) + + [percentController, pieController].forEach { controller in + controller.chartFrame = { [unowned self] in self.chartFrame() } + controller.cartViewBounds = { [unowned self] in self.cartViewBounds() } + controller.zoomInOnDateClosure = { [unowned self] date in + self.didTapZoomIn(date: date) + } + controller.setChartTitleClosure = { [unowned self] (title, animated) in + self.setChartTitleClosure?(title, animated) + } + controller.setDetailsViewPositionClosure = { [unowned self] (position) in + self.setDetailsViewPositionClosure?(position) + } + controller.setDetailsChartVisibleClosure = { [unowned self] (visible, animated) in + self.setDetailsChartVisibleClosure?(visible, animated) + } + controller.setDetailsViewModel = { [unowned self] (viewModel, animated) in + self.setDetailsViewModel?(viewModel, animated) + } + controller.updatePreviewRangeClosure = { [unowned self] (fraction, animated) in + self.chartRangeUpdatedClosure?(fraction, animated) + } + controller.chartRangePagingClosure = { [unowned self] (isEnabled, pageSize) in + self.setChartRangePagingEnabled(isEnabled: isEnabled, minimumSelectionSize: pageSize) + } + } + transitionRenderer.isEnabled = false + } + + override var mainChartRenderers: [ChartViewRenderer] { + return [percentController.mainPecentChartRenderer, + transitionRenderer, + percentController.horizontalScalesRenderer, + percentController.verticalScalesRenderer, + percentController.verticalLineRenderer, + pieController.pieChartRenderer, +// performanceRenderer + ] + } + + override var navigationRenderers: [ChartViewRenderer] { + return [percentController.previewPercentChartRenderer, + pieController.previewBarChartRenderer] + } + + override func initializeChart() { + percentController.initialize(chartsCollection: initialChartsCollection, + initialDate: Date(), + totalHorizontalRange: BaseConstants.defaultRange, + totalVerticalRange: BaseConstants.defaultRange) + switchToChart(chartsCollection: percentController.chartsCollection, isZoomed: false, animated: false) + } + + func switchToChart(chartsCollection: ChartsCollection, isZoomed: Bool, animated: Bool) { + if animated { + TimeInterval.setDefaultSuration(.expandAnimationDuration) + DispatchQueue.main.asyncAfter(deadline: .now() + .expandAnimationDuration) { + TimeInterval.setDefaultSuration(.osXDuration) + } + } + + super.isZoomed = isZoomed + if isZoomed { + let toHorizontalRange = pieController.initialHorizontalRange + + pieController.updateChartsVisibility(visibility: percentController.chartVisibility, animated: false) + pieController.pieChartRenderer.setup(horizontalRange: percentController.currentHorizontalMainChartRange, animated: false) + pieController.previewBarChartRenderer.setup(horizontalRange: percentController.currentPreviewHorizontalRange, animated: false) + pieController.pieChartRenderer.setVisible(false, animated: false) + pieController.previewBarChartRenderer.setVisible(true, animated: false) + + pieController.willAppear(animated: animated) + percentController.willDisappear(animated: animated) + + pieController.pieChartRenderer.drawPie = false + percentController.mainPecentChartRenderer.isEnabled = false + + setupTransitionRenderer() + + percentController.setupMainChart(horizontalRange: toHorizontalRange, animated: animated) + percentController.previewPercentChartRenderer.setup(horizontalRange: toHorizontalRange, animated: animated) + percentController.setConponentsVisible(visible: false, animated: animated) + + transitionRenderer.animate(fromDataToPie: true, animated: animated) { [weak self] in + self?.pieController.pieChartRenderer.drawPie = true + self?.percentController.mainPecentChartRenderer.isEnabled = true + } + } else { + if !pieController.chartsCollection.isBlank { + let fromHorizontalRange = pieController.currentHorizontalMainChartRange + let toHorizontalRange = percentController.initialHorizontalRange + + pieController.pieChartRenderer.setup(horizontalRange: toHorizontalRange, animated: animated) + pieController.previewBarChartRenderer.setup(horizontalRange: toHorizontalRange, animated: animated) + pieController.pieChartRenderer.setVisible(false, animated: animated) + pieController.previewBarChartRenderer.setVisible(false, animated: animated) + + percentController.updateChartsVisibility(visibility: pieController.chartVisibility, animated: false) + percentController.setupMainChart(horizontalRange: fromHorizontalRange, animated: false) + percentController.previewPercentChartRenderer.setup(horizontalRange: fromHorizontalRange, animated: false) + percentController.setConponentsVisible(visible: false, animated: false) + } + + percentController.willAppear(animated: animated) + pieController.willDisappear(animated: animated) + + if animated { + pieController.pieChartRenderer.drawPie = false + percentController.mainPecentChartRenderer.isEnabled = false + + setupTransitionRenderer() + + transitionRenderer.animate(fromDataToPie: false, animated: true) { + self.pieController.pieChartRenderer.drawPie = true + self.percentController.mainPecentChartRenderer.isEnabled = true + } + } + } + + self.setBackButtonVisibilityClosure?(isZoomed, animated) + } + + func setupTransitionRenderer() { + transitionRenderer.setup(verticalRange: percentController.currentVerticalMainChartRange, animated: false) + transitionRenderer.setup(horizontalRange: percentController.currentHorizontalMainChartRange, animated: false) + transitionRenderer.visiblePieComponents = pieController.visiblePieDataWithCurrentPreviewRange + transitionRenderer.visiblePercentageData = percentController.currentlyVisiblePercentageData + } + + override func updateChartsVisibility(visibility: [Bool], animated: Bool) { + if isZoomed { + pieController.updateChartsVisibility(visibility: visibility, animated: animated) + } else { + percentController.updateChartsVisibility(visibility: visibility, animated: animated) + } + } + + var visibleChartValues: [ChartsCollection.Chart] { + let visibility = isZoomed ? pieController.chartVisibility : percentController.chartVisibility + let collection = isZoomed ? pieController.chartsCollection : percentController.chartsCollection + let visibleCharts: [ChartsCollection.Chart] = visibility.enumerated().compactMap { args in + args.element ? collection.chartValues[args.offset] : nil + } + return visibleCharts + } + + override var actualChartVisibility: [Bool] { + return isZoomed ? pieController.chartVisibility : percentController.chartVisibility + } + + override var actualChartsCollection: ChartsCollection { + return isZoomed ? pieController.chartsCollection : percentController.chartsCollection + } + + override func chartInteractionDidBegin(point: CGPoint) { + if isZoomed { + pieController.chartInteractionDidBegin(point: point) + } else { + percentController.chartInteractionDidBegin(point: point) + } + } + + override func chartInteractionDidEnd() { + if isZoomed { + pieController.chartInteractionDidEnd() + } else { + percentController.chartInteractionDidEnd() + } + } + + override var drawChartVisibity: Bool { + return true + } + + override var currentChartHorizontalRangeFraction: ClosedRange { + if isZoomed { + return pieController.currentChartHorizontalRangeFraction + } else { + return percentController.currentChartHorizontalRangeFraction + } + } + + override func cancelChartInteraction() { + if isZoomed { + return pieController.hideDetailsView(animated: true) + } else { + return percentController.hideDetailsView(animated: true) + } + } + + override func didTapZoomIn(date: Date) { + guard isZoomed == false else { return } + cancelChartInteraction() + let currentCollection = percentController.chartsCollection + let range: Int = Constants.zoomedRange + guard let (foundDate, index) = percentController.findClosestDateTo(dateToFind: date) else { return } + var lowIndex = max(0, index - range / 2) + var highIndex = min(currentCollection.axisValues.count - 1, index + range / 2) + if lowIndex == 0 { + highIndex = lowIndex + (range - 1) + } else if highIndex == currentCollection.axisValues.count - 1 { + lowIndex = highIndex - (range - 1) + } + + let newValues = currentCollection.chartValues.map { chart in + return ChartsCollection.Chart(color: chart.color, + name: chart.name, + values: Array(chart.values[(lowIndex...highIndex)])) + } + let newCollection = ChartsCollection(axisValues: Array(currentCollection.axisValues[(lowIndex...highIndex)]), + chartValues: newValues) + let selectedRange = CGFloat(foundDate.timeIntervalSince1970 - .day)...CGFloat(foundDate.timeIntervalSince1970) + pieController.initialize(chartsCollection: newCollection, initialDate: date, totalHorizontalRange: 0...1, totalVerticalRange: 0...1) + pieController.initialHorizontalRange = selectedRange + + switchToChart(chartsCollection: newCollection, isZoomed: true, animated: true) + } + + override func didTapZoomOut() { + self.pieController.deselectSegment(completion: { [weak self] in + guard let self = self else { return } + self.switchToChart(chartsCollection: self.percentController.chartsCollection, isZoomed: false, animated: true) + }) + } + + override func updateChartRange(_ rangeFraction: ClosedRange) { + if isZoomed { + return pieController.chartRangeFractionDidUpdated(rangeFraction) + } else { + return percentController.chartRangeFractionDidUpdated(rangeFraction) + } + } + + override func apply(colorMode: ColorMode, animated: Bool) { + super.apply(colorMode: colorMode, animated: animated) + + pieController.apply(colorMode: colorMode, animated: animated) + percentController.apply(colorMode: colorMode, animated: animated) + transitionRenderer.backgroundColor = colorMode.chartBackgroundColor + } +} diff --git a/submodules/Charts/Sources/Charts/Controllers/Percent And Pie/PieChartComponentController.swift b/submodules/Charts/Sources/Charts/Controllers/Percent And Pie/PieChartComponentController.swift new file mode 100644 index 0000000000..68c3541912 --- /dev/null +++ b/submodules/Charts/Sources/Charts/Controllers/Percent And Pie/PieChartComponentController.swift @@ -0,0 +1,198 @@ +// +// PieChartComponentController.swift +// GraphTest +// +// Created by Andrei Salavei on 4/14/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +class PieChartComponentController: GeneralChartComponentController { + let pieChartRenderer: PieChartRenderer + let previewBarChartRenderer: BarChartRenderer + var barWidth: CGFloat = 1 + + var chartBars: BarChartRenderer.BarsData = .blank + + init(isZoomed: Bool, + pieChartRenderer: PieChartRenderer, + previewBarChartRenderer: BarChartRenderer) { + self.pieChartRenderer = pieChartRenderer + self.previewBarChartRenderer = previewBarChartRenderer + super.init(isZoomed: isZoomed) + } + + override func initialize(chartsCollection: ChartsCollection, initialDate: Date, totalHorizontalRange _: ClosedRange, totalVerticalRange _: ClosedRange) { + let (width, chartBars, totalHorizontalRange, _) = BarChartRenderer.BarsData.initialComponents(chartsCollection: chartsCollection) + self.barWidth = width + self.chartBars = chartBars + super.initialize(chartsCollection: chartsCollection, + initialDate: initialDate, + totalHorizontalRange: totalHorizontalRange, + totalVerticalRange: BaseConstants.defaultRange) + + self.previewBarChartRenderer.bars = chartBars + self.previewBarChartRenderer.fillToTop = true + + pieChartRenderer.valuesFormatter = PercentConstants.percentValueFormatter + pieChartRenderer.setup(horizontalRange: initialHorizontalRange, animated: false) + previewBarChartRenderer.setup(verticalRange: initialVerticalRange, animated: false) + previewBarChartRenderer.setup(horizontalRange: initialHorizontalRange, animated: false) + + pieChartRenderer.updatePercentageData(pieDataWithCurrentPreviewRange, animated: false) + pieChartRenderer.selectSegmentAt(at: nil, animated: false) + } + + private var pieDataWithCurrentPreviewRange: [PieChartRenderer.PieComponent] { + let range = currentHorizontalMainChartRange + var pieComponents = chartsCollection.chartValues.map { PieChartRenderer.PieComponent(color: $0.color, + value: 0) } + guard var valueIndex = chartsCollection.axisValues.firstIndex(where: { CGFloat($0.timeIntervalSince1970) > (range.lowerBound + 1)}) else { + return pieComponents + } + var count = 0 + while valueIndex < chartsCollection.axisValues.count, CGFloat(chartsCollection.axisValues[valueIndex].timeIntervalSince1970) <= range.upperBound { + count += 1 + for pieIndex in pieComponents.indices { + pieComponents[pieIndex].value += CGFloat(chartsCollection.chartValues[pieIndex].values[valueIndex]) + } + valueIndex += 1 + } + return pieComponents + } + + var visiblePieDataWithCurrentPreviewRange: [PieChartRenderer.PieComponent] { + let currentData = pieDataWithCurrentPreviewRange + return chartVisibility.enumerated().compactMap { $0.element ? currentData[$0.offset] : nil } + } + + override func willAppear(animated: Bool) { + pieChartRenderer.setup(horizontalRange: initialHorizontalRange, animated: animated) + pieChartRenderer.setVisible(true, animated: animated) + + previewBarChartRenderer.setup(verticalRange: totalVerticalRange, animated: animated) + previewBarChartRenderer.setup(horizontalRange: totalHorizontalRange, animated: animated) + previewBarChartRenderer.setVisible(true, animated: animated) + + updatePreviewRangeClosure?(currentChartHorizontalRangeFraction, animated) + pieChartRenderer.updatePercentageData(pieDataWithCurrentPreviewRange, animated: false) + + super.willAppear(animated: animated) + } + + override func setupChartRangePaging() { + let valuesCount = chartsCollection.axisValues.count + guard valuesCount > 0 else { return } + chartRangePagingClosure?(true, 1.0 / CGFloat(valuesCount)) + } + + override func chartRangeDidUpdated(_ updatedRange: ClosedRange) { + if isChartInteractionBegun { + chartInteractionDidBegin(point: lastChartInteractionPoint) + } + initialHorizontalRange = updatedRange + + setupMainChart(horizontalRange: updatedRange, animated: true) + updateSelectedDataLabelIfNeeded() + } + + func setupMainChart(horizontalRange: ClosedRange, animated: Bool) { + pieChartRenderer.setup(horizontalRange: horizontalRange, animated: animated) + pieChartRenderer.updatePercentageData(pieDataWithCurrentPreviewRange, animated: animated) + } + + override func updateChartsVisibility(visibility: [Bool], animated: Bool) { + super.updateChartsVisibility(visibility: visibility, animated: animated) + for (index, isVisible) in visibility.enumerated() { + pieChartRenderer.setComponentVisible(isVisible, at: index, animated: animated) + previewBarChartRenderer.setComponentVisible(isVisible, at: index, animated: animated) + } + if let segment = pieChartRenderer.selectedSegment { + if !visibility[segment] { + pieChartRenderer.selectSegmentAt(at: nil, animated: true) + } + } + updateSelectedDataLabelIfNeeded() + } + + func deselectSegment(completion: @escaping () -> Void) { + if pieChartRenderer.hasSelectedSegments { + hideDetailsView(animated: true) + pieChartRenderer.selectSegmentAt(at: nil, animated: true) + DispatchQueue.main.asyncAfter(deadline: .now() + .defaultDuration / 2) { + completion() + } + } else { + completion() + } + } + + func updateSelectedDataLabelIfNeeded() { + if let segment = pieChartRenderer.selectedSegment { + self.setDetailsChartVisibleClosure?(true, true) + self.setDetailsViewModel?(chartDetailsViewModel(segmentInde: segment), false) + self.setDetailsViewPositionClosure?(chartFrame().width / 4) + } else { + self.setDetailsChartVisibleClosure?(false, true) + } + } + + func chartDetailsViewModel(segmentInde: Int) -> ChartDetailsViewModel { + let pieItem = pieDataWithCurrentPreviewRange[segmentInde] + let title = chartsCollection.chartValues[segmentInde].name + let valueString = BaseConstants.detailsNumberFormatter.string(from: pieItem.value) + let viewModel = ChartDetailsViewModel(title: "", + showArrow: false, + showPrefixes: false, + values: [ChartDetailsViewModel.Value(prefix: nil, + title: title, + value: valueString, + color: pieItem.color, + visible: true)], + totalValue: nil, + tapAction: nil) + return viewModel + } + + override var currentMainRangeRenderer: BaseChartRenderer { + return pieChartRenderer + } + + override var currentPreviewRangeRenderer: BaseChartRenderer { + return previewBarChartRenderer + } + + var lastInteractionPoint: CGPoint = .zero + override func chartInteractionDidBegin(point: CGPoint) { + lastInteractionPoint = point + } + + override func chartInteractionDidEnd() { + if let segment = pieChartRenderer.selectedItemIndex(at: lastInteractionPoint) { + if pieChartRenderer.selectedSegment == segment { + pieChartRenderer.selectSegmentAt(at: nil, animated: true) + } else { + pieChartRenderer.selectSegmentAt(at: segment, animated: true) + } + updateSelectedDataLabelIfNeeded() + } + } + + override func hideDetailsView(animated: Bool) { + pieChartRenderer.selectSegmentAt(at: nil, animated: animated) + updateSelectedDataLabelIfNeeded() + } + + override func updateChartRangeTitle(animated: Bool) { + let fromDate = Date(timeIntervalSince1970: TimeInterval(currentHorizontalMainChartRange.lowerBound) + .day + 1) + let toDate = Date(timeIntervalSince1970: TimeInterval(currentHorizontalMainChartRange.upperBound)) + if Calendar.utc.startOfDay(for: fromDate) == Calendar.utc.startOfDay(for: toDate) { + let stirng = BaseConstants.headerFullZoomedFormatter.string(from: fromDate) + self.setChartTitleClosure?(stirng, animated) + } else { + let stirng = "\(BaseConstants.headerMediumRangeFormatter.string(from: fromDate)) - \(BaseConstants.headerMediumRangeFormatter.string(from: toDate))" + self.setChartTitleClosure?(stirng, animated) + } + } +} diff --git a/submodules/Charts/Sources/Charts/Controllers/Stacked Bars/BarsComponentController.swift b/submodules/Charts/Sources/Charts/Controllers/Stacked Bars/BarsComponentController.swift new file mode 100644 index 0000000000..2e1894465b --- /dev/null +++ b/submodules/Charts/Sources/Charts/Controllers/Stacked Bars/BarsComponentController.swift @@ -0,0 +1,226 @@ +// +// BarsComponentController.swift +// GraphTest +// +// Created by Andrei Salavei on 4/14/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +class BarsComponentController: GeneralChartComponentController { + let mainBarsRenderer: BarChartRenderer + let horizontalScalesRenderer: HorizontalScalesRenderer + let verticalScalesRenderer: VerticalScalesRenderer + + let previewBarsChartRenderer: BarChartRenderer + private(set) var barsWidth: CGFloat = 1 + + private (set) var chartBars: BarChartRenderer.BarsData = .blank + + init(isZoomed: Bool, + mainBarsRenderer: BarChartRenderer, + horizontalScalesRenderer: HorizontalScalesRenderer, + verticalScalesRenderer: VerticalScalesRenderer, + previewBarsChartRenderer: BarChartRenderer) { + self.mainBarsRenderer = mainBarsRenderer + self.horizontalScalesRenderer = horizontalScalesRenderer + self.verticalScalesRenderer = verticalScalesRenderer + self.previewBarsChartRenderer = previewBarsChartRenderer + + self.mainBarsRenderer.optimizationLevel = BaseConstants.barsChartOptimizationLevel + self.previewBarsChartRenderer.optimizationLevel = BaseConstants.barsChartOptimizationLevel + + super.init(isZoomed: isZoomed) + } + + override func initialize(chartsCollection: ChartsCollection, initialDate: Date, totalHorizontalRange _: ClosedRange, totalVerticalRange _: ClosedRange) { + let (width, chartBars, totalHorizontalRange, totalVerticalRange) = BarChartRenderer.BarsData.initialComponents(chartsCollection: chartsCollection) + self.chartBars = chartBars + self.barsWidth = width + + super.initialize(chartsCollection: chartsCollection, + initialDate: initialDate, + totalHorizontalRange: totalHorizontalRange, + totalVerticalRange: totalVerticalRange) + } + + override func setupInitialChartRange(initialDate: Date) { + guard let first = chartsCollection.axisValues.first?.timeIntervalSince1970, + let last = chartsCollection.axisValues.last?.timeIntervalSince1970 else { return } + + let rangeStart = CGFloat(first) + let rangeEnd = CGFloat(last) + + if isZoomed { + let initalDate = CGFloat(initialDate.timeIntervalSince1970) + + initialHorizontalRange = max(initalDate - barsWidth, rangeStart)...min(initalDate + GeneralChartComponentConstants.defaultZoomedRangeLength - barsWidth, rangeEnd) + initialVerticalRange = totalVerticalRange + } else { + super.setupInitialChartRange(initialDate: initialDate) + } + } + + + override func willAppear(animated: Bool) { + mainBarsRenderer.bars = self.chartBars + previewBarsChartRenderer.bars = self.chartBars + + previewBarsChartRenderer.setup(verticalRange: totalVerticalRange, animated: animated) + previewBarsChartRenderer.setup(horizontalRange: totalHorizontalRange, animated: animated) + + setupMainChart(verticalRange: initialVerticalRange, animated: animated) + setupMainChart(horizontalRange: initialHorizontalRange, animated: animated) + + updateChartVerticalRanges(horizontalRange: initialHorizontalRange, animated: animated) + + super.willAppear(animated: animated) + + updatePreviewRangeClosure?(currentChartHorizontalRangeFraction, animated) + setConponentsVisible(visible: true, animated: animated) + updateHorizontalLimitLabels(animated: animated, forceUpdate: true) + } + + override func chartRangeDidUpdated(_ updatedRange: ClosedRange) { + super.chartRangeDidUpdated(updatedRange) + if !isZoomed { + initialHorizontalRange = updatedRange + } + setupMainChart(horizontalRange: updatedRange, animated: false) + updateHorizontalLimitLabels(animated: true, forceUpdate: false) + updateChartVerticalRanges(horizontalRange: updatedRange, animated: true) + } + + func updateHorizontalLimitLabels(animated: Bool, forceUpdate: Bool) { + updateHorizontalLimitLabels(horizontalScalesRenderer: horizontalScalesRenderer, + horizontalRange: currentHorizontalMainChartRange, + scaleType: isZoomed ? .hour : .day, + forceUpdate: forceUpdate, + animated: animated) + } + + func prepareAppearanceAnimation(horizontalRnage: ClosedRange) { + setupMainChart(horizontalRange: horizontalRnage, animated: false) + setConponentsVisible(visible: false, animated: false) + } + + func setConponentsVisible(visible: Bool, animated: Bool) { + mainBarsRenderer.setVisible(visible, animated: animated) + horizontalScalesRenderer.setVisible(visible, animated: animated) + verticalScalesRenderer.setVisible(visible, animated: animated) + previewBarsChartRenderer.setVisible(visible, animated: animated) + } + + func setupMainChart(horizontalRange: ClosedRange, animated: Bool) { + mainBarsRenderer.setup(horizontalRange: horizontalRange, animated: animated) + horizontalScalesRenderer.setup(horizontalRange: horizontalRange, animated: animated) + verticalScalesRenderer.setup(horizontalRange: horizontalRange, animated: animated) + } + + var visibleBars: BarChartRenderer.BarsData { + let visibleComponents: [BarChartRenderer.BarsData.Component] = chartVisibility.enumerated().compactMap { args in + args.element ? chartBars.components[args.offset] : nil + } + return BarChartRenderer.BarsData(barWidth: chartBars.barWidth, + locations: chartBars.locations, + components: visibleComponents) + } + + func updateChartVerticalRanges(horizontalRange: ClosedRange, animated: Bool) { + if let range = BarChartRenderer.BarsData.verticalRange(bars: visibleBars, + calculatingRange: horizontalRange, + addBounds: true) { + let (range, labels) = verticalLimitsLabels(verticalRange: range) + if verticalScalesRenderer.verticalRange.end != range { + verticalScalesRenderer.setup(verticalLimitsLabels: labels, animated: animated) + } + verticalScalesRenderer.setVisible(true, animated: animated) + + setupMainChart(verticalRange: range, animated: animated) + } else { + verticalScalesRenderer.setVisible(false, animated: animated) + } + + if let range = BarChartRenderer.BarsData.verticalRange(bars: visibleBars) { + previewBarsChartRenderer.setup(verticalRange: range, animated: animated) + } + } + + func setupMainChart(verticalRange: ClosedRange, animated: Bool) { + mainBarsRenderer.setup(verticalRange: verticalRange, animated: animated) + horizontalScalesRenderer.setup(verticalRange: verticalRange, animated: animated) + verticalScalesRenderer.setup(verticalRange: verticalRange, animated: animated) + } + + override func updateChartsVisibility(visibility: [Bool], animated: Bool) { + super.updateChartsVisibility(visibility: visibility, animated: animated) + for (index, isVisible) in visibility.enumerated() { + mainBarsRenderer.setComponentVisible(isVisible, at: index, animated: animated) + previewBarsChartRenderer.setComponentVisible(isVisible, at: index, animated: animated) + } + updateChartVerticalRanges(horizontalRange: currentHorizontalMainChartRange, animated: true) + } + + var visibleChartValues: [ChartsCollection.Chart] { + let visibleCharts: [ChartsCollection.Chart] = chartVisibility.enumerated().compactMap { args in + args.element ? chartsCollection.chartValues[args.offset] : nil + } + return visibleCharts + } + + override func chartDetailsViewModel(closestDate: Date, pointIndex: Int) -> ChartDetailsViewModel { + var viewModel = super.chartDetailsViewModel(closestDate: closestDate, pointIndex: pointIndex) + let visibleChartValues = self.visibleChartValues + let totalSumm: CGFloat = visibleChartValues.map { CGFloat($0.values[pointIndex]) }.reduce(0, +) + + viewModel.totalValue = ChartDetailsViewModel.Value(prefix: nil, + title: "Total", + value: BaseConstants.detailsNumberFormatter.string(from: totalSumm), + color: .white, + visible: visibleChartValues.count > 1) + return viewModel + } + + override var currentMainRangeRenderer: BaseChartRenderer { + return mainBarsRenderer + } + + override var currentPreviewRangeRenderer: BaseChartRenderer { + return previewBarsChartRenderer + } + + override func showDetailsView(at chartPosition: CGFloat, detailsViewPosition: CGFloat, dataIndex: Int, date: Date, animted: Bool) { + let rangeWithOffset = detailsViewPosition - barsWidth / currentHorizontalMainChartRange.distance * chartFrame().width / 2 + super.showDetailsView(at: chartPosition, detailsViewPosition: rangeWithOffset, dataIndex: dataIndex, date: date, animted: animted) + mainBarsRenderer.setSelectedIndex(dataIndex, animated: true) + } + + override func hideDetailsView(animated: Bool) { + super.hideDetailsView(animated: animated) + + mainBarsRenderer.setSelectedIndex(nil, animated: animated) + } + override func apply(colorMode: ColorMode, animated: Bool) { + super.apply(colorMode: colorMode, animated: animated) + + horizontalScalesRenderer.labelsColor = colorMode.chartLabelsColor + verticalScalesRenderer.labelsColor = colorMode.chartLabelsColor + verticalScalesRenderer.axisXColor = colorMode.barChartStrongLinesColor + verticalScalesRenderer.horizontalLinesColor = colorMode.barChartStrongLinesColor + mainBarsRenderer.update(backgroundColor: colorMode.chartBackgroundColor, animated: false) + previewBarsChartRenderer.update(backgroundColor: colorMode.chartBackgroundColor, animated: false) + } + + override func updateChartRangeTitle(animated: Bool) { + let fromDate = Date(timeIntervalSince1970: TimeInterval(currentHorizontalMainChartRange.lowerBound + barsWidth)) + let toDate = Date(timeIntervalSince1970: TimeInterval(currentHorizontalMainChartRange.upperBound)) + if Calendar.utc.startOfDay(for: fromDate) == Calendar.utc.startOfDay(for: toDate) { + let stirng = BaseConstants.headerFullZoomedFormatter.string(from: fromDate) + self.setChartTitleClosure?(stirng, animated) + } else { + let stirng = "\(BaseConstants.headerMediumRangeFormatter.string(from: fromDate)) - \(BaseConstants.headerMediumRangeFormatter.string(from: toDate))" + self.setChartTitleClosure?(stirng, animated) + } + } +} diff --git a/submodules/Charts/Sources/Charts/Controllers/Stacked Bars/DailyBarsChartController.swift b/submodules/Charts/Sources/Charts/Controllers/Stacked Bars/DailyBarsChartController.swift new file mode 100644 index 0000000000..ae83803bb1 --- /dev/null +++ b/submodules/Charts/Sources/Charts/Controllers/Stacked Bars/DailyBarsChartController.swift @@ -0,0 +1,249 @@ +// +// DailyBarsChartController.swift +// GraphTest +// +// Created by Andrei Salavei on 4/7/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +class DailyBarsChartController: BaseChartController { + let barsController: BarsComponentController + let linesController: LinesComponentController + + override init(chartsCollection: ChartsCollection) { + let horizontalScalesRenderer = HorizontalScalesRenderer() + let verticalScalesRenderer = VerticalScalesRenderer() + barsController = BarsComponentController(isZoomed: false, + mainBarsRenderer: BarChartRenderer(), + horizontalScalesRenderer: horizontalScalesRenderer, + verticalScalesRenderer: verticalScalesRenderer, + previewBarsChartRenderer: BarChartRenderer()) + linesController = LinesComponentController(isZoomed: true, + userLinesTransitionAnimation: false, + mainLinesRenderer: LinesChartRenderer(), + horizontalScalesRenderer: horizontalScalesRenderer, + verticalScalesRenderer: verticalScalesRenderer, + verticalLineRenderer: VerticalLinesRenderer(), + lineBulletsRenerer: LineBulletsRenerer(), + previewLinesChartRenderer: LinesChartRenderer()) + + super.init(chartsCollection: chartsCollection) + + [barsController, linesController].forEach { controller in + controller.chartFrame = { [unowned self] in self.chartFrame() } + controller.cartViewBounds = { [unowned self] in self.cartViewBounds() } + controller.zoomInOnDateClosure = { [unowned self] date in + self.didTapZoomIn(date: date) + } + controller.setChartTitleClosure = { [unowned self] (title, animated) in + self.setChartTitleClosure?(title, animated) + } + controller.setDetailsViewPositionClosure = { [unowned self] (position) in + self.setDetailsViewPositionClosure?(position) + } + controller.setDetailsChartVisibleClosure = { [unowned self] (visible, animated) in + self.setDetailsChartVisibleClosure?(visible, animated) + } + controller.setDetailsViewModel = { [unowned self] (viewModel, animated) in + self.setDetailsViewModel?(viewModel, animated) + } + controller.updatePreviewRangeClosure = { [unowned self] (fraction, animated) in + self.chartRangeUpdatedClosure?(fraction, animated) + } + controller.chartRangePagingClosure = { [unowned self] (isEnabled, pageSize) in + self.setChartRangePagingEnabled(isEnabled: isEnabled, minimumSelectionSize: pageSize) + } + } + } + + override var mainChartRenderers: [ChartViewRenderer] { + return [barsController.mainBarsRenderer, + linesController.mainLinesRenderer, + barsController.horizontalScalesRenderer, + barsController.verticalScalesRenderer, + linesController.verticalLineRenderer, + linesController.lineBulletsRenerer, +// performanceRenderer + ] + } + + override var navigationRenderers: [ChartViewRenderer] { + return [barsController.previewBarsChartRenderer, + linesController.previewLinesChartRenderer] + } + + override func initializeChart() { + barsController.initialize(chartsCollection: initialChartsCollection, + initialDate: Date(), + totalHorizontalRange: BaseConstants.defaultRange, + totalVerticalRange: BaseConstants.defaultRange) + switchToChart(chartsCollection: barsController.chartsCollection, isZoomed: false, animated: false) + } + + func switchToChart(chartsCollection: ChartsCollection, isZoomed: Bool, animated: Bool) { + if animated { + TimeInterval.setDefaultSuration(.expandAnimationDuration) + DispatchQueue.main.asyncAfter(deadline: .now() + .expandAnimationDuration) { + TimeInterval.setDefaultSuration(.osXDuration) + } + } + + super.isZoomed = isZoomed + if isZoomed { + let toHorizontalRange = linesController.initialHorizontalRange + let destinationHorizontalRange = (toHorizontalRange.lowerBound - barsController.barsWidth)...(toHorizontalRange.upperBound - barsController.barsWidth) + let initialChartVerticalRange = lineProportionAnimationRange() + + linesController.mainLinesRenderer.setup(horizontalRange: barsController.currentHorizontalMainChartRange, animated: false) + linesController.previewLinesChartRenderer.setup(horizontalRange: barsController.currentPreviewHorizontalRange, animated: false) + linesController.mainLinesRenderer.setup(verticalRange: initialChartVerticalRange, animated: false) + linesController.previewLinesChartRenderer.setup(verticalRange: initialChartVerticalRange, animated: false) + linesController.mainLinesRenderer.setVisible(false, animated: false) + linesController.previewLinesChartRenderer.setVisible(false, animated: false) + + barsController.setupMainChart(horizontalRange: destinationHorizontalRange, animated: animated) + barsController.previewBarsChartRenderer.setup(horizontalRange: linesController.totalHorizontalRange, animated: animated) + barsController.mainBarsRenderer.setVisible(false, animated: animated) + barsController.previewBarsChartRenderer.setVisible(false, animated: animated) + + linesController.willAppear(animated: animated) + barsController.willDisappear(animated: animated) + + linesController.updateChartsVisibility(visibility: linesController.chartLines.map { _ in true }, animated: false) + } else { + if !linesController.chartsCollection.isBlank { + barsController.hideDetailsView(animated: false) + let visibleVerticalRange = BarChartRenderer.BarsData.verticalRange(bars: barsController.visibleBars, + calculatingRange: barsController.initialHorizontalRange) ?? BaseConstants.defaultRange + barsController.mainBarsRenderer.setup(verticalRange: visibleVerticalRange, animated: false) + + let toHorizontalRange = barsController.initialHorizontalRange + let destinationChartVerticalRange = lineProportionAnimationRange() + + linesController.setupMainChart(horizontalRange: toHorizontalRange, animated: animated) + linesController.mainLinesRenderer.setup(verticalRange: destinationChartVerticalRange, animated: animated) + linesController.previewLinesChartRenderer.setup(verticalRange: destinationChartVerticalRange, animated: animated) + linesController.previewLinesChartRenderer.setup(horizontalRange: barsController.totalHorizontalRange, animated: animated) + linesController.mainLinesRenderer.setVisible(false, animated: animated) + linesController.previewLinesChartRenderer.setVisible(false, animated: animated) + } + + barsController.willAppear(animated: animated) + linesController.willDisappear(animated: animated) + } + + self.setBackButtonVisibilityClosure?(isZoomed, animated) + self.refreshChartToolsClosure?(animated) + } + + override func updateChartsVisibility(visibility: [Bool], animated: Bool) { + if isZoomed { + linesController.updateChartsVisibility(visibility: visibility, animated: animated) + } else { + barsController.updateChartsVisibility(visibility: visibility, animated: animated) + } + } + + var visibleChartValues: [ChartsCollection.Chart] { + let visibility = isZoomed ? linesController.chartVisibility : barsController.chartVisibility + let collection = isZoomed ? linesController.chartsCollection : barsController.chartsCollection + let visibleCharts: [ChartsCollection.Chart] = visibility.enumerated().compactMap { args in + args.element ? collection.chartValues[args.offset] : nil + } + return visibleCharts + } + + override var actualChartVisibility: [Bool] { + return isZoomed ? linesController.chartVisibility : barsController.chartVisibility + } + + override var actualChartsCollection: ChartsCollection { + return isZoomed ? linesController.chartsCollection : barsController.chartsCollection + } + + override func chartInteractionDidBegin(point: CGPoint) { + if isZoomed { + linesController.chartInteractionDidBegin(point: point) + } else { + barsController.chartInteractionDidBegin(point: point) + } + } + + override func chartInteractionDidEnd() { + if isZoomed { + linesController.chartInteractionDidEnd() + } else { + barsController.chartInteractionDidEnd() + } + } + + override var currentChartHorizontalRangeFraction: ClosedRange { + if isZoomed { + return linesController.currentChartHorizontalRangeFraction + } else { + return barsController.currentChartHorizontalRangeFraction + } + } + + override func cancelChartInteraction() { + if isZoomed { + return linesController.hideDetailsView(animated: true) + } else { + return barsController.hideDetailsView(animated: true) + } + } + + override func didTapZoomIn(date: Date) { + guard isZoomed == false else { return } + if isZoomed { + return linesController.hideDetailsView(animated: true) + } + self.getDetailsData?(date, { updatedCollection in + if let updatedCollection = updatedCollection { + self.linesController.initialize(chartsCollection: updatedCollection, + initialDate: date, + totalHorizontalRange: 0...1, + totalVerticalRange: 0...1) + self.switchToChart(chartsCollection: updatedCollection, isZoomed: true, animated: true) + } + }) + } + + func lineProportionAnimationRange() -> ClosedRange { + let visibleLines = self.barsController.chartVisibility.enumerated().compactMap { $0.element ? self.linesController.chartLines[$0.offset] : nil } + let linesRange = LinesChartRenderer.LineData.verticalRange(lines: visibleLines) ?? BaseConstants.defaultRange + let barsRange = BarChartRenderer.BarsData.verticalRange(bars: self.barsController.visibleBars, + calculatingRange: self.linesController.totalHorizontalRange) ?? BaseConstants.defaultRange + let range = 0...(linesRange.upperBound / barsRange.distance * self.barsController.currentVerticalMainChartRange.distance) + return range + } + + override func didTapZoomOut() { + cancelChartInteraction() + switchToChart(chartsCollection: barsController.chartsCollection, isZoomed: false, animated: true) + } + + override func updateChartRange(_ rangeFraction: ClosedRange) { + if isZoomed { + return linesController.chartRangeFractionDidUpdated(rangeFraction) + } else { + return barsController.chartRangeFractionDidUpdated(rangeFraction) + } + } + + override func apply(colorMode: ColorMode, animated: Bool) { + super.apply(colorMode: colorMode, animated: animated) + + linesController.apply(colorMode: colorMode, animated: animated) + barsController.apply(colorMode: colorMode, animated: animated) + } + + override var drawChartVisibity: Bool { + return isZoomed + } +} + +//TODO: Убрать Performance полоŃки ŃĐ˛ĐµŃ€Đ·Ń Ń‡Đ°Ń€Ń‚ĐľĐ˛ (Не забыть) +//TODO: Добавить ховеры на кнопки diff --git a/submodules/Charts/Sources/Charts/Controllers/Stacked Bars/LinesComponentController.swift b/submodules/Charts/Sources/Charts/Controllers/Stacked Bars/LinesComponentController.swift new file mode 100644 index 0000000000..fc39a5f4c6 --- /dev/null +++ b/submodules/Charts/Sources/Charts/Controllers/Stacked Bars/LinesComponentController.swift @@ -0,0 +1,210 @@ +// +// LinesComponentController.swift +// GraphTest +// +// Created by Andrei Salavei on 4/14/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +class LinesComponentController: GeneralChartComponentController { + let mainLinesRenderer: LinesChartRenderer + let horizontalScalesRenderer: HorizontalScalesRenderer + let verticalScalesRenderer: VerticalScalesRenderer + let verticalLineRenderer: VerticalLinesRenderer + let lineBulletsRenerer: LineBulletsRenerer + + let previewLinesChartRenderer: LinesChartRenderer + + private let zoomedLinesRenderer = LinesChartRenderer() + private let zoomedPreviewLinesRenderer = LinesChartRenderer() + + private let userLinesTransitionAnimation: Bool + + private(set) var chartLines: [LinesChartRenderer.LineData] = [] + + init(isZoomed: Bool, + userLinesTransitionAnimation: Bool, + mainLinesRenderer: LinesChartRenderer, + horizontalScalesRenderer: HorizontalScalesRenderer, + verticalScalesRenderer: VerticalScalesRenderer, + verticalLineRenderer: VerticalLinesRenderer, + lineBulletsRenerer: LineBulletsRenerer, + previewLinesChartRenderer: LinesChartRenderer) { + self.mainLinesRenderer = mainLinesRenderer + self.horizontalScalesRenderer = horizontalScalesRenderer + self.verticalScalesRenderer = verticalScalesRenderer + self.verticalLineRenderer = verticalLineRenderer + self.lineBulletsRenerer = lineBulletsRenerer + self.previewLinesChartRenderer = previewLinesChartRenderer + self.userLinesTransitionAnimation = userLinesTransitionAnimation + + super.init(isZoomed: isZoomed) + + self.mainLinesRenderer.lineWidth = BaseConstants.mainChartLineWidth + self.mainLinesRenderer.optimizationLevel = BaseConstants.linesChartOptimizationLevel + self.previewLinesChartRenderer.lineWidth = BaseConstants.previewChartLineWidth + self.previewLinesChartRenderer.optimizationLevel = BaseConstants.previewLinesChartOptimizationLevel + + self.lineBulletsRenerer.isEnabled = false + } + + override func initialize(chartsCollection: ChartsCollection, + initialDate: Date, + totalHorizontalRange _: ClosedRange, + totalVerticalRange _: ClosedRange) { + let (chartLines, totalHorizontalRange, totalVerticalRange) = LinesChartRenderer.LineData.initialComponents(chartsCollection: chartsCollection) + self.chartLines = chartLines + + self.lineBulletsRenerer.bullets = self.chartLines.map { LineBulletsRenerer.Bullet(coordinate: $0.points.first ?? .zero, + color: $0.color)} + + super.initialize(chartsCollection: chartsCollection, + initialDate: initialDate, + totalHorizontalRange: totalHorizontalRange, + totalVerticalRange: totalVerticalRange) + + self.mainLinesRenderer.setup(verticalRange: totalVerticalRange, animated: true) + } + + override func willAppear(animated: Bool) { + mainLinesRenderer.setLines(lines: self.chartLines, animated: animated && userLinesTransitionAnimation) + previewLinesChartRenderer.setLines(lines: self.chartLines, animated: animated && userLinesTransitionAnimation) + + previewLinesChartRenderer.setup(verticalRange: totalVerticalRange, animated: animated) + previewLinesChartRenderer.setup(horizontalRange: totalHorizontalRange, animated: animated) + + setupMainChart(verticalRange: initialVerticalRange, animated: animated) + setupMainChart(horizontalRange: initialHorizontalRange, animated: animated) + + updateChartVerticalRanges(horizontalRange: initialHorizontalRange, animated: animated) + + super.willAppear(animated: animated) + + updatePreviewRangeClosure?(currentChartHorizontalRangeFraction, animated) + setConponentsVisible(visible: true, animated: animated) + updateHorizontalLimitLabels(animated: animated, forceUpdate: true) + } + + override func chartRangeDidUpdated(_ updatedRange: ClosedRange) { + super.chartRangeDidUpdated(updatedRange) + if !isZoomed { + initialHorizontalRange = updatedRange + } + setupMainChart(horizontalRange: updatedRange, animated: false) + updateHorizontalLimitLabels(animated: true, forceUpdate: false) + updateChartVerticalRanges(horizontalRange: updatedRange, animated: true) + } + + func updateHorizontalLimitLabels(animated: Bool, forceUpdate: Bool) { + updateHorizontalLimitLabels(horizontalScalesRenderer: horizontalScalesRenderer, + horizontalRange: currentHorizontalMainChartRange, + scaleType: isZoomed ? .hour : .day, + forceUpdate: forceUpdate, + animated: animated) + } + + func prepareAppearanceAnimation(horizontalRnage: ClosedRange) { + setupMainChart(horizontalRange: horizontalRnage, animated: false) + setConponentsVisible(visible: false, animated: false) + } + + func setConponentsVisible(visible: Bool, animated: Bool) { + mainLinesRenderer.setVisible(visible, animated: animated) + horizontalScalesRenderer.setVisible(visible, animated: animated) + verticalScalesRenderer.setVisible(visible, animated: animated) + verticalLineRenderer.setVisible(visible, animated: animated) + previewLinesChartRenderer.setVisible(visible, animated: animated) + lineBulletsRenerer.setVisible(visible, animated: animated) + } + + func setupMainChart(horizontalRange: ClosedRange, animated: Bool) { + mainLinesRenderer.setup(horizontalRange: horizontalRange, animated: animated) + horizontalScalesRenderer.setup(horizontalRange: horizontalRange, animated: animated) + verticalScalesRenderer.setup(horizontalRange: horizontalRange, animated: animated) + verticalLineRenderer.setup(horizontalRange: horizontalRange, animated: animated) + lineBulletsRenerer.setup(horizontalRange: horizontalRange, animated: animated) + } + + var visibleLines: [LinesChartRenderer.LineData] { + return chartVisibility.enumerated().compactMap { $0.element ? chartLines[$0.offset] : nil } + } + + func updateChartVerticalRanges(horizontalRange: ClosedRange, animated: Bool) { + if let range = LinesChartRenderer.LineData.verticalRange(lines: visibleLines, + calculatingRange: horizontalRange, + addBounds: true) { + let (range, labels) = verticalLimitsLabels(verticalRange: range) + if verticalScalesRenderer.verticalRange.end != range { + verticalScalesRenderer.setup(verticalLimitsLabels: labels, animated: animated) + } + + setupMainChart(verticalRange: range, animated: animated) + verticalScalesRenderer.setVisible(true, animated: animated) + } else { + verticalScalesRenderer.setVisible(false, animated: animated) + } + + if let range = LinesChartRenderer.LineData.verticalRange(lines: visibleLines) { + previewLinesChartRenderer.setup(verticalRange: range, animated: animated) + } + } + + func setupMainChart(verticalRange: ClosedRange, animated: Bool) { + mainLinesRenderer.setup(verticalRange: verticalRange, animated: animated) + horizontalScalesRenderer.setup(verticalRange: verticalRange, animated: animated) + verticalScalesRenderer.setup(verticalRange: verticalRange, animated: animated) + verticalLineRenderer.setup(verticalRange: verticalRange, animated: animated) + lineBulletsRenerer.setup(verticalRange: verticalRange, animated: animated) + } + + override func updateChartsVisibility(visibility: [Bool], animated: Bool) { + super.updateChartsVisibility(visibility: visibility, animated: animated) + for (index, isVisible) in visibility.enumerated() { + mainLinesRenderer.setLineVisible(isVisible, at: index, animated: animated) + previewLinesChartRenderer.setLineVisible(isVisible, at: index, animated: animated) + lineBulletsRenerer.setLineVisible(isVisible, at: index, animated: animated) + } + updateChartVerticalRanges(horizontalRange: currentHorizontalMainChartRange, animated: true) + } + + override var currentMainRangeRenderer: BaseChartRenderer { + return mainLinesRenderer + } + + override var currentPreviewRangeRenderer: BaseChartRenderer { + return previewLinesChartRenderer + } + + override func showDetailsView(at chartPosition: CGFloat, detailsViewPosition: CGFloat, dataIndex: Int, date: Date, animted: Bool) { + super.showDetailsView(at: chartPosition, detailsViewPosition: detailsViewPosition, dataIndex: dataIndex, date: date, animted: animted) + verticalLineRenderer.values = [chartPosition] + verticalLineRenderer.isEnabled = true + + lineBulletsRenerer.isEnabled = true + lineBulletsRenerer.setVisible(true, animated: animted) + lineBulletsRenerer.bullets = chartLines.compactMap { chart in + return LineBulletsRenerer.Bullet(coordinate: chart.points[dataIndex], color: chart.color) + } + } + + override func hideDetailsView(animated: Bool) { + super.hideDetailsView(animated: animated) + + verticalLineRenderer.values = [] + verticalLineRenderer.isEnabled = false + lineBulletsRenerer.isEnabled = false + } + + override func apply(colorMode: ColorMode, animated: Bool) { + super.apply(colorMode: colorMode, animated: animated) + + horizontalScalesRenderer.labelsColor = colorMode.chartLabelsColor + verticalScalesRenderer.labelsColor = colorMode.chartLabelsColor + verticalScalesRenderer.axisXColor = colorMode.chartStrongLinesColor + verticalScalesRenderer.horizontalLinesColor = colorMode.chartHelperLinesColor + lineBulletsRenerer.setInnerColor(colorMode.chartBackgroundColor, animated: animated) + verticalLineRenderer.linesColor = colorMode.chartStrongLinesColor + } +} diff --git a/submodules/Charts/Sources/Charts/Controllers/Stacked Bars/StackedBarsChartController.swift b/submodules/Charts/Sources/Charts/Controllers/Stacked Bars/StackedBarsChartController.swift new file mode 100644 index 0000000000..ab836d00d2 --- /dev/null +++ b/submodules/Charts/Sources/Charts/Controllers/Stacked Bars/StackedBarsChartController.swift @@ -0,0 +1,243 @@ +// +// StackedBarsChartController.swift +// GraphTest +// +// Created by Andrei Salavei on 4/7/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +class StackedBarsChartController: BaseChartController { + let barsController: BarsComponentController + let zoomedBarsController: BarsComponentController + + override init(chartsCollection: ChartsCollection) { + let horizontalScalesRenderer = HorizontalScalesRenderer() + let verticalScalesRenderer = VerticalScalesRenderer() + barsController = BarsComponentController(isZoomed: false, + mainBarsRenderer: BarChartRenderer(), + horizontalScalesRenderer: horizontalScalesRenderer, + verticalScalesRenderer: verticalScalesRenderer, + previewBarsChartRenderer: BarChartRenderer()) + zoomedBarsController = BarsComponentController(isZoomed: true, + mainBarsRenderer: BarChartRenderer(), + horizontalScalesRenderer: horizontalScalesRenderer, + verticalScalesRenderer: verticalScalesRenderer, + previewBarsChartRenderer: BarChartRenderer()) + + super.init(chartsCollection: chartsCollection) + + [barsController, zoomedBarsController].forEach { controller in + controller.chartFrame = { [unowned self] in self.chartFrame() } + controller.cartViewBounds = { [unowned self] in self.cartViewBounds() } + controller.zoomInOnDateClosure = { [unowned self] date in + self.didTapZoomIn(date: date) + } + controller.setChartTitleClosure = { [unowned self] (title, animated) in + self.setChartTitleClosure?(title, animated) + } + controller.setDetailsViewPositionClosure = { [unowned self] (position) in + self.setDetailsViewPositionClosure?(position) + } + controller.setDetailsChartVisibleClosure = { [unowned self] (visible, animated) in + self.setDetailsChartVisibleClosure?(visible, animated) + } + controller.setDetailsViewModel = { [unowned self] (viewModel, animated) in + self.setDetailsViewModel?(viewModel, animated) + } + controller.updatePreviewRangeClosure = { [unowned self] (fraction, animated) in + self.chartRangeUpdatedClosure?(fraction, animated) + } + controller.chartRangePagingClosure = { [unowned self] (isEnabled, pageSize) in + self.setChartRangePagingEnabled(isEnabled: isEnabled, minimumSelectionSize: pageSize) + } + } + } + + override var mainChartRenderers: [ChartViewRenderer] { + return [barsController.mainBarsRenderer, + zoomedBarsController.mainBarsRenderer, + barsController.horizontalScalesRenderer, + barsController.verticalScalesRenderer, +// performanceRenderer + ] + } + + override var navigationRenderers: [ChartViewRenderer] { + return [barsController.previewBarsChartRenderer, + zoomedBarsController.previewBarsChartRenderer] + } + + override func initializeChart() { + barsController.initialize(chartsCollection: initialChartsCollection, + initialDate: Date(), + totalHorizontalRange: BaseConstants.defaultRange, + totalVerticalRange: BaseConstants.defaultRange) + switchToChart(chartsCollection: barsController.chartsCollection, isZoomed: false, animated: false) + } + + func switchToChart(chartsCollection: ChartsCollection, isZoomed: Bool, animated: Bool) { + if animated { + TimeInterval.setDefaultSuration(.expandAnimationDuration) + DispatchQueue.main.asyncAfter(deadline: .now() + .expandAnimationDuration) { + TimeInterval.setDefaultSuration(.osXDuration) + } + } + + super.isZoomed = isZoomed + if isZoomed { + let toHorizontalRange = zoomedBarsController.initialHorizontalRange + let destinationHorizontalRange = (toHorizontalRange.lowerBound - barsController.barsWidth)...(toHorizontalRange.upperBound - barsController.barsWidth) + let verticalVisibleRange = barsController.currentVerticalMainChartRange + let initialVerticalRange = verticalVisibleRange.lowerBound...(verticalVisibleRange.upperBound + verticalVisibleRange.distance * 10) + + zoomedBarsController.mainBarsRenderer.setup(horizontalRange: barsController.currentHorizontalMainChartRange, animated: false) + zoomedBarsController.previewBarsChartRenderer.setup(horizontalRange: barsController.currentPreviewHorizontalRange, animated: false) + zoomedBarsController.mainBarsRenderer.setup(verticalRange: initialVerticalRange, animated: false) + zoomedBarsController.previewBarsChartRenderer.setup(verticalRange: initialVerticalRange, animated: false) + zoomedBarsController.mainBarsRenderer.setVisible(true, animated: false) + zoomedBarsController.previewBarsChartRenderer.setVisible(true, animated: false) + + barsController.setupMainChart(horizontalRange: destinationHorizontalRange, animated: animated) + barsController.previewBarsChartRenderer.setup(horizontalRange: zoomedBarsController.totalHorizontalRange, animated: animated) + barsController.mainBarsRenderer.setVisible(false, animated: animated) + barsController.previewBarsChartRenderer.setVisible(false, animated: animated) + + zoomedBarsController.willAppear(animated: animated) + barsController.willDisappear(animated: animated) + + zoomedBarsController.updateChartsVisibility(visibility: barsController.chartVisibility, animated: false) + zoomedBarsController.mainBarsRenderer.setup(verticalRange: zoomedBarsController.currentVerticalMainChartRange, animated: animated, timeFunction: .easeOut) + zoomedBarsController.previewBarsChartRenderer.setup(verticalRange: zoomedBarsController.currentPreviewVerticalRange, animated: animated, timeFunction: .easeOut) + } else { + if !zoomedBarsController.chartsCollection.isBlank { + barsController.hideDetailsView(animated: false) + barsController.chartVisibility = zoomedBarsController.chartVisibility + let visibleVerticalRange = BarChartRenderer.BarsData.verticalRange(bars: barsController.visibleBars, + calculatingRange: barsController.initialHorizontalRange) ?? BaseConstants.defaultRange + barsController.mainBarsRenderer.setup(verticalRange: visibleVerticalRange, animated: false) + + let toHorizontalRange = barsController.initialHorizontalRange + + let verticalVisibleRange = barsController.initialVerticalRange + let targetVerticalRange = verticalVisibleRange.lowerBound...(verticalVisibleRange.upperBound + verticalVisibleRange.distance * 10) + + zoomedBarsController.setupMainChart(horizontalRange: toHorizontalRange, animated: animated) + zoomedBarsController.mainBarsRenderer.setup(verticalRange: targetVerticalRange, animated: animated, timeFunction: .easeIn) + zoomedBarsController.previewBarsChartRenderer.setup(verticalRange: targetVerticalRange, animated: animated, timeFunction: .easeIn) + zoomedBarsController.previewBarsChartRenderer.setup(horizontalRange: barsController.totalHorizontalRange, animated: animated) + DispatchQueue.main.asyncAfter(deadline: .now() + .defaultDuration) { [weak self] in + self?.zoomedBarsController.mainBarsRenderer.setVisible(false, animated: false) + self?.zoomedBarsController.previewBarsChartRenderer.setVisible(false, animated: false) + } + } + + barsController.willAppear(animated: animated) + zoomedBarsController.willDisappear(animated: animated) + + if !zoomedBarsController.chartsCollection.isBlank { + barsController.updateChartsVisibility(visibility: zoomedBarsController.chartVisibility, animated: false) + } + } + + self.setBackButtonVisibilityClosure?(isZoomed, animated) + } + + override func updateChartsVisibility(visibility: [Bool], animated: Bool) { + if isZoomed { + zoomedBarsController.updateChartsVisibility(visibility: visibility, animated: animated) + } else { + barsController.updateChartsVisibility(visibility: visibility, animated: animated) + } + } + + var visibleChartValues: [ChartsCollection.Chart] { + let visibility = isZoomed ? zoomedBarsController.chartVisibility : barsController.chartVisibility + let collection = isZoomed ? zoomedBarsController.chartsCollection : barsController.chartsCollection + let visibleCharts: [ChartsCollection.Chart] = visibility.enumerated().compactMap { args in + args.element ? collection.chartValues[args.offset] : nil + } + return visibleCharts + } + + override var actualChartVisibility: [Bool] { + return isZoomed ? zoomedBarsController.chartVisibility : barsController.chartVisibility + } + + override var actualChartsCollection: ChartsCollection { + return isZoomed ? zoomedBarsController.chartsCollection : barsController.chartsCollection + } + + override func chartInteractionDidBegin(point: CGPoint) { + if isZoomed { + zoomedBarsController.chartInteractionDidBegin(point: point) + } else { + barsController.chartInteractionDidBegin(point: point) + } + } + + override func chartInteractionDidEnd() { + if isZoomed { + zoomedBarsController.chartInteractionDidEnd() + } else { + barsController.chartInteractionDidEnd() + } + } + + override var drawChartVisibity: Bool { + return true + } + + override var currentChartHorizontalRangeFraction: ClosedRange { + if isZoomed { + return zoomedBarsController.currentChartHorizontalRangeFraction + } else { + return barsController.currentChartHorizontalRangeFraction + } + } + + override func cancelChartInteraction() { + if isZoomed { + return zoomedBarsController.hideDetailsView(animated: true) + } else { + return barsController.hideDetailsView(animated: true) + } + } + + override func didTapZoomIn(date: Date) { + guard isZoomed == false else { return } + if isZoomed { + return zoomedBarsController.hideDetailsView(animated: true) + } + self.getDetailsData?(date, { updatedCollection in + if let updatedCollection = updatedCollection { + self.zoomedBarsController.initialize(chartsCollection: updatedCollection, + initialDate: date, + totalHorizontalRange: 0...1, + totalVerticalRange: 0...1) + self.switchToChart(chartsCollection: updatedCollection, isZoomed: true, animated: true) + } + }) + } + + override func didTapZoomOut() { + cancelChartInteraction() + switchToChart(chartsCollection: barsController.chartsCollection, isZoomed: false, animated: true) + } + + override func updateChartRange(_ rangeFraction: ClosedRange) { + if isZoomed { + return zoomedBarsController.chartRangeFractionDidUpdated(rangeFraction) + } else { + return barsController.chartRangeFractionDidUpdated(rangeFraction) + } + } + + override func apply(colorMode: ColorMode, animated: Bool) { + super.apply(colorMode: colorMode, animated: animated) + + zoomedBarsController.apply(colorMode: colorMode, animated: animated) + barsController.apply(colorMode: colorMode, animated: animated) + } +} diff --git a/submodules/Charts/Sources/Charts/Renderes/BarChartRenderer.swift b/submodules/Charts/Sources/Charts/Renderes/BarChartRenderer.swift new file mode 100644 index 0000000000..73a6b52f42 --- /dev/null +++ b/submodules/Charts/Sources/Charts/Renderes/BarChartRenderer.swift @@ -0,0 +1,293 @@ +// +// BarChartRenderer.swift +// GraphTest +// +// Created by Andrei Salavei on 4/7/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +class BarChartRenderer: BaseChartRenderer { + struct BarsData { + static let blank = BarsData(barWidth: 1, locations: [], components: []) + var barWidth: CGFloat + var locations: [CGFloat] + var components: [Component] + + struct Component { + var color: UIColor + var values: [CGFloat] + } + } + + var fillToTop: Bool = false + private(set) lazy var selectedIndexAnimator: AnimationController = { + return AnimationController(current: 0, refreshClosure: self.refreshClosure) + }() + func setSelectedIndex(_ index: Int?, animated: Bool) { + let destinationValue: CGFloat = (index == nil) ? 0 : 1 + if animated { + if index != nil { + selectedBarIndex = index + } + self.selectedIndexAnimator.completionClosure = { + self.selectedBarIndex = index + } + guard self.selectedIndexAnimator.end != destinationValue else { return } + self.selectedIndexAnimator.animate(to: destinationValue, duration: .defaultDuration) + } else { + self.selectedIndexAnimator.set(current: destinationValue) + self.selectedBarIndex = index + } + } + + private var selectedBarIndex: Int? { + didSet { + setNeedsDisplay() + } + } + var generalUnselectedAlpha: CGFloat = 0.5 + + private var componentsAnimators: [AnimationController] = [] + var bars: BarsData = BarsData(barWidth: 1, locations: [], components: []) { + willSet { + if bars.components.count != newValue.components.count { + componentsAnimators = newValue.components.map { _ in AnimationController(current: 1, refreshClosure: self.refreshClosure) } + } + } + didSet { + setNeedsDisplay() + } + } + + func setComponentVisible(_ isVisible: Bool, at index: Int, animated: Bool) { + componentsAnimators[index].animate(to: isVisible ? 1 : 0, duration: animated ? .defaultDuration : 0) + } + + private lazy var backgroundColorAnimator = AnimationController(current: UIColorContainer(color: .white), refreshClosure: refreshClosure) + func update(backgroundColor: UIColor, animated: Bool) { + if animated { + backgroundColorAnimator.animate(to: UIColorContainer(color: backgroundColor), duration: .defaultDuration) + } else { + backgroundColorAnimator.set(current: UIColorContainer(color: backgroundColor)) + } + } + + override func render(context: CGContext, bounds: CGRect, chartFrame: CGRect) { + guard isEnabled && verticalRange.current.distance > 0 && verticalRange.current.distance > 0 else { return } + let chartsAlpha = chartAlphaAnimator.current + if chartsAlpha == 0 { return } + + let range = renderRange(bounds: bounds, chartFrame: chartFrame) + + var selectedPaths: [[CGRect]] = bars.components.map { _ in [] } + var unselectedPaths: [[CGRect]] = bars.components.map { _ in [] } + + if var barIndex = bars.locations.firstIndex(where: { $0 >= range.lowerBound }) { + if fillToTop { + barIndex = max(0, barIndex - 1) + + while barIndex < bars.locations.count { + let currentLocation = bars.locations[barIndex] + let right = transform(toChartCoordinateHorizontal: currentLocation, chartFrame: chartFrame).roundedUpToPixelGrid() + let left = transform(toChartCoordinateHorizontal: currentLocation - bars.barWidth, chartFrame: chartFrame).roundedUpToPixelGrid() + + var summ: CGFloat = 0 + for (index, component) in bars.components.enumerated() { + summ += componentsAnimators[index].current * component.values[barIndex] + } + guard summ > 0 else { + barIndex += 1 + continue + } + + var stackedValue: CGFloat = 0 + for (index, component) in bars.components.enumerated() { + let visibilityPercent = componentsAnimators[index].current + if visibilityPercent == 0 { continue } + + let bottomFraction = stackedValue + let topFraction = stackedValue + ((component.values[barIndex] * visibilityPercent) / summ) + + let rect = CGRect(x: left, + y: chartFrame.maxY - chartFrame.height * topFraction, + width: right - left, + height: chartFrame.height * (topFraction - bottomFraction)) + if selectedBarIndex == barIndex { + selectedPaths[index].append(rect) + } else { + unselectedPaths[index].append(rect) + } + stackedValue = topFraction + } + if currentLocation > range.upperBound { + break + } + barIndex += 1 + } + + for (index, component) in bars.components.enumerated() { + context.saveGState() + context.setFillColor(component.color.withAlphaComponent(chartsAlpha * component.color.alphaValue).cgColor) + context.fill(selectedPaths[index]) + let resultAlpha: CGFloat = 1.0 - (1.0 - generalUnselectedAlpha) * selectedIndexAnimator.current + context.setFillColor(component.color.withAlphaComponent(chartsAlpha * component.color.alphaValue * resultAlpha).cgColor) + context.fill(unselectedPaths[index]) + context.restoreGState() + } + } else { + var selectedPaths: [[CGRect]] = bars.components.map { _ in [] } + barIndex = max(0, barIndex - 1) + + var currentLocation = bars.locations[barIndex] + var leftX = transform(toChartCoordinateHorizontal: currentLocation - bars.barWidth, chartFrame: chartFrame) + var rightX: CGFloat = 0 + + let startPoint = CGPoint(x: leftX, + y: transform(toChartCoordinateVertical: verticalRange.current.lowerBound, chartFrame: chartFrame)) + + var backgourndPaths: [[CGPoint]] = bars.components.map { _ in Array() } + let itemsCount = ((bars.locations.count - barIndex) * 2) + 4 + for path in backgourndPaths.indices { + backgourndPaths[path].reserveCapacity(itemsCount) + backgourndPaths[path].append(startPoint) + } + var maxValues: [CGFloat] = bars.components.map { _ in 0 } + while barIndex < bars.locations.count { + currentLocation = bars.locations[barIndex] + rightX = transform(toChartCoordinateHorizontal: currentLocation, chartFrame: chartFrame) + + var stackedValue: CGFloat = 0 + var bottomY: CGFloat = transform(toChartCoordinateVertical: stackedValue, chartFrame: chartFrame) + for (index, component) in bars.components.enumerated() { + let visibilityPercent = componentsAnimators[index].current + if visibilityPercent == 0 { continue } + + let height = component.values[barIndex] * visibilityPercent + stackedValue += height + let topY = transform(toChartCoordinateVertical: stackedValue, chartFrame: chartFrame) + let componentHeight = (bottomY - topY) + maxValues[index] = max(maxValues[index], componentHeight) + if selectedBarIndex == barIndex { + let rect = CGRect(x: leftX, + y: topY, + width: rightX - leftX, + height: componentHeight) + selectedPaths[index].append(rect) + } + backgourndPaths[index].append(CGPoint(x: leftX, y: topY)) + backgourndPaths[index].append(CGPoint(x: rightX, y: topY)) + bottomY = topY + } + if currentLocation > range.upperBound { + break + } + leftX = rightX + barIndex += 1 + } + + let endPoint = CGPoint(x: transform(toChartCoordinateHorizontal: currentLocation, chartFrame: chartFrame).roundedUpToPixelGrid(), + y: transform(toChartCoordinateVertical: verticalRange.current.lowerBound, chartFrame: chartFrame)) + let colorOffset = Double((1.0 - (1.0 - generalUnselectedAlpha) * selectedIndexAnimator.current) * chartsAlpha) + + for (index, component) in bars.components.enumerated().reversed() { + if maxValues[index] < optimizationLevel { + continue + } + context.saveGState() + backgourndPaths[index].append(endPoint) + + context.setFillColor(UIColor.valueBetween(start: backgroundColorAnimator.current.color, + end: component.color, + offset: colorOffset).cgColor) + context.beginPath() + context.addLines(between: backgourndPaths[index]) + context.closePath() + context.fillPath() + context.restoreGState() + } + + for (index, component) in bars.components.enumerated().reversed() { + context.setFillColor(component.color.withAlphaComponent(chartsAlpha * component.color.alphaValue).cgColor) + context.fill(selectedPaths[index]) + } + } + } + } +} + +extension BarChartRenderer.BarsData { + static func initialComponents(chartsCollection: ChartsCollection) -> + (width: CGFloat, + chartBars: BarChartRenderer.BarsData, + totalHorizontalRange: ClosedRange, + totalVerticalRange: ClosedRange) { + let width: CGFloat + if chartsCollection.axisValues.count > 1 { + width = CGFloat(abs(chartsCollection.axisValues[1].timeIntervalSince1970 - chartsCollection.axisValues[0].timeIntervalSince1970)) + } else { + width = 1 + } + let components = chartsCollection.chartValues.map { BarChartRenderer.BarsData.Component(color: $0.color, + values: $0.values.map { CGFloat($0) }) } + let chartBars = BarChartRenderer.BarsData(barWidth: width, + locations: chartsCollection.axisValues.map { CGFloat($0.timeIntervalSince1970) }, + components: components) + + + + let totalVerticalRange = BarChartRenderer.BarsData.verticalRange(bars: chartBars) ?? 0...1 + let totalHorizontalRange = BarChartRenderer.BarsData.visibleHorizontalRange(bars: chartBars, width: width) ?? 0...1 + return (width: width, chartBars: chartBars, totalHorizontalRange: totalHorizontalRange, totalVerticalRange: totalVerticalRange) + } + + static func visibleHorizontalRange(bars: BarChartRenderer.BarsData, width: CGFloat) -> ClosedRange? { + guard let firstPoint = bars.locations.first, + let lastPoint = bars.locations.last, + firstPoint <= lastPoint else { + return nil + } + + return (firstPoint - width)...lastPoint + } + + static func verticalRange(bars: BarChartRenderer.BarsData, calculatingRange: ClosedRange? = nil, addBounds: Bool = false) -> ClosedRange? { + guard bars.components.count > 0 else { + return nil + } + if let calculatingRange = calculatingRange { + guard var index = bars.locations.firstIndex(where: { $0 >= calculatingRange.lowerBound && $0 <= calculatingRange.upperBound }) else { + return nil + } + + var vMax: CGFloat = bars.components[0].values[index] + while index < bars.locations.count { + var summ: CGFloat = 0 + for component in bars.components { + summ += component.values[index] + } + vMax = max(vMax, summ) + + if bars.locations[index] > calculatingRange.upperBound { + break + } + index += 1 + } + return 0...vMax + } else { + var index = 0 + + var vMax: CGFloat = bars.components[0].values[index] + while index < bars.locations.count { + var summ: CGFloat = 0 + for component in bars.components { + summ += component.values[index] + } + vMax = max(vMax, summ) + index += 1 + } + return 0...vMax + } + } +} diff --git a/submodules/Charts/Sources/Charts/Renderes/BaseChartRenderer.swift b/submodules/Charts/Sources/Charts/Renderes/BaseChartRenderer.swift new file mode 100644 index 0000000000..63627566e7 --- /dev/null +++ b/submodules/Charts/Sources/Charts/Renderes/BaseChartRenderer.swift @@ -0,0 +1,116 @@ +// +// BaseChartRenderer.swift +// GraphTest +// +// Created by Andrei Salavei on 4/7/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +private let exponentialAnimationTrashold: CGFloat = 100 + +class BaseChartRenderer: ChartViewRenderer { + var containerViews: [UIView] = [] + + var optimizationLevel: CGFloat = 1 { + didSet { + setNeedsDisplay() + } + } + var isEnabled: Bool = true { + didSet { + setNeedsDisplay() + } + } + + private(set) lazy var chartAlphaAnimator: AnimationController = { + return AnimationController(current: 1, refreshClosure: self.refreshClosure) + }() + func setVisible(_ visible: Bool, animated: Bool) { + let destinationValue: CGFloat = visible ? 1 : 0 + guard self.chartAlphaAnimator.end != destinationValue else { return } + if animated { + self.chartAlphaAnimator.animate(to: destinationValue, duration: .defaultDuration) + } else { + self.chartAlphaAnimator.set(current: destinationValue) + } + } + + lazy var horizontalRange = AnimationController>(current: 0...1, refreshClosure: refreshClosure) + lazy var verticalRange = AnimationController>(current: 0...1, refreshClosure: refreshClosure) + + func setup(verticalRange: ClosedRange, animated: Bool, timeFunction: TimeFunction? = nil) { + guard self.verticalRange.end != verticalRange else { + self.verticalRange.timeFunction = timeFunction ?? .linear + return + } + if animated { + let function: TimeFunction + if let timeFunction = timeFunction { + function = timeFunction + } else if self.verticalRange.current.distance > 0 && verticalRange.distance > 0 { + if self.verticalRange.current.distance / verticalRange.distance > exponentialAnimationTrashold { + function = .easeIn + } else if verticalRange.distance / self.verticalRange.current.distance > exponentialAnimationTrashold { + function = .easeOut + } else { + function = .linear + } + } else { + function = .linear + } + + self.verticalRange.animate(to: verticalRange, duration: .defaultDuration, timeFunction: function) + } else { + self.verticalRange.set(current: verticalRange) + } + } + + func setup(horizontalRange: ClosedRange, animated: Bool) { + guard self.horizontalRange.end != horizontalRange else { return } + if animated { + let animationCurve: TimeFunction = self.horizontalRange.current.distance > horizontalRange.distance ? .easeOut : .easeIn + self.horizontalRange.animate(to: horizontalRange, duration: .defaultDuration, timeFunction: animationCurve) + } else { + self.horizontalRange.set(current: horizontalRange) + } + } + + func transform(toChartCoordinateHorizontal x: CGFloat, chartFrame: CGRect) -> CGFloat { + return chartFrame.origin.x + (x - horizontalRange.current.lowerBound) / horizontalRange.current.distance * chartFrame.width + } + + func transform(toChartCoordinateVertical y: CGFloat, chartFrame: CGRect) -> CGFloat { + return chartFrame.height + chartFrame.origin.y - (y - verticalRange.current.lowerBound) / verticalRange.current.distance * chartFrame.height + } + + func transform(toChartCoordinate point: CGPoint, chartFrame: CGRect) -> CGPoint { + return CGPoint(x: transform(toChartCoordinateHorizontal: point.x, chartFrame: chartFrame), + y: transform(toChartCoordinateVertical: point.y, chartFrame: chartFrame)) + } + + func renderRange(bounds: CGRect, chartFrame: CGRect) -> ClosedRange { + let lowerBound = horizontalRange.current.lowerBound - chartFrame.origin.x / chartFrame.width * horizontalRange.current.distance + let upperBound = horizontalRange.current.upperBound + (bounds.width - chartFrame.width - chartFrame.origin.x) / chartFrame.width * horizontalRange.current.distance + guard lowerBound <= upperBound else { + print("Error: Unexpecated bounds range!") + return 0...1 + } + return lowerBound...upperBound + } + + func render(context: CGContext, bounds: CGRect, chartFrame: CGRect) { + fatalError("abstract") + } + + func setNeedsDisplay() { + containerViews.forEach { $0.setNeedsDisplay() } + } + + var refreshClosure: () -> Void { + return { [weak self] in + self?.setNeedsDisplay() + } + } +} diff --git a/submodules/Charts/Sources/Charts/Renderes/ChartDetailsRenderer.swift b/submodules/Charts/Sources/Charts/Renderes/ChartDetailsRenderer.swift new file mode 100644 index 0000000000..ad61ff5dd9 --- /dev/null +++ b/submodules/Charts/Sources/Charts/Renderes/ChartDetailsRenderer.swift @@ -0,0 +1,147 @@ +// +// ChartDetailsRenderer.swift +// GraphTest +// +// Created by Andrei Salavei on 4/13/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +class ChartDetailsRenderer: BaseChartRenderer, ColorModeContainer { + private lazy var colorAnimator = AnimationController(current: 1, refreshClosure: refreshClosure) + private var fromColorMode: ColorMode = .day + private var currentColorMode: ColorMode = .day + func apply(colorMode: ColorMode, animated: Bool) { + if currentColorMode != colorMode { + fromColorMode = currentColorMode + currentColorMode = colorMode + if animated { + colorAnimator.set(current: 0) + colorAnimator.animate(to: 1, duration: .defaultDuration) + } else { + colorAnimator.set(current: 1) + } + } + } + + private var valuesAnimators: [AnimationController] = [] + func setValueVisible(_ isVisible: Bool, at index: Int, animated: Bool) { + valuesAnimators[index].animate(to: isVisible ? 1 : 0, duration: animated ? .defaultDuration : 0) + } + var detailsViewModel: ChartDetailsViewModel = .blank { + didSet { + if detailsViewModel.values.count != valuesAnimators.count { + valuesAnimators = detailsViewModel.values.map { _ in AnimationController(current: 1, refreshClosure: refreshClosure) } + } + setNeedsDisplay() + } + } + + var detailsViewPosition: CGFloat = 0 { + didSet { + setNeedsDisplay() + } + } + var detailViewPositionOffset: CGFloat = 10 + var detailViewTopOffset: CGFloat = 10 + private var iconWidth: CGFloat = 10 + private var margins: CGFloat = 10 + private let cornerRadius: CGFloat = 5 + private var rowHeight: CGFloat = 20 + private let titleFont = UIFont.systemFont(ofSize: 14, weight: .bold) + private let prefixFont = UIFont.systemFont(ofSize: 14, weight: .bold) + private let labelsFont = UIFont.systemFont(ofSize: 14, weight: .medium) + private let valuesFont = UIFont.systemFont(ofSize: 14, weight: .bold) + private let labelsColor: UIColor = .black + + private(set) var previousRenderBannerFrame: CGRect = .zero + override func render(context: CGContext, bounds: CGRect, chartFrame: CGRect) { + previousRenderBannerFrame = .zero + guard isEnabled && verticalRange.current.distance > 0 && verticalRange.current.distance > 0 else { return } + let generalAlpha = chartAlphaAnimator.current + if generalAlpha == 0 { return } + + let widths: [(prefix: CGFloat, label: CGFloat, value: CGFloat)] = detailsViewModel.values.map { value in + var prefixWidth: CGFloat = 0 + if let prefixText = value.prefix { + prefixWidth = (prefixText as NSString).boundingRect(with: bounds.size, + options: .usesLineFragmentOrigin, + attributes: [.font: prefixFont], + context: nil).width.rounded(.up) + margins + } + + let labelWidth = (value.title as NSString).boundingRect(with: bounds.size, + options: .usesLineFragmentOrigin, + attributes: [.font: labelsFont], + context: nil).width.rounded(.up) + margins + + let valueWidth = (value.value as NSString).boundingRect(with: bounds.size, + options: .usesLineFragmentOrigin, + attributes: [.font: valuesFont], + context: nil).width.rounded(.up) + return (prefixWidth, labelWidth, valueWidth) + } + + let titleWidth = (detailsViewModel.title as NSString).boundingRect(with: bounds.size, + options: .usesLineFragmentOrigin, + attributes: [.font: titleFont], + context: nil).width + let prefixesWidth = widths.map { $0.prefix }.max() ?? 0 + let labelsWidth = widths.map { $0.label }.max() ?? 0 + let valuesWidth = widths.map { $0.value }.max() ?? 0 + + let totalWidth: CGFloat = max(prefixesWidth + labelsWidth + valuesWidth, titleWidth + iconWidth) + margins * 2 + let totalHeight: CGFloat = CGFloat(detailsViewModel.values.count + 1) * rowHeight + margins * 2 + let backgroundColor = UIColor.valueBetween(start: fromColorMode.chartDetailsViewColor, + end: currentColorMode.chartDetailsViewColor, + offset: Double(colorAnimator.current)) + let titleAndTextColor = UIColor.valueBetween(start: fromColorMode.chartDetailsTextColor, + end: currentColorMode.chartDetailsTextColor, + offset: Double(colorAnimator.current)) + let detailsViewFrame: CGRect + if totalWidth + detailViewTopOffset > detailsViewPosition { + detailsViewFrame = CGRect(x: detailsViewPosition + detailViewTopOffset, + y: detailViewTopOffset + chartFrame.minY, + width: totalWidth, + height: totalHeight) + } else { + detailsViewFrame = CGRect(x: detailsViewPosition - totalWidth - detailViewTopOffset, + y: detailViewTopOffset + chartFrame.minY, + width: totalWidth, + height: totalHeight) + } + previousRenderBannerFrame = detailsViewFrame + context.saveGState() + context.setFillColor(backgroundColor.cgColor) + context.beginPath() + context.addPath(CGPath(roundedRect: detailsViewFrame, cornerWidth: 5, cornerHeight: 5, transform: nil)) + context.fillPath() + context.endPage() + context.restoreGState() + + var drawY = detailsViewFrame.minY + margins + (rowHeight - titleFont.pointSize) / 2 + (detailsViewModel.title as NSString).draw(at: CGPoint(x: detailsViewFrame.minX + margins, y: drawY), withAttributes: [.font: titleFont, + .foregroundColor: titleAndTextColor]) + drawY += rowHeight + + for (index, row) in widths.enumerated() { + let value = detailsViewModel.values[index] + if let prefixText = value.prefix { + (prefixText as NSString).draw(at: CGPoint(x: detailsViewFrame.minX + prefixesWidth - row.prefix, + y: drawY), + withAttributes: [.font: prefixText, .foregroundColor: titleAndTextColor]) + } + + (value.title as NSString).draw(at: CGPoint(x: detailsViewFrame.minX + prefixesWidth + margins, + y: drawY), + withAttributes: [.font: labelsFont, .foregroundColor: titleAndTextColor]) + + (value.value as NSString).draw(at: CGPoint(x: detailsViewFrame.minX + prefixesWidth + labelsWidth + valuesWidth - row.value + margins, + y: drawY), + withAttributes: [.font: labelsFont, .foregroundColor: value.color]) + + drawY += rowHeight + } + } +} diff --git a/submodules/Charts/Sources/Charts/Renderes/HorizontalScalesRenderer.swift b/submodules/Charts/Sources/Charts/Renderes/HorizontalScalesRenderer.swift new file mode 100644 index 0000000000..3ab90ef546 --- /dev/null +++ b/submodules/Charts/Sources/Charts/Renderes/HorizontalScalesRenderer.swift @@ -0,0 +1,99 @@ +// +// HorizontalScalesRenderer.swift +// GraphTest +// +// Created by Andrei Salavei on 4/8/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +class HorizontalScalesRenderer: BaseChartRenderer { + private var horizontalLabels: [LinesChartLabel] = [] + private var animatedHorizontalLabels: [AnimatedLinesChartLabels] = [] + + var labelsVerticalOffset: CGFloat = 8 + var labelsFont: UIFont = .systemFont(ofSize: 11) + var labelsColor: UIColor = .gray + + func setup(labels: [LinesChartLabel], animated: Bool) { + if animated { + var labelsToKeepVisible: [LinesChartLabel] = [] + let labelsToHide: [LinesChartLabel] + var labelsToShow: [LinesChartLabel] = [] + + for label in labels { + if horizontalLabels.contains(label) { + labelsToKeepVisible.append(label) + } else { + labelsToShow.append(label) + } + } + labelsToHide = horizontalLabels.filter { !labels.contains($0) } + animatedHorizontalLabels.removeAll() + horizontalLabels = labelsToKeepVisible + + let showAnimation = AnimatedLinesChartLabels(labels: labelsToShow, alphaAnimator: AnimationController(current: 1.0, refreshClosure: refreshClosure)) + showAnimation.isAppearing = true + showAnimation.alphaAnimator.set(current: 0) + showAnimation.alphaAnimator.animate(to: 1, duration: .defaultDuration) + showAnimation.alphaAnimator.completionClosure = { [weak self, weak showAnimation] in + guard let self = self, let showAnimation = showAnimation else { return } + self.animatedHorizontalLabels.removeAll(where: { $0 === showAnimation }) + self.horizontalLabels = labels + } + + let hideAnimation = AnimatedLinesChartLabels(labels: labelsToHide, alphaAnimator: AnimationController(current: 1.0, refreshClosure: refreshClosure)) + hideAnimation.isAppearing = false + hideAnimation.alphaAnimator.set(current: 1) + hideAnimation.alphaAnimator.animate(to: 0, duration: .defaultDuration) + hideAnimation.alphaAnimator.completionClosure = { [weak self, weak hideAnimation] in + guard let self = self, let hideAnimation = hideAnimation else { return } + self.animatedHorizontalLabels.removeAll(where: { $0 === hideAnimation }) + } + + animatedHorizontalLabels.append(showAnimation) + animatedHorizontalLabels.append(hideAnimation) + } else { + horizontalLabels = labels + animatedHorizontalLabels = [] + } + } + + override func render(context: CGContext, bounds: CGRect, chartFrame: CGRect) { + guard isEnabled && verticalRange.current.distance > 0 && verticalRange.current.distance > 0 else { return } + let itemsAlpha = chartAlphaAnimator.current + guard itemsAlpha > 0 else { return } + + let range = renderRange(bounds: bounds, chartFrame: chartFrame) + + func drawHorizontalLabels(_ labels: [LinesChartLabel], color: UIColor) { + let attributes: [NSAttributedString.Key : Any] = [.foregroundColor: color, + .font: labelsFont] + let y = chartFrame.origin.y + chartFrame.height + labelsVerticalOffset + + if let start = labels.firstIndex(where: { $0.value > range.lowerBound }) { + for index in start.. range.upperBound { + break + } + } + } + } + let labelColorAlpha = labelsColor.alphaValue * itemsAlpha + drawHorizontalLabels(horizontalLabels, color: labelsColor.withAlphaComponent(labelColorAlpha * itemsAlpha)) + for animation in animatedHorizontalLabels { + let color = labelsColor.withAlphaComponent(animation.alphaAnimator.current * labelColorAlpha) + drawHorizontalLabels(animation.labels, color: color) + } + } +} diff --git a/submodules/Charts/Sources/Charts/Renderes/LineBulletsRenerer.swift b/submodules/Charts/Sources/Charts/Renderes/LineBulletsRenerer.swift new file mode 100644 index 0000000000..e0417719d7 --- /dev/null +++ b/submodules/Charts/Sources/Charts/Renderes/LineBulletsRenerer.swift @@ -0,0 +1,67 @@ +// +// LineBulletsRenerer.swift +// GraphTest +// +// Created by Andrei Salavei on 4/8/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +class LineBulletsRenerer: BaseChartRenderer { + struct Bullet { + var coordinate: CGPoint + var color: UIColor + } + + var bullets: [Bullet] = [] { + willSet { + if alphaAnimators.count != newValue.count { + alphaAnimators = newValue.map { _ in AnimationController(current: 1.0, refreshClosure: refreshClosure) } + } + } + didSet { + setNeedsDisplay() + } + } + private var alphaAnimators: [AnimationController] = [] + + private lazy var innerColorAnimator = AnimationController(current: UIColorContainer(color: .white), refreshClosure: refreshClosure) + public func setInnerColor(_ color: UIColor, animated: Bool) { + if animated { + innerColorAnimator.animate(to: UIColorContainer(color: color), duration: .defaultDuration) + } else { + innerColorAnimator.set(current: UIColorContainer(color: color)) + } + } + + var linesWidth: CGFloat = 2 + var bulletRadius: CGFloat = 6 + + func setLineVisible(_ isVisible: Bool, at index: Int, animated: Bool) { + alphaAnimators[index].animate(to: isVisible ? 1 : 0, duration: animated ? .defaultDuration : 0) + } + + override func render(context: CGContext, bounds: CGRect, chartFrame: CGRect) { + guard isEnabled && verticalRange.current.distance > 0 && verticalRange.current.distance > 0 else { return } + let generalAlpha = chartAlphaAnimator.current + if generalAlpha == 0 { return } + + for (index, bullet) in bullets.enumerated() { + let alpha = alphaAnimators[index].current + if alpha == 0 { continue } + + let centerX = transform(toChartCoordinateHorizontal: bullet.coordinate.x, chartFrame: chartFrame) + let centerY = transform(toChartCoordinateVertical: bullet.coordinate.y, chartFrame: chartFrame) + context.setFillColor(innerColorAnimator.current.color.withAlphaComponent(alpha).cgColor) + context.setStrokeColor(bullet.color.withAlphaComponent(alpha).cgColor) + context.setLineWidth(linesWidth) + let rect = CGRect(x: centerX - bulletRadius / 2, + y: centerY - bulletRadius / 2, + width: bulletRadius, + height: bulletRadius) + context.fillEllipse(in: rect) + context.strokeEllipse(in: rect) + } + } +} diff --git a/submodules/Charts/Sources/Charts/Renderes/LinesChartRenderer.swift b/submodules/Charts/Sources/Charts/Renderes/LinesChartRenderer.swift new file mode 100644 index 0000000000..fe3cdd47ab --- /dev/null +++ b/submodules/Charts/Sources/Charts/Renderes/LinesChartRenderer.swift @@ -0,0 +1,538 @@ +// +// LinesChartRenderer.swift +// GraphTest +// +// Created by Andrei Salavei on 4/7/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +class LinesChartRenderer: BaseChartRenderer { + struct LineData { + var color: UIColor + var points: [CGPoint] + } + + private var linesAlphaAnimators: [AnimationController] = [] + + var lineWidth: CGFloat = 1 { + didSet { + setNeedsDisplay() + } + } + private lazy var linesShapeAnimator = AnimationController(current: 1, refreshClosure: self.refreshClosure) + private var fromLines: [LineData] = [] + private var toLines: [LineData] = [] + + func setLines(lines: [LineData], animated: Bool) { + if toLines.count != lines.count { + linesAlphaAnimators = lines.map { _ in AnimationController(current: 1, refreshClosure: self.refreshClosure) } + } + if animated { + self.fromLines = self.toLines + self.toLines = lines + linesShapeAnimator.set(current: 1.0 - linesShapeAnimator.current) + linesShapeAnimator.completionClosure = { + self.fromLines = [] + } + linesShapeAnimator.animate(to: 1, duration: .defaultDuration) + } else { + self.fromLines = [] + self.toLines = lines + linesShapeAnimator.set(current: 1) + } + } + + func setLineVisible(_ isVisible: Bool, at index: Int, animated: Bool) { + linesAlphaAnimators[index].animate(to: isVisible ? 1 : 0, duration: animated ? .defaultDuration : 0) + } + + override func render(context: CGContext, bounds: CGRect, chartFrame: CGRect) { + guard isEnabled && verticalRange.current.distance > 0 && verticalRange.current.distance > 0 else { return } + let chartsAlpha = chartAlphaAnimator.current + if chartsAlpha == 0 { return } + let range = renderRange(bounds: bounds, chartFrame: chartFrame) + + for (index, toLine) in toLines.enumerated() { + let alpha = linesAlphaAnimators[index].current * chartsAlpha + if alpha == 0 { continue } + context.setStrokeColor(toLine.color.withAlphaComponent(alpha).cgColor) + context.setLineWidth(lineWidth) + + if linesShapeAnimator.isAnimating { + let animationOffset = linesShapeAnimator.current + + let path = CGMutablePath() + let fromPoints = fromLines.safeElement(at: index)?.points ?? [] + let toPoints = toLines.safeElement(at: index)?.points ?? [] + + var fromIndex: Int? = fromPoints.firstIndex(where: { $0.x >= range.lowerBound }) + var toIndex: Int? = toPoints.firstIndex(where: { $0.x >= range.lowerBound }) + + let fromRange = verticalRange.start + let currentRange = verticalRange.current + let toRange = verticalRange.end + + func convertFromPoint(_ fromPoint: CGPoint) -> CGPoint { + return CGPoint(x: fromPoint.x, + y: (fromPoint.y - fromRange.lowerBound) / fromRange.distance * currentRange.distance + currentRange.lowerBound) + } + + func convertToPoint(_ toPoint: CGPoint) -> CGPoint { + return CGPoint(x: toPoint.x, + y: (toPoint.y - toRange.lowerBound) / toRange.distance * currentRange.distance + currentRange.lowerBound) + } + + var previousFromPoint: CGPoint + var previousToPoint: CGPoint + let startFromPoint: CGPoint? + let startToPoint: CGPoint? + + if let validFrom = fromIndex { + previousFromPoint = convertFromPoint(fromPoints[max(0, validFrom - 1)]) + startFromPoint = previousFromPoint + } else { + previousFromPoint = .zero + startFromPoint = nil + } + if let validTo = toIndex { + previousToPoint = convertToPoint(toPoints[max(0, validTo - 1)]) + startToPoint = previousToPoint + } else { + previousToPoint = .zero + startToPoint = nil + } + + var combinedPoints: [CGPoint] = [] + + func add(pointToDraw: CGPoint) { + if let startFromPoint = startFromPoint, + pointToDraw.x < startFromPoint.x { + let animatedPoint = CGPoint(x: pointToDraw.x, + y: CGFloat.valueBetween(start: startFromPoint.y, end: pointToDraw.y, offset: animationOffset)) + combinedPoints.append(transform(toChartCoordinate: animatedPoint, chartFrame: chartFrame)) + } else if let startToPoint = startToPoint, + pointToDraw.x < startToPoint.x { + let animatedPoint = CGPoint(x: pointToDraw.x, + y: CGFloat.valueBetween(start: startToPoint.y, end: pointToDraw.y, offset: 1 - animationOffset)) + combinedPoints.append(transform(toChartCoordinate: animatedPoint, chartFrame: chartFrame)) + } else { + combinedPoints.append(transform(toChartCoordinate: pointToDraw, chartFrame: chartFrame)) + } + } + + if previousToPoint != .zero && previousFromPoint != .zero { + add(pointToDraw: (previousToPoint.x < previousFromPoint.x ? previousToPoint : previousFromPoint)) + } else if previousToPoint != .zero { + add(pointToDraw: previousToPoint) + } else if previousFromPoint != .zero { + add(pointToDraw: previousFromPoint) + } + + while let validFromIndex = fromIndex, + let validToIndex = toIndex, + validFromIndex < fromPoints.count, + validToIndex < toPoints.count { + let currentFromPoint = convertFromPoint(fromPoints[validFromIndex]) + let currentToPoint = convertToPoint(toPoints[validToIndex]) + let pointToAdd: CGPoint + if currentFromPoint.x == currentToPoint.x { + pointToAdd = CGPoint.valueBetween(start: currentFromPoint, end: currentToPoint, offset: animationOffset) + previousFromPoint = currentFromPoint + previousToPoint = currentToPoint + fromIndex = validFromIndex + 1 + toIndex = validToIndex + 1 + } else if currentFromPoint.x < currentToPoint.x { + if previousToPoint.x < currentFromPoint.x { + let offset = Double((currentFromPoint.x - previousToPoint.x) / (currentToPoint.x - previousToPoint.x)) + let intermidiateToPoint = CGPoint.valueBetween(start: previousToPoint, end: currentToPoint, offset: offset) + pointToAdd = CGPoint.valueBetween(start: currentFromPoint, end: intermidiateToPoint, offset: animationOffset) + } else { + pointToAdd = currentFromPoint + } + previousFromPoint = currentFromPoint + fromIndex = validFromIndex + 1 + } else { + if previousFromPoint.x < currentToPoint.x { + let offset = Double((currentToPoint.x - previousFromPoint.x) / (currentFromPoint.x - previousFromPoint.x)) + let intermidiateFromPoint = CGPoint.valueBetween(start: previousFromPoint, end: currentFromPoint, offset: offset) + pointToAdd = CGPoint.valueBetween(start: intermidiateFromPoint, end: currentToPoint, offset: animationOffset) + } else { + pointToAdd = currentToPoint + } + previousToPoint = currentToPoint + toIndex = validToIndex + 1 + } + add(pointToDraw: pointToAdd) + if (pointToAdd.x > range.upperBound) { + break + } + } + + while let validToIndex = toIndex, validToIndex < toPoints.count { + var pointToAdd = convertToPoint(toPoints[validToIndex]) + pointToAdd.y = CGFloat.valueBetween(start: previousFromPoint.y, + end: pointToAdd.y, + offset: animationOffset) + + add(pointToDraw: pointToAdd) + if (pointToAdd.x > range.upperBound) { + break + } + + toIndex = validToIndex + 1 + } + + while let validFromIndex = fromIndex, validFromIndex < fromPoints.count { + var pointToAdd = convertFromPoint(fromPoints[validFromIndex]) + pointToAdd.y = CGFloat.valueBetween(start: previousToPoint.y, + end: pointToAdd.y, + offset: 1 - animationOffset) + + add(pointToDraw: pointToAdd) + if (pointToAdd.x > range.upperBound) { + break + } + + fromIndex = validFromIndex + 1 + } + + var index = 0 + var lines: [CGPoint] = [] + var currentChartPoint = combinedPoints[index] + lines.append(currentChartPoint) + + var chartPoints = [currentChartPoint] + var minIndex = 0 + var maxIndex = 0 + index += 1 + + while index < combinedPoints.count { + currentChartPoint = combinedPoints[index] + + if currentChartPoint.x - chartPoints[0].x < lineWidth * optimizationLevel { + chartPoints.append(currentChartPoint) + + if currentChartPoint.y > chartPoints[maxIndex].y { + maxIndex = chartPoints.count - 1 + } + if currentChartPoint.y < chartPoints[minIndex].y { + minIndex = chartPoints.count - 1 + } + + index += 1 + } else { + if chartPoints.count == 1 { + lines.append(currentChartPoint) + lines.append(currentChartPoint) + chartPoints[0] = currentChartPoint + index += 1 + minIndex = 0 + maxIndex = 0 + } else { + if minIndex < maxIndex { + if minIndex != 0 { + lines.append(chartPoints[minIndex]) + lines.append(chartPoints[minIndex]) + } + lines.append(chartPoints[maxIndex]) + lines.append(chartPoints[maxIndex]) + if maxIndex != chartPoints.count - 1 { + chartPoints = [chartPoints[maxIndex], chartPoints.last!] + } else { + chartPoints = [chartPoints[maxIndex]] + } + } else { + if maxIndex != 0 { + lines.append(chartPoints[maxIndex]) + lines.append(chartPoints[maxIndex]) + } + lines.append(chartPoints[minIndex]) + lines.append(chartPoints[minIndex]) + if minIndex != chartPoints.count - 1 { + chartPoints = [chartPoints[minIndex], chartPoints.last!] + } else { + chartPoints = [chartPoints[minIndex]] + } + } + if chartPoints.count == 2 { + if chartPoints[0].y < chartPoints[1].y { + minIndex = 0 + maxIndex = 1 + } else { + minIndex = 1 + maxIndex = 0 + } + } else { + minIndex = 0 + maxIndex = 0 + } + } + } + } + + if chartPoints.count == 1 { + lines.append(currentChartPoint) + lines.append(currentChartPoint) + } else { + if minIndex < maxIndex { + if minIndex != 0 { + lines.append(chartPoints[minIndex]) + lines.append(chartPoints[minIndex]) + } + lines.append(chartPoints[maxIndex]) + lines.append(chartPoints[maxIndex]) + if maxIndex != chartPoints.count - 1 { + lines.append(chartPoints.last!) + lines.append(chartPoints.last!) + } + } else { + if maxIndex != 0 { + lines.append(chartPoints[maxIndex]) + lines.append(chartPoints[maxIndex]) + } + lines.append(chartPoints[minIndex]) + lines.append(chartPoints[minIndex]) + if minIndex != chartPoints.count - 1 { + lines.append(chartPoints.last!) + lines.append(chartPoints.last!) + } + } + } + + if (lines.count % 2) == 1 { + lines.removeLast() + } + + context.setLineCap(.round) + context.strokeLineSegments(between: lines) + + } else { + let alpha = linesAlphaAnimators[index].current * chartsAlpha + if alpha == 0 { continue } + context.setStrokeColor(toLine.color.withAlphaComponent(alpha).cgColor) + context.setLineWidth(lineWidth) + + if var index = toLine.points.firstIndex(where: { $0.x >= range.lowerBound }) { + var lines: [CGPoint] = [] + index = max(0, index - 1) + var currentPoint = toLine.points[index] + var currentChartPoint = transform(toChartCoordinate: currentPoint, chartFrame: chartFrame) + lines.append(currentChartPoint) + //context.move(to: currentChartPoint) + + var chartPoints = [currentChartPoint] + var minIndex = 0 + var maxIndex = 0 + index += 1 + + while index < toLine.points.count { + currentPoint = toLine.points[index] + currentChartPoint = transform(toChartCoordinate: currentPoint, chartFrame: chartFrame) + + if currentChartPoint.x - chartPoints[0].x < lineWidth * optimizationLevel { + chartPoints.append(currentChartPoint) + + if currentChartPoint.y > chartPoints[maxIndex].y { + maxIndex = chartPoints.count - 1 + } + if currentChartPoint.y < chartPoints[minIndex].y { + minIndex = chartPoints.count - 1 + } + + index += 1 + } else { + if chartPoints.count == 1 { + lines.append(currentChartPoint) + lines.append(currentChartPoint) + chartPoints[0] = currentChartPoint + index += 1 + minIndex = 0 + maxIndex = 0 + } else { + if minIndex < maxIndex { + if minIndex != 0 { + lines.append(chartPoints[minIndex]) + lines.append(chartPoints[minIndex]) + } + lines.append(chartPoints[maxIndex]) + lines.append(chartPoints[maxIndex]) + if maxIndex != chartPoints.count - 1 { + chartPoints = [chartPoints[maxIndex], chartPoints.last!] + } else { + chartPoints = [chartPoints[maxIndex]] + } + } else { + if maxIndex != 0 { + lines.append(chartPoints[maxIndex]) + lines.append(chartPoints[maxIndex]) + } + lines.append(chartPoints[minIndex]) + lines.append(chartPoints[minIndex]) + if minIndex != chartPoints.count - 1 { + chartPoints = [chartPoints[minIndex], chartPoints.last!] + } else { + chartPoints = [chartPoints[minIndex]] + } + } + if chartPoints.count == 2 { + if chartPoints[0].y < chartPoints[1].y { + minIndex = 0 + maxIndex = 1 + } else { + minIndex = 1 + maxIndex = 0 + } + } else { + minIndex = 0 + maxIndex = 0 + } + } + } + if currentPoint.x > range.upperBound { + break + } + } + + if chartPoints.count == 1 { + lines.append(currentChartPoint) + lines.append(currentChartPoint) + } else { + if minIndex < maxIndex { + if minIndex != 0 { + lines.append(chartPoints[minIndex]) + lines.append(chartPoints[minIndex]) + } + lines.append(chartPoints[maxIndex]) + lines.append(chartPoints[maxIndex]) + if maxIndex != chartPoints.count - 1 { + lines.append(chartPoints.last!) + lines.append(chartPoints.last!) + } + } else { + if maxIndex != 0 { + lines.append(chartPoints[maxIndex]) + lines.append(chartPoints[maxIndex]) + } + lines.append(chartPoints[minIndex]) + lines.append(chartPoints[minIndex]) + if minIndex != chartPoints.count - 1 { + lines.append(chartPoints.last!) + lines.append(chartPoints.last!) + } + } + } + + if (lines.count % 2) == 1 { + lines.removeLast() + } + + context.setLineCap(.round) + context.strokeLineSegments(between: lines) + } + +// if var start = toLine.points.firstIndex(where: { $0.x > range.lowerBound }) { +// let alpha = linesAlphaAnimators[index].current * chartsAlpha +// if alpha == 0 { continue } +// context.setStrokeColor(toLine.color.withAlphaComponent(alpha).cgColor) +// context.setLineWidth(lineWidth) +// +// context.setLineCap(.round) +// start = max(0, start - 1) +// let startPoint = toLine.points[start] +// var lines: [CGPoint] = [] +// var pointToDraw = CGPoint(x: transform(toChartCoordinateHorizontal: startPoint.x, chartFrame: chartFrame), +// y: transform(toChartCoordinateVertical: startPoint.y, chartFrame: chartFrame)) +// for index in (start + 1).. range.upperBound { +// break +// } +// } +// +// context.strokeLineSegments(between: lines) +// } + } + } + } +} + +extension LinesChartRenderer.LineData { + static func initialComponents(chartsCollection: ChartsCollection) -> (linesData: [LinesChartRenderer.LineData], + totalHorizontalRange: ClosedRange, + totalVerticalRange: ClosedRange) { + let lines: [LinesChartRenderer.LineData] = chartsCollection.chartValues.map { chart in + let points = chart.values.enumerated().map({ (arg) -> CGPoint in + return CGPoint(x: chartsCollection.axisValues[arg.offset].timeIntervalSince1970, + y: arg.element) + }) + return LinesChartRenderer.LineData(color: chart.color, points: points) + } + let horizontalRange = LinesChartRenderer.LineData.horizontalRange(lines: lines) ?? BaseConstants.defaultRange + let verticalRange = LinesChartRenderer.LineData.verticalRange(lines: lines) ?? BaseConstants.defaultRange + return (linesData: lines, totalHorizontalRange: horizontalRange, totalVerticalRange: verticalRange) + } + + static func horizontalRange(lines: [LinesChartRenderer.LineData]) -> ClosedRange? { + guard let firstPoint = lines.first?.points.first else { return nil } + var hMin: CGFloat = firstPoint.x + var hMax: CGFloat = firstPoint.x + + for line in lines { + if let first = line.points.first, + let last = line.points.last { + hMin = min(hMin, first.x) + hMax = max(hMax, last.x) + } + } + + return hMin...hMax + } + + static func verticalRange(lines: [LinesChartRenderer.LineData], calculatingRange: ClosedRange? = nil, addBounds: Bool = false) -> ClosedRange? { + if let calculatingRange = calculatingRange { + guard let initalStart = lines.first?.points.first(where: { $0.x >= calculatingRange.lowerBound && + $0.x <= calculatingRange.upperBound }) else { return nil } + var vMin: CGFloat = initalStart.y + var vMax: CGFloat = initalStart.y + for line in lines { + if var index = line.points.firstIndex(where: { $0.x > calculatingRange.lowerBound }) { + if addBounds { + index = max(0, index - 1) + } + while index < line.points.count { + let point = line.points[index] + if point.x < calculatingRange.upperBound { + vMin = min(vMin, point.y) + vMax = max(vMax, point.y) + } else if addBounds { + vMin = min(vMin, point.y) + vMax = max(vMax, point.y) + break + } else { + break + } + index += 1 + } + } + } + return vMin...vMax + } else { + guard let firstPoint = lines.first?.points.first else { return nil } + var vMin: CGFloat = firstPoint.y + var vMax: CGFloat = firstPoint.y + for line in lines { + for point in line.points { + vMin = min(vMin, point.y) + vMax = max(vMax, point.y) + } + } + return vMin...vMax + } + } +} diff --git a/submodules/Charts/Sources/Charts/Renderes/PecentChartRenderer.swift b/submodules/Charts/Sources/Charts/Renderes/PecentChartRenderer.swift new file mode 100644 index 0000000000..07ff3daaaa --- /dev/null +++ b/submodules/Charts/Sources/Charts/Renderes/PecentChartRenderer.swift @@ -0,0 +1,132 @@ +// +// PecentChartRenderer.swift +// GraphTest +// +// Created by Andrei Salavei on 4/7/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +class PecentChartRenderer: BaseChartRenderer { + struct PercentageData { + static let blank = PecentChartRenderer.PercentageData(locations: [], components: []) + var locations: [CGFloat] + var components: [Component] + + struct Component { + var color: UIColor + var values: [CGFloat] + } + } + + override func setup(verticalRange: ClosedRange, animated: Bool, timeFunction: TimeFunction? = nil) { + super.setup(verticalRange: 0...1, animated: animated, timeFunction: timeFunction) + } + + private var componentsAnimators: [AnimationController] = [] + var percentageData: PercentageData = PercentageData(locations: [], components: []) { + willSet { + if percentageData.components.count != newValue.components.count { + componentsAnimators = newValue.components.map { _ in AnimationController(current: 1, refreshClosure: self.refreshClosure) } + } + } + didSet { + setNeedsDisplay() + } + } + + func setComponentVisible(_ isVisible: Bool, at index: Int, animated: Bool) { + componentsAnimators[index].animate(to: isVisible ? 1 : 0, duration: animated ? .defaultDuration : 0) + } + + override func render(context: CGContext, bounds: CGRect, chartFrame: CGRect) { + guard isEnabled && verticalRange.current.distance > 0 && verticalRange.current.distance > 0 else { return } + let alpha = chartAlphaAnimator.current + guard alpha > 0 else { return } + + let range = renderRange(bounds: bounds, chartFrame: chartFrame) + + var paths: [CGMutablePath] = percentageData.components.map { _ in CGMutablePath() } + var vertices: [CGFloat] = Array(repeating: 0, count: percentageData.components.count) + + if var locationIndex = percentageData.locations.firstIndex(where: { $0 > range.lowerBound }) { + locationIndex = max(0, locationIndex - 1) + + var currentLocation = transform(toChartCoordinateHorizontal: percentageData.locations[locationIndex], chartFrame: chartFrame) + + let startPoint = CGPoint(x: currentLocation, + y: transform(toChartCoordinateVertical: verticalRange.current.lowerBound, chartFrame: chartFrame)) + + for path in paths { + path.move(to: startPoint) + } + paths.last?.addLine(to: CGPoint(x: currentLocation, + y: transform(toChartCoordinateVertical: verticalRange.current.upperBound, chartFrame: chartFrame))) + + while locationIndex < percentageData.locations.count { + currentLocation = transform(toChartCoordinateHorizontal: percentageData.locations[locationIndex], chartFrame: chartFrame) + var summ: CGFloat = 0 + + for (index, component) in percentageData.components.enumerated() { + let visibilityPercent = componentsAnimators[index].current + + let value = component.values[locationIndex] * visibilityPercent + if index == 0 { + vertices[index] = value + } else { + vertices[index] = value + vertices[index - 1] + } + summ += value + } + + if summ > 0 { + for (index, value) in vertices.dropLast().enumerated() { + paths[index].addLine(to: CGPoint(x: currentLocation, + y: transform(toChartCoordinateVertical: value / summ, chartFrame: chartFrame))) + } + } + + if currentLocation > range.upperBound { + break + } + + locationIndex += 1 + } + + paths.last?.addLine(to: CGPoint(x: currentLocation, + y: transform(toChartCoordinateVertical: verticalRange.current.upperBound, chartFrame: chartFrame))) + + let endPoint = CGPoint(x: currentLocation, + y: transform(toChartCoordinateVertical: verticalRange.current.lowerBound, chartFrame: chartFrame)) + + for (index, path) in paths.enumerated().reversed() { + let visibilityPercent = componentsAnimators[index].current + if visibilityPercent == 0 { continue } + + path.addLine(to: endPoint) + path.closeSubpath() + + context.saveGState() + context.beginPath() + context.addPath(path) + + context.setFillColor(percentageData.components[index].color.cgColor) + context.fillPath() + context.restoreGState() + } + } + } +} + +extension PecentChartRenderer.PercentageData { + static func horizontalRange(data: PecentChartRenderer.PercentageData) -> ClosedRange? { + guard let firstPoint = data.locations.first, + let lastPoint = data.locations.last, + firstPoint <= lastPoint else { + return nil + } + + return firstPoint...lastPoint + } +} diff --git a/submodules/Charts/Sources/Charts/Renderes/PercentPieAnimationRenderer.swift b/submodules/Charts/Sources/Charts/Renderes/PercentPieAnimationRenderer.swift new file mode 100644 index 0000000000..e36fdaf913 --- /dev/null +++ b/submodules/Charts/Sources/Charts/Renderes/PercentPieAnimationRenderer.swift @@ -0,0 +1,202 @@ +// +// PercentPieAnimationRenderer.swift +// GraphTest +// +// Created by Andrei Salavei on 4/13/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +class PercentPieAnimationRenderer: BaseChartRenderer { + override func setup(verticalRange: ClosedRange, animated: Bool, timeFunction: TimeFunction? = nil) { + super.setup(verticalRange: 0...1, animated: animated, timeFunction: timeFunction) + } + + private lazy var transitionAnimator = AnimationController(current: 0, refreshClosure: refreshClosure) + private var animationComponentsPoints: [[CGPoint]] = [] + var visiblePercentageData: PecentChartRenderer.PercentageData = .blank { + didSet { + animationComponentsPoints = [] + } + } + var visiblePieComponents: [PieChartRenderer.PieComponent] = [] + + func animate(fromDataToPie: Bool, animated: Bool, completion: @escaping () -> Void) { + assert(visiblePercentageData.components.count == visiblePieComponents.count) + + isEnabled = true + transitionAnimator.completionClosure = { [weak self] in + self?.isEnabled = false + completion() + } + transitionAnimator.animate(to: fromDataToPie ? 1 : 0, duration: animated ? .defaultDuration : 0) + } + + private func generateAnimationComponentPoints(bounds: CGRect, chartFrame: CGRect) { + let range = renderRange(bounds: bounds, chartFrame: chartFrame) + + let componentsCount = visiblePercentageData.components.count + guard componentsCount > 0 else { return } + animationComponentsPoints = visiblePercentageData.components.map { _ in [] } + var vertices: [CGFloat] = Array(repeating: 0, count: visiblePercentageData.components.count) + + if var locationIndex = visiblePercentageData.locations.firstIndex(where: { $0 > range.lowerBound }) { + locationIndex = max(0, locationIndex - 1) + var currentLocation = transform(toChartCoordinateHorizontal: visiblePercentageData.locations[locationIndex], chartFrame: chartFrame) + let startPoint = CGPoint(x: currentLocation, y: transform(toChartCoordinateVertical: verticalRange.current.lowerBound, chartFrame: chartFrame)) + for index in 0.. range.upperBound { + break + } + locationIndex += 1 + } + + animationComponentsPoints[componentsCount - 1].append(CGPoint(x: currentLocation, y: transform(toChartCoordinateVertical: verticalRange.current.upperBound, chartFrame: chartFrame))) + let endPoint = CGPoint(x: currentLocation, y: transform(toChartCoordinateVertical: verticalRange.current.lowerBound, chartFrame: chartFrame)) + for index in 0.. 0 && verticalRange.current.distance > 0 else { return } + self.optimizationLevel = 1 + + if animationComponentsPoints.isEmpty { + generateAnimationComponentPoints(bounds: bounds, chartFrame: chartFrame) + } + + let numberOfComponents = animationComponentsPoints.count + guard numberOfComponents > 0 else { return } + let destinationRadius = max(chartFrame.width, chartFrame.height) + + let animationFraction = transitionAnimator.current + let animationFractionD = Double(transitionAnimator.current) + let easeInAnimationFractionD = animationFractionD * animationFractionD * animationFractionD * animationFractionD + let center = CGPoint(x: chartFrame.midX, y: chartFrame.midY) + let totalPieSumm: CGFloat = visiblePieComponents.map { $0.value } .reduce(0, +) + + let pathsToDraw: [CGMutablePath] = (0.. 4 else { + return + } + + let percent = visiblePieComponents[componentIndex].value / totalPieSumm + let segmentSize = 2 * .pi * percent + let endAngle = startAngle + segmentSize + let centerAngle = (startAngle + endAngle) / 2 + + let lineCenterPoint = CGPoint.valueBetween(start: componentPoints[componentPoints.count / 2], + end: center, + offset: animationFractionD) + + let startDestinationPoint = lineCenterPoint + CGPoint(x: destinationRadius, y: 0) + let centerDestinationPoint = lineCenterPoint + CGPoint(x: 0, y: destinationRadius) + let endDestinationPoint = lineCenterPoint + CGPoint(x: -destinationRadius, y: 0) + let initialStartDestinationAngle: CGFloat = 0 + let initialCenterDestinationAngle: CGFloat = .pi / 2 + let initialEndDestinationAngle: CGFloat = .pi + + var previousAddedPoint = (componentPoints[0] * 2 - center) + .rotate(origin: lineCenterPoint, angle: CGFloat.valueBetween(start: 0, end: centerAngle - initialCenterDestinationAngle, offset: animationFractionD)) + + pathsToDraw[componentIndex].move(to: previousAddedPoint) + + func addPointToPath(_ point: CGPoint) { + if (point - previousAddedPoint).lengthSquared() > optimizationLevel { + pathsToDraw[componentIndex].addLine(to: point) + previousAddedPoint = point + } + } + + for endPointIndex in 1..<(componentPoints.count / 2) { + addPointToPath(CGPoint.valueBetween(start: componentPoints[endPointIndex], end: endDestinationPoint, offset: easeInAnimationFractionD) + .rotate(origin: lineCenterPoint, angle: CGFloat.valueBetween(start: 0, end: endAngle - initialEndDestinationAngle, offset: animationFractionD))) + } + + addPointToPath(lineCenterPoint) + + for startPointIndex in (componentPoints.count / 2 + 1)..<(componentPoints.count - 1) { + addPointToPath(CGPoint.valueBetween(start: componentPoints[startPointIndex], end: startDestinationPoint, offset: easeInAnimationFractionD) + .rotate(origin: lineCenterPoint, angle: CGFloat.valueBetween(start: 0, end: startAngle - initialStartDestinationAngle, offset: animationFractionD))) + } + + if let lastPoint = componentPoints.last { + addPointToPath((lastPoint * 2 - center) + .rotate(origin: lineCenterPoint, angle: CGFloat.valueBetween(start: 0, end: centerAngle - initialCenterDestinationAngle, offset: animationFractionD))) + } + + startAngle = endAngle + } + + if let lastPath = animationComponentsPoints.last { + pathsToDraw.last?.addLines(between: lastPath) + } + + for (index, path) in pathsToDraw.enumerated().reversed() { + path.closeSubpath() + + context.saveGState() + context.beginPath() + context.addPath(path) + + context.setFillColor(visiblePieComponents[index].color.cgColor) + context.fillPath() + context.restoreGState() + } + + let diagramRadius = (min(chartFrame.width, chartFrame.height) / 2) * 0.925 + let targetFrame = CGRect(origin: CGPoint(x: center.x - diagramRadius, + y: center.y - diagramRadius), + size: CGSize(width: diagramRadius * 2, + height: diagramRadius * 2)) + + let minX = animationComponentsPoints.last?.first?.x ?? 0 + let maxX = animationComponentsPoints.last?.last?.x ?? 0 + let startFrame = CGRect(x: minX, + y: chartFrame.minY, + width: maxX - minX, + height: chartFrame.height) + let cornerRadius = diagramRadius * animationFraction + let fadeOutFrame = CGRect.valueBetween(start: startFrame, end: targetFrame, offset: animationFractionD) + let fadeOutPath = CGMutablePath() + fadeOutPath.addRect(bounds) + fadeOutPath.addPath(CGPath(roundedRect: fadeOutFrame, cornerWidth: cornerRadius, cornerHeight: cornerRadius, transform: nil)) + + context.saveGState() + context.beginPath() + context.addPath(fadeOutPath) + context.setFillColor(backgroundColor.cgColor) + context.fillPath(using: .evenOdd) + context.restoreGState() + } +} diff --git a/submodules/Charts/Sources/Charts/Renderes/PerformanceRenderer.swift b/submodules/Charts/Sources/Charts/Renderes/PerformanceRenderer.swift new file mode 100644 index 0000000000..c17663ce5f --- /dev/null +++ b/submodules/Charts/Sources/Charts/Renderes/PerformanceRenderer.swift @@ -0,0 +1,31 @@ +// +// PerformanceRenderer.swift +// GraphTest +// +// Created by Andrei Salavei on 4/10/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +class PerformanceRenderer: ChartViewRenderer { + var containerViews: [UIView] = [] + + private var previousTickTime: TimeInterval = CACurrentMediaTime() + + func render(context: CGContext, bounds: CGRect, chartFrame: CGRect) { + let currentTime = CACurrentMediaTime() + let delta = currentTime - previousTickTime + previousTickTime = currentTime + + let normalDelta = 0.017 + let redDelta = 0.05 + + if delta > normalDelta || delta < 0.75 { + let green = CGFloat( 1.0 - crop(0, (delta - normalDelta) / (redDelta - normalDelta), 1)) + let color = UIColor(red: 1.0, green: green, blue: 0, alpha: 1) + context.setFillColor(color.cgColor) + context.fill(CGRect(x: 0, y: 0, width: bounds.width, height: 3)) + } + } +} diff --git a/submodules/Charts/Sources/Charts/Renderes/PieChartRenderer.swift b/submodules/Charts/Sources/Charts/Renderes/PieChartRenderer.swift new file mode 100644 index 0000000000..ed4e6bdd49 --- /dev/null +++ b/submodules/Charts/Sources/Charts/Renderes/PieChartRenderer.swift @@ -0,0 +1,191 @@ +// +// PieChartRenderer.swift +// GraphTest +// +// Created by Andrei Salavei on 4/11/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +class PieChartRenderer: BaseChartRenderer { + struct PieComponent: Hashable { + var color: UIColor + var value: CGFloat + } + + override func setup(verticalRange: ClosedRange, animated: Bool, timeFunction: TimeFunction? = nil) { + super.setup(verticalRange: 0...1, animated: animated, timeFunction: timeFunction) + } + + var valuesFormatter: NumberFormatter = NumberFormatter() + var drawValues: Bool = true + + private var componentsAnimators: [AnimationController] = [] + private lazy var transitionAnimator: AnimationController = { AnimationController(current: 1, refreshClosure: self.refreshClosure) }() + private var oldPercentageData: [PieComponent] = [] + private var percentageData: [PieComponent] = [] + private var setlectedSegmentsAnimators: [AnimationController] = [] + + var drawPie: Bool = true + var initialAngle: CGFloat = .pi / 3 + var hasSelectedSegments: Bool { + return selectedSegment != nil + } + private(set) var selectedSegment: Int? + func selectSegmentAt(at indexToSelect: Int?, animated: Bool) { + selectedSegment = indexToSelect + for (index, animator) in setlectedSegmentsAnimators.enumerated() { + let fraction: CGFloat = (index == indexToSelect) ? 1.0 : 0.0 + if animated { + animator.animate(to: fraction, duration: .defaultDuration / 2) + } else { + animator.set(current: fraction) + } + } + } + + func updatePercentageData(_ percentageData: [PieComponent], animated: Bool) { + if self.percentageData.count != percentageData.count { + componentsAnimators = percentageData.map { _ in AnimationController(current: 1, refreshClosure: self.refreshClosure) } + setlectedSegmentsAnimators = percentageData.map { _ in AnimationController(current: 0, refreshClosure: self.refreshClosure) } + } + if animated { + self.oldPercentageData = self.currentTransitionAnimationData + self.percentageData = percentageData + transitionAnimator.completionClosure = { [weak self] in + self?.oldPercentageData = [] + } + transitionAnimator.set(current: 0) + transitionAnimator.animate(to: 1, duration: .defaultDuration) + } else { + self.oldPercentageData = [] + self.percentageData = percentageData + transitionAnimator.set(current: 0) + } + } + + func setComponentVisible(_ isVisible: Bool, at index: Int, animated: Bool) { + componentsAnimators[index].animate(to: isVisible ? 1 : 0, duration: animated ? .defaultDuration : 0) + } + + var lastRenderedBounds: CGRect = .zero + var lastRenderedChartFrame: CGRect = .zero + func selectedItemIndex(at point: CGPoint) -> Int? { + let touchPosition = lastRenderedChartFrame.origin + point * lastRenderedChartFrame.size + let center = CGPoint(x: lastRenderedChartFrame.midX, y: lastRenderedChartFrame.midY) + let radius = min(lastRenderedChartFrame.width, lastRenderedChartFrame.height) / 2 + if center.distanceTo(touchPosition) > radius { return nil } + let angle = (center - touchPosition).angle + .pi + let currentData = currentlyVisibleData + let total: CGFloat = currentData.map({ $0.value }).reduce(0, +) + var startAngle: CGFloat = initialAngle + for (index, piece) in currentData.enumerated() { + let percent = piece.value / total + let segmentSize = 2 * .pi * percent + let endAngle = startAngle + segmentSize + if angle >= startAngle && angle <= endAngle || + angle + .pi * 2 >= startAngle && angle + .pi * 2 <= endAngle { + return index + } + startAngle = endAngle + } + return nil + } + + private var currentTransitionAnimationData: [PieComponent] { + if transitionAnimator.isAnimating { + let animationFraction = transitionAnimator.current + return percentageData.enumerated().map { arg in + return PieComponent(color: arg.element.color, + value: oldPercentageData[arg.offset].value * (1 - animationFraction) + arg.element.value * animationFraction) + } + } else { + return percentageData + } + } + + var currentlyVisibleData: [PieComponent] { + return currentTransitionAnimationData.enumerated().map { arg in + return PieComponent(color: arg.element.color, + value: arg.element.value * componentsAnimators[arg.offset].current) + } + } + + override func render(context: CGContext, bounds: CGRect, chartFrame: CGRect) { + guard isEnabled && verticalRange.current.distance > 0 && verticalRange.current.distance > 0 else { return } + lastRenderedBounds = bounds + lastRenderedChartFrame = chartFrame + let chartAlpha = chartAlphaAnimator.current + if chartAlpha == 0 { return } + + let center = CGPoint(x: chartFrame.midX, y: chartFrame.midY) + let radius = min(chartFrame.width, chartFrame.height) / 2 + + let currentData = currentlyVisibleData + + let total: CGFloat = currentData.map({ $0.value }).reduce(0, +) + guard total > 0 else { + return + } + + let animationSelectionOffset: CGFloat = radius / 15 + let maximumFontSize: CGFloat = radius / 7 + let minimumFontSize: CGFloat = 4 + let centerOffsetStartAngle = CGFloat.pi / 4 + let minimumValueToDraw: CGFloat = 0.01 + let diagramRadius = radius - animationSelectionOffset + + let numberOfVisibleItems = currentlyVisibleData.filter { $0.value > 0 }.count + var startAngle: CGFloat = initialAngle + for (index, piece) in currentData.enumerated() { + let percent = piece.value / total + guard percent > 0 else { continue } + let segmentSize = 2 * .pi * percent * chartAlpha + let endAngle = startAngle + segmentSize + let centerAngle = (startAngle + endAngle) / 2 + let labelVector = CGPoint(x: cos(centerAngle), + y: sin(centerAngle)) + + let selectionAnimationFraction = (numberOfVisibleItems > 1 ? setlectedSegmentsAnimators[index].current : 0) + + let updatedCenter = CGPoint(x: center.x + labelVector.x * selectionAnimationFraction * animationSelectionOffset, + y: center.y + labelVector.y * selectionAnimationFraction * animationSelectionOffset) + if drawPie { + context.saveGState() + context.setFillColor(piece.color.withAlphaComponent(piece.color.alphaValue * chartAlpha).cgColor) + context.move(to: updatedCenter) + context.addArc(center: updatedCenter, + radius: radius - animationSelectionOffset, + startAngle: startAngle, + endAngle: endAngle, + clockwise: false) + context.fillPath() + context.restoreGState() + } + + if drawValues && percent >= minimumValueToDraw { + context.saveGState() + + let text = valuesFormatter.string(from: percent * 100) + let fraction = crop(0, segmentSize / centerOffsetStartAngle, 1) + let fontSize = (minimumFontSize + (maximumFontSize - minimumFontSize) * fraction).rounded(.up) + let labelPotisionOffset = diagramRadius / 2 + diagramRadius / 2 * (1 - fraction) + let font = UIFont.systemFont(ofSize: fontSize, weight: .bold) + let labelsEaseInColor = crop(0, chartAlpha * chartAlpha * 2 - 1, 1) + let attributes: [NSAttributedString.Key: Any] = [.foregroundColor: UIColor.white.withAlphaComponent(labelsEaseInColor), + .font: font] + let rect = (text as NSString).boundingRect(with: bounds.size, + options: .usesLineFragmentOrigin, + attributes: attributes, + context: nil) + let labelPoint = CGPoint(x: labelVector.x * labelPotisionOffset + updatedCenter.x - rect.width / 2, + y: labelVector.y * labelPotisionOffset + updatedCenter.y - rect.height / 2) + (text as NSString).draw(at: labelPoint, withAttributes: attributes) + context.restoreGState() + } + + startAngle = endAngle + } + } +} diff --git a/submodules/Charts/Sources/Charts/Renderes/VerticalLinesRenderer.swift b/submodules/Charts/Sources/Charts/Renderes/VerticalLinesRenderer.swift new file mode 100644 index 0000000000..39d1f26a46 --- /dev/null +++ b/submodules/Charts/Sources/Charts/Renderes/VerticalLinesRenderer.swift @@ -0,0 +1,42 @@ +// +// VerticalLinesRenderer.swift +// GraphTest +// +// Created by Andrei Salavei on 4/8/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +class VerticalLinesRenderer: BaseChartRenderer { + var values: [CGFloat] = [] { + didSet { + alphaAnimators = values.map { _ in AnimationController(current: 1.0, refreshClosure: refreshClosure) } + setNeedsDisplay() + } + } + private var alphaAnimators: [AnimationController] = [] + + var linesColor: UIColor = .black + var linesWidth: CGFloat = UIView.oneDevicePixel + + func setLineVisible(_ isVisible: Bool, at index: Int, animated: Bool) { + alphaAnimators[index].animate(to: isVisible ? 1 : 0, duration: animated ? .defaultDuration : 0) + } + + override func render(context: CGContext, bounds: CGRect, chartFrame: CGRect) { + guard isEnabled && verticalRange.current.distance > 0 && verticalRange.current.distance > 0 else { return } + + context.setLineWidth(linesWidth) + + for (index, value) in values.enumerated() { + let alpha = alphaAnimators[index].current + if alpha == 0 { continue } + + context.setStrokeColor(linesColor.withAlphaComponent(linesColor.alphaValue * alpha).cgColor) + let pointX = transform(toChartCoordinateHorizontal: value, chartFrame: chartFrame) + context.strokeLineSegments(between: [CGPoint(x: pointX, y: chartFrame.minY), + CGPoint(x: pointX, y: chartFrame.maxY)]) + } + } +} diff --git a/submodules/Charts/Sources/Charts/Renderes/VerticalScalesRenderer.swift b/submodules/Charts/Sources/Charts/Renderes/VerticalScalesRenderer.swift new file mode 100644 index 0000000000..79d9dcec22 --- /dev/null +++ b/submodules/Charts/Sources/Charts/Renderes/VerticalScalesRenderer.swift @@ -0,0 +1,162 @@ +// +// VerticalScalesRenderer.swift +// GraphTest +// +// Created by Andrei Salavei on 4/8/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +class VerticalScalesRenderer: BaseChartRenderer { + private var verticalLabelsAndLines: [LinesChartLabel] = [] + private var animatedVerticalLabelsAndLines: [AnimatedLinesChartLabels] = [] + private lazy var horizontalLinesAlphaAnimator: AnimationController = { + return AnimationController(current: 1, refreshClosure: self.refreshClosure) + }() + + var drawAxisX: Bool = true + var axisXColor: UIColor = .black + var axisXWidth: CGFloat = UIView.oneDevicePixel + + var isRightAligned: Bool = false + + var horizontalLinesColor: UIColor = .black { + didSet { + setNeedsDisplay() + } + } + var horizontalLinesWidth: CGFloat = UIView.oneDevicePixel + var lavelsAsisOffset: CGFloat = 6 + var labelsColor: UIColor = .black { + didSet { + setNeedsDisplay() + } + } + var labelsFont: UIFont = .systemFont(ofSize: 11) + + func setHorizontalLinesVisible(_ visible: Bool, animated: Bool) { + let destinationValue: CGFloat = visible ? 1 : 0 + guard self.horizontalLinesAlphaAnimator.end != destinationValue else { return } + if animated { + self.horizontalLinesAlphaAnimator.animate(to: destinationValue, duration: .defaultDuration) + } else { + self.horizontalLinesAlphaAnimator.set(current: destinationValue) + } + } + + func setup(verticalLimitsLabels: [LinesChartLabel], animated: Bool) { + if animated { + var labelsToKeepVisible: [LinesChartLabel] = [] + let labelsToHide: [LinesChartLabel] + var labelsToShow: [LinesChartLabel] = [] + + for label in verticalLimitsLabels { + if verticalLabelsAndLines.contains(label) { + labelsToKeepVisible.append(label) + } else { + labelsToShow.append(label) + } + } + labelsToHide = verticalLabelsAndLines.filter { !verticalLimitsLabels.contains($0) } + animatedVerticalLabelsAndLines.removeAll(where: { $0.isAppearing }) + verticalLabelsAndLines = labelsToKeepVisible + + let showAnimation = AnimatedLinesChartLabels(labels: labelsToShow, alphaAnimator: AnimationController(current: 1.0, refreshClosure: refreshClosure)) + showAnimation.isAppearing = true + showAnimation.alphaAnimator.set(current: 0) + showAnimation.alphaAnimator.animate(to: 1, duration: .defaultDuration) + showAnimation.alphaAnimator.completionClosure = { [weak self, weak showAnimation] in + guard let self = self, let showAnimation = showAnimation else { return } + self.animatedVerticalLabelsAndLines.removeAll(where: { $0 === showAnimation }) + self.verticalLabelsAndLines = verticalLimitsLabels + } + + let hideAnimation = AnimatedLinesChartLabels(labels: labelsToHide, alphaAnimator: AnimationController(current: 1.0, refreshClosure: refreshClosure)) + hideAnimation.isAppearing = false + hideAnimation.alphaAnimator.set(current: 1) + hideAnimation.alphaAnimator.animate(to: 0, duration: .defaultDuration) + hideAnimation.alphaAnimator.completionClosure = { [weak self, weak hideAnimation] in + guard let self = self, let hideAnimation = hideAnimation else { return } + self.animatedVerticalLabelsAndLines.removeAll(where: { $0 === hideAnimation }) + } + + animatedVerticalLabelsAndLines.append(showAnimation) + animatedVerticalLabelsAndLines.append(hideAnimation) + } else { + verticalLabelsAndLines = verticalLimitsLabels + animatedVerticalLabelsAndLines = [] + } + } + + override func render(context: CGContext, bounds: CGRect, chartFrame: CGRect) { + guard isEnabled && verticalRange.current.distance > 0 && verticalRange.current.distance > 0 else { return } + let generalAlpha = chartAlphaAnimator.current + if generalAlpha == 0 { return } + let labelColorAlpha = labelsColor.alphaValue + + func drawLines(_ labels: [LinesChartLabel], alpha: CGFloat) { + var lineSegments: [CGPoint] = [] + let x0 = chartFrame.minX + let x1 = chartFrame.maxX + + context.setStrokeColor(horizontalLinesColor.withAlphaComponent(horizontalLinesColor.alphaValue * alpha).cgColor) + + for lineInfo in labels { + let y = transform(toChartCoordinateVertical: lineInfo.value, chartFrame: chartFrame).roundedUpToPixelGrid() + lineSegments.append(CGPoint(x: x0, y: y)) + lineSegments.append(CGPoint(x: x1, y: y)) + } + context.strokeLineSegments(between: lineSegments) + } + + func drawVerticalLabels(_ labels: [LinesChartLabel], attributes: [NSAttributedString.Key: Any]) { + if isRightAligned { + for label in labels { + let y = transform(toChartCoordinateVertical: label.value, chartFrame: chartFrame) - labelsFont.pointSize - lavelsAsisOffset + + let rect = (label.text as NSString).boundingRect(with: bounds.size, + options: .usesLineFragmentOrigin, + attributes: attributes, + context: nil) + + (label.text as NSString).draw(at: CGPoint(x:chartFrame.maxX - rect.width, y: y), withAttributes: attributes) + } + } else { + for label in labels { + let y = transform(toChartCoordinateVertical: label.value, chartFrame: chartFrame) - labelsFont.pointSize - lavelsAsisOffset + + (label.text as NSString).draw(at: CGPoint(x:chartFrame.minX, y: y), withAttributes: attributes) + } + } + } + + let horizontalLinesAlpha = horizontalLinesAlphaAnimator.current + if horizontalLinesAlpha > 0 { + context.setLineWidth(horizontalLinesWidth) + + drawLines(verticalLabelsAndLines, alpha: generalAlpha) + for animatedLabesAndLines in animatedVerticalLabelsAndLines { + drawLines(animatedLabesAndLines.labels, alpha: animatedLabesAndLines.alphaAnimator.current * generalAlpha * horizontalLinesAlpha) + } + + if drawAxisX { + context.setLineWidth(axisXWidth) + context.setStrokeColor(axisXColor.withAlphaComponent(axisXColor.alphaValue * horizontalLinesAlpha * generalAlpha).cgColor) + + let lineSegments: [CGPoint] = [CGPoint(x: chartFrame.minX, y: chartFrame.maxY.roundedUpToPixelGrid()), + CGPoint(x: chartFrame.maxX, y: chartFrame.maxY.roundedUpToPixelGrid())] + + context.strokeLineSegments(between: lineSegments) + } + } + + drawVerticalLabels(verticalLabelsAndLines, attributes: [.foregroundColor: labelsColor.withAlphaComponent(labelColorAlpha * generalAlpha), + .font: labelsFont]) + for animatedLabesAndLines in animatedVerticalLabelsAndLines { + drawVerticalLabels(animatedLabesAndLines.labels, + attributes: [.foregroundColor: labelsColor.withAlphaComponent(animatedLabesAndLines.alphaAnimator.current * labelColorAlpha * generalAlpha), + .font: labelsFont]) + } + } +} diff --git a/submodules/Charts/Sources/Helpers/AnimationController.swift b/submodules/Charts/Sources/Helpers/AnimationController.swift new file mode 100644 index 0000000000..6df8d17f76 --- /dev/null +++ b/submodules/Charts/Sources/Helpers/AnimationController.swift @@ -0,0 +1,178 @@ +// +// RangeAnimatedContainer.swift +// GraphTest +// +// Created by Andrei Salavei on 3/12/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +protocol Animatable { + static func valueBetween(start: Self, end: Self, offset: Double) -> Self +} + +enum TimeFunction { + case linear + case easeOut + case easeIn + + func profress(time: TimeInterval, duration: TimeInterval) -> TimeInterval { + switch self { + case .linear: + return time / duration + case .easeIn: + return (pow(2, 10 * (time / duration - 1)) - 0.0009765625) * 1.0009775171065499 + + case .easeOut: + return (-pow(2, -10 * time / duration)) + 1 * 1.0009775171065499 + } + } +} + +class AnimationController { + + private(set) var isAnimating: Bool = false + private(set) var animationDuration: TimeInterval = 0.0 + private(set) var currentTime: TimeInterval = 0.0 + + private(set) var start: AnimatableObject + private(set) var end: AnimatableObject + private(set) var current: AnimatableObject + + var timeFunction: TimeFunction = .linear + + var refreshClosure: (() -> Void)? +// var updateClosure: ((AnimatableObject) -> Void)? + var completionClosure: (() -> Void)? + + init(current: AnimatableObject, refreshClosure: (() -> Void)?) { + self.current = current + self.start = current + self.end = current + self.refreshClosure = refreshClosure + } + + func animate(to: AnimatableObject, duration: TimeInterval, timeFunction: TimeFunction = .linear) { + self.timeFunction = timeFunction + currentTime = 0 + animationDuration = duration + if animationDuration > 0 { + start = current + end = to + isAnimating = true + DisplayLinkService.shared.add(listner: self) + } else { + start = to + end = to + current = to + isAnimating = false + DisplayLinkService.shared.remove(listner: self) + } + refreshClosure?() + } + + func set(current: AnimatableObject) { + self.start = current + self.end = current + self.current = current + + animationDuration = 0.0 + currentTime = 0.0 +// updateClosure?(current) + refreshClosure?() + if isAnimating { + isAnimating = false + DisplayLinkService.shared.remove(listner: self) + } + } +} + +extension AnimationController: DisplayLinkListner { + func update(delta: TimeInterval) { + guard isAnimating else { + DisplayLinkService.shared.remove(listner: self) + return + } + + currentTime += delta + if currentTime > animationDuration || animationDuration <= 0 { + start = end + current = end + isAnimating = false + animationDuration = 0.0 + currentTime = 0.0 +// updateClosure?(end) + completionClosure?() + refreshClosure?() + DisplayLinkService.shared.remove(listner: self) + } else { + let offset = timeFunction.profress(time: currentTime, duration: animationDuration) + current = AnimatableObject.valueBetween(start: start, end: end, offset: offset) +// updateClosure?(current) + refreshClosure?() + } + } +} + +extension ClosedRange: Animatable where Bound: BinaryFloatingPoint { + static func valueBetween(start: ClosedRange, end: ClosedRange, offset: Double) -> ClosedRange { + let castedOffset = Bound(offset) + return ClosedRange(uncheckedBounds: (lower: start.lowerBound + (end.lowerBound - start.lowerBound) * castedOffset, + upper: start.upperBound + (end.upperBound - start.upperBound) * castedOffset)) + } +} + +extension CGFloat: Animatable { + static func valueBetween(start: CGFloat, end: CGFloat, offset: Double) -> CGFloat { + return start + (end - start) * CGFloat(offset) + } +} + +extension Double: Animatable { + static func valueBetween(start: Double, end: Double, offset: Double) -> Double { + return start + (end - start) * Double(offset) + } +} + +extension Int: Animatable { + static func valueBetween(start: Int, end: Int, offset: Double) -> Int { + return start + Int(Double(end - start) * offset) + } +} + +extension CGPoint: Animatable { + static func valueBetween(start: CGPoint, end: CGPoint, offset: Double) -> CGPoint { + return CGPoint(x: start.x + (end.x - start.x) * CGFloat(offset), + y: start.y + (end.y - start.y) * CGFloat(offset)) + } +} + +extension CGRect: Animatable { + static func valueBetween(start: CGRect, end: CGRect, offset: Double) -> CGRect { + return CGRect(x: start.origin.x + (end.origin.x - start.origin.x) * CGFloat(offset), + y: start.origin.y + (end.origin.y - start.origin.y) * CGFloat(offset), + width: start.width + (end.width - start.width) * CGFloat(offset), + height: start.height + (end.height - start.height) * CGFloat(offset)) + } +} + +struct UIColorContainer: Animatable { + var color: UIColor + + static func valueBetween(start: UIColorContainer, end: UIColorContainer, offset: Double) -> UIColorContainer { + return UIColorContainer(color: UIColor.valueBetween(start: start.color, end: end.color, offset: offset)) + } +} + +extension UIColor { + static func valueBetween(start: UIColor, end: UIColor, offset: Double) -> UIColor { + let offsetF = CGFloat(offset) + let startCIColor = CIColor(color: start) + let endCIColor = CIColor(color: end) + return UIColor(red: startCIColor.red + (endCIColor.red - startCIColor.red) * offsetF, + green: startCIColor.green + (endCIColor.green - startCIColor.green) * offsetF, + blue: startCIColor.blue + (endCIColor.blue - startCIColor.blue) * offsetF, + alpha: startCIColor.alpha + (endCIColor.alpha - startCIColor.alpha) * offsetF) + } +} diff --git a/submodules/Charts/Sources/Helpers/Array+Utils.swift b/submodules/Charts/Sources/Helpers/Array+Utils.swift new file mode 100644 index 0000000000..539a559756 --- /dev/null +++ b/submodules/Charts/Sources/Helpers/Array+Utils.swift @@ -0,0 +1,18 @@ +// +// Array+Utils.swift +// GraphTest +// +// Created by Andrei Salavei on 4/7/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import Foundation + +extension Array { + func safeElement(at index: Int) -> Element? { + if index >= 0 && index < count { + return self[index] + } + return nil + } +} diff --git a/submodules/Charts/Sources/Helpers/CGFloat.swift b/submodules/Charts/Sources/Helpers/CGFloat.swift new file mode 100644 index 0000000000..7bde39b84f --- /dev/null +++ b/submodules/Charts/Sources/Helpers/CGFloat.swift @@ -0,0 +1,17 @@ +// +// CGFloat.swift +// GraphTest +// +// Created by Andrei Salavei on 4/11/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +private let screenScale: CGFloat = UIScreen.main.scale + +extension CGFloat { + func roundedUpToPixelGrid() -> CGFloat { + return (self * screenScale).rounded(.up) / screenScale + } +} diff --git a/submodules/Charts/Sources/Helpers/CGPoint+Extensions.swift b/submodules/Charts/Sources/Helpers/CGPoint+Extensions.swift new file mode 100644 index 0000000000..b5bbd06da4 --- /dev/null +++ b/submodules/Charts/Sources/Helpers/CGPoint+Extensions.swift @@ -0,0 +1,219 @@ +// +// CGPoint+Extensions.swift +// GraphTest +// +// Created by Andrei Salavei on 4/11/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +extension CGPoint { + public init(vector: CGVector) { + self.init(x: vector.dx, y: vector.dy) + } + + + public init(angle: CGFloat) { + self.init(x: cos(angle), y: sin(angle)) + } + + + public mutating func offset(dx: CGFloat, dy: CGFloat) -> CGPoint { + x += dx + y += dy + return self + } + + public func length() -> CGFloat { + return sqrt(x*x + y*y) + } + + public func lengthSquared() -> CGFloat { + return x*x + y*y + } + + func normalized() -> CGPoint { + let len = length() + return len>0 ? self / len : CGPoint.zero + } + + public mutating func normalize() -> CGPoint { + self = normalized() + return self + } + + public func distanceTo(_ point: CGPoint) -> CGFloat { + return (self - point).length() + } + + public var angle: CGFloat { + return atan2(y, x) + } + + public var cgSize: CGSize { + return CGSize(width: x, height: y) + } + + func rotate(origin: CGPoint, angle: CGFloat) -> CGPoint { + let point = self - origin + let s = sin(angle) + let c = cos(angle) + return CGPoint(x: c * point.x - s * point.y, + y: s * point.x + c * point.y) + origin + } +} + +extension CGSize { + public var cgPoint: CGPoint { + return CGPoint(x: width, y: height) + } + + public init(point: CGPoint) { + self.init(width: point.x, height: point.y) + } +} + +public func + (left: CGPoint, right: CGPoint) -> CGPoint { + return CGPoint(x: left.x + right.x, y: left.y + right.y) +} + +public func += (left: inout CGPoint, right: CGPoint) { + left = left + right +} + +public func + (left: CGPoint, right: CGVector) -> CGPoint { + return CGPoint(x: left.x + right.dx, y: left.y + right.dy) +} + +public func += (left: inout CGPoint, right: CGVector) { + left = left + right +} + +public func - (left: CGPoint, right: CGPoint) -> CGPoint { return CGPoint(x: left.x - right.x, y: left.y - right.y) } +public func - (left: CGSize, right: CGSize) -> CGSize { return CGSize(width: left.width - right.width, height: left.height - right.height) } +public func - (left: CGSize, right: CGPoint) -> CGSize { return CGSize(width: left.width - right.x, height: left.height - right.x) } +public func - (left: CGPoint, right: CGSize) -> CGPoint { return CGPoint(x: left.x - right.width, y: left.y - right.height) } + +public func -= (left: inout CGPoint, right: CGPoint) { + left = left - right +} + +public func - (left: CGPoint, right: CGVector) -> CGPoint { + return CGPoint(x: left.x - right.dx, y: left.y - right.dy) +} + +public func -= (left: inout CGPoint, right: CGVector) { + left = left - right +} + +public func *= (left: inout CGPoint, right: CGPoint) { + left = left * right +} + +public func * (point: CGPoint, scalar: CGFloat) -> CGPoint { return CGPoint(x: point.x * scalar, y: point.y * scalar) } +public func * (point: CGSize, scalar: CGFloat) -> CGSize { return CGSize(width: point.width * scalar, height: point.height * scalar) } + +public func *= (point: inout CGPoint, scalar: CGFloat) { point = point * scalar } + +public func * (left: CGPoint, right: CGVector) -> CGPoint { + return CGPoint(x: left.x * right.dx, y: left.y * right.dy) +} + +public func *= (left: inout CGPoint, right: CGVector) { + left = left * right +} + +public func / (left: CGPoint, right: CGPoint) -> CGPoint { return CGPoint(x: left.x / right.x, y: left.y / right.y) } +public func / (left: CGSize, right: CGSize) -> CGSize { return CGSize(width: left.width / right.width, height: left.height / right.height) } +public func / (left: CGPoint, right: CGSize) -> CGPoint { return CGPoint(x: left.x / right.width, y: left.y / right.height) } +public func / (left: CGSize, right: CGPoint) -> CGSize { return CGSize(width: left.width / right.x, height: left.height / right.y) } +public func /= (left: inout CGPoint, right: CGPoint) { left = left / right } +public func /= (left: inout CGSize, right: CGSize) { left = left / right } +public func /= (left: inout CGSize, right: CGPoint) { left = left / right } +public func /= (left: inout CGPoint, right: CGSize) { left = left / right } + + +public func / (point: CGPoint, scalar: CGFloat) -> CGPoint { return CGPoint(x: point.x / scalar, y: point.y / scalar) } +public func / (point: CGSize, scalar: CGFloat) -> CGSize { return CGSize(width: point.width / scalar, height: point.height / scalar) } + +public func /= (point: inout CGPoint, scalar: CGFloat) { + point = point / scalar +} + +public func / (left: CGPoint, right: CGVector) -> CGPoint { + return CGPoint(x: left.x / right.dx, y: left.y / right.dy) +} + +public func / (left: CGSize, right: CGVector) -> CGSize { + return CGSize(width: left.width / right.dx, height: left.height / right.dy) +} + +public func /= (left: inout CGPoint, right: CGVector) { + left = left / right +} + +public func * (left: CGPoint, right: CGPoint) -> CGPoint { return CGPoint(x: left.x * right.x, y: left.y * right.y) } +public func * (left: CGPoint, right: CGSize) -> CGPoint { return CGPoint(x: left.x * right.width, y: left.y * right.height) } +public func *= (left: inout CGPoint, right: CGSize) { left = left * right } +public func * (left: CGSize, right: CGSize) -> CGSize { return CGSize(width: left.width * right.width, height: left.height * right.height) } +public func *= (left: inout CGSize, right: CGSize) { left = left * right } +public func * (left: CGSize, right: CGPoint) -> CGSize { return CGSize(width: left.width * right.x, height: left.height * right.y) } +public func *= (left: inout CGSize, right: CGPoint) { left = left * right } + + +public func lerp(start: CGPoint, end: CGPoint, t: CGFloat) -> CGPoint { + return start + (end - start) * t +} + +public func abs(_ point: CGPoint) -> CGPoint { + return CGPoint(x: abs(point.x), y: abs(point.y)) +} + +extension CGSize { + var isValid: Bool { + return width > 0 && height > 0 && width != .infinity && height != .infinity && width != .nan && height != .nan + } + + var ratio: CGFloat { + return width / height + } +} + + +extension CGRect { + static var identity: CGRect { + return CGRect(x: 0, y: 0, width: 1, height: 1) + } + + var center: CGPoint { + return origin + size.cgPoint / 2 + } + + var rounded: CGRect { + return CGRect(x: origin.x.rounded(), + y: origin.y.rounded(), + width: width.rounded(.up), + height: height.rounded(.up)) + } + + var mirroredVertically: CGRect { + return CGRect(x: origin.x, + y: 1.0 - (origin.y + height), + width: width, + height: height) + } +} + +extension CGAffineTransform { + func inverted(with size: CGSize) -> CGAffineTransform { + var transform = self + let transformedSize = CGRect(origin: .zero, size: size).applying(transform).size + transform.tx /= transformedSize.width; + transform.ty /= transformedSize.height; + transform = transform.inverted() + transform.tx *= transformedSize.width; + transform.ty *= transformedSize.height; + return transform + } +} diff --git a/submodules/Charts/Sources/Helpers/ClosedRange+Utils.swift b/submodules/Charts/Sources/Helpers/ClosedRange+Utils.swift new file mode 100644 index 0000000000..236d6c8a38 --- /dev/null +++ b/submodules/Charts/Sources/Helpers/ClosedRange+Utils.swift @@ -0,0 +1,15 @@ +// +// ClosedRange+Utils.swift +// GraphTest +// +// Created by Andrei Salavei on 3/11/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import Foundation + +extension ClosedRange where Bound: Numeric { + var distance: Bound { + return upperBound - lowerBound + } +} diff --git a/submodules/Charts/Sources/Helpers/CustomNavigationController.swift b/submodules/Charts/Sources/Helpers/CustomNavigationController.swift new file mode 100644 index 0000000000..977244dfcc --- /dev/null +++ b/submodules/Charts/Sources/Helpers/CustomNavigationController.swift @@ -0,0 +1,19 @@ +// +// CustomNavigationController.swift +// GraphTest +// +// Created by Andrew Solovey on 15/03/2019. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +class CustomNavigationController: UINavigationController { + override var preferredStatusBarStyle: UIStatusBarStyle { + return topViewController?.preferredStatusBarStyle ?? .default + } + + override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { + return topViewController?.preferredStatusBarUpdateAnimation ?? .fade + } +} diff --git a/submodules/Charts/Sources/Helpers/DisplayLinkService.swift b/submodules/Charts/Sources/Helpers/DisplayLinkService.swift new file mode 100644 index 0000000000..2c91471c39 --- /dev/null +++ b/submodules/Charts/Sources/Helpers/DisplayLinkService.swift @@ -0,0 +1,114 @@ +// +// DisplayLinkService.swift +// GraphTest +// +// Created by Andrei Salavei on 4/7/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit +import CoreGraphics + +public protocol DisplayLinkListner: class { + func update(delta: TimeInterval) +} + +// DispatchSource mares refreshes more accurate +class DisplayLinkService { + let listners = NSHashTable.weakObjects() + static let shared = DisplayLinkService() + + public func add(listner: DisplayLinkListner) { + listners.add(listner) + startDisplayLink() + } + + public func remove(listner: DisplayLinkListner) { + listners.remove(listner) + + if listners.count == 0 { + stopDisplayLink() + } + } + +// private init() { +// displayLink.add(to: .main, forMode: .common) +// displayLink.preferredFramesPerSecond = 60 +// displayLink.isPaused = true +// } +// +// // MARK: - Display Link +// private lazy var displayLink: CADisplayLink! = { CADisplayLink(target: self, selector: #selector(displayLinkDidFire)) } () +// private var previousTickTime = 0.0 +// +// private func startDisplayLink() { +// guard displayLink.isPaused else { +// return +// } +// previousTickTime = CACurrentMediaTime() +// displayLink.isPaused = false +// } +// +// @objc private func displayLinkDidFire(_ displayLink: CADisplayLink) { +// let currentTime = CACurrentMediaTime() +// let delta = currentTime - previousTickTime +// previousTickTime = currentTime +// let allListners = listners.allObjects +// var hasListners = false +// for listner in allListners { +// (listner as! DisplayLinkListner).update(delta: delta) +// hasListners = true +// } +// +// if !hasListners { +// stopDisplayLink() +// } +// } +// +// private func stopDisplayLink() { +// displayLink.isPaused = true +// } + + private init() { + dispatchSourceTimer.schedule(deadline: .now() + 1.0 / 60, repeating: 1.0 / 60) + dispatchSourceTimer.setEventHandler { + DispatchQueue.main.sync { + self.fire() + } + } + } + + private var dispatchSourceTimer = DispatchSource.makeTimerSource(flags: [], queue: .global(qos: .userInteractive)) + private var dispatchSourceTimerStarted: Bool = false + private var previousTickTime = 0.0 + + private func startDisplayLink() { + guard !dispatchSourceTimerStarted else { return } + dispatchSourceTimerStarted = true + previousTickTime = CACurrentMediaTime() + dispatchSourceTimer.resume() + } + + private func stopDisplayLink() { + guard dispatchSourceTimerStarted else { return } + dispatchSourceTimerStarted = false + dispatchSourceTimer.suspend() + } + + public func fire() { + let currentTime = CACurrentMediaTime() + + let delta = currentTime - previousTickTime + previousTickTime = currentTime + let allListners = listners.allObjects + var hasListners = false + for listner in allListners { + (listner as! DisplayLinkListner).update(delta: delta) + hasListners = true + } + + if !hasListners { + stopDisplayLink() + } + } +} diff --git a/submodules/Charts/Sources/Helpers/GlobalHelpers.swift b/submodules/Charts/Sources/Helpers/GlobalHelpers.swift new file mode 100644 index 0000000000..3f5c488ff9 --- /dev/null +++ b/submodules/Charts/Sources/Helpers/GlobalHelpers.swift @@ -0,0 +1,12 @@ +// +// GlobalHelpers.swift +// TrackingRecorder +// +// Created by Andrew Solovey on 07.09.2018. +// Copyright © 2018 Andrew Solovey. All rights reserved. +// + +public func crop(_ lower: Type, _ val: Type, _ upper: Type) -> Type where Type : Comparable { + assert(lower < upper, "Invalid lover and upper values") + return max(lower, min(upper, val)) +} diff --git a/submodules/Charts/Sources/Helpers/NumberFormatter+Utils.swift b/submodules/Charts/Sources/Helpers/NumberFormatter+Utils.swift new file mode 100644 index 0000000000..1254d44249 --- /dev/null +++ b/submodules/Charts/Sources/Helpers/NumberFormatter+Utils.swift @@ -0,0 +1,19 @@ +// +// NumberFormatter+Utils.swift +// GraphTest +// +// Created by Andrei Salavei on 4/12/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +extension NumberFormatter { + func string(from value: CGFloat) -> String { + return string(from: Double(value)) + } + + func string(from value: Double) -> String { + return string(from: NSNumber(value: Double(value))) ?? "" + } +} diff --git a/submodules/Charts/Sources/Helpers/OnePixelConstraint.swift b/submodules/Charts/Sources/Helpers/OnePixelConstraint.swift new file mode 100644 index 0000000000..03e33e6524 --- /dev/null +++ b/submodules/Charts/Sources/Helpers/OnePixelConstraint.swift @@ -0,0 +1,17 @@ +// +// OnePixelConstraint.swift +// GraphTest +// +// Created by Andrei Salavei on 4/13/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +public class OnePixelConstrain: NSLayoutConstraint { + public override func awakeFromNib() { + super.awakeFromNib() + + constant = UIView.oneDevicePixel + } +} diff --git a/submodules/Charts/Sources/Helpers/ScalesNumberFormatter.swift b/submodules/Charts/Sources/Helpers/ScalesNumberFormatter.swift new file mode 100644 index 0000000000..db067f8a95 --- /dev/null +++ b/submodules/Charts/Sources/Helpers/ScalesNumberFormatter.swift @@ -0,0 +1,32 @@ +// +// ScalesNumberFormatter.swift +// GraphTest +// +// Created by Andrei Salavei on 4/13/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +private let milionsScale = "M" +private let thousandsScale = "K" + +class ScalesNumberFormatter: NumberFormatter { + override func string(from number: NSNumber) -> String? { + let value = number.doubleValue + let pow = log10(value) + if pow >= 6 { + guard let string = super.string(from: NSNumber(value: value / 1_000_000)) else { + return nil + } + return string + milionsScale + } else if pow >= 4 { + guard let string = super.string(from: NSNumber(value: value / 1_000)) else { + return nil + } + return string + thousandsScale + } else { + return super.string(from: number) + } + } +} diff --git a/submodules/Charts/Sources/Helpers/TimeInterval+Utils.swift b/submodules/Charts/Sources/Helpers/TimeInterval+Utils.swift new file mode 100644 index 0000000000..204b1e861a --- /dev/null +++ b/submodules/Charts/Sources/Helpers/TimeInterval+Utils.swift @@ -0,0 +1,27 @@ +// +// TimeInterval+Utils.swift +// GraphTest +// +// Created by Andrei Salavei on 3/13/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import Foundation + +extension TimeInterval { + static let minute: TimeInterval = 60 + static let hour: TimeInterval = 60 * 60 + static let day: TimeInterval = 60 * 60 * 24 + static let osXDuration: TimeInterval = 0.25 + static let expandAnimationDuration: TimeInterval = 0.4 + static var animationDurationMultipler: Double = 1.0 + + static var defaultDuration: TimeInterval { + return innerDefaultDuration * animationDurationMultipler + } + private static var innerDefaultDuration: TimeInterval = osXDuration + + static func setDefaultSuration(_ duration: TimeInterval) { + innerDefaultDuration = duration + } +} diff --git a/submodules/Charts/Sources/Helpers/TimeZone.swift b/submodules/Charts/Sources/Helpers/TimeZone.swift new file mode 100644 index 0000000000..40ba9ab8f5 --- /dev/null +++ b/submodules/Charts/Sources/Helpers/TimeZone.swift @@ -0,0 +1,36 @@ +// +// TimeZone.swift +// GraphTest +// +// Created by Andrei Salavei on 4/9/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import Foundation + +extension TimeZone { + static let utc = TimeZone(secondsFromGMT: 0)! +} + +extension Locale { + static let posix = Locale(identifier: "en_US_POSIX") +} + +extension Calendar { + static let utc: Calendar = { + var calendar = Calendar.current + calendar.locale = Locale.posix + calendar.timeZone = TimeZone.utc + return calendar + }() +} + +extension DateFormatter { + static func utc(format: String = "") -> DateFormatter { + let formatter = DateFormatter() + formatter.calendar = Calendar.utc + formatter.dateFormat = format + formatter.timeZone = TimeZone.utc + return formatter + } +} diff --git a/submodules/Charts/Sources/Helpers/UIColor+Utils.swift b/submodules/Charts/Sources/Helpers/UIColor+Utils.swift new file mode 100644 index 0000000000..0a70421d5e --- /dev/null +++ b/submodules/Charts/Sources/Helpers/UIColor+Utils.swift @@ -0,0 +1,64 @@ +// +// UIColor+Utils.swift +// GraphTest +// +// Created by Andrei Salavei on 3/11/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +extension UIColor { + public convenience init?(hexString: String) { + let r, g, b, a: CGFloat + + if hexString.hasPrefix("#") { + let start = hexString.index(hexString.startIndex, offsetBy: 1) + let hexColor = String(hexString[start...]) + + if hexColor.count == 8 { + let scanner = Scanner(string: hexColor) + var hexNumber: UInt64 = 0 + + if scanner.scanHexInt64(&hexNumber) { + r = CGFloat((hexNumber & 0xff000000) >> 24) / 255 + g = CGFloat((hexNumber & 0x00ff0000) >> 16) / 255 + b = CGFloat((hexNumber & 0x0000ff00) >> 8) / 255 + a = CGFloat(hexNumber & 0x000000ff) / 255 + + self.init(red: r, green: g, blue: b, alpha: a) + return + } + } else if hexColor.count == 6 { + let scanner = Scanner(string: hexColor) + var hexNumber: UInt64 = 0 + + if scanner.scanHexInt64(&hexNumber) { + r = CGFloat((hexNumber & 0xff0000) >> 16) / 255 + g = CGFloat((hexNumber & 0x00ff00) >> 8) / 255 + b = CGFloat((hexNumber & 0x0000ff) >> 0) / 255 + + self.init(red: r, green: g, blue: b, alpha: 1.0) + return + } + } + } + return nil + } + + func image(_ size: CGSize = CGSize(width: 1, height: 1)) -> UIImage { + if #available(iOS 10.0, *) { + return UIGraphicsImageRenderer(size: size).image { rendererContext in + self.setFill() + rendererContext.fill(CGRect(origin: .zero, size: size)) + } + } else { + return UIImage() + } + } + + var redValue: CGFloat{ return CIColor(color: self).red } + var greenValue: CGFloat{ return CIColor(color: self).green } + var blueValue: CGFloat{ return CIColor(color: self).blue } + var alphaValue: CGFloat{ return CIColor(color: self).alpha } +} diff --git a/submodules/Charts/Sources/Helpers/UIImage+Utils.swift b/submodules/Charts/Sources/Helpers/UIImage+Utils.swift new file mode 100644 index 0000000000..50964025c2 --- /dev/null +++ b/submodules/Charts/Sources/Helpers/UIImage+Utils.swift @@ -0,0 +1,28 @@ +// +// UIImage+Utils.swift +// GraphTest +// +// Created by Andrei Salavei on 4/8/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +extension UIImage { + static let arrowRight = UIImage(bundleImageName: "Chart/arrow_right") + static let arrowLeft = UIImage(bundleImageName: "Chart/arrow_left") + + public convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) { + let rect = CGRect(origin: .zero, size: size) + UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0) + color.setFill() + UIRectFill(rect) + let image = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + + guard let cgImage = image?.cgImage else { return nil } + self.init(cgImage: cgImage) + } + + +} diff --git a/submodules/Charts/Sources/Helpers/UIImageView+Utils.swift b/submodules/Charts/Sources/Helpers/UIImageView+Utils.swift new file mode 100644 index 0000000000..608f25a114 --- /dev/null +++ b/submodules/Charts/Sources/Helpers/UIImageView+Utils.swift @@ -0,0 +1,24 @@ +// +// UIImageView+Utils.swift +// GraphTest +// +// Created by Andrei Salavei on 4/9/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +extension UIImageView { + func setImage(_ image: UIImage?, animated: Bool) { + if self.image != image { + if animated { + let animation = CATransition() + animation.timingFunction = CAMediaTimingFunction.init(name: .linear) + animation.type = .fade + animation.duration = .defaultDuration + self.layer.add(animation, forKey: "kCATransitionImageFade") + } + self.image = image + } + } +} diff --git a/submodules/Charts/Sources/Helpers/UILabel+Utils.swift b/submodules/Charts/Sources/Helpers/UILabel+Utils.swift new file mode 100644 index 0000000000..6c41c73fd9 --- /dev/null +++ b/submodules/Charts/Sources/Helpers/UILabel+Utils.swift @@ -0,0 +1,37 @@ +// +// UILabel+Utils.swift +// GraphTest +// +// Created by Andrei Salavei on 4/9/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +extension UILabel { + func setTextColor(_ color: UIColor, animated: Bool) { + if self.textColor != color { + if animated { + let animation = CATransition() + animation.timingFunction = CAMediaTimingFunction.init(name: .linear) + animation.type = .fade + animation.duration = .defaultDuration + self.layer.add(animation, forKey: "kCATransitionColorFade") + } + self.textColor = color + } + } + + func setText(_ title: String?, animated: Bool) { + if self.text != title { + if animated { + let animation = CATransition() + animation.timingFunction = CAMediaTimingFunction.init(name: .linear) + animation.type = .fade + animation.duration = .defaultDuration + self.layer.add(animation, forKey: "kCATransitionTextFade") + } + self.text = title + } + } +} diff --git a/submodules/Charts/Sources/Helpers/UIView+Extensions.swift b/submodules/Charts/Sources/Helpers/UIView+Extensions.swift new file mode 100644 index 0000000000..bba2d1f886 --- /dev/null +++ b/submodules/Charts/Sources/Helpers/UIView+Extensions.swift @@ -0,0 +1,57 @@ +// +// UIView+Extensions.swift +// GraphTest +// +// Created by Andrei Salavei on 4/10/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +extension UIView { + static let oneDevicePixel: CGFloat = (1.0 / max(2, min(1, UIScreen.main.scale))) +} + +// MARK: UIView+Animation +public extension UIView { + func bringToFront() { + superview?.bringSubviewToFront(self) + } + + func layoutIfNeeded(animated: Bool) { + UIView.perform(animated: animated) { + self.layoutIfNeeded() + } + } + + func setVisible(_ visible: Bool, animated: Bool) { + let updatedAlpha: CGFloat = visible ? 1 : 0 + if self.alpha != updatedAlpha { + UIView.perform(animated: animated) { + self.alpha = updatedAlpha + } + } + } + + static func perform(animated: Bool, animations: @escaping () -> Void) { + perform(animated: animated, animations: animations, completion: { _ in }) + } + + static func perform(animated: Bool, animations: @escaping () -> Void, completion: @escaping (Bool) -> Void) { + if animated { + + UIView.animate(withDuration: .defaultDuration, delay: 0, animations: animations, completion: completion) + } else { + animations() + completion(true) + } + } + + var isVisibleInWindow: Bool { + guard let windowBounds = window?.bounds else { + return false + } + let frame = convert(bounds, to: nil) + return frame.intersects(windowBounds) + } +} diff --git a/submodules/Charts/Sources/Models/ChartLineData.swift b/submodules/Charts/Sources/Models/ChartLineData.swift new file mode 100644 index 0000000000..79813a2a35 --- /dev/null +++ b/submodules/Charts/Sources/Models/ChartLineData.swift @@ -0,0 +1,76 @@ +// +// ChartLineData.swift +// GraphTest +// +// Created by Andrei Salavei on 3/13/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +struct ChartLineData { + var title: String + var color: UIColor + var width: CGFloat? + var points: [CGPoint] +} + +extension ChartLineData { + static func horizontalRange(lines: [ChartLineData]) -> ClosedRange? { + guard let firstPoint = lines.first?.points.first else { return nil } + var hMin: CGFloat = firstPoint.x + var hMax: CGFloat = firstPoint.x + + for line in lines { + if let first = line.points.first, + let last = line.points.last { + hMin = min(hMin, first.x) + hMax = max(hMax, last.x) + } + } + + return hMin...hMax + } + + static func verticalRange(lines: [ChartLineData], calculatingRange: ClosedRange? = nil, addBounds: Bool = false) -> ClosedRange? { + if let calculatingRange = calculatingRange { + guard let initalStart = lines.first?.points.first(where: { $0.x > calculatingRange.lowerBound && + $0.x < calculatingRange.upperBound }) else { return nil } + var vMin: CGFloat = initalStart.y + var vMax: CGFloat = initalStart.y + for line in lines { + if var index = line.points.firstIndex(where: { $0.x > calculatingRange.lowerBound }) { + if addBounds { + index = max(0, index - 1) + } + while index < line.points.count { + let point = line.points[index] + if point.x < calculatingRange.upperBound { + vMin = min(vMin, point.y) + vMax = max(vMax, point.y) + } else if addBounds { + vMin = min(vMin, point.y) + vMax = max(vMax, point.y) + break + } else { + break + } + index += 1 + } + } + } + return vMin...vMax + } else { + guard let firstPoint = lines.first?.points.first else { return nil } + var vMin: CGFloat = firstPoint.y + var vMax: CGFloat = firstPoint.y + for line in lines { + for point in line.points { + vMin = min(vMin, point.y) + vMax = max(vMax, point.y) + } + } + return vMin...vMax + } + } +} diff --git a/submodules/Charts/Sources/Models/ColorMode.swift b/submodules/Charts/Sources/Models/ColorMode.swift new file mode 100644 index 0000000000..f0de7b52ae --- /dev/null +++ b/submodules/Charts/Sources/Models/ColorMode.swift @@ -0,0 +1,175 @@ +// +// ColorMode.swift +// GraphTest +// +// Created by Andrew Solovey on 15/03/2019. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit +import AppBundle + +protocol ColorModeContainer { + func apply(colorMode: ColorMode, animated: Bool) +} + +enum ColorMode { + case day + case night +} + +extension ColorMode { + var chartTitleColor: UIColor { // ТекŃŃ‚ Ń Đ´Đ°Ń‚ĐľĐą на чарте + switch self { + case .day: return .black + case .night: return .white + } + } + + var actionButtonColor: UIColor { // Кнопка Zoom Out/ Смена режима день/ночь + switch self { + case .day: return UIColor(red: 53/255.0, green: 120/255.0, blue: 246/255.0, alpha: 1.0) + case .night: return UIColor(red: 84/255.0, green: 164/255.0, blue: 247/255.0, alpha: 1.0) + } + } + + var tableBackgroundColor: UIColor { + switch self { + case .day: return UIColor(red: 239/255.0, green: 239/255.0, blue: 244/255.0, alpha: 1.0) + case .night: return UIColor(red: 24/255.0, green: 34/255.0, blue: 45/255.0, alpha: 1.0) + } + } + + var chartBackgroundColor: UIColor { + switch self { + case .day: return UIColor(red: 254/255.0, green: 254/255.0, blue: 254/255.0, alpha: 1.0) + case .night: return UIColor(red: 34/255.0, green: 47/255.0, blue: 63/255.0, alpha: 1.0) + } + } + + var sectionTitleColor: UIColor { + switch self { + case .day: return UIColor(red: 109/255.0, green: 109/255.0, blue: 114/255.0, alpha: 1.0) + case .night: return UIColor(red: 133/255.0, green: 150/255.0, blue: 171/255.0, alpha: 1.0) + } + } + + var tableSeparatorColor: UIColor { + switch self { + case .day: return UIColor(red: 200/255.0, green: 199/255.0, blue: 204/255.0, alpha: 1.0) + case .night: return UIColor(red: 18/255.0, green: 26/255.0, blue: 35/255.0, alpha: 1.0) + } + } + + var chartLabelsColor: UIColor { + switch self { + case .day: return UIColor(red: 37/255.0, green: 37/255.0, blue: 41/255.0, alpha: 0.5) + case .night: return UIColor(red: 186/255.0, green: 204/255.0, blue: 225/255.0, alpha: 0.6) + } + } + + var chartHelperLinesColor: UIColor { + switch self { + case .day: return UIColor(red: 24/255.0, green: 45/255.0, blue: 59/255.0, alpha: 0.1) + case .night: return UIColor(red: 133/255.0, green: 150/255.0, blue: 171/255.0, alpha: 0.20) + } + } + + var chartStrongLinesColor: UIColor { + switch self { + case .day: return UIColor(red: 24/255.0, green: 45/255.0, blue: 59/255.0, alpha: 0.35) + case .night: return UIColor(red: 186/255.0, green: 204/255.0, blue: 225/255.0, alpha: 0.45) + } + } + + var barChartStrongLinesColor: UIColor { + switch self { + case .day: return UIColor(red: 37/255.0, green: 37/255.0, blue: 41/255.0, alpha: 0.2) + case .night: return UIColor(red: 186/255.0, green: 204/255.0, blue: 225/255.0, alpha: 0.45) + } + } + + var chartDetailsTextColor: UIColor { + switch self { + case .day: return UIColor(red: 109/255.0, green: 109/255.0, blue: 114/255.0, alpha: 1.0) + case .night: return UIColor(red: 254/255.0, green: 254/255.0, blue: 254/255.0, alpha: 1.0) + } + } + + var chartDetailsArrowColor: UIColor { + switch self { + case .day: return UIColor(red: 197/255.0, green: 199/255.0, blue: 205/255.0, alpha: 1.0) + case .night: return UIColor(red: 76/255.0, green: 84/255.0, blue: 96/255.0, alpha: 1.0) + } + } + + var chartDetailsViewColor: UIColor { + switch self { + case .day: return UIColor(red: 245/255.0, green: 245/255.0, blue: 251/255.0, alpha: 1.0) + case .night: return UIColor(red: 25/255.0, green: 35/255.0, blue: 47/255.0, alpha: 1.0) + } + } + + var descriptionChatNameColor: UIColor { + switch self { + case .day: return .black + case .night: return UIColor(red: 254/255.0, green: 254/255.0, blue: 254/255.0, alpha: 1.0) + } + } + + var descriptionActionColor: UIColor { + switch self { + case .day: return UIColor(red: 1/255.0, green: 125/255.0, blue: 229/255.0, alpha: 1.0) + case .night: return UIColor(red: 24/255.0, green: 145/255.0, blue: 255/255.0, alpha: 1.0) + } + } + + var rangeViewBackgroundColor: UIColor { + switch self { + case .day: return UIColor(red: 254/255.0, green: 254/255.0, blue: 254/255.0, alpha: 1.0) + case .night: return UIColor(red: 34/255.0, green: 47/255.0, blue: 63/255.0, alpha: 1.0) + } + } + + var rangeViewFrameColor: UIColor { + switch self { + case .day: return UIColor(red: 202/255.0, green: 212/255.0, blue: 222/255.0, alpha: 1.0) + case .night: return UIColor(red: 53/255.0, green: 70/255.0, blue: 89/255.0, alpha: 1.0) + } + } + + var rangeViewTintColor: UIColor { + switch self { + case .day: return UIColor(red: 239/255.0, green: 239/255.0, blue: 244/255.0, alpha: 0.5) + case .night: return UIColor(red: 24/255.0, green: 34/255.0, blue: 45/255.0, alpha: 0.5) + } + } + + var rangeViewMarkerColor: UIColor { + switch self { + case .day: return UIColor.white + case .night: return UIColor.white + } + } + + var statusBarStyle: UIStatusBarStyle { + switch self { + case .day: return .default + case .night: return .lightContent + } + } + + var viewTintColor: UIColor { + switch self { + case .day: return .black + case .night: return UIColor(red: 254/255.0, green: 254/255.0, blue: 254/255.0, alpha: 1.0) + } + } + + var rangeCropImage: UIImage? { + switch self { + case .day: return UIImage(bundleImageName: "Chart/selection_frame_light") + case .night: return UIImage(bundleImageName: "Chart/selection_frame_dark") + } + } +} diff --git a/submodules/Charts/Sources/Models/LinesChartLabel.swift b/submodules/Charts/Sources/Models/LinesChartLabel.swift new file mode 100644 index 0000000000..6ace8c2c65 --- /dev/null +++ b/submodules/Charts/Sources/Models/LinesChartLabel.swift @@ -0,0 +1,25 @@ +// +// LinesChartLabel.swift +// GraphTest +// +// Created by Andrei Salavei on 3/18/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +struct LinesChartLabel: Hashable { + let value: CGFloat + let text: String +} + +class AnimatedLinesChartLabels { + var labels: [LinesChartLabel] + var isAppearing: Bool = false + let alphaAnimator: AnimationController + + init(labels: [LinesChartLabel], alphaAnimator: AnimationController) { + self.labels = labels + self.alphaAnimator = alphaAnimator + } +} diff --git a/submodules/Charts/Sources/Models/LinesSelectionLabel.swift b/submodules/Charts/Sources/Models/LinesSelectionLabel.swift new file mode 100644 index 0000000000..0fd7142eda --- /dev/null +++ b/submodules/Charts/Sources/Models/LinesSelectionLabel.swift @@ -0,0 +1,15 @@ +// +// LinesSelectionLabel.swift +// GraphTest +// +// Created by Andrei Salavei on 3/18/19. +// Copyright © 2019 Andrei Salavei. All rights reserved. +// + +import UIKit + +struct LinesSelectionLabel { + let coordinate: CGPoint + let valueText: String + let color: UIColor +} diff --git a/submodules/ChatListUI/Sources/ChatListController.swift b/submodules/ChatListUI/Sources/ChatListController.swift index f2049711c5..4874490784 100644 --- a/submodules/ChatListUI/Sources/ChatListController.swift +++ b/submodules/ChatListUI/Sources/ChatListController.swift @@ -22,10 +22,6 @@ import AppBundle import LocalizedPeerData import TelegramIntents -public func useSpecialTabBarIcons() -> Bool { - return (Date(timeIntervalSince1970: 1545642000)...Date(timeIntervalSince1970: 1546387200)).contains(Date()) -} - private func fixListNodeScrolling(_ listNode: ListView, searchNode: NavigationBarSearchContentNode) -> Bool { if searchNode.expansionProgress > 0.0 && searchNode.expansionProgress < 1.0 { let scrollToItem: ListViewScrollToItem @@ -178,8 +174,8 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController, self.tabBarItem.title = self.presentationData.strings.DialogList_Title let icon: UIImage? - if (useSpecialTabBarIcons()) { - icon = UIImage(bundleImageName: "Chat List/Tabs/NY/IconChats") + if useSpecialTabBarIcons() { + icon = UIImage(bundleImageName: "Chat List/Tabs/Holiday/IconChats") } else { icon = UIImage(bundleImageName: "Chat List/Tabs/IconChats") } diff --git a/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift b/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift index 22e250ef4a..af2a6d1b88 100644 --- a/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift +++ b/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift @@ -715,7 +715,7 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo return (views, local) } } - |> mapToSignal{ viewsAndPeers -> Signal<(peers: [RenderedPeer], unread: [PeerId: (Int32, Bool)]), NoError> in + |> mapToSignal { viewsAndPeers -> Signal<(peers: [RenderedPeer], unread: [PeerId: (Int32, Bool)]), NoError> in return context.account.postbox.unreadMessageCountsView(items: viewsAndPeers.0.map {.peer($0.peerId)}) |> map { values in var unread: [PeerId: (Int32, Bool)] = [:] for peerView in viewsAndPeers.0 { @@ -804,8 +804,18 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo ) } - return combineLatest(accountPeer, foundLocalPeers, foundRemotePeers, foundRemoteMessages, presentationDataPromise.get(), searchStatePromise.get()) - |> map { accountPeer, foundLocalPeers, foundRemotePeers, foundRemoteMessages, presentationData, searchState -> ([ChatListSearchEntry], Bool)? in + let resolvedMessage = .single(nil) + |> then(context.sharedContext.resolveUrl(account: context.account, url: query) + |> mapToSignal { resolvedUrl -> Signal in + if case let .channelMessage(peerId, messageId) = resolvedUrl { + return downloadMessage(postbox: context.account.postbox, network: context.account.network, messageId: messageId) + } else { + return .single(nil) + } + }) + + return combineLatest(accountPeer, foundLocalPeers, foundRemotePeers, foundRemoteMessages, presentationDataPromise.get(), searchStatePromise.get(), resolvedMessage) + |> map { accountPeer, foundLocalPeers, foundRemotePeers, foundRemoteMessages, presentationData, searchState, resolvedMessage -> ([ChatListSearchEntry], Bool)? in var entries: [ChatListSearchEntry] = [] let isSearching = foundRemotePeers.2 || foundRemoteMessages.1 var index = 0 @@ -938,6 +948,17 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo } } + if let message = resolvedMessage { + var peer = RenderedPeer(message: message) + if let group = message.peers[message.id.peerId] as? TelegramGroup, let migrationReference = group.migrationReference { + if let channelPeer = message.peers[migrationReference.peerId] { + peer = RenderedPeer(peer: channelPeer) + } + } + entries.append(.message(message, peer, nil, presentationData)) + index += 1 + } + if !foundRemotePeers.2 { index = 0 for message in foundRemoteMessages.0.0 { diff --git a/submodules/ContactListUI/Sources/ContactsController.swift b/submodules/ContactListUI/Sources/ContactsController.swift index 7dcfc4b716..b65dfabfec 100644 --- a/submodules/ContactListUI/Sources/ContactsController.swift +++ b/submodules/ContactListUI/Sources/ContactsController.swift @@ -105,7 +105,12 @@ public class ContactsController: ViewController { self.title = self.presentationData.strings.Contacts_Title self.tabBarItem.title = self.presentationData.strings.Contacts_Title - let icon = UIImage(bundleImageName: "Chat List/Tabs/IconContacts") + let icon: UIImage? + if useSpecialTabBarIcons() { + icon = UIImage(bundleImageName: "Chat List/Tabs/Holiday/IconContacts") + } else { + icon = UIImage(bundleImageName: "Chat List/Tabs/IconContacts") + } self.tabBarItem.image = icon self.tabBarItem.selectedImage = icon diff --git a/submodules/Display/Display/TabBarNode.swift b/submodules/Display/Display/TabBarNode.swift index f83a6b1289..9301512ec1 100644 --- a/submodules/Display/Display/TabBarNode.swift +++ b/submodules/Display/Display/TabBarNode.swift @@ -442,7 +442,7 @@ class TabBarNode: ASDisplayNode { if horizontal { backgroundFrame = CGRect(origin: CGPoint(x: originX + 15.0, y: 3.0), size: backgroundSize) } else { - let contentWidth = node.contentWidth ?? node.frame.width + let contentWidth: CGFloat = 25.0 //node.contentWidth ?? node.frame.width backgroundFrame = CGRect(origin: CGPoint(x: floor(originX + node.frame.width / 2.0) + contentWidth - backgroundSize.width - 5.0, y: self.centered ? 9.0 : 2.0), size: backgroundSize) } transition.updateFrame(node: container.badgeContainerNode, frame: backgroundFrame) diff --git a/submodules/GalleryUI/Sources/GalleryController.swift b/submodules/GalleryUI/Sources/GalleryController.swift index 53b10ecb22..e0acc9d09c 100644 --- a/submodules/GalleryUI/Sources/GalleryController.swift +++ b/submodules/GalleryUI/Sources/GalleryController.swift @@ -332,7 +332,7 @@ public class GalleryController: ViewController, StandalonePresentableController private let centralItemRightBarButtonItem = Promise() private let centralItemRightBarButtonItems = Promise<[UIBarButtonItem]?>(nil) private let centralItemNavigationStyle = Promise() - private let centralItemFooterContentNode = Promise() + private let centralItemFooterContentNode = Promise<(GalleryFooterContentNode?, GalleryOverlayContentNode?)>() private let centralItemAttributesDisposable = DisposableSet(); private let _hiddenMedia = Promise<(MessageId, Media)?>(nil) @@ -531,9 +531,9 @@ public class GalleryController: ViewController, StandalonePresentableController } })) - self.centralItemAttributesDisposable.add(self.centralItemFooterContentNode.get().start(next: { [weak self] footerContentNode in + self.centralItemAttributesDisposable.add(self.centralItemFooterContentNode.get().start(next: { [weak self] footerContentNode, overlayContentNode in self?.galleryNode.updatePresentationState({ - $0.withUpdatedFooterContentNode(footerContentNode) + $0.withUpdatedFooterContentNode(footerContentNode).withUpdatedOverlayContentNode(overlayContentNode) }, transition: .immediate) })) diff --git a/submodules/GalleryUI/Sources/GalleryControllerNode.swift b/submodules/GalleryUI/Sources/GalleryControllerNode.swift index 0c82bd5bec..5409b07a5b 100644 --- a/submodules/GalleryUI/Sources/GalleryControllerNode.swift +++ b/submodules/GalleryUI/Sources/GalleryControllerNode.swift @@ -250,8 +250,8 @@ open class GalleryControllerNode: ASDisplayNode, UIScrollViewDelegate, UIGesture self.updateThumbnailContainerNodeAlpha(transition) } - self.footerNode.updateLayout(layout, footerContentNode: self.presentationState.footerContentNode, thumbnailPanelHeight: thumbnailPanelHeight, transition: transition) - + self.footerNode.updateLayout(layout, footerContentNode: self.presentationState.footerContentNode, overlayContentNode: self.presentationState.overlayContentNode, thumbnailPanelHeight: thumbnailPanelHeight, transition: transition) + let previousContentHeight = self.scrollView.contentSize.height let previousVerticalOffset = self.scrollView.contentOffset.y @@ -276,14 +276,14 @@ open class GalleryControllerNode: ASDisplayNode, UIScrollViewDelegate, UIGesture let alpha: CGFloat = self.areControlsHidden ? 0.0 : 1.0 self.navigationBar?.alpha = alpha self.statusBar?.updateAlpha(alpha, transition: .animated(duration: 0.3, curve: .easeInOut)) - self.footerNode.alpha = alpha + self.footerNode.setVisibilityAlpha(alpha) self.updateThumbnailContainerNodeAlpha(.immediate) }) } else { let alpha: CGFloat = self.areControlsHidden ? 0.0 : 1.0 self.navigationBar?.alpha = alpha self.statusBar?.updateAlpha(alpha, transition: .immediate) - self.footerNode.alpha = alpha + self.footerNode.setVisibilityAlpha(alpha) self.updateThumbnailContainerNodeAlpha(.immediate) } } diff --git a/submodules/GalleryUI/Sources/GalleryControllerPresentationState.swift b/submodules/GalleryUI/Sources/GalleryControllerPresentationState.swift index 7fd9620cb5..4881b7744e 100644 --- a/submodules/GalleryUI/Sources/GalleryControllerPresentationState.swift +++ b/submodules/GalleryUI/Sources/GalleryControllerPresentationState.swift @@ -2,16 +2,23 @@ import Foundation public final class GalleryControllerPresentationState { public let footerContentNode: GalleryFooterContentNode? + public let overlayContentNode: GalleryOverlayContentNode? public init() { self.footerContentNode = nil + self.overlayContentNode = nil } - public init(footerContentNode: GalleryFooterContentNode?) { + public init(footerContentNode: GalleryFooterContentNode?, overlayContentNode: GalleryOverlayContentNode?) { self.footerContentNode = footerContentNode + self.overlayContentNode = overlayContentNode } public func withUpdatedFooterContentNode(_ footerContentNode: GalleryFooterContentNode?) -> GalleryControllerPresentationState { - return GalleryControllerPresentationState(footerContentNode: footerContentNode) + return GalleryControllerPresentationState(footerContentNode: footerContentNode, overlayContentNode: self.overlayContentNode) + } + + public func withUpdatedOverlayContentNode(_ overlayContentNode: GalleryOverlayContentNode?) -> GalleryControllerPresentationState { + return GalleryControllerPresentationState(footerContentNode: self.footerContentNode, overlayContentNode: overlayContentNode) } } diff --git a/submodules/GalleryUI/Sources/GalleryFooterContentNode.swift b/submodules/GalleryUI/Sources/GalleryFooterContentNode.swift index 9fe0dadf41..1d9126eec0 100644 --- a/submodules/GalleryUI/Sources/GalleryFooterContentNode.swift +++ b/submodules/GalleryUI/Sources/GalleryFooterContentNode.swift @@ -31,3 +31,20 @@ open class GalleryFooterContentNode: ASDisplayNode { completion() } } + +open class GalleryOverlayContentNode: ASDisplayNode { + var visibilityAlpha: CGFloat = 1.0 + open func setVisibilityAlpha(_ alpha: CGFloat) { + self.visibilityAlpha = alpha + } + + open func updateLayout(size: CGSize, metrics: LayoutMetrics, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, transition: ContainedViewLayoutTransition) { + } + + open func animateIn(previousContentNode: GalleryOverlayContentNode?, transition: ContainedViewLayoutTransition) { + } + + open func animateOut(nextContentNode: GalleryOverlayContentNode?, transition: ContainedViewLayoutTransition, completion: @escaping () -> Void) { + completion() + } +} diff --git a/submodules/GalleryUI/Sources/GalleryFooterNode.swift b/submodules/GalleryUI/Sources/GalleryFooterNode.swift index 7537360dce..155f2cc358 100644 --- a/submodules/GalleryUI/Sources/GalleryFooterNode.swift +++ b/submodules/GalleryUI/Sources/GalleryFooterNode.swift @@ -7,6 +7,7 @@ public final class GalleryFooterNode: ASDisplayNode { private let backgroundNode: ASDisplayNode private var currentFooterContentNode: GalleryFooterContentNode? + private var currentOverlayContentNode: GalleryOverlayContentNode? private var currentLayout: (ContainerViewLayout, CGFloat)? private let controllerInteraction: GalleryControllerInteraction @@ -22,38 +23,59 @@ public final class GalleryFooterNode: ASDisplayNode { self.addSubnode(self.backgroundNode) } - public func updateLayout(_ layout: ContainerViewLayout, footerContentNode: GalleryFooterContentNode?, thumbnailPanelHeight: CGFloat, transition: ContainedViewLayoutTransition) { + private var visibilityAlpha: CGFloat = 1.0 + public func setVisibilityAlpha(_ alpha: CGFloat) { + self.visibilityAlpha = alpha + self.backgroundNode.alpha = alpha + self.currentFooterContentNode?.alpha = alpha + self.currentOverlayContentNode?.setVisibilityAlpha(alpha) + } + + public func updateLayout(_ layout: ContainerViewLayout, footerContentNode: GalleryFooterContentNode?, overlayContentNode: GalleryOverlayContentNode?, thumbnailPanelHeight: CGFloat, transition: ContainedViewLayoutTransition) { self.currentLayout = (layout, thumbnailPanelHeight) let cleanInsets = layout.insets(options: []) - var removeCurrentFooterContentNode: GalleryFooterContentNode? + var dismissedCurrentFooterContentNode: GalleryFooterContentNode? if self.currentFooterContentNode !== footerContentNode { if let currentFooterContentNode = self.currentFooterContentNode { currentFooterContentNode.requestLayout = nil - removeCurrentFooterContentNode = currentFooterContentNode + dismissedCurrentFooterContentNode = currentFooterContentNode } self.currentFooterContentNode = footerContentNode if let footerContentNode = footerContentNode { + footerContentNode.alpha = self.visibilityAlpha footerContentNode.controllerInteraction = self.controllerInteraction footerContentNode.requestLayout = { [weak self] transition in if let strongSelf = self, let (currentLayout, currentThumbnailPanelHeight) = strongSelf.currentLayout { - strongSelf.updateLayout(currentLayout, footerContentNode: strongSelf.currentFooterContentNode, thumbnailPanelHeight: currentThumbnailPanelHeight, transition: transition) + strongSelf.updateLayout(currentLayout, footerContentNode: strongSelf.currentFooterContentNode, overlayContentNode: strongSelf.currentOverlayContentNode, thumbnailPanelHeight: currentThumbnailPanelHeight, transition: transition) } } self.addSubnode(footerContentNode) } } + var dismissedCurrentOverlayContentNode: GalleryOverlayContentNode? + if self.currentOverlayContentNode !== overlayContentNode { + if let currentOverlayContentNode = self.currentOverlayContentNode { + dismissedCurrentOverlayContentNode = currentOverlayContentNode + } + self.currentOverlayContentNode = overlayContentNode + if let overlayContentNode = overlayContentNode { + overlayContentNode.setVisibilityAlpha(self.visibilityAlpha) + self.addSubnode(overlayContentNode) + } + } + var backgroundHeight: CGFloat = 0.0 if let footerContentNode = self.currentFooterContentNode { backgroundHeight = footerContentNode.updateLayout(size: layout.size, metrics: layout.metrics, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, bottomInset: cleanInsets.bottom, contentInset: thumbnailPanelHeight, transition: transition) transition.updateFrame(node: footerContentNode, frame: CGRect(origin: CGPoint(x: 0.0, y: layout.size.height - backgroundHeight), size: CGSize(width: layout.size.width, height: backgroundHeight))) - if let removeCurrentFooterContentNode = removeCurrentFooterContentNode { + if let dismissedCurrentFooterContentNode = dismissedCurrentFooterContentNode { let contentTransition = ContainedViewLayoutTransition.animated(duration: 0.4, curve: .spring) - footerContentNode.animateIn(fromHeight: removeCurrentFooterContentNode.bounds.height, previousContentNode: removeCurrentFooterContentNode, transition: contentTransition) - removeCurrentFooterContentNode.animateOut(toHeight: backgroundHeight, nextContentNode: footerContentNode, transition: contentTransition, completion: { [weak self, weak removeCurrentFooterContentNode] in - if let strongSelf = self, let removeCurrentFooterContentNode = removeCurrentFooterContentNode, removeCurrentFooterContentNode !== strongSelf.currentFooterContentNode { - removeCurrentFooterContentNode.removeFromSupernode() + footerContentNode.animateIn(fromHeight: dismissedCurrentFooterContentNode.bounds.height, previousContentNode: dismissedCurrentFooterContentNode, transition: contentTransition) + dismissedCurrentFooterContentNode.animateOut(toHeight: backgroundHeight, nextContentNode: footerContentNode, transition: contentTransition, completion: { [weak self, weak dismissedCurrentFooterContentNode] in + if let strongSelf = self, let dismissedCurrentFooterContentNode = dismissedCurrentFooterContentNode, dismissedCurrentFooterContentNode !== strongSelf.currentFooterContentNode { + dismissedCurrentFooterContentNode.removeFromSupernode() } }) contentTransition.updateFrame(node: self.backgroundNode, frame: CGRect(origin: CGPoint(x: 0.0, y: layout.size.height - backgroundHeight), size: CGSize(width: layout.size.width, height: backgroundHeight))) @@ -61,15 +83,41 @@ public final class GalleryFooterNode: ASDisplayNode { transition.updateFrame(node: self.backgroundNode, frame: CGRect(origin: CGPoint(x: 0.0, y: layout.size.height - backgroundHeight), size: CGSize(width: layout.size.width, height: backgroundHeight))) } } else { - if let removeCurrentFooterContentNode = removeCurrentFooterContentNode { - removeCurrentFooterContentNode.removeFromSupernode() + if let dismissedCurrentFooterContentNode = dismissedCurrentFooterContentNode { + dismissedCurrentFooterContentNode.removeFromSupernode() } transition.updateFrame(node: self.backgroundNode, frame: CGRect(origin: CGPoint(x: 0.0, y: layout.size.height - backgroundHeight), size: CGSize(width: layout.size.width, height: backgroundHeight))) } + + let contentTransition = ContainedViewLayoutTransition.animated(duration: 0.4, curve: .spring) + if let overlayContentNode = self.currentOverlayContentNode { + overlayContentNode.updateLayout(size: layout.size, metrics: layout.metrics, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, bottomInset: backgroundHeight, transition: transition) + transition.updateFrame(node: overlayContentNode, frame: CGRect(origin: CGPoint(), size: layout.size)) + + overlayContentNode.animateIn(previousContentNode: dismissedCurrentOverlayContentNode, transition: contentTransition) + if let dismissedCurrentOverlayContentNode = dismissedCurrentOverlayContentNode { + dismissedCurrentOverlayContentNode.animateOut(nextContentNode: overlayContentNode, transition: contentTransition, completion: { [weak self, weak dismissedCurrentOverlayContentNode] in + if let strongSelf = self, let dismissedCurrentOverlayContentNode = dismissedCurrentOverlayContentNode, dismissedCurrentOverlayContentNode !== strongSelf.currentOverlayContentNode { + dismissedCurrentOverlayContentNode.removeFromSupernode() + } + }) + } + } else { + if let dismissedCurrentOverlayContentNode = dismissedCurrentOverlayContentNode { + dismissedCurrentOverlayContentNode.animateOut(nextContentNode: overlayContentNode, transition: contentTransition, completion: { [weak self, weak dismissedCurrentOverlayContentNode] in + if let strongSelf = self, let dismissedCurrentOverlayContentNode = dismissedCurrentOverlayContentNode, dismissedCurrentOverlayContentNode !== strongSelf.currentOverlayContentNode { + dismissedCurrentOverlayContentNode.removeFromSupernode() + } + }) + } + } } override public func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + if let overlayResult = self.currentOverlayContentNode?.hitTest(point, with: event) { + return overlayResult + } if !self.backgroundNode.frame.contains(point) { return nil } diff --git a/submodules/GalleryUI/Sources/GalleryItemNode.swift b/submodules/GalleryUI/Sources/GalleryItemNode.swift index ce3d8b3c59..615bdde364 100644 --- a/submodules/GalleryUI/Sources/GalleryItemNode.swift +++ b/submodules/GalleryUI/Sources/GalleryItemNode.swift @@ -21,6 +21,8 @@ open class GalleryItemNode: ASDisplayNode { } public var toggleControlsVisibility: () -> Void = { } + public var goToPreviousItem: () -> Void = { } + public var goToNextItem: () -> Void = { } public var dismiss: () -> Void = { } public var beginCustomDismiss: () -> Void = { } public var completeCustomDismiss: () -> Void = { } @@ -54,8 +56,8 @@ open class GalleryItemNode: ASDisplayNode { return .single(nil) } - open func footerContent() -> Signal { - return .single(nil) + open func footerContent() -> Signal<(GalleryFooterContentNode?, GalleryOverlayContentNode?), NoError> { + return .single((nil, nil)) } open func navigationStyle() -> Signal { diff --git a/submodules/GalleryUI/Sources/GalleryPagerNode.swift b/submodules/GalleryUI/Sources/GalleryPagerNode.swift index fea7e407af..125b432cdc 100644 --- a/submodules/GalleryUI/Sources/GalleryPagerNode.swift +++ b/submodules/GalleryUI/Sources/GalleryPagerNode.swift @@ -241,6 +241,20 @@ public final class GalleryPagerNode: ASDisplayNode, UIScrollViewDelegate { private func makeNodeForItem(at index: Int) -> GalleryItemNode { let node = self.items[index].node() node.toggleControlsVisibility = self.toggleControlsVisibility + node.goToPreviousItem = { [weak self] in + if let strongSelf = self { + if let index = strongSelf.centralItemIndex, index > 0 { + strongSelf.transaction(GalleryPagerTransaction(deleteItems: [], insertItems: [], updateItems: [], focusOnItem: index - 1)) + } + } + } + node.goToNextItem = { [weak self] in + if let strongSelf = self { + if let index = strongSelf.centralItemIndex, index < strongSelf.items.count - 1 { + strongSelf.transaction(GalleryPagerTransaction(deleteItems: [], insertItems: [], updateItems: [], focusOnItem: index + 1)) + } + } + } node.dismiss = self.dismiss node.beginCustomDismiss = self.beginCustomDismiss node.completeCustomDismiss = self.completeCustomDismiss @@ -314,7 +328,7 @@ public final class GalleryPagerNode: ASDisplayNode, UIScrollViewDelegate { } } - if centralItemIndex != items.count - 1 { + if centralItemIndex != self.items.count - 1 { if self.shouldLoadItems(force: forceLoad) && self.visibleItemNode(at: centralItemIndex + 1) == nil { let node = self.makeNodeForItem(at: centralItemIndex + 1) node.frame = centralItemNode.frame.offsetBy(dx: centralItemNode.frame.size.width + self.pageGap, dy: 0.0) diff --git a/submodules/GalleryUI/Sources/Items/ChatAnimationGalleryItem.swift b/submodules/GalleryUI/Sources/Items/ChatAnimationGalleryItem.swift index f4f24f1221..834d6758d1 100644 --- a/submodules/GalleryUI/Sources/Items/ChatAnimationGalleryItem.swift +++ b/submodules/GalleryUI/Sources/Items/ChatAnimationGalleryItem.swift @@ -325,8 +325,8 @@ final class ChatAnimationGalleryItemNode: ZoomableContentGalleryItemNode { return self._rightBarButtonItems.get() } - override func footerContent() -> Signal { - return .single(self.footerContentNode) + override func footerContent() -> Signal<(GalleryFooterContentNode?, GalleryOverlayContentNode?), NoError> { + return .single((self.footerContentNode, nil)) } @objc func statusPressed() { diff --git a/submodules/GalleryUI/Sources/Items/ChatDocumentGalleryItem.swift b/submodules/GalleryUI/Sources/Items/ChatDocumentGalleryItem.swift index 1537d93a17..2be4d488cc 100644 --- a/submodules/GalleryUI/Sources/Items/ChatDocumentGalleryItem.swift +++ b/submodules/GalleryUI/Sources/Items/ChatDocumentGalleryItem.swift @@ -375,8 +375,8 @@ class ChatDocumentGalleryItemNode: ZoomableContentGalleryItemNode, WKNavigationD self.statusNodeContainer.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.15, timingFunction: CAMediaTimingFunctionName.easeIn.rawValue, removeOnCompletion: false) } - override func footerContent() -> Signal { - return .single(self.footerContentNode) + override func footerContent() -> Signal<(GalleryFooterContentNode?, GalleryOverlayContentNode?), NoError> { + return .single((self.footerContentNode, nil)) } @objc func statusPressed() { diff --git a/submodules/GalleryUI/Sources/Items/ChatExternalFileGalleryItem.swift b/submodules/GalleryUI/Sources/Items/ChatExternalFileGalleryItem.swift index c0714f5fd1..753b5cc904 100644 --- a/submodules/GalleryUI/Sources/Items/ChatExternalFileGalleryItem.swift +++ b/submodules/GalleryUI/Sources/Items/ChatExternalFileGalleryItem.swift @@ -310,8 +310,8 @@ class ChatExternalFileGalleryItemNode: GalleryItemNode { self.statusNodeContainer.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.15, timingFunction: CAMediaTimingFunctionName.easeIn.rawValue, removeOnCompletion: false) } - override func footerContent() -> Signal { - return .single(self.footerContentNode) + override func footerContent() -> Signal<(GalleryFooterContentNode?, GalleryOverlayContentNode?), NoError> { + return .single((self.footerContentNode, nil)) } @objc func statusPressed() { diff --git a/submodules/GalleryUI/Sources/Items/ChatImageGalleryItem.swift b/submodules/GalleryUI/Sources/Items/ChatImageGalleryItem.swift index 083195070c..e07033342e 100644 --- a/submodules/GalleryUI/Sources/Items/ChatImageGalleryItem.swift +++ b/submodules/GalleryUI/Sources/Items/ChatImageGalleryItem.swift @@ -505,8 +505,8 @@ final class ChatImageGalleryItemNode: ZoomableContentGalleryItemNode { return self._rightBarButtonItem.get() } - override func footerContent() -> Signal { - return .single(self.footerContentNode) + override func footerContent() -> Signal<(GalleryFooterContentNode?, GalleryOverlayContentNode?), NoError> { + return .single((self.footerContentNode, nil)) } @objc func statusPressed() { diff --git a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift index 183bce8efd..dc01efd988 100644 --- a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift +++ b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift @@ -145,6 +145,87 @@ private final class UniversalVideoGalleryItemPictureInPictureNode: ASDisplayNode } } +private let soundOnImage = generateTintedImage(image: UIImage(bundleImageName: "Media Gallery/SoundOn"), color: .white) +private let soundOffImage = generateTintedImage(image: UIImage(bundleImageName: "Media Gallery/SoundOff"), color: .white) +private var roundButtonBackgroundImage = { + return generateImage(CGSize(width: 42.0, height: 42), rotatedContext: { size, context in + let bounds = CGRect(origin: CGPoint(), size: size) + context.clear(bounds) + context.setFillColor(UIColor(white: 0.0, alpha: 0.5).cgColor) + context.fillEllipse(in: bounds) + }) +}() + +private final class UniversalVideoGalleryItemOverlayNode: GalleryOverlayContentNode { + private let soundButtonNode: HighlightableButtonNode + private var validLayout: (CGSize, LayoutMetrics, CGFloat, CGFloat, CGFloat)? + + override init() { + self.soundButtonNode = HighlightableButtonNode() + self.soundButtonNode.alpha = 0.0 + self.soundButtonNode.setBackgroundImage(roundButtonBackgroundImage, for: .normal) + self.soundButtonNode.setImage(soundOffImage, for: .normal) + self.soundButtonNode.setImage(soundOnImage, for: .selected) + self.soundButtonNode.setImage(soundOnImage, for: [.selected, .highlighted]) + + super.init() + + self.soundButtonNode.addTarget(self, action: #selector(self.soundButtonPressed), forControlEvents: .touchUpInside) + self.addSubnode(self.soundButtonNode) + } + + func hide() { + self.soundButtonNode.isHidden = true + } + + override func updateLayout(size: CGSize, metrics: LayoutMetrics, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, transition: ContainedViewLayoutTransition) { + self.validLayout = (size, metrics, leftInset, rightInset, bottomInset) + + let soundButtonDiameter: CGFloat = 42.0 + let inset: CGFloat = 12.0 + let effectiveBottomInset = self.visibilityAlpha < 1.0 ? 0.0 : bottomInset + let soundButtonFrame = CGRect(origin: CGPoint(x: size.width - soundButtonDiameter - inset - rightInset, y: size.height - soundButtonDiameter - inset - effectiveBottomInset), size: CGSize(width: soundButtonDiameter, height: soundButtonDiameter)) + transition.updateFrame(node: self.soundButtonNode, frame: soundButtonFrame) + } + + override func animateIn(previousContentNode: GalleryOverlayContentNode?, transition: ContainedViewLayoutTransition) { + transition.updateAlpha(node: self.soundButtonNode, alpha: 1.0) + } + + override func animateOut(nextContentNode: GalleryOverlayContentNode?, transition: ContainedViewLayoutTransition, completion: @escaping () -> Void) { + transition.updateAlpha(node: self.soundButtonNode, alpha: 0.0) + } + + override func setVisibilityAlpha(_ alpha: CGFloat) { + super.setVisibilityAlpha(alpha) + self.updateSoundButtonVisibility() + } + + func updateSoundButtonVisibility() { + if self.soundButtonNode.isSelected { + self.soundButtonNode.alpha = self.visibilityAlpha + } else { + self.soundButtonNode.alpha = 1.0 + } + + if let validLayout = self.validLayout { + self.updateLayout(size: validLayout.0, metrics: validLayout.1, leftInset: validLayout.2, rightInset: validLayout.3, bottomInset: validLayout.4, transition: .animated(duration: 0.3, curve: .easeInOut)) + } + } + + @objc func soundButtonPressed() { + self.soundButtonNode.isSelected = !self.soundButtonNode.isSelected + self.updateSoundButtonVisibility() + } + + override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + if !self.soundButtonNode.frame.contains(point) { + return nil + } + return super.hitTest(point, with: event) + } +} + private struct FetchControls { let fetch: () -> Void let cancel: () -> Void @@ -161,6 +242,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { private let scrubberView: ChatVideoGalleryItemScrubberView private let footerContentNode: ChatItemGalleryFooterContentNode + private let overlayContentNode: UniversalVideoGalleryItemOverlayNode private var videoNode: UniversalVideoNode? private var videoFramePreview: MediaPlayerFramePreview? @@ -206,6 +288,8 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { self.footerContentNode.performAction = performAction self.footerContentNode.openActionOptions = openActionOptions + self.overlayContentNode = UniversalVideoGalleryItemOverlayNode() + self.statusButtonNode = HighlightableButtonNode() self.statusNode = RadialStatusNode(backgroundNodeColor: UIColor(white: 0.0, alpha: 0.5)) self.statusNode.frame = CGRect(origin: CGPoint(), size: CGSize(width: 50.0, height: 50.0)) @@ -398,6 +482,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { videoNode.backgroundColor = videoNode.ownsContentNode ? UIColor.black : UIColor(rgb: 0x333335) if item.fromPlayingVideo { videoNode.canAttachContent = false + self.overlayContentNode.hide() } else { self.updateDisplayPlaceholder(!videoNode.ownsContentNode) } @@ -982,7 +1067,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { transformedSuperFrame = transformedSuperFrame.offsetBy(dx: videoNode.position.x - previousFrame.center.x, dy: videoNode.position.y - previousFrame.center.y) } - let initialScale: CGFloat = 1.0 //min(videoNode.layer.bounds.width / node.0.view.bounds.width, videoNode.layer.bounds.height / node.0.view.bounds.height) + let initialScale: CGFloat = 1.0 let targetScale = max(transformedFrame.size.width / videoNode.layer.bounds.size.width, transformedFrame.size.height / videoNode.layer.bounds.size.height) videoNode.backgroundColor = .clear @@ -1197,7 +1282,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { } } - override func footerContent() -> Signal { - return .single(self.footerContentNode) + override func footerContent() -> Signal<(GalleryFooterContentNode?, GalleryOverlayContentNode?), NoError> { + return .single((self.footerContentNode, self.overlayContentNode)) } } diff --git a/submodules/GalleryUI/Sources/ZoomableContentGalleryItemNode.swift b/submodules/GalleryUI/Sources/ZoomableContentGalleryItemNode.swift index 7c7851232a..a0abf7e711 100644 --- a/submodules/GalleryUI/Sources/ZoomableContentGalleryItemNode.swift +++ b/submodules/GalleryUI/Sources/ZoomableContentGalleryItemNode.swift @@ -3,8 +3,36 @@ import UIKit import Display import AsyncDisplayKit +private let leftFadeImage = generateImage(CGSize(width: 64.0, height: 1.0), opaque: false, rotatedContext: { size, context in + let bounds = CGRect(origin: CGPoint(), size: size) + context.clear(bounds) + + let gradientColors = [UIColor.black.withAlphaComponent(0.5).cgColor, UIColor.black.withAlphaComponent(0.0).cgColor] as CFArray + + var locations: [CGFloat] = [0.0, 1.0] + let colorSpace = CGColorSpaceCreateDeviceRGB() + let gradient = CGGradient(colorsSpace: colorSpace, colors: gradientColors, locations: &locations)! + + context.drawLinearGradient(gradient, start: CGPoint(x: 0.0, y: 0.0), end: CGPoint(x: 64.0, y: 0.0), options: CGGradientDrawingOptions()) +}) + +private let rightFadeImage = generateImage(CGSize(width: 64.0, height: 1.0), opaque: false, rotatedContext: { size, context in + let bounds = CGRect(origin: CGPoint(), size: size) + context.clear(bounds) + + let gradientColors = [UIColor.black.withAlphaComponent(0.0).cgColor, UIColor.black.withAlphaComponent(0.5).cgColor] as CFArray + + var locations: [CGFloat] = [0.0, 1.0] + let colorSpace = CGColorSpaceCreateDeviceRGB() + let gradient = CGGradient(colorsSpace: colorSpace, colors: gradientColors, locations: &locations)! + + context.drawLinearGradient(gradient, start: CGPoint(x: 0.0, y: 0.0), end: CGPoint(x: 64.0, y: 0.0), options: CGGradientDrawingOptions()) +}) + open class ZoomableContentGalleryItemNode: GalleryItemNode, UIScrollViewDelegate { public let scrollNode: ASScrollNode + private let leftFadeNode: ASImageNode + private let rightFadeNode: ASImageNode private var containerLayout: ContainerViewLayout? @@ -32,6 +60,16 @@ open class ZoomableContentGalleryItemNode: GalleryItemNode, UIScrollViewDelegate self.scrollNode.view.contentInsetAdjustmentBehavior = .never } + self.leftFadeNode = ASImageNode() + self.leftFadeNode.contentMode = .scaleToFill + self.leftFadeNode.image = leftFadeImage + self.leftFadeNode.isHidden = true + + self.rightFadeNode = ASImageNode() + self.rightFadeNode.contentMode = .scaleToFill + self.rightFadeNode.image = rightFadeImage + self.rightFadeNode.isHidden = true + super.init() self.scrollNode.view.delegate = self @@ -42,41 +80,69 @@ open class ZoomableContentGalleryItemNode: GalleryItemNode, UIScrollViewDelegate self.scrollNode.view.delaysContentTouches = false let tapRecognizer = TapLongTapOrDoubleTapGestureRecognizer(target: self, action: #selector(self.contentTap(_:))) - tapRecognizer.tapActionAtPoint = { _ in + tapRecognizer.tapActionAtPoint = { [weak self] location in + if let strongSelf = self { + if location.x < 44.0 || location.x > strongSelf.frame.width - 44.0 { + return .waitForSingleTap + } + } return .waitForDoubleTap } + tapRecognizer.highlight = { [weak self] location in + if let strongSelf = self { + if let location = location, location.x < 44.0 { + strongSelf.leftFadeNode.isHidden = false + } else { + strongSelf.leftFadeNode.isHidden = true + } + if let location = location, location.x > strongSelf.frame.width - 44.0 { + strongSelf.rightFadeNode.isHidden = false + } else { + strongSelf.rightFadeNode.isHidden = true + } + } + } self.scrollNode.view.addGestureRecognizer(tapRecognizer) + self.addSubnode(self.scrollNode) + self.addSubnode(self.leftFadeNode) + self.addSubnode(self.rightFadeNode) } @objc open func contentTap(_ recognizer: TapLongTapOrDoubleTapGestureRecognizer) { if recognizer.state == .ended { if let (gesture, location) = recognizer.lastRecognizedGestureAndLocation { - switch gesture { - case .tap: - self.toggleControlsVisibility() - case .doubleTap: - if let contentView = self.zoomableContent?.1.view, self.scrollNode.view.zoomScale.isLessThanOrEqualTo(self.scrollNode.view.minimumZoomScale) { - let pointInView = self.scrollNode.view.convert(location, to: contentView) - - let newZoomScale = self.scrollNode.view.maximumZoomScale - let scrollViewSize = self.scrollNode.view.bounds.size - - let w = scrollViewSize.width / newZoomScale - let h = scrollViewSize.height / newZoomScale - let x = pointInView.x - (w / 2.0) - let y = pointInView.y - (h / 2.0) - - let rectToZoomTo = CGRect(x: x, y: y, width: w, height: h) - - self.scrollNode.view.zoom(to: rectToZoomTo, animated: true) - } else { - self.scrollNode.view.setZoomScale(self.scrollNode.view.minimumZoomScale, animated: true) - } - default: - break + if location.x < 44.0 { + self.goToPreviousItem() + } else if location.x > self.frame.width - 44.0 { + self.goToNextItem() + } else { + switch gesture { + case .tap: + self.toggleControlsVisibility() + case .doubleTap: + if let contentView = self.zoomableContent?.1.view, self.scrollNode.view.zoomScale.isLessThanOrEqualTo(self.scrollNode.view.minimumZoomScale) { + let pointInView = self.scrollNode.view.convert(location, to: contentView) + + let newZoomScale = self.scrollNode.view.maximumZoomScale + let scrollViewSize = self.scrollNode.view.bounds.size + + let w = scrollViewSize.width / newZoomScale + let h = scrollViewSize.height / newZoomScale + let x = pointInView.x - (w / 2.0) + let y = pointInView.y - (h / 2.0) + + let rectToZoomTo = CGRect(x: x, y: y, width: w, height: h) + + self.scrollNode.view.zoom(to: rectToZoomTo, animated: true) + } else { + self.scrollNode.view.setZoomScale(self.scrollNode.view.minimumZoomScale, animated: true) + } + default: + break + } } } } @@ -93,6 +159,9 @@ open class ZoomableContentGalleryItemNode: GalleryItemNode, UIScrollViewDelegate } self.containerLayout = layout + self.leftFadeNode.frame = CGRect(x: 0.0, y: 0.0, width: layout.size.width * 0.2, height: layout.size.height) + self.rightFadeNode.frame = CGRect(x: layout.size.width - layout.size.width * 0.2, y: 0.0, width: layout.size.width * 0.2, height: layout.size.height) + if shouldResetContents { var previousFrame: CGRect? var previousScale: CGFloat? diff --git a/submodules/InstantPageUI/Sources/InstantImageGalleryItem.swift b/submodules/InstantPageUI/Sources/InstantImageGalleryItem.swift index 9254384396..1d0c082ae5 100644 --- a/submodules/InstantPageUI/Sources/InstantImageGalleryItem.swift +++ b/submodules/InstantPageUI/Sources/InstantImageGalleryItem.swift @@ -301,7 +301,7 @@ final class InstantImageGalleryItemNode: ZoomableContentGalleryItemNode { return self._title.get() } - override func footerContent() -> Signal { - return .single(self.footerContentNode) + override func footerContent() -> Signal<(GalleryFooterContentNode?, GalleryOverlayContentNode?), NoError> { + return .single((self.footerContentNode, nil)) } } diff --git a/submodules/InstantPageUI/Sources/InstantPageGalleryController.swift b/submodules/InstantPageUI/Sources/InstantPageGalleryController.swift index 0e32aadb82..d50fc2b478 100644 --- a/submodules/InstantPageUI/Sources/InstantPageGalleryController.swift +++ b/submodules/InstantPageUI/Sources/InstantPageGalleryController.swift @@ -170,7 +170,7 @@ public class InstantPageGalleryController: ViewController, StandalonePresentable private let centralItemTitleView = Promise() private let centralItemRightBarButtonItem = Promise() private let centralItemNavigationStyle = Promise() - private let centralItemFooterContentNode = Promise() + private let centralItemFooterContentNode = Promise<(GalleryFooterContentNode?, GalleryOverlayContentNode?)>() private let centralItemAttributesDisposable = DisposableSet(); private let _hiddenMedia = Promise(nil) @@ -243,7 +243,7 @@ public class InstantPageGalleryController: ViewController, StandalonePresentable self?.navigationItem.rightBarButtonItem = rightBarButtonItem })) - self.centralItemAttributesDisposable.add(self.centralItemFooterContentNode.get().start(next: { [weak self] footerContentNode in + self.centralItemAttributesDisposable.add(self.centralItemFooterContentNode.get().start(next: { [weak self] footerContentNode, _ in self?.galleryNode.updatePresentationState({ $0.withUpdatedFooterContentNode(footerContentNode) }, transition: .immediate) diff --git a/submodules/ItemListPeerActionItem/Sources/ItemListPeerActionItem.swift b/submodules/ItemListPeerActionItem/Sources/ItemListPeerActionItem.swift index 2b0988c6d8..b9da7f99eb 100644 --- a/submodules/ItemListPeerActionItem/Sources/ItemListPeerActionItem.swift +++ b/submodules/ItemListPeerActionItem/Sources/ItemListPeerActionItem.swift @@ -12,6 +12,11 @@ public enum ItemListPeerActionItemHeight { case peerList } +public enum ItemListPeerActionItemColor { + case accent + case destructive +} + public class ItemListPeerActionItem: ListViewItem, ItemListItem { let presentationData: ItemListPresentationData let icon: UIImage? @@ -19,16 +24,18 @@ public class ItemListPeerActionItem: ListViewItem, ItemListItem { public let alwaysPlain: Bool let editing: Bool let height: ItemListPeerActionItemHeight + let color: ItemListPeerActionItemColor public let sectionId: ItemListSectionId let action: (() -> Void)? - public init(presentationData: ItemListPresentationData, icon: UIImage?, title: String, alwaysPlain: Bool = false, sectionId: ItemListSectionId, height: ItemListPeerActionItemHeight = .peerList, editing: Bool, action: (() -> Void)?) { + public init(presentationData: ItemListPresentationData, icon: UIImage?, title: String, alwaysPlain: Bool = false, sectionId: ItemListSectionId, height: ItemListPeerActionItemHeight = .peerList, color: ItemListPeerActionItemColor = .accent, editing: Bool, action: (() -> Void)?) { self.presentationData = presentationData self.icon = icon self.title = title self.alwaysPlain = alwaysPlain self.editing = editing self.height = height + self.color = color self.sectionId = sectionId self.action = action } @@ -167,7 +174,15 @@ class ItemListPeerActionItemNode: ListViewItemNode { let editingOffset: CGFloat = (item.editing ? 38.0 : 0.0) - let (titleLayout, titleApply) = makeTitleLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: item.title, font: titleFont, textColor: item.presentationData.theme.list.itemAccentColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width - leftInset - editingOffset, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) + let textColor: UIColor + switch item.color { + case .accent: + textColor = item.presentationData.theme.list.itemAccentColor + case .destructive: + textColor = item.presentationData.theme.list.itemDestructiveColor + } + + let (titleLayout, titleApply) = makeTitleLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: item.title, font: titleFont, textColor: textColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width - leftInset - editingOffset, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) let separatorHeight = UIScreenPixel diff --git a/submodules/ItemListStickerPackItem/Sources/ItemListStickerPackItem.swift b/submodules/ItemListStickerPackItem/Sources/ItemListStickerPackItem.swift index 0eb1793f6c..f707e88839 100644 --- a/submodules/ItemListStickerPackItem/Sources/ItemListStickerPackItem.swift +++ b/submodules/ItemListStickerPackItem/Sources/ItemListStickerPackItem.swift @@ -31,6 +31,7 @@ public enum ItemListStickerPackItemControl: Equatable { case none case installation(installed: Bool) case selection + case check(checked: Bool) } public final class ItemListStickerPackItem: ListViewItem, ItemListItem { @@ -305,6 +306,8 @@ class ItemListStickerPackItemNode: ItemListRevealOptionsItemNode { case .selection: rightInset += 16.0 checkImage = PresentationResourcesItemList.checkIconImage(item.presentationData.theme) + case .check: + rightInset += 16.0 } var unreadImage: UIImage? @@ -531,6 +534,10 @@ class ItemListStickerPackItemNode: ItemListRevealOptionsItemNode { strongSelf.selectionIconNode.image = image strongSelf.selectionIconNode.frame = CGRect(origin: CGPoint(x: params.width - params.rightInset - image.size.width - floor((44.0 - image.size.width) / 2.0), y: floor((contentSize.height - image.size.height) / 2.0)), size: image.size) } + case let .check(checked): + strongSelf.installationActionNode.isHidden = true + strongSelf.installationActionImageNode.isHidden = true + strongSelf.selectionIconNode.isHidden = true } if strongSelf.backgroundNode.supernode == nil { diff --git a/submodules/PassportUI/Sources/SecureIdDocumentGalleryController.swift b/submodules/PassportUI/Sources/SecureIdDocumentGalleryController.swift index d8a06b4494..b2604b8881 100644 --- a/submodules/PassportUI/Sources/SecureIdDocumentGalleryController.swift +++ b/submodules/PassportUI/Sources/SecureIdDocumentGalleryController.swift @@ -68,7 +68,7 @@ class SecureIdDocumentGalleryController: ViewController, StandalonePresentableCo private let centralItemTitle = Promise() private let centralItemTitleView = Promise() private let centralItemNavigationStyle = Promise() - private let centralItemFooterContentNode = Promise() + private let centralItemFooterContentNode = Promise<(GalleryFooterContentNode?, GalleryOverlayContentNode?)>() private let centralItemAttributesDisposable = DisposableSet(); private let _hiddenMedia = Promise(nil) @@ -123,7 +123,7 @@ class SecureIdDocumentGalleryController: ViewController, StandalonePresentableCo self?.navigationItem.titleView = titleView })) - self.centralItemAttributesDisposable.add(self.centralItemFooterContentNode.get().start(next: { [weak self] footerContentNode in + self.centralItemAttributesDisposable.add(self.centralItemFooterContentNode.get().start(next: { [weak self] footerContentNode, _ in self?.galleryNode.updatePresentationState({ $0.withUpdatedFooterContentNode(footerContentNode) }, transition: .immediate) diff --git a/submodules/PassportUI/Sources/SecureIdDocumentImageGalleryItem.swift b/submodules/PassportUI/Sources/SecureIdDocumentImageGalleryItem.swift index b4f80aa4d5..857c233cc3 100644 --- a/submodules/PassportUI/Sources/SecureIdDocumentImageGalleryItem.swift +++ b/submodules/PassportUI/Sources/SecureIdDocumentImageGalleryItem.swift @@ -210,8 +210,8 @@ final class SecureIdDocumentGalleryItemNode: ZoomableContentGalleryItemNode { return self._title.get() } - override func footerContent() -> Signal { - return .single(self.footerContentNode) + override func footerContent() -> Signal<(GalleryFooterContentNode?, GalleryOverlayContentNode?), NoError> { + return .single((self.footerContentNode, nil)) } } diff --git a/submodules/PeerAvatarGalleryUI/Sources/AvatarGalleryController.swift b/submodules/PeerAvatarGalleryUI/Sources/AvatarGalleryController.swift index 30c25a1b5b..cb2f0a9d82 100644 --- a/submodules/PeerAvatarGalleryUI/Sources/AvatarGalleryController.swift +++ b/submodules/PeerAvatarGalleryUI/Sources/AvatarGalleryController.swift @@ -118,7 +118,7 @@ public class AvatarGalleryController: ViewController, StandalonePresentableContr private let centralItemTitle = Promise() private let centralItemTitleView = Promise() private let centralItemNavigationStyle = Promise() - private let centralItemFooterContentNode = Promise() + private let centralItemFooterContentNode = Promise<(GalleryFooterContentNode?, GalleryOverlayContentNode?)>() private let centralItemAttributesDisposable = DisposableSet(); private let _hiddenMedia = Promise(nil) @@ -232,7 +232,7 @@ public class AvatarGalleryController: ViewController, StandalonePresentableContr self?.navigationItem.titleView = titleView })) - self.centralItemAttributesDisposable.add(self.centralItemFooterContentNode.get().start(next: { [weak self] footerContentNode in + self.centralItemAttributesDisposable.add(self.centralItemFooterContentNode.get().start(next: { [weak self] footerContentNode, _ in self?.galleryNode.updatePresentationState({ $0.withUpdatedFooterContentNode(footerContentNode) }, transition: .immediate) diff --git a/submodules/PeerAvatarGalleryUI/Sources/PeerAvatarImageGalleryItem.swift b/submodules/PeerAvatarGalleryUI/Sources/PeerAvatarImageGalleryItem.swift index 4789f0c18f..d2db820983 100644 --- a/submodules/PeerAvatarGalleryUI/Sources/PeerAvatarImageGalleryItem.swift +++ b/submodules/PeerAvatarGalleryUI/Sources/PeerAvatarImageGalleryItem.swift @@ -355,7 +355,7 @@ final class PeerAvatarImageGalleryItemNode: ZoomableContentGalleryItemNode { } } - override func footerContent() -> Signal { - return .single(self.footerContentNode) + override func footerContent() -> Signal<(GalleryFooterContentNode?, GalleryOverlayContentNode?), NoError> { + return .single((self.footerContentNode, nil)) } } diff --git a/submodules/PeerInfoUI/BUCK b/submodules/PeerInfoUI/BUCK index 47da260275..16d723277d 100644 --- a/submodules/PeerInfoUI/BUCK +++ b/submodules/PeerInfoUI/BUCK @@ -64,6 +64,7 @@ static_library( "//submodules/TelegramIntents:TelegramIntents", "//submodules/SolidRoundedButtonNode:SolidRoundedButtonNode", "//submodules/ChatListSearchItemHeader:ChatListSearchItemHeader", + "//submodules/StatisticsUI:StatisticsUI", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/PeersNearbyUI/BUCK b/submodules/PeersNearbyUI/BUCK index 5a6ca7965b..a6c565b2b6 100644 --- a/submodules/PeersNearbyUI/BUCK +++ b/submodules/PeersNearbyUI/BUCK @@ -26,6 +26,8 @@ static_library( "//submodules/PeersNearbyIconNode:PeersNearbyIconNode", "//submodules/Geocoding:Geocoding", "//submodules/AppBundle:AppBundle", + "//submodules/AnimatedStickerNode:AnimatedStickerNode", + "//submodules/TelegramStringFormatting:TelegramStringFormatting", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/PeersNearbyUI/Sources/PeersNearbyController.swift b/submodules/PeersNearbyUI/Sources/PeersNearbyController.swift index 5c6a28bdae..32b5157750 100644 --- a/submodules/PeersNearbyUI/Sources/PeersNearbyController.swift +++ b/submodules/PeersNearbyUI/Sources/PeersNearbyController.swift @@ -20,6 +20,9 @@ import TelegramPermissionsUI import ItemListPeerActionItem import Geocoding import AppBundle +import ContextUI +import TelegramNotices +import TelegramStringFormatting private struct PeerNearbyEntry { let peer: (Peer, CachedPeerData?) @@ -49,13 +52,19 @@ private func arePeerNearbyArraysEqual(_ lhs: [PeerNearbyEntry], _ rhs: [PeerNear private final class PeersNearbyControllerArguments { let context: AccountContext + let toggleVisibility: (Bool) -> Void + let openProfile: (Peer) -> Void let openChat: (Peer) -> Void let openCreateGroup: (Double, Double, String?) -> Void + let contextAction: (Peer, ASDisplayNode, ContextGesture?) -> Void - init(context: AccountContext, openChat: @escaping (Peer) -> Void, openCreateGroup: @escaping (Double, Double, String?) -> Void) { + init(context: AccountContext, toggleVisibility: @escaping (Bool) -> Void, openProfile: @escaping (Peer) -> Void, openChat: @escaping (Peer) -> Void, openCreateGroup: @escaping (Double, Double, String?) -> Void, contextAction: @escaping (Peer, ASDisplayNode, ContextGesture?) -> Void) { self.context = context + self.toggleVisibility = toggleVisibility + self.openProfile = openProfile self.openChat = openChat self.openCreateGroup = openCreateGroup + self.contextAction = contextAction } } @@ -71,6 +80,7 @@ private enum PeersNearbyEntry: ItemListNodeEntry { case usersHeader(PresentationTheme, String, Bool) case empty(PresentationTheme, String) + case visibility(PresentationTheme, String, Bool) case user(Int32, PresentationTheme, PresentationStrings, PresentationDateTimeFormat, PresentationPersonNameOrder, PeerNearbyEntry) case groupsHeader(PresentationTheme, String, Bool) @@ -84,7 +94,7 @@ private enum PeersNearbyEntry: ItemListNodeEntry { switch self { case .header: return PeersNearbySection.header.rawValue - case .usersHeader, .empty, .user: + case .usersHeader, .empty, .visibility, .user: return PeersNearbySection.users.rawValue case .groupsHeader, .createGroup, .group: return PeersNearbySection.groups.rawValue @@ -101,8 +111,10 @@ private enum PeersNearbyEntry: ItemListNodeEntry { return 1 case .empty: return 2 + case .visibility: + return 3 case let .user(index, _, _, _, _, _): - return 3 + index + return 4 + index case .groupsHeader: return 1000 case .createGroup: @@ -136,6 +148,13 @@ private enum PeersNearbyEntry: ItemListNodeEntry { } else { return false } + case let .visibility(lhsTheme, lhsText, lhsStop): + if case let .visibility(rhsTheme, rhsText, rhsStop) = rhs, lhsTheme === rhsTheme, lhsText == rhsText, lhsStop == rhsStop { + return true + } else { + return false + } + case let .user(lhsIndex, lhsTheme, lhsStrings, lhsDateTimeFormat, lhsDisplayOrder, lhsPeer): if case let .user(rhsIndex, rhsTheme, rhsStrings, rhsDateTimeFormat, rhsDisplayOrder, rhsPeer) = rhs, lhsIndex == rhsIndex, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsDateTimeFormat == rhsDateTimeFormat, lhsDisplayOrder == rhsDisplayOrder, arePeersNearbyEqual(lhsPeer, rhsPeer) { return true @@ -199,10 +218,20 @@ private enum PeersNearbyEntry: ItemListNodeEntry { return ItemListSectionHeaderItem(presentationData: presentationData, text: text, activityIndicator: loading ? .left : .none, sectionId: self.section) case let .empty(theme, text): return ItemListPlaceholderItem(theme: theme, text: text, sectionId: self.section, style: .blocks) + case let .visibility(theme, title, stop): + return ItemListPeerActionItem(presentationData: presentationData, icon: stop ? PresentationResourcesItemList.makeInvisibleIcon(theme) : PresentationResourcesItemList.makeVisibleIcon(theme), title: title, alwaysPlain: false, sectionId: self.section, color: stop ? .destructive : .accent, editing: false, action: { + arguments.toggleVisibility(!stop) + }) case let .user(_, theme, strings, dateTimeFormat, nameDisplayOrder, peer): + var text = strings.Map_DistanceAway(stringForDistance(peer.distance)).0 + if peer.peer.0.id == arguments.context.account.peerId { + text = strings.PeopleNearby_VisibleUntil(humanReadableStringForTimestamp(strings: strings, dateTimeFormat: dateTimeFormat, timestamp: peer.expires)).0 + } return ItemListPeerItem(presentationData: presentationData, dateTimeFormat: dateTimeFormat, nameDisplayOrder: nameDisplayOrder, context: arguments.context, peer: peer.peer.0, aliasHandling: .standard, nameColor: .primary, nameStyle: .distinctBold, presence: nil, text: .text(strings.Map_DistanceAway(stringForDistance(peer.distance)).0), label: .none, editing: ItemListPeerItemEditing(editable: false, editing: false, revealed: false), revealOptions: nil, switchValue: nil, enabled: true, selectable: true, sectionId: self.section, action: { - arguments.openChat(peer.peer.0) - }, setPeerIdWithRevealedOptions: { _, _ in }, removePeer: { _ in }, toggleUpdated: nil, hasTopGroupInset: false, tag: nil) + arguments.openProfile(peer.peer.0) + }, setPeerIdWithRevealedOptions: { _, _ in }, removePeer: { _ in }, toggleUpdated: nil, contextAction: { node, gesture in + arguments.contextAction(peer.peer.0, node, gesture) + }, hasTopGroupInset: false, tag: nil) case let .groupsHeader(theme, text, loading): return ItemListSectionHeaderItem(presentationData: presentationData, text: text, activityIndicator: loading ? .left : .none, sectionId: self.section) case let .createGroup(theme, title, latitude, longitude, address): @@ -220,7 +249,9 @@ private enum PeersNearbyEntry: ItemListNodeEntry { } return ItemListPeerItem(presentationData: presentationData, dateTimeFormat: dateTimeFormat, nameDisplayOrder: nameDisplayOrder, context: arguments.context, peer: peer.peer.0, aliasHandling: .standard, nameColor: .primary, nameStyle: .distinctBold, presence: nil, text: text, label: .none, editing: ItemListPeerItemEditing(editable: false, editing: false, revealed: false), revealOptions: nil, switchValue: nil, enabled: true, selectable: true, sectionId: self.section, action: { arguments.openChat(peer.peer.0) - }, setPeerIdWithRevealedOptions: { _, _ in }, removePeer: { _ in }, toggleUpdated: nil, hasTopGroupInset: false, tag: nil) + }, setPeerIdWithRevealedOptions: { _, _ in }, removePeer: { _ in }, toggleUpdated: nil, contextAction: { node, gesture in + arguments.contextAction(peer.peer.0, node, gesture) + }, hasTopGroupInset: false, tag: nil) case let .channelsHeader(theme, text): return ItemListSectionHeaderItem(presentationData: presentationData, text: text, sectionId: self.section) case let .channel(_, theme, strings, dateTimeFormat, nameDisplayOrder, peer): @@ -232,7 +263,9 @@ private enum PeersNearbyEntry: ItemListNodeEntry { } return ItemListPeerItem(presentationData: presentationData, dateTimeFormat: dateTimeFormat, nameDisplayOrder: nameDisplayOrder, context: arguments.context, peer: peer.peer.0, aliasHandling: .standard, nameColor: .primary, nameStyle: .distinctBold, presence: nil, text: text, label: .none, editing: ItemListPeerItemEditing(editable: false, editing: false, revealed: false), revealOptions: nil, switchValue: nil, enabled: true, selectable: true, sectionId: self.section, action: { arguments.openChat(peer.peer.0) - }, setPeerIdWithRevealedOptions: { _, _ in }, removePeer: { _ in }, toggleUpdated: nil, hasTopGroupInset: false, tag: nil) + }, setPeerIdWithRevealedOptions: { _, _ in }, removePeer: { _ in }, toggleUpdated: nil, contextAction: { node, gesture in + arguments.contextAction(peer.peer.0, node, gesture) + }, hasTopGroupInset: false, tag: nil) } } } @@ -241,37 +274,41 @@ private struct PeersNearbyData: Equatable { let latitude: Double let longitude: Double let address: String? + let visible: Bool let users: [PeerNearbyEntry] let groups: [PeerNearbyEntry] let channels: [PeerNearbyEntry] - init(latitude: Double, longitude: Double, address: String?, users: [PeerNearbyEntry], groups: [PeerNearbyEntry], channels: [PeerNearbyEntry]) { + init(latitude: Double, longitude: Double, address: String?, visible: Bool, users: [PeerNearbyEntry], groups: [PeerNearbyEntry], channels: [PeerNearbyEntry]) { self.latitude = latitude self.longitude = longitude self.address = address + self.visible = visible self.users = users self.groups = groups self.channels = channels } static func ==(lhs: PeersNearbyData, rhs: PeersNearbyData) -> Bool { - return lhs.latitude == rhs.latitude && lhs.longitude == rhs.longitude && lhs.address == rhs.address && arePeerNearbyArraysEqual(lhs.users, rhs.users) && arePeerNearbyArraysEqual(lhs.groups, rhs.groups) && arePeerNearbyArraysEqual(lhs.channels, rhs.channels) + return lhs.latitude == rhs.latitude && lhs.longitude == rhs.longitude && lhs.address == rhs.address && lhs.visible == rhs.visible && arePeerNearbyArraysEqual(lhs.users, rhs.users) && arePeerNearbyArraysEqual(lhs.groups, rhs.groups) && arePeerNearbyArraysEqual(lhs.channels, rhs.channels) } } private func peersNearbyControllerEntries(data: PeersNearbyData?, presentationData: PresentationData, displayLoading: Bool) -> [PeersNearbyEntry] { var entries: [PeersNearbyEntry] = [] - entries.append(.header(presentationData.theme, presentationData.strings.PeopleNearby_Description)) + entries.append(.header(presentationData.theme, presentationData.strings.PeopleNearby_DiscoverDescription)) entries.append(.usersHeader(presentationData.theme, presentationData.strings.PeopleNearby_Users.uppercased(), displayLoading && data == nil)) + + let visible = data?.visible ?? false + entries.append(.visibility(presentationData.theme, visible ? presentationData.strings.PeopleNearby_MakeInvisible : presentationData.strings.PeopleNearby_MakeVisible, visible)) + if let data = data, !data.users.isEmpty { var i: Int32 = 0 for user in data.users { entries.append(.user(i, presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, presentationData.nameDisplayOrder, user)) i += 1 } - } else { - entries.append(.empty(presentationData.theme, presentationData.strings.PeopleNearby_UsersEmpty)) } entries.append(.groupsHeader(presentationData.theme, presentationData.strings.PeopleNearby_Groups.uppercased(), displayLoading && data == nil)) @@ -295,11 +332,94 @@ private func peersNearbyControllerEntries(data: PeersNearbyData?, presentationDa return entries } +private final class ContextControllerContentSourceImpl: ContextControllerContentSource { + let controller: ViewController + weak var sourceNode: ASDisplayNode? + + let navigationController: NavigationController? = nil + + let passthroughTouches: Bool = true + + init(controller: ViewController, sourceNode: ASDisplayNode?) { + self.controller = controller + self.sourceNode = sourceNode + } + + func transitionInfo() -> ContextControllerTakeControllerInfo? { + let sourceNode = self.sourceNode + return ContextControllerTakeControllerInfo(contentAreaInScreenSpace: CGRect(origin: CGPoint(), size: CGSize(width: 10.0, height: 10.0)), sourceNode: { [weak sourceNode] in + if let sourceNode = sourceNode { + return (sourceNode, sourceNode.bounds) + } else { + return nil + } + }) + } + + func animatedIn() { + } +} + +private func peerNearbyContextMenuItems(context: AccountContext, peerId: PeerId, present: @escaping (ViewController) -> Void) -> Signal<[ContextMenuItem], NoError> { + let presentationData = context.sharedContext.currentPresentationData.with({ $0 }) + return context.account.postbox.transaction { transaction -> [ContextMenuItem] in + var items: [ContextMenuItem] = [] +// +// let peer = transaction.getPeer(peerId) +// +// if let peer = peer as? TelegramUser { +// items.append(.action(ContextMenuActionItem(text: presentationData.strings.ChatList_Context_AddToContacts, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Add"), color: theme.contextMenu.primaryColor) }, action: { _, f in +// f(.default) +// }))) +// } else { +// items.append(.action(ContextMenuActionItem(text: presentationData.strings.PeopleNearby_Context_JoinGroup, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Add"), color: theme.contextMenu.primaryColor) }, action: { _, f in +// let _ = (joinChannel(account: context.account, peerId: peerId) |> deliverOnMainQueue).start(next: { participant in +// f(.default) +// }, error: { error in +//// if let strongSelf = self { +//// if case .tooMuchJoined = error { +//// if let parentNavigationController = strongSelf.parentNavigationController { +//// let context = strongSelf.context +//// let link = strongSelf.link +//// let navigateToPeer = strongSelf.navigateToPeer +//// let resolvedState = strongSelf.resolvedState +//// parentNavigationController.pushViewController(oldChannelsController(context: strongSelf.context, intent: .join, completed: { [weak parentNavigationController] value in +//// if value { +//// (parentNavigationController?.viewControllers.last as? ViewController)?.present(JoinLinkPreviewController(context: context, link: link, navigateToPeer: navigateToPeer, parentNavigationController: parentNavigationController, resolvedState: resolvedState), in: .window(.root)) +//// } +//// })) +//// } else { +//// strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: strongSelf.presentationData.strings.Join_ChannelsTooMuch, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) +//// } +//// strongSelf.dismiss() +//// } +//// } +// }) +// }))) +// +// items.append(.action(ContextMenuActionItem(text: presentationData.strings.PeopleNearby_Context_UnrelatedLocation, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Report"), color: theme.contextMenu.primaryColor) }, action: { _, f in +// let _ = (TelegramCore.reportPeer(account: context.account, peerId: peerId, reason: .irrelevantLocation) +// |> deliverOnMainQueue).start(completed: { +// let _ = ApplicationSpecificNotice.setIrrelevantPeerGeoReport(postbox: context.account.postbox, peerId: peerId).start() +// +// present(textAlertController(context: context, title: nil, text: presentationData.strings.ReportPeer_AlertSuccess, actions: [TextAlertAction(type: TextAlertActionType.defaultAction, title: presentationData.strings.Common_OK, action: {})])) +// }) +// f(.default) +// }))) +// } + + return items + } +} + + public func peersNearbyController(context: AccountContext) -> ViewController { var pushControllerImpl: ((ViewController) -> Void)? var replaceAllButRootControllerImpl: ((ViewController, Bool) -> Void)? var replaceTopControllerImpl: ((ViewController) -> Void)? var presentControllerImpl: ((ViewController, ViewControllerPresentationArguments?) -> Void)? + var presentInGlobalOverlayImpl: ((ViewController) -> Void)? + var navigateToProfileImpl: ((Peer) -> Void)? var navigateToChatImpl: ((Peer) -> Void)? let actionsDisposable = DisposableSet() @@ -309,7 +429,27 @@ public func peersNearbyController(context: AccountContext) -> ViewController { let dataPromise = Promise(nil) let addressPromise = Promise(nil) - let arguments = PeersNearbyControllerArguments(context: context, openChat: { peer in + let coordinatePromise = Promise(nil) + coordinatePromise.set(.single(nil) |> then(currentLocationManagerCoordinate(manager: context.sharedContext.locationManager!, timeout: 5.0))) + + let arguments = PeersNearbyControllerArguments(context: context, toggleVisibility: { visible in + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + + if visible { + presentControllerImpl?(textAlertController(context: context, title: presentationData.strings.PeopleNearby_MakeVisibleTitle, text: presentationData.strings.PeopleNearby_MakeVisibleDescription, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Common_Cancel, action: {}), TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: { + let _ = (coordinatePromise.get() + |> deliverOnMainQueue).start(next: { coordinate in + if let coordinate = coordinate { + let _ = peersNearbyUpdateVisibility(network: context.account.network, stateManager: context.account.stateManager, update: .visible(latitude: coordinate.latitude, longitude: coordinate.longitude), background: false).start() + } + }) + })]), nil) + } else { + let _ = peersNearbyUpdateVisibility(network: context.account.network, stateManager: context.account.stateManager, update: .invisible, background: false).start() + } + }, openProfile: { peer in + navigateToProfileImpl?(peer) + }, openChat: { peer in navigateToChatImpl?(peer) }, openCreateGroup: { latitude, longitude, address in let presentationData = context.sharedContext.currentPresentationData.with { $0 } @@ -350,16 +490,24 @@ public func peersNearbyController(context: AccountContext) -> ViewController { presentControllerImpl?(textAlertController(context: context, title: nil, text: presentationData.strings.CreateGroup_ErrorLocatedGroupsTooMuch, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil) } })) + }, contextAction: { peer, node, gesture in + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + let chatController = context.sharedContext.makeChatController(context: context, chatLocation: .peer(peer.id), subject: nil, botStart: nil, mode: .standard(previewing: true)) + chatController.canReadHistory.set(false) + let contextController = ContextController(account: context.account, presentationData: presentationData, source: .controller(ContextControllerContentSourceImpl(controller: chatController, sourceNode: node)), items: peerNearbyContextMenuItems(context: context, peerId: peer.id, present: { c in + presentControllerImpl?(c, nil) + }), reactionItems: [], gesture: gesture) + presentInGlobalOverlayImpl?(contextController) }) - let dataSignal: Signal = currentLocationManagerCoordinate(manager: context.sharedContext.locationManager!, timeout: 5.0) + let dataSignal: Signal = coordinatePromise.get() |> mapToSignal { coordinate -> Signal in guard let coordinate = coordinate else { return .single(nil) } return Signal { subscriber in - let peersNearbyContext = PeersNearbyContext(network: context.account.network, accountStateManager: context.account.stateManager, coordinate: (latitude: coordinate.latitude, longitude: coordinate.longitude)) + let peersNearbyContext = PeersNearbyContext(network: context.account.network, stateManager: context.account.stateManager, coordinate: (latitude: coordinate.latitude, longitude: coordinate.longitude)) let peersNearby: Signal = combineLatest(peersNearbyContext.get(), addressPromise.get()) |> mapToSignal { peersNearby, address -> Signal<([PeerNearby]?, String?), NoError> in @@ -379,17 +527,26 @@ public func peersNearbyController(context: AccountContext) -> ViewController { return context.account.postbox.transaction { transaction -> PeersNearbyData? in var users: [PeerNearbyEntry] = [] var groups: [PeerNearbyEntry] = [] + var visible = false for peerNearby in peersNearby { - if peerNearby.id != context.account.peerId, let peer = transaction.getPeer(peerNearby.id) { - if peerNearby.id.namespace == Namespaces.Peer.CloudUser { - users.append(PeerNearbyEntry(peer: (peer, nil), expires: peerNearby.expires, distance: peerNearby.distance)) - } else { - let cachedData = transaction.getPeerCachedData(peerId: peerNearby.id) as? CachedChannelData - groups.append(PeerNearbyEntry(peer: (peer, cachedData), expires: peerNearby.expires, distance: peerNearby.distance)) - } + switch peerNearby { + case let .peer(id, expires, distance): + if let peer = transaction.getPeer(id) { + if id.namespace == Namespaces.Peer.CloudUser { + users.append(PeerNearbyEntry(peer: (peer, nil), expires: expires, distance: distance)) + } else { + let cachedData = transaction.getPeerCachedData(peerId: id) as? CachedChannelData + groups.append(PeerNearbyEntry(peer: (peer, cachedData), expires: expires, distance: distance)) + } + } + case let .selfPeer(expires): + visible = true + if let peer = transaction.getPeer(context.account.peerId) { + users.append(PeerNearbyEntry(peer: (peer, nil), expires: expires, distance: 0)) + } } } - return PeersNearbyData(latitude: coordinate.latitude, longitude: coordinate.longitude, address: address, users: users, groups: groups, channels: []) + return PeersNearbyData(latitude: coordinate.latitude, longitude: coordinate.longitude, address: address, visible: visible, users: users, groups: groups, channels: []) } } @@ -438,6 +595,11 @@ public func peersNearbyController(context: AccountContext) -> ViewController { controller.didDisappear = { [weak controller] _ in controller?.clearItemNodesHighlight(animated: true) } + navigateToProfileImpl = { [weak controller] peer in + if let navigationController = controller?.navigationController as? NavigationController, let controller = context.sharedContext.makePeerInfoController(context: context, peer: peer, mode: .generic) { + (navigationController as? NavigationController)?.pushViewController(controller) + } + } navigateToChatImpl = { [weak controller] peer in if let navigationController = controller?.navigationController as? NavigationController { context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(peer.id), keepStack: .always, purposefulAction: { [weak navigationController] in @@ -467,6 +629,10 @@ public func peersNearbyController(context: AccountContext) -> ViewController { controller.present(c, in: .window(.root), with: p) } } - + presentInGlobalOverlayImpl = { [weak controller] c in + if let controller = controller { + controller.presentInGlobalOverlay(c) + } + } return controller } diff --git a/submodules/PeersNearbyUI/Sources/PeersNearbyHeaderItem.swift b/submodules/PeersNearbyUI/Sources/PeersNearbyHeaderItem.swift index 7bbb9e9428..ed5a84dc13 100644 --- a/submodules/PeersNearbyUI/Sources/PeersNearbyHeaderItem.swift +++ b/submodules/PeersNearbyUI/Sources/PeersNearbyHeaderItem.swift @@ -6,7 +6,8 @@ import SwiftSignalKit import TelegramPresentationData import ItemListUI import PresentationDataUtils -import PeersNearbyIconNode +import AnimatedStickerNode +import AppBundle class PeersNearbyHeaderItem: ListViewItem, ItemListItem { let theme: PresentationTheme @@ -60,7 +61,7 @@ private let titleFont = Font.regular(13.0) class PeersNearbyHeaderItemNode: ListViewItemNode { private let titleNode: TextNode - private var iconNode: PeersNearbyIconNode? + private var animationNode: AnimatedStickerNode private var item: PeersNearbyHeaderItem? @@ -70,24 +71,29 @@ class PeersNearbyHeaderItemNode: ListViewItemNode { self.titleNode.contentMode = .left self.titleNode.contentsScale = UIScreen.main.scale + self.animationNode = AnimatedStickerNode() + if let path = getAppBundle().path(forResource: "Compass", ofType: "tgs") { + self.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(path: path), width: 192, height: 192, playbackMode: .once, mode: .direct) + self.animationNode.visibility = true + } + super.init(layerBacked: false, dynamicBounce: false) self.addSubnode(self.titleNode) + self.addSubnode(self.animationNode) } func asyncLayout() -> (_ item: PeersNearbyHeaderItem, _ params: ListViewItemLayoutParams, _ neighbors: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) { let makeTitleLayout = TextNode.asyncLayout(self.titleNode) return { item, params, neighbors in - let leftInset: CGFloat = 48.0 + params.leftInset + let leftInset: CGFloat = 32.0 + params.leftInset let topInset: CGFloat = 92.0 let attributedText = NSAttributedString(string: item.text, font: titleFont, textColor: item.theme.list.freeTextColor) let (titleLayout, titleApply) = makeTitleLayout(TextNodeLayoutArguments(attributedString: attributedText, backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: params.width - params.rightInset - leftInset * 2.0, height: CGFloat.greatestFiniteMagnitude), alignment: .center, cutout: nil, insets: UIEdgeInsets())) - let contentSize: CGSize - - contentSize = CGSize(width: params.width, height: topInset + titleLayout.size.height) + let contentSize = CGSize(width: params.width, height: topInset + titleLayout.size.height) let insets = itemListNeighborsGroupedInsets(neighbors) let layout = ListViewItemNodeLayout(contentSize: contentSize, insets: insets) @@ -96,22 +102,13 @@ class PeersNearbyHeaderItemNode: ListViewItemNode { if let strongSelf = self { strongSelf.item = item strongSelf.accessibilityLabel = attributedText.string - - let iconNode: PeersNearbyIconNode - if let node = strongSelf.iconNode { - iconNode = node - iconNode.updateTheme(item.theme) - } else { - iconNode = PeersNearbyIconNode(theme: item.theme) - strongSelf.iconNode = iconNode - strongSelf.addSubnode(iconNode) - } - - let iconSize = CGSize(width: 60.0, height: 60.0) - iconNode.frame = CGRect(origin: CGPoint(x: floor((layout.size.width - iconSize.width) / 2.0), y: 5.0), size: iconSize) + + let iconSize = CGSize(width: 96.0, height: 96.0) + strongSelf.animationNode.frame = CGRect(origin: CGPoint(x: floor((layout.size.width - iconSize.width) / 2.0), y: -10.0), size: iconSize) + strongSelf.animationNode.updateLayout(size: iconSize) let _ = titleApply() - strongSelf.titleNode.frame = CGRect(origin: CGPoint(x: floor((layout.size.width - titleLayout.size.width) / 2.0), y: topInset), size: titleLayout.size) + strongSelf.titleNode.frame = CGRect(origin: CGPoint(x: floor((layout.size.width - titleLayout.size.width) / 2.0), y: topInset + 8.0), size: titleLayout.size) } }) } diff --git a/submodules/PresentationDataUtils/Sources/SpecialTabBarIcons.swift b/submodules/PresentationDataUtils/Sources/SpecialTabBarIcons.swift new file mode 100644 index 0000000000..0fa053ebd0 --- /dev/null +++ b/submodules/PresentationDataUtils/Sources/SpecialTabBarIcons.swift @@ -0,0 +1,5 @@ +import Foundation + +public func useSpecialTabBarIcons() -> Bool { + return (Date(timeIntervalSince1970: 1581638400)...Date(timeIntervalSince1970: 1581724799)).contains(Date()) +} diff --git a/submodules/SettingsUI/Sources/SettingsController.swift b/submodules/SettingsUI/Sources/SettingsController.swift index 280b6055f8..e304b7390c 100644 --- a/submodules/SettingsUI/Sources/SettingsController.swift +++ b/submodules/SettingsUI/Sources/SettingsController.swift @@ -17,7 +17,6 @@ import AccountContext import OverlayStatusController import AvatarNode import AlertUI -import PresentationDataUtils import TelegramNotices import GalleryUI import LegacyUI @@ -1436,7 +1435,12 @@ public func settingsController(context: AccountContext, accountManager: AccountM actionsDisposable.dispose() } - let icon = UIImage(bundleImageName: "Chat List/Tabs/IconSettings") + let icon: UIImage? + if useSpecialTabBarIcons() { + icon = UIImage(bundleImageName: "Chat List/Tabs/Holiday/IconSettings") + } else { + icon = UIImage(bundleImageName: "Chat List/Tabs/IconSettings") + } let notificationsFromAllAccounts = accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.inAppNotificationSettings]) |> map { sharedData -> Bool in diff --git a/submodules/StatisticsUI/BUCK b/submodules/StatisticsUI/BUCK new file mode 100644 index 0000000000..911a9fff4a --- /dev/null +++ b/submodules/StatisticsUI/BUCK @@ -0,0 +1,31 @@ +load("//Config:buck_rule_macros.bzl", "static_library") + +static_library( + name = "StatisticsUI", + srcs = glob([ + "Sources/**/*.swift", + ]), + deps = [ + "//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit#shared", + "//submodules/AsyncDisplayKit:AsyncDisplayKit#shared", + "//submodules/Display:Display#shared", + "//submodules/Postbox:Postbox#shared", + "//submodules/TelegramCore:TelegramCore#shared", + "//submodules/SyncCore:SyncCore#shared", + "//submodules/TelegramPresentationData:TelegramPresentationData", + "//submodules/TelegramUIPreferences:TelegramUIPreferences", + "//submodules/AccountContext:AccountContext", + "//submodules/ItemListUI:ItemListUI", + "//submodules/AvatarNode:AvatarNode", + "//submodules/TelegramStringFormatting:TelegramStringFormatting", + "//submodules/AlertUI:AlertUI", + "//submodules/PresentationDataUtils:PresentationDataUtils", + "//submodules/TelegramNotices:TelegramNotices", + "//submodules/MergeLists:MergeLists", + "//submodules/Charts:Charts", + ], + frameworks = [ + "$SDKROOT/System/Library/Frameworks/Foundation.framework", + "$SDKROOT/System/Library/Frameworks/UIKit.framework", + ], +) diff --git a/submodules/StatisticsUI/Info.plist b/submodules/StatisticsUI/Info.plist new file mode 100644 index 0000000000..e1fe4cfb7b --- /dev/null +++ b/submodules/StatisticsUI/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + + diff --git a/submodules/StatisticsUI/Sources/StatisticsUI.h b/submodules/StatisticsUI/Sources/StatisticsUI.h new file mode 100644 index 0000000000..89573b3f16 --- /dev/null +++ b/submodules/StatisticsUI/Sources/StatisticsUI.h @@ -0,0 +1,19 @@ +// +// StatisticsUI.h +// StatisticsUI +// +// Created by Peter on 8/13/19. +// Copyright © 2019 Telegram Messenger LLP. All rights reserved. +// + +#import + +//! Project version number for StatisticsUI. +FOUNDATION_EXPORT double StatisticsUIVersionNumber; + +//! Project version string for StatisticsUI. +FOUNDATION_EXPORT const unsigned char StatisticsUIVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/submodules/StatisticsUI/Sources/StatsController.swift b/submodules/StatisticsUI/Sources/StatsController.swift new file mode 100644 index 0000000000..440d29cf02 --- /dev/null +++ b/submodules/StatisticsUI/Sources/StatsController.swift @@ -0,0 +1,351 @@ +import Foundation +import UIKit +import Display +import SwiftSignalKit +import Postbox +import TelegramCore +import SyncCore +import MapKit +import TelegramPresentationData +import TelegramUIPreferences +import ItemListUI +import PresentationDataUtils +import AccountContext +import PresentationDataUtils +import AppBundle +import ContextUI +import TelegramNotices + +private final class StatsArguments { + init() { + } +} + +private enum StatsSection: Int32 { + case overview + case growth + case followers + case notifications + case viewsByHour + case postInteractions + case viewsBySource + case followersBySource + case languages +} + +private enum StatsEntry: ItemListNodeEntry { + case overviewHeader(PresentationTheme, String) + case overview(PresentationTheme, ChannelStats) + + case growthTitle(PresentationTheme, String) + case growthGraph(PresentationTheme, PresentationStrings, PresentationDateTimeFormat, String, ChannelStatsGraph) + + case followersTitle(PresentationTheme, String) + case followersGraph(PresentationTheme, PresentationStrings, PresentationDateTimeFormat, String, ChannelStatsGraph) + + case notificationsTitle(PresentationTheme, String) + case notificationsGraph(PresentationTheme, PresentationStrings, PresentationDateTimeFormat, String, ChannelStatsGraph) + + case viewsByHourTitle(PresentationTheme, String) + case viewsByHourGraph(PresentationTheme, PresentationStrings, PresentationDateTimeFormat, String, ChannelStatsGraph) + + case postInteractionsTitle(PresentationTheme, String) + case postInteractionsGraph(PresentationTheme, PresentationStrings, PresentationDateTimeFormat, String, ChannelStatsGraph) + + case viewsBySourceTitle(PresentationTheme, String) + case viewsBySourceGraph(PresentationTheme, PresentationStrings, PresentationDateTimeFormat, String, ChannelStatsGraph) + + case followersBySourceTitle(PresentationTheme, String) + case followersBySourceGraph(PresentationTheme, PresentationStrings, PresentationDateTimeFormat, String, ChannelStatsGraph) + + case languagesTitle(PresentationTheme, String) + case languagesGraph(PresentationTheme, PresentationStrings, PresentationDateTimeFormat, String, ChannelStatsGraph) + + var section: ItemListSectionId { + switch self { + case .overviewHeader, .overview: + return StatsSection.overview.rawValue + case .growthTitle, .growthGraph: + return StatsSection.growth.rawValue + case .followersTitle, .followersGraph: + return StatsSection.followers.rawValue + case .notificationsTitle, .notificationsGraph: + return StatsSection.notifications.rawValue + case .viewsByHourTitle, .viewsByHourGraph: + return StatsSection.viewsByHour.rawValue + case .postInteractionsTitle, .postInteractionsGraph: + return StatsSection.postInteractions.rawValue + case .viewsBySourceTitle, .viewsBySourceGraph: + return StatsSection.viewsBySource.rawValue + case .followersBySourceTitle, .followersBySourceGraph: + return StatsSection.followersBySource.rawValue + case .languagesTitle, .languagesGraph: + return StatsSection.languages.rawValue + } + } + + var stableId: Int32 { + switch self { + case .overviewHeader: + return 0 + case .overview: + return 1 + case .growthTitle: + return 2 + case .growthGraph: + return 3 + case .followersTitle: + return 4 + case .followersGraph: + return 5 + case .notificationsTitle: + return 6 + case .notificationsGraph: + return 7 + case .viewsByHourTitle: + return 8 + case .viewsByHourGraph: + return 9 + case .postInteractionsTitle: + return 10 + case .postInteractionsGraph: + return 11 + case .viewsBySourceTitle: + return 12 + case .viewsBySourceGraph: + return 13 + case .followersBySourceTitle: + return 14 + case .followersBySourceGraph: + return 15 + case .languagesTitle: + return 16 + case .languagesGraph: + return 17 + } + } + + static func ==(lhs: StatsEntry, rhs: StatsEntry) -> Bool { + switch lhs { + case let .overviewHeader(lhsTheme, lhsText): + if case let .overviewHeader(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + return true + } else { + return false + } + case let .overview(lhsTheme, lhsStats): + if case let .overview(rhsTheme, rhsStats) = rhs, lhsTheme === rhsTheme, lhsStats == rhsStats { + return true + } else { + return false + } + case let .growthTitle(lhsTheme, lhsText): + if case let .growthTitle(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + return true + } else { + return false + } + case let .growthGraph(lhsTheme, lhsStrings, lhsDateTimeFormat, lhsText, lhsGraph): + if case let .growthGraph(rhsTheme, rhsStrings, rhsDateTimeFormat, rhsText, rhsGraph) = rhs, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsDateTimeFormat == rhsDateTimeFormat, lhsText == rhsText, lhsGraph == rhsGraph { + return true + } else { + return false + } + case let .followersTitle(lhsTheme, lhsText): + if case let .followersTitle(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + return true + } else { + return false + } + case let .followersGraph(lhsTheme, lhsStrings, lhsDateTimeFormat, lhsText, lhsGraph): + if case let .followersGraph(rhsTheme, rhsStrings, rhsDateTimeFormat, rhsText, rhsGraph) = rhs, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsDateTimeFormat == rhsDateTimeFormat, lhsText == rhsText, lhsGraph == rhsGraph { + return true + } else { + return false + } + case let .notificationsTitle(lhsTheme, lhsText): + if case let .notificationsTitle(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + return true + } else { + return false + } + case let .notificationsGraph(lhsTheme, lhsStrings, lhsDateTimeFormat, lhsText, lhsGraph): + if case let .notificationsGraph(rhsTheme, rhsStrings, rhsDateTimeFormat, rhsText, rhsGraph) = rhs, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsDateTimeFormat == rhsDateTimeFormat, lhsText == rhsText, lhsGraph == rhsGraph { + return true + } else { + return false + } + case let .viewsByHourTitle(lhsTheme, lhsText): + if case let .viewsByHourTitle(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + return true + } else { + return false + } + case let .viewsByHourGraph(lhsTheme, lhsStrings, lhsDateTimeFormat, lhsText, lhsGraph): + if case let .viewsByHourGraph(rhsTheme, rhsStrings, rhsDateTimeFormat, rhsText, rhsGraph) = rhs, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsDateTimeFormat == rhsDateTimeFormat, lhsText == rhsText, lhsGraph == rhsGraph { + return true + } else { + return false + } + case let .postInteractionsTitle(lhsTheme, lhsText): + if case let .postInteractionsTitle(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + return true + } else { + return false + } + case let .postInteractionsGraph(lhsTheme, lhsStrings, lhsDateTimeFormat, lhsText, lhsGraph): + if case let .postInteractionsGraph(rhsTheme, rhsStrings, rhsDateTimeFormat, rhsText, rhsGraph) = rhs, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsDateTimeFormat == rhsDateTimeFormat, lhsText == rhsText, lhsGraph == rhsGraph { + return true + } else { + return false + } + case let .viewsBySourceTitle(lhsTheme, lhsText): + if case let .viewsBySourceTitle(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + return true + } else { + return false + } + case let .viewsBySourceGraph(lhsTheme, lhsStrings, lhsDateTimeFormat, lhsText, lhsGraph): + if case let .viewsBySourceGraph(rhsTheme, rhsStrings, rhsDateTimeFormat, rhsText, rhsGraph) = rhs, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsDateTimeFormat == rhsDateTimeFormat, lhsText == rhsText, lhsGraph == rhsGraph { + return true + } else { + return false + } + case let .followersBySourceTitle(lhsTheme, lhsText): + if case let .followersBySourceTitle(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + return true + } else { + return false + } + case let .followersBySourceGraph(lhsTheme, lhsStrings, lhsDateTimeFormat, lhsText, lhsGraph): + if case let .followersBySourceGraph(rhsTheme, rhsStrings, rhsDateTimeFormat, rhsText, rhsGraph) = rhs, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsDateTimeFormat == rhsDateTimeFormat, lhsText == rhsText, lhsGraph == rhsGraph { + return true + } else { + return false + } + case let .languagesTitle(lhsTheme, lhsText): + if case let .languagesTitle(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + return true + } else { + return false + } + case let .languagesGraph(lhsTheme, lhsStrings, lhsDateTimeFormat, lhsText, lhsGraph): + if case let .languagesGraph(rhsTheme, rhsStrings, rhsDateTimeFormat, rhsText, rhsGraph) = rhs, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsDateTimeFormat == rhsDateTimeFormat, lhsText == rhsText, lhsGraph == rhsGraph { + return true + } else { + return false + } + } + } + + static func <(lhs: StatsEntry, rhs: StatsEntry) -> Bool { + return lhs.stableId < rhs.stableId + } + + func item(presentationData: ItemListPresentationData, arguments: Any) -> ListViewItem { + switch self { + case let .overviewHeader(theme, text), + let .growthTitle(theme, text), + let .followersTitle(theme, text), + let .notificationsTitle(theme, text), + let .viewsByHourTitle(theme, text), + let .postInteractionsTitle(theme, text), + let .viewsBySourceTitle(theme, text), + let .followersBySourceTitle(theme, text), + let .languagesTitle(theme, text): + return ItemListSectionHeaderItem(presentationData: presentationData, text: text, sectionId: self.section) + case let .overview(theme, stats): + return StatsOverviewItem(presentationData: presentationData, stats: stats, sectionId: self.section, style: .blocks) + case let .growthGraph(theme, strings, dateTimeFormat, title, graph), + let .followersGraph(theme, strings, dateTimeFormat, title, graph), + let .notificationsGraph(theme, strings, dateTimeFormat, title, graph), + let .viewsByHourGraph(theme, strings, dateTimeFormat, title, graph), + let .postInteractionsGraph(theme, strings, dateTimeFormat, title, graph), + let .viewsBySourceGraph(theme, strings, dateTimeFormat, title, graph), + let .followersBySourceGraph(theme, strings, dateTimeFormat, title, graph), + let .languagesGraph(theme, strings, dateTimeFormat, title, graph): + return StatsGraphItem(presentationData: presentationData, title: title, graph: graph, sectionId: self.section, style: .blocks) + } + } +} + +private func statsControllerEntries(data: ChannelStats?, presentationData: PresentationData) -> [StatsEntry] { + var entries: [StatsEntry] = [] + + if let data = data { + entries.append(.overviewHeader(presentationData.theme, "OVERVIEW")) + entries.append(.overview(presentationData.theme, data)) + + entries.append(.growthTitle(presentationData.theme, "GROWTH")) + entries.append(.growthGraph(presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, "Growth", data.growthGraph)) + + entries.append(.followersTitle(presentationData.theme, "FOLLOWERS")) + entries.append(.followersGraph(presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, "Followers", data.followersGraph)) + + entries.append(.notificationsTitle(presentationData.theme, "NOTIFICATIONS")) + entries.append(.notificationsGraph(presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, "Notifications", data.muteGraph)) + } + + return entries +} + +public func channelStatsController(context: AccountContext, peer: Peer, cachedPeerData: CachedPeerData) -> ViewController { + var pushControllerImpl: ((ViewController) -> Void)? + var presentControllerImpl: ((ViewController, ViewControllerPresentationArguments?) -> Void)? + var navigateToChatImpl: ((Peer) -> Void)? + + let actionsDisposable = DisposableSet() + let checkCreationAvailabilityDisposable = MetaDisposable() + actionsDisposable.add(checkCreationAvailabilityDisposable) + + let dataPromise = Promise(nil) + + var datacenterId: Int32 = 0 + if let cachedData = cachedPeerData as? CachedChannelData { + datacenterId = cachedData.statsDatacenterId + } + + let statsContext = ChannelStatsContext(network: context.account.network, datacenterId: datacenterId, peer: peer) + let dataSignal: Signal = statsContext.state + |> map { state in + return state.stats + } |> afterNext({ [weak statsContext] a in + if let w = statsContext, let a = a { + if case .OnDemand = a.interactionsGraph { + w.loadInteractionsGraph() + } + } + }) + dataPromise.set(.single(nil) |> then(dataSignal)) + + let arguments = StatsArguments() + + let signal = combineLatest(context.sharedContext.presentationData, dataPromise.get()) + |> deliverOnMainQueue + |> map { presentationData, data -> (ItemListControllerState, (ItemListNodeState, Any)) in + let controllerState = ItemListControllerState(presentationData: ItemListPresentationData(presentationData), title: .text(presentationData.strings.ChannelInfo_Stats), leftNavigationButton: nil, rightNavigationButton: nil, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: true) + let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: statsControllerEntries(data: data, presentationData: presentationData), style: .blocks, emptyStateItem: nil, crossfadeState: false, animateChanges: false) + + return (controllerState, (listState, arguments)) + } + |> afterDisposed { + actionsDisposable.dispose() + let _ = statsContext.state + } + + let controller = ItemListController(context: context, state: signal) + controller.didDisappear = { [weak controller] _ in + controller?.clearItemNodesHighlight(animated: true) + } + pushControllerImpl = { [weak controller] c in + if let controller = controller { + (controller.navigationController as? NavigationController)?.pushViewController(c, animated: true) + } + } + presentControllerImpl = { [weak controller] c, a in + if let controller = controller { + controller.present(c, in: .window(.root), with: a) + } + } + return controller +} diff --git a/submodules/StatisticsUI/Sources/StatsGraphItem.swift b/submodules/StatisticsUI/Sources/StatsGraphItem.swift new file mode 100644 index 0000000000..a800baf8e9 --- /dev/null +++ b/submodules/StatisticsUI/Sources/StatsGraphItem.swift @@ -0,0 +1,205 @@ +import Foundation +import UIKit +import Display +import AsyncDisplayKit +import SwiftSignalKit +import TelegramCore +import SyncCore +import TelegramPresentationData +import ItemListUI +import PresentationDataUtils +import Charts + +class StatsGraphItem: ListViewItem, ItemListItem { + let presentationData: ItemListPresentationData + let title: String + let graph: ChannelStatsGraph + let sectionId: ItemListSectionId + let style: ItemListStyle + + init(presentationData: ItemListPresentationData, title: String, graph: ChannelStatsGraph, sectionId: ItemListSectionId, style: ItemListStyle) { + self.presentationData = presentationData + self.title = title + self.graph = graph + self.sectionId = sectionId + self.style = style + } + + func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal?, (ListViewItemApply) -> Void)) -> Void) { + async { + let node = StatsGraphItemNode() + let (layout, apply) = node.asyncLayout()(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem)) + + node.contentSize = layout.contentSize + node.insets = layout.insets + + Queue.mainQueue().async { + completion(node, { + return (nil, { _ in apply() }) + }) + } + } + } + + func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping (ListViewItemApply) -> Void) -> Void) { + Queue.mainQueue().async { + if let nodeValue = node() as? StatsGraphItemNode { + let makeLayout = nodeValue.asyncLayout() + + async { + let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem)) + Queue.mainQueue().async { + completion(layout, { _ in + apply() + }) + } + } + } + } + } + + var selectable: Bool = false +} + +class StatsGraphItemNode: ListViewItemNode { + private let backgroundNode: ASDisplayNode + private let topStripeNode: ASDisplayNode + private let bottomStripeNode: ASDisplayNode + + let chartNode: ChartNode + + private var item: StatsGraphItem? + + init() { + self.backgroundNode = ASDisplayNode() + self.backgroundNode.isLayerBacked = true + self.backgroundNode.backgroundColor = .white + + self.topStripeNode = ASDisplayNode() + self.topStripeNode.isLayerBacked = true + + self.bottomStripeNode = ASDisplayNode() + self.bottomStripeNode.isLayerBacked = true + + self.chartNode = ChartNode() + + super.init(layerBacked: false, dynamicBounce: false) + + self.clipsToBounds = true + + self.addSubnode(self.chartNode) + } + + func asyncLayout() -> (_ item: StatsGraphItem, _ params: ListViewItemLayoutParams, _ insets: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) { + let currentItem = self.item + + return { item, params, neighbors in + let leftInset = params.leftInset + let rightInset: CGFloat = params.rightInset + var updatedTheme: PresentationTheme? + var updatedGraph: ChannelStatsGraph? + + if currentItem?.presentationData.theme !== item.presentationData.theme { + updatedTheme = item.presentationData.theme + } + + if currentItem?.graph != item.graph { + updatedGraph = item.graph + } + + let contentSize: CGSize + let insets: UIEdgeInsets + let separatorHeight = UIScreenPixel + let itemBackgroundColor: UIColor + let itemSeparatorColor: UIColor + + switch item.style { + case .plain: + itemBackgroundColor = item.presentationData.theme.list.plainBackgroundColor + itemSeparatorColor = item.presentationData.theme.list.itemPlainSeparatorColor + contentSize = CGSize(width: params.width, height: 320.0) + insets = itemListNeighborsPlainInsets(neighbors) + case .blocks: + itemBackgroundColor = item.presentationData.theme.list.itemBlocksBackgroundColor + itemSeparatorColor = item.presentationData.theme.list.itemBlocksSeparatorColor + contentSize = CGSize(width: params.width, height: 320.0) + insets = itemListNeighborsGroupedInsets(neighbors) + } + + let layout = ListViewItemNodeLayout(contentSize: contentSize, insets: insets) + + return (ListViewItemNodeLayout(contentSize: contentSize, insets: insets), { [weak self] in + if let strongSelf = self { + strongSelf.item = item + + if let _ = updatedTheme { + strongSelf.topStripeNode.backgroundColor = itemSeparatorColor + strongSelf.bottomStripeNode.backgroundColor = itemSeparatorColor + strongSelf.backgroundNode.backgroundColor = itemBackgroundColor + } + + if let updatedGraph = updatedGraph, case let .Loaded(data) = updatedGraph { + strongSelf.chartNode.setup(data) + } + + switch item.style { + case .plain: + if strongSelf.backgroundNode.supernode != nil { + strongSelf.backgroundNode.removeFromSupernode() + } + if strongSelf.topStripeNode.supernode != nil { + strongSelf.topStripeNode.removeFromSupernode() + } + if strongSelf.bottomStripeNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 0) + } + + strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: leftInset, y: contentSize.height - separatorHeight), size: CGSize(width: params.width - leftInset, height: separatorHeight)) + case .blocks: + if strongSelf.backgroundNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.backgroundNode, at: 0) + } + if strongSelf.topStripeNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.topStripeNode, at: 1) + } + if strongSelf.bottomStripeNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 2) + } + switch neighbors.top { + case .sameSection(false): + strongSelf.topStripeNode.isHidden = true + default: + strongSelf.topStripeNode.isHidden = false + } + let bottomStripeInset: CGFloat + switch neighbors.bottom { + case .sameSection(false): + bottomStripeInset = leftInset + default: + bottomStripeInset = 0.0 + } + + strongSelf.chartNode.frame = CGRect(origin: CGPoint(x: leftInset, y: -30.0), size: CGSize(width: layout.size.width - leftInset - rightInset, height: 350.0)) + + strongSelf.backgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: contentSize.height + min(insets.top, separatorHeight) + min(insets.bottom, separatorHeight))) + strongSelf.topStripeNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: separatorHeight)) + strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: bottomStripeInset, y: contentSize.height - separatorHeight), size: CGSize(width: params.width - bottomStripeInset, height: separatorHeight)) + } + } + }) + } + } + + override func animateInsertion(_ currentTimestamp: Double, duration: Double, short: Bool) { + self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.4) + } + + override func animateAdded(_ currentTimestamp: Double, duration: Double) { + self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + } + + override func animateRemoved(_ currentTimestamp: Double, duration: Double) { + self.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.15, removeOnCompletion: false) + } +} + diff --git a/submodules/StatisticsUI/Sources/StatsOverviewItem.swift b/submodules/StatisticsUI/Sources/StatsOverviewItem.swift new file mode 100644 index 0000000000..5e85186e30 --- /dev/null +++ b/submodules/StatisticsUI/Sources/StatsOverviewItem.swift @@ -0,0 +1,292 @@ +import Foundation +import UIKit +import Display +import AsyncDisplayKit +import SwiftSignalKit +import TelegramCore +import SyncCore +import TelegramPresentationData +import ItemListUI +import PresentationDataUtils +import Charts + +class StatsOverviewItem: ListViewItem, ItemListItem { + let presentationData: ItemListPresentationData + let stats: ChannelStats + let sectionId: ItemListSectionId + let style: ItemListStyle + + init(presentationData: ItemListPresentationData, stats: ChannelStats, sectionId: ItemListSectionId, style: ItemListStyle) { + self.presentationData = presentationData + self.stats = stats + self.sectionId = sectionId + self.style = style + } + + func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal?, (ListViewItemApply) -> Void)) -> Void) { + async { + let node = StatsOverviewItemNode() + let (layout, apply) = node.asyncLayout()(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem)) + + node.contentSize = layout.contentSize + node.insets = layout.insets + + Queue.mainQueue().async { + completion(node, { + return (nil, { _ in apply() }) + }) + } + } + } + + func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping (ListViewItemApply) -> Void) -> Void) { + Queue.mainQueue().async { + if let nodeValue = node() as? StatsOverviewItemNode { + let makeLayout = nodeValue.asyncLayout() + + async { + let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem)) + Queue.mainQueue().async { + completion(layout, { _ in + apply() + }) + } + } + } + } + } + + var selectable: Bool = false +} + +class StatsOverviewItemNode: ListViewItemNode { + private let backgroundNode: ASDisplayNode + private let topStripeNode: ASDisplayNode + private let bottomStripeNode: ASDisplayNode + + private let followersValueLabel: ImmediateTextNode + private let viewsPerPostValueLabel: ImmediateTextNode + private let sharesPerPostValueLabel: ImmediateTextNode + private let enabledNotificationsValueLabel: ImmediateTextNode + + private let followersTitleLabel: ImmediateTextNode + private let viewsPerPostTitleLabel: ImmediateTextNode + private let sharesPerPostTitleLabel: ImmediateTextNode + private let enabledNotificationsTitleLabel: ImmediateTextNode + + private let followersDeltaLabel: ImmediateTextNode + private let viewsPerPostDeltaLabel: ImmediateTextNode + private let sharesPerPostDeltaLabel: ImmediateTextNode + + private var item: StatsOverviewItem? + + init() { + self.backgroundNode = ASDisplayNode() + self.backgroundNode.isLayerBacked = true + self.backgroundNode.backgroundColor = .white + + self.topStripeNode = ASDisplayNode() + self.topStripeNode.isLayerBacked = true + + self.bottomStripeNode = ASDisplayNode() + self.bottomStripeNode.isLayerBacked = true + + self.followersValueLabel = ImmediateTextNode() + self.viewsPerPostValueLabel = ImmediateTextNode() + self.sharesPerPostValueLabel = ImmediateTextNode() + self.enabledNotificationsValueLabel = ImmediateTextNode() + + self.followersTitleLabel = ImmediateTextNode() + self.viewsPerPostTitleLabel = ImmediateTextNode() + self.sharesPerPostTitleLabel = ImmediateTextNode() + self.enabledNotificationsTitleLabel = ImmediateTextNode() + + self.followersDeltaLabel = ImmediateTextNode() + self.viewsPerPostDeltaLabel = ImmediateTextNode() + self.sharesPerPostDeltaLabel = ImmediateTextNode() + + super.init(layerBacked: false, dynamicBounce: false) + + self.clipsToBounds = true + + self.addSubnode(self.followersValueLabel) + self.addSubnode(self.viewsPerPostValueLabel) + self.addSubnode(self.sharesPerPostValueLabel) + self.addSubnode(self.enabledNotificationsValueLabel) + + self.addSubnode(self.followersTitleLabel) + self.addSubnode(self.viewsPerPostTitleLabel) + self.addSubnode(self.sharesPerPostTitleLabel) + self.addSubnode(self.enabledNotificationsTitleLabel) + + self.addSubnode(self.followersDeltaLabel) + self.addSubnode(self.viewsPerPostDeltaLabel) + self.addSubnode(self.sharesPerPostDeltaLabel) + } + + func asyncLayout() -> (_ item: StatsOverviewItem, _ params: ListViewItemLayoutParams, _ insets: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) { + let makeFollowersValueLabelLayout = TextNode.asyncLayout(self.followersValueLabel) + let makeViewsPerPostValueLabelLayout = TextNode.asyncLayout(self.viewsPerPostValueLabel) + let makeSharesPerPostValueLabelLayout = TextNode.asyncLayout(self.sharesPerPostValueLabel) + let makeEnabledNotificationsValueLabelLayout = TextNode.asyncLayout(self.enabledNotificationsValueLabel) + + let makeFollowersTitleLabelLayout = TextNode.asyncLayout(self.followersTitleLabel) + let makeViewsPerPostTitleLabelLayout = TextNode.asyncLayout(self.viewsPerPostTitleLabel) + let makeSharesPerPostTitleLabelLayout = TextNode.asyncLayout(self.sharesPerPostTitleLabel) + let makeEnabledNotificationsTitleLabelLayout = TextNode.asyncLayout(self.enabledNotificationsTitleLabel) + + let makeFollowersDeltaLabelLayout = TextNode.asyncLayout(self.followersDeltaLabel) + let makeViewsPerPostDeltaLabelLayout = TextNode.asyncLayout(self.viewsPerPostDeltaLabel) + let makeSharesPerPostDeltaLabelLayout = TextNode.asyncLayout(self.sharesPerPostDeltaLabel) + + let currentItem = self.item + + return { item, params, neighbors in + let leftInset = params.leftInset + let rightInset: CGFloat = params.rightInset + var updatedTheme: PresentationTheme? + var updatedGraph: ChannelStatsGraph? + + if currentItem?.presentationData.theme !== item.presentationData.theme { + updatedTheme = item.presentationData.theme + } + + let valueFont = Font.regular(item.presentationData.fontSize.itemListBaseHeaderFontSize) + let titleFont = Font.regular(item.presentationData.fontSize.itemListBaseHeaderFontSize) + let deltaFont = Font.regular(item.presentationData.fontSize.itemListBaseHeaderFontSize) + + let (followersValueLabelLayout, followersValueLabelApply) = makeFollowersValueLabelLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: "221K", font: valueFont, textColor: item.presentationData.theme.list.sectionHeaderTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: 100.0, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) + + let (viewsPerPostValueLabelLayout, viewsPerPostValueLabelApply) = makeViewsPerPostValueLabelLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: "120K", font: valueFont, textColor: item.presentationData.theme.list.sectionHeaderTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: 100.0, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) + + let (sharesPerPostValueLabelLayout, sharesPerPostValueLabelApply) = makeSharesPerPostValueLabelLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: "350", font: valueFont, textColor: item.presentationData.theme.list.sectionHeaderTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: 100.0, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) + + let (enabledNotificationsValueLabelLayout, enabledNotificationsValueLabelApply) = makeEnabledNotificationsValueLabelLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: "22.77%", font: valueFont, textColor: item.presentationData.theme.list.sectionHeaderTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: 100.0, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) + + + let (followersTitleLabelLayout, followersTitleLabelApply) = makeFollowersTitleLabelLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: "Followers", font: valueFont, textColor: item.presentationData.theme.list.sectionHeaderTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: 100.0, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) + + let (viewsPerPostTitleLabelLayout, viewsPerPostTitleLabelApply) = makeViewsPerPostTitleLabelLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: "Views Per Post", font: valueFont, textColor: item.presentationData.theme.list.sectionHeaderTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: 100.0, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) + + let (sharesPerPostTitleLabelLayout, sharesPerPostTitleLabelApply) = makeSharesPerPostTitleLabelLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: "Shares Per Post", font: valueFont, textColor: item.presentationData.theme.list.sectionHeaderTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: 100.0, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) + + let (enabledNotificationsTitleLabelLayout, enabledNotificationsTitleLabelApply) = makeEnabledNotificationsTitleLabelLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: "Enabled Notifications", font: valueFont, textColor: item.presentationData.theme.list.sectionHeaderTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: 100.0, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) + + let (followersDeltaLabelLayout, followersDeltaLabelApply) = makeFollowersDeltaLabelLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: "+474 (0.21%)", font: valueFont, textColor: item.presentationData.theme.list.sectionHeaderTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: 100.0, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) + + let (viewsPerPostDeltaLabelLayout, viewsPerPostDeltaLabelApply) = makeViewsPerPostDeltaLabelLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: "-14K (10.68%)", font: valueFont, textColor: item.presentationData.theme.list.sectionHeaderTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: 100.0, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) + + let (sharesPerPostDeltaLabelLayout, sharesPerPostDeltaLabelApply) = makeSharesPerPostDeltaLabelLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: "-134 (27.68%)", font: valueFont, textColor: item.presentationData.theme.list.sectionHeaderTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: 100.0, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) + + let contentSize: CGSize + let insets: UIEdgeInsets + let separatorHeight = UIScreenPixel + let itemBackgroundColor: UIColor + let itemSeparatorColor: UIColor + + switch item.style { + case .plain: + itemBackgroundColor = item.presentationData.theme.list.plainBackgroundColor + itemSeparatorColor = item.presentationData.theme.list.itemPlainSeparatorColor + contentSize = CGSize(width: params.width, height: 120.0) + insets = itemListNeighborsPlainInsets(neighbors) + case .blocks: + itemBackgroundColor = item.presentationData.theme.list.itemBlocksBackgroundColor + itemSeparatorColor = item.presentationData.theme.list.itemBlocksSeparatorColor + contentSize = CGSize(width: params.width, height: 120.0) + insets = itemListNeighborsGroupedInsets(neighbors) + } + + let layout = ListViewItemNodeLayout(contentSize: contentSize, insets: insets) + + return (ListViewItemNodeLayout(contentSize: contentSize, insets: insets), { [weak self] in + if let strongSelf = self { + strongSelf.item = item + + let _ = followersValueLabelApply() + let _ = viewsPerPostValueLabelApply() + let _ = sharesPerPostValueLabelApply() + let _ = enabledNotificationsValueLabelApply() + + let _ = followersTitleLabelApply() + let _ = viewsPerPostTitleLabelApply() + let _ = sharesPerPostTitleLabelApply() + let _ = enabledNotificationsTitleLabelApply() + + let _ = followersDeltaLabelApply() + let _ = viewsPerPostDeltaLabelApply() + let _ = sharesPerPostDeltaLabelApply() + + if let _ = updatedTheme { + strongSelf.topStripeNode.backgroundColor = itemSeparatorColor + strongSelf.bottomStripeNode.backgroundColor = itemSeparatorColor + strongSelf.backgroundNode.backgroundColor = itemBackgroundColor + } + + switch item.style { + case .plain: + if strongSelf.backgroundNode.supernode != nil { + strongSelf.backgroundNode.removeFromSupernode() + } + if strongSelf.topStripeNode.supernode != nil { + strongSelf.topStripeNode.removeFromSupernode() + } + if strongSelf.bottomStripeNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 0) + } + + strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: leftInset, y: contentSize.height - separatorHeight), size: CGSize(width: params.width - leftInset, height: separatorHeight)) + case .blocks: + if strongSelf.backgroundNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.backgroundNode, at: 0) + } + if strongSelf.topStripeNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.topStripeNode, at: 1) + } + if strongSelf.bottomStripeNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 2) + } + switch neighbors.top { + case .sameSection(false): + strongSelf.topStripeNode.isHidden = true + default: + strongSelf.topStripeNode.isHidden = false + } + let bottomStripeInset: CGFloat + switch neighbors.bottom { + case .sameSection(false): + bottomStripeInset = leftInset + default: + bottomStripeInset = 0.0 + } + + strongSelf.backgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: contentSize.height + min(insets.top, separatorHeight) + min(insets.bottom, separatorHeight))) + strongSelf.topStripeNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: separatorHeight)) + strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: bottomStripeInset, y: contentSize.height - separatorHeight), size: CGSize(width: params.width - bottomStripeInset, height: separatorHeight)) + } + + strongSelf.followersValueLabel.frame = CGRect(origin: CGPoint(x: leftInset, y: 7.0), size: followersValueLabelLayout.size) + + strongSelf.viewsPerPostValueLabel.frame = CGRect(origin: CGPoint(x: leftInset, y: 44.0), size: viewsPerPostValueLabelLayout.size) + + strongSelf.sharesPerPostValueLabel.frame = CGRect(origin: CGPoint(x: layout.size.width / 2.0, y: 44.0), size: sharesPerPostValueLabelLayout.size) + + strongSelf.enabledNotificationsValueLabel.frame = CGRect(origin: CGPoint(x: layout.size.width / 2.0, y: 7.0), size: enabledNotificationsValueLabelLayout.size) + } + }) + } + } + + override func animateInsertion(_ currentTimestamp: Double, duration: Double, short: Bool) { + self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.4) + } + + override func animateAdded(_ currentTimestamp: Double, duration: Double) { + self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + } + + override func animateRemoved(_ currentTimestamp: Double, duration: Double) { + self.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.15, removeOnCompletion: false) + } +} + diff --git a/submodules/SyncCore/Sources/CachedChannelData.swift b/submodules/SyncCore/Sources/CachedChannelData.swift index c00a913477..49bcb7c71c 100644 --- a/submodules/SyncCore/Sources/CachedChannelData.swift +++ b/submodules/SyncCore/Sources/CachedChannelData.swift @@ -166,6 +166,7 @@ public final class CachedChannelData: CachedPeerData { public let slowModeTimeout: Int32? public let slowModeValidUntilTimestamp: Int32? public let hasScheduledMessages: Bool + public let statsDatacenterId: Int32 public let peerIds: Set public let messageIds: Set @@ -192,9 +193,10 @@ public final class CachedChannelData: CachedPeerData { self.slowModeTimeout = nil self.slowModeValidUntilTimestamp = nil self.hasScheduledMessages = false + self.statsDatacenterId = 0 } - public init(isNotAccessible: Bool, flags: CachedChannelFlags, about: String?, participantsSummary: CachedChannelParticipantsSummary, exportedInvitation: ExportedInvitation?, botInfos: [CachedPeerBotInfo], peerStatusSettings: PeerStatusSettings?, pinnedMessageId: MessageId?, stickerPack: StickerPackCollectionInfo?, minAvailableMessageId: MessageId?, migrationReference: ChannelMigrationReference?, linkedDiscussionPeerId: PeerId?, peerGeoLocation: PeerGeoLocation?, slowModeTimeout: Int32?, slowModeValidUntilTimestamp: Int32?, hasScheduledMessages: Bool) { + public init(isNotAccessible: Bool, flags: CachedChannelFlags, about: String?, participantsSummary: CachedChannelParticipantsSummary, exportedInvitation: ExportedInvitation?, botInfos: [CachedPeerBotInfo], peerStatusSettings: PeerStatusSettings?, pinnedMessageId: MessageId?, stickerPack: StickerPackCollectionInfo?, minAvailableMessageId: MessageId?, migrationReference: ChannelMigrationReference?, linkedDiscussionPeerId: PeerId?, peerGeoLocation: PeerGeoLocation?, slowModeTimeout: Int32?, slowModeValidUntilTimestamp: Int32?, hasScheduledMessages: Bool, statsDatacenterId: Int32) { self.isNotAccessible = isNotAccessible self.flags = flags self.about = about @@ -211,6 +213,7 @@ public final class CachedChannelData: CachedPeerData { self.slowModeTimeout = slowModeTimeout self.slowModeValidUntilTimestamp = slowModeValidUntilTimestamp self.hasScheduledMessages = hasScheduledMessages + self.statsDatacenterId = statsDatacenterId var peerIds = Set() for botInfo in botInfos { @@ -231,67 +234,71 @@ public final class CachedChannelData: CachedPeerData { } public func withUpdatedIsNotAccessible(_ isNotAccessible: Bool) -> CachedChannelData { - return CachedChannelData(isNotAccessible: isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages) + return CachedChannelData(isNotAccessible: isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId) } public func withUpdatedFlags(_ flags: CachedChannelFlags) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId) } public func withUpdatedAbout(_ about: String?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId) } public func withUpdatedParticipantsSummary(_ participantsSummary: CachedChannelParticipantsSummary) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId) } public func withUpdatedExportedInvitation(_ exportedInvitation: ExportedInvitation?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId) } public func withUpdatedBotInfos(_ botInfos: [CachedPeerBotInfo]) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId) } public func withUpdatedPeerStatusSettings(_ peerStatusSettings: PeerStatusSettings?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId) } public func withUpdatedPinnedMessageId(_ pinnedMessageId: MessageId?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId) } public func withUpdatedStickerPack(_ stickerPack: StickerPackCollectionInfo?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId) } public func withUpdatedMinAvailableMessageId(_ minAvailableMessageId: MessageId?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId) } public func withUpdatedMigrationReference(_ migrationReference: ChannelMigrationReference?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId) } public func withUpdatedLinkedDiscussionPeerId(_ linkedDiscussionPeerId: PeerId?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId) } public func withUpdatedPeerGeoLocation(_ peerGeoLocation: PeerGeoLocation?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId) } public func withUpdatedSlowModeTimeout(_ slowModeTimeout: Int32?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId) } public func withUpdatedSlowModeValidUntilTimestamp(_ slowModeValidUntilTimestamp: Int32?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId) } public func withUpdatedHasScheduledMessages(_ hasScheduledMessages: Bool) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: hasScheduledMessages) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: hasScheduledMessages, statsDatacenterId: self.statsDatacenterId) + } + + public func withUpdatedStatsDatacenterId(_ statsDatacenterId: Int32) -> CachedChannelData { + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: statsDatacenterId) } public init(decoder: PostboxDecoder) { @@ -346,6 +353,7 @@ public final class CachedChannelData: CachedPeerData { self.slowModeTimeout = decoder.decodeOptionalInt32ForKey("smt") self.slowModeValidUntilTimestamp = decoder.decodeOptionalInt32ForKey("smv") self.hasScheduledMessages = decoder.decodeBoolForKey("hsm", orElse: false) + self.statsDatacenterId = decoder.decodeInt32ForKey("sdi", orElse: 0) if let linkedDiscussionPeerId = self.linkedDiscussionPeerId { peerIds.insert(linkedDiscussionPeerId) @@ -430,6 +438,7 @@ public final class CachedChannelData: CachedPeerData { encoder.encodeNil(forKey: "smv") } encoder.encodeBool(self.hasScheduledMessages, forKey: "hsm") + encoder.encodeInt32(self.statsDatacenterId, forKey: "sdi") } public func isEqual(to: CachedPeerData) -> Bool { @@ -497,6 +506,14 @@ public final class CachedChannelData: CachedPeerData { return false } + if other.hasScheduledMessages != self.hasScheduledMessages { + return false + } + + if other.statsDatacenterId != self.statsDatacenterId { + return false + } + return true } } diff --git a/submodules/SyncCore/Sources/TextEntitiesMessageAttribute.swift b/submodules/SyncCore/Sources/TextEntitiesMessageAttribute.swift index 79fe68a5ed..e0c3f565a9 100644 --- a/submodules/SyncCore/Sources/TextEntitiesMessageAttribute.swift +++ b/submodules/SyncCore/Sources/TextEntitiesMessageAttribute.swift @@ -19,6 +19,7 @@ public enum MessageTextEntityType: Equatable { case Strikethrough case BlockQuote case Underline + case BankCard case Custom(type: CustomEntityType) } @@ -65,6 +66,8 @@ public struct MessageTextEntity: PostboxCoding, Equatable { self.type = .BlockQuote case 15: self.type = .Underline + case 16: + self.type = .BankCard case Int32.max: self.type = .Custom(type: decoder.decodeInt32ForKey("type", orElse: 0)) default: @@ -110,6 +113,8 @@ public struct MessageTextEntity: PostboxCoding, Equatable { encoder.encodeInt32(14, forKey: "_rawValue") case .Underline: encoder.encodeInt32(15, forKey: "_rawValue") + case .BankCard: + encoder.encodeInt32(16, forKey: "_rawValue") case let .Custom(type): encoder.encodeInt32(Int32.max, forKey: "_rawValue") encoder.encodeInt32(type, forKey: "type") diff --git a/submodules/TelegramApi/Sources/Api0.swift b/submodules/TelegramApi/Sources/Api0.swift index ab2f4a7b7b..be3e05a869 100644 --- a/submodules/TelegramApi/Sources/Api0.swift +++ b/submodules/TelegramApi/Sources/Api0.swift @@ -412,6 +412,9 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[2103482845] = { return Api.SecurePlainData.parse_securePlainPhone($0) } dict[569137759] = { return Api.SecurePlainData.parse_securePlainEmail($0) } dict[-1269012015] = { return Api.messages.AffectedHistory.parse_affectedHistory($0) } + dict[1244130093] = { return Api.StatsGraph.parse_statsGraphAsync($0) } + dict[-1092839390] = { return Api.StatsGraph.parse_statsGraphError($0) } + dict[-1057809608] = { return Api.StatsGraph.parse_statsGraph($0) } dict[-1036572727] = { return Api.account.PasswordInputSettings.parse_passwordInputSettings($0) } dict[878078826] = { return Api.PageTableCell.parse_pageTableCell($0) } dict[-1626209256] = { return Api.ChatBannedRights.parse_chatBannedRights($0) } @@ -480,6 +483,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-668391402] = { return Api.InputUser.parse_inputUser($0) } dict[-1366746132] = { return Api.Page.parse_page($0) } dict[871426631] = { return Api.SecureCredentialsEncrypted.parse_secureCredentialsEncrypted($0) } + dict[-875679776] = { return Api.StatsPercentValue.parse_statsPercentValue($0) } dict[157948117] = { return Api.upload.File.parse_file($0) } dict[-242427324] = { return Api.upload.File.parse_fileCdnRedirect($0) } dict[-1078612597] = { return Api.ChannelLocation.parse_channelLocationEmpty($0) } @@ -506,6 +510,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1160215659] = { return Api.InputMessage.parse_inputMessageReplyTo($0) } dict[-2037963464] = { return Api.InputMessage.parse_inputMessagePinned($0) } dict[-1564789301] = { return Api.PhoneCallProtocol.parse_phoneCallProtocol($0) } + dict[-1237848657] = { return Api.StatsDateRangeDays.parse_statsDateRangeDays($0) } dict[-1567175714] = { return Api.MessageFwdAuthor.parse_messageFwdAuthor($0) } dict[-1539849235] = { return Api.WallPaper.parse_wallPaper($0) } dict[-1963717851] = { return Api.WallPaper.parse_wallPaperNoFile($0) } @@ -520,6 +525,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1837345356] = { return Api.InputChatPhoto.parse_inputChatUploadedPhoto($0) } dict[-1991004873] = { return Api.InputChatPhoto.parse_inputChatPhoto($0) } dict[-368917890] = { return Api.PaymentCharge.parse_paymentCharge($0) } + dict[205195937] = { return Api.stats.BroadcastStats.parse_broadcastStats($0) } dict[-484987010] = { return Api.Updates.parse_updatesTooLong($0) } dict[-1857044719] = { return Api.Updates.parse_updateShortMessage($0) } dict[377562760] = { return Api.Updates.parse_updateShortChatMessage($0) } @@ -527,6 +533,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[1918567619] = { return Api.Updates.parse_updatesCombined($0) } dict[1957577280] = { return Api.Updates.parse_updates($0) } dict[301019932] = { return Api.Updates.parse_updateShortSentMessage($0) } + dict[-884757282] = { return Api.StatsAbsValueAndPrev.parse_statsAbsValueAndPrev($0) } dict[1038967584] = { return Api.MessageMedia.parse_messageMediaEmpty($0) } dict[1457575028] = { return Api.MessageMedia.parse_messageMediaGeo($0) } dict[-1618676578] = { return Api.MessageMedia.parse_messageMediaUnsupported($0) } @@ -608,6 +615,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[1421174295] = { return Api.WebPageAttribute.parse_webPageAttributeTheme($0) } dict[82699215] = { return Api.messages.FeaturedStickers.parse_featuredStickersNotModified($0) } dict[-123893531] = { return Api.messages.FeaturedStickers.parse_featuredStickers($0) } + dict[1375940666] = { return Api.auth.LoginTokenInfo.parse_loginTokenInfo($0) } dict[-2048646399] = { return Api.PhoneCallDiscardReason.parse_phoneCallDiscardReasonMissed($0) } dict[-527056480] = { return Api.PhoneCallDiscardReason.parse_phoneCallDiscardReasonDisconnect($0) } dict[1471006352] = { return Api.PhoneCallDiscardReason.parse_phoneCallDiscardReasonHangup($0) } @@ -678,8 +686,6 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-395967805] = { return Api.messages.AllStickers.parse_allStickersNotModified($0) } dict[-302170017] = { return Api.messages.AllStickers.parse_allStickers($0) } dict[-1655957568] = { return Api.PhoneConnection.parse_phoneConnection($0) } - dict[-206688531] = { return Api.help.UserInfo.parse_userInfoEmpty($0) } - dict[32192344] = { return Api.help.UserInfo.parse_userInfo($0) } dict[-1194283041] = { return Api.AccountDaysTTL.parse_accountDaysTTL($0) } dict[-1658158621] = { return Api.SecureValueType.parse_secureValueTypePersonalDetails($0) } dict[1034709504] = { return Api.SecureValueType.parse_secureValueTypePassport($0) } @@ -746,6 +752,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[1363483106] = { return Api.DialogPeer.parse_dialogPeerFolder($0) } dict[-104284986] = { return Api.WebDocument.parse_webDocumentNoProxy($0) } dict[475467473] = { return Api.WebDocument.parse_webDocument($0) } + dict[1211967244] = { return Api.Theme.parse_themeDocumentNotModified($0) } dict[42930452] = { return Api.Theme.parse_theme($0) } dict[-1290580579] = { return Api.contacts.Found.parse_found($0) } dict[-368018716] = { return Api.ChannelAdminLogEventsFilter.parse_channelAdminLogEventsFilter($0) } @@ -761,6 +768,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[1041346555] = { return Api.updates.ChannelDifference.parse_channelDifferenceEmpty($0) } dict[543450958] = { return Api.updates.ChannelDifference.parse_channelDifference($0) } dict[-1531132162] = { return Api.updates.ChannelDifference.parse_channelDifferenceTooLong($0) } + dict[-581804346] = { return Api.StatsRowAbsValueAndPrev.parse_statsRowAbsValueAndPrev($0) } dict[-309659827] = { return Api.channels.AdminLogResults.parse_adminLogResults($0) } dict[-264117680] = { return Api.ChatOnlines.parse_chatOnlines($0) } dict[488313413] = { return Api.InputAppEvent.parse_inputAppEvent($0) } @@ -782,6 +790,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1672577397] = { return Api.MessageEntity.parse_messageEntityUnderline($0) } dict[-1090087980] = { return Api.MessageEntity.parse_messageEntityStrike($0) } dict[34469328] = { return Api.MessageEntity.parse_messageEntityBlockquote($0) } + dict[1981704948] = { return Api.MessageEntity.parse_messageEntityBankCard($0) } dict[483901197] = { return Api.InputPhoto.parse_inputPhotoEmpty($0) } dict[1001634122] = { return Api.InputPhoto.parse_inputPhoto($0) } dict[-567906571] = { return Api.contacts.TopPeers.parse_topPeersNotModified($0) } @@ -799,11 +808,13 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-94974410] = { return Api.EncryptedChat.parse_encryptedChat($0) } dict[332848423] = { return Api.EncryptedChat.parse_encryptedChatDiscarded($0) } dict[-901375139] = { return Api.PeerLocated.parse_peerLocated($0) } + dict[-118740917] = { return Api.PeerLocated.parse_peerSelfLocated($0) } dict[922273905] = { return Api.Document.parse_documentEmpty($0) } dict[-1683841855] = { return Api.Document.parse_document($0) } dict[-1707344487] = { return Api.messages.HighScores.parse_highScores($0) } dict[-892779534] = { return Api.WebAuthorization.parse_webAuthorization($0) } dict[-805141448] = { return Api.ImportedContact.parse_importedContact($0) } + dict[-419239361] = { return Api.payments.BankCardData.parse_bankCardData($0) } return dict }() @@ -1081,6 +1092,8 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.messages.AffectedHistory: _1.serialize(buffer, boxed) + case let _1 as Api.StatsGraph: + _1.serialize(buffer, boxed) case let _1 as Api.account.PasswordInputSettings: _1.serialize(buffer, boxed) case let _1 as Api.PageTableCell: @@ -1151,6 +1164,8 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.SecureCredentialsEncrypted: _1.serialize(buffer, boxed) + case let _1 as Api.StatsPercentValue: + _1.serialize(buffer, boxed) case let _1 as Api.upload.File: _1.serialize(buffer, boxed) case let _1 as Api.ChannelLocation: @@ -1185,6 +1200,8 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.PhoneCallProtocol: _1.serialize(buffer, boxed) + case let _1 as Api.StatsDateRangeDays: + _1.serialize(buffer, boxed) case let _1 as Api.MessageFwdAuthor: _1.serialize(buffer, boxed) case let _1 as Api.WallPaper: @@ -1201,8 +1218,12 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.PaymentCharge: _1.serialize(buffer, boxed) + case let _1 as Api.stats.BroadcastStats: + _1.serialize(buffer, boxed) case let _1 as Api.Updates: _1.serialize(buffer, boxed) + case let _1 as Api.StatsAbsValueAndPrev: + _1.serialize(buffer, boxed) case let _1 as Api.MessageMedia: _1.serialize(buffer, boxed) case let _1 as Api.PaymentSavedCredentials: @@ -1273,6 +1294,8 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.messages.FeaturedStickers: _1.serialize(buffer, boxed) + case let _1 as Api.auth.LoginTokenInfo: + _1.serialize(buffer, boxed) case let _1 as Api.PhoneCallDiscardReason: _1.serialize(buffer, boxed) case let _1 as Api.NearestDc: @@ -1331,8 +1354,6 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.PhoneConnection: _1.serialize(buffer, boxed) - case let _1 as Api.help.UserInfo: - _1.serialize(buffer, boxed) case let _1 as Api.AccountDaysTTL: _1.serialize(buffer, boxed) case let _1 as Api.SecureValueType: @@ -1381,6 +1402,8 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.updates.ChannelDifference: _1.serialize(buffer, boxed) + case let _1 as Api.StatsRowAbsValueAndPrev: + _1.serialize(buffer, boxed) case let _1 as Api.channels.AdminLogResults: _1.serialize(buffer, boxed) case let _1 as Api.ChatOnlines: @@ -1409,6 +1432,8 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.ImportedContact: _1.serialize(buffer, boxed) + case let _1 as Api.payments.BankCardData: + _1.serialize(buffer, boxed) default: break } diff --git a/submodules/TelegramApi/Sources/Api1.swift b/submodules/TelegramApi/Sources/Api1.swift index 9e6d38f6d1..09dc6c09b6 100644 --- a/submodules/TelegramApi/Sources/Api1.swift +++ b/submodules/TelegramApi/Sources/Api1.swift @@ -11956,6 +11956,82 @@ public extension Api { } } + } + public enum StatsGraph: TypeConstructorDescription { + case statsGraphAsync(token: String) + case statsGraphError(error: String) + case statsGraph(json: Api.DataJSON) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .statsGraphAsync(let token): + if boxed { + buffer.appendInt32(1244130093) + } + serializeString(token, buffer: buffer, boxed: false) + break + case .statsGraphError(let error): + if boxed { + buffer.appendInt32(-1092839390) + } + serializeString(error, buffer: buffer, boxed: false) + break + case .statsGraph(let json): + if boxed { + buffer.appendInt32(-1057809608) + } + json.serialize(buffer, true) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .statsGraphAsync(let token): + return ("statsGraphAsync", [("token", token)]) + case .statsGraphError(let error): + return ("statsGraphError", [("error", error)]) + case .statsGraph(let json): + return ("statsGraph", [("json", json)]) + } + } + + public static func parse_statsGraphAsync(_ reader: BufferReader) -> StatsGraph? { + var _1: String? + _1 = parseString(reader) + let _c1 = _1 != nil + if _c1 { + return Api.StatsGraph.statsGraphAsync(token: _1!) + } + else { + return nil + } + } + public static func parse_statsGraphError(_ reader: BufferReader) -> StatsGraph? { + var _1: String? + _1 = parseString(reader) + let _c1 = _1 != nil + if _c1 { + return Api.StatsGraph.statsGraphError(error: _1!) + } + else { + return nil + } + } + public static func parse_statsGraph(_ reader: BufferReader) -> StatsGraph? { + var _1: Api.DataJSON? + if let signature = reader.readInt32() { + _1 = Api.parse(reader, signature: signature) as? Api.DataJSON + } + let _c1 = _1 != nil + if _c1 { + return Api.StatsGraph.statsGraph(json: _1!) + } + else { + return nil + } + } + } public enum PageTableCell: TypeConstructorDescription { case pageTableCell(flags: Int32, text: Api.RichText?, colspan: Int32?, rowspan: Int32?) @@ -13662,6 +13738,44 @@ public extension Api { } } + } + public enum StatsPercentValue: TypeConstructorDescription { + case statsPercentValue(part: Double, total: Double) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .statsPercentValue(let part, let total): + if boxed { + buffer.appendInt32(-875679776) + } + serializeDouble(part, buffer: buffer, boxed: false) + serializeDouble(total, buffer: buffer, boxed: false) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .statsPercentValue(let part, let total): + return ("statsPercentValue", [("part", part), ("total", total)]) + } + } + + public static func parse_statsPercentValue(_ reader: BufferReader) -> StatsPercentValue? { + var _1: Double? + _1 = reader.readDouble() + var _2: Double? + _2 = reader.readDouble() + let _c1 = _1 != nil + let _c2 = _2 != nil + if _c1 && _c2 { + return Api.StatsPercentValue.statsPercentValue(part: _1!, total: _2!) + } + else { + return nil + } + } + } public enum ChannelLocation: TypeConstructorDescription { case channelLocationEmpty @@ -14434,6 +14548,44 @@ public extension Api { } } + } + public enum StatsDateRangeDays: TypeConstructorDescription { + case statsDateRangeDays(minDate: Int32, maxDate: Int32) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .statsDateRangeDays(let minDate, let maxDate): + if boxed { + buffer.appendInt32(-1237848657) + } + serializeInt32(minDate, buffer: buffer, boxed: false) + serializeInt32(maxDate, buffer: buffer, boxed: false) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .statsDateRangeDays(let minDate, let maxDate): + return ("statsDateRangeDays", [("minDate", minDate), ("maxDate", maxDate)]) + } + } + + public static func parse_statsDateRangeDays(_ reader: BufferReader) -> StatsDateRangeDays? { + var _1: Int32? + _1 = reader.readInt32() + var _2: Int32? + _2 = reader.readInt32() + let _c1 = _1 != nil + let _c2 = _2 != nil + if _c1 && _c2 { + return Api.StatsDateRangeDays.statsDateRangeDays(minDate: _1!, maxDate: _2!) + } + else { + return nil + } + } + } public enum MessageFwdAuthor: TypeConstructorDescription { case messageFwdAuthor(channelId: Int32) @@ -15098,6 +15250,44 @@ public extension Api { } } + } + public enum StatsAbsValueAndPrev: TypeConstructorDescription { + case statsAbsValueAndPrev(current: Double, previous: Double) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .statsAbsValueAndPrev(let current, let previous): + if boxed { + buffer.appendInt32(-884757282) + } + serializeDouble(current, buffer: buffer, boxed: false) + serializeDouble(previous, buffer: buffer, boxed: false) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .statsAbsValueAndPrev(let current, let previous): + return ("statsAbsValueAndPrev", [("current", current), ("previous", previous)]) + } + } + + public static func parse_statsAbsValueAndPrev(_ reader: BufferReader) -> StatsAbsValueAndPrev? { + var _1: Double? + _1 = reader.readDouble() + var _2: Double? + _2 = reader.readDouble() + let _c1 = _1 != nil + let _c2 = _2 != nil + if _c1 && _c2 { + return Api.StatsAbsValueAndPrev.statsAbsValueAndPrev(current: _1!, previous: _2!) + } + else { + return nil + } + } + } public enum MessageMedia: TypeConstructorDescription { case messageMediaEmpty @@ -20448,10 +20638,17 @@ public extension Api { } public enum Theme: TypeConstructorDescription { + case themeDocumentNotModified case theme(flags: Int32, id: Int64, accessHash: Int64, slug: String, title: String, document: Api.Document?, settings: Api.ThemeSettings?, installsCount: Int32) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { + case .themeDocumentNotModified: + if boxed { + buffer.appendInt32(1211967244) + } + + break case .theme(let flags, let id, let accessHash, let slug, let title, let document, let settings, let installsCount): if boxed { buffer.appendInt32(42930452) @@ -20470,11 +20667,16 @@ public extension Api { public func descriptionFields() -> (String, [(String, Any)]) { switch self { + case .themeDocumentNotModified: + return ("themeDocumentNotModified", []) case .theme(let flags, let id, let accessHash, let slug, let title, let document, let settings, let installsCount): return ("theme", [("flags", flags), ("id", id), ("accessHash", accessHash), ("slug", slug), ("title", title), ("document", document), ("settings", settings), ("installsCount", installsCount)]) } } + public static func parse_themeDocumentNotModified(_ reader: BufferReader) -> Theme? { + return Api.Theme.themeDocumentNotModified + } public static func parse_theme(_ reader: BufferReader) -> Theme? { var _1: Int32? _1 = reader.readInt32() @@ -20880,6 +21082,54 @@ public extension Api { } } + } + public enum StatsRowAbsValueAndPrev: TypeConstructorDescription { + case statsRowAbsValueAndPrev(id: String, title: String, shortTitle: String, values: Api.StatsAbsValueAndPrev) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .statsRowAbsValueAndPrev(let id, let title, let shortTitle, let values): + if boxed { + buffer.appendInt32(-581804346) + } + serializeString(id, buffer: buffer, boxed: false) + serializeString(title, buffer: buffer, boxed: false) + serializeString(shortTitle, buffer: buffer, boxed: false) + values.serialize(buffer, true) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .statsRowAbsValueAndPrev(let id, let title, let shortTitle, let values): + return ("statsRowAbsValueAndPrev", [("id", id), ("title", title), ("shortTitle", shortTitle), ("values", values)]) + } + } + + public static func parse_statsRowAbsValueAndPrev(_ reader: BufferReader) -> StatsRowAbsValueAndPrev? { + var _1: String? + _1 = parseString(reader) + var _2: String? + _2 = parseString(reader) + var _3: String? + _3 = parseString(reader) + var _4: Api.StatsAbsValueAndPrev? + if let signature = reader.readInt32() { + _4 = Api.parse(reader, signature: signature) as? Api.StatsAbsValueAndPrev + } + let _c1 = _1 != nil + let _c2 = _2 != nil + let _c3 = _3 != nil + let _c4 = _4 != nil + if _c1 && _c2 && _c3 && _c4 { + return Api.StatsRowAbsValueAndPrev.statsRowAbsValueAndPrev(id: _1!, title: _2!, shortTitle: _3!, values: _4!) + } + else { + return nil + } + } + } public enum ChatOnlines: TypeConstructorDescription { case chatOnlines(onlines: Int32) @@ -20982,6 +21232,7 @@ public extension Api { case messageEntityUnderline(offset: Int32, length: Int32) case messageEntityStrike(offset: Int32, length: Int32) case messageEntityBlockquote(offset: Int32, length: Int32) + case messageEntityBankCard(offset: Int32, length: Int32) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -21115,6 +21366,13 @@ public extension Api { serializeInt32(offset, buffer: buffer, boxed: false) serializeInt32(length, buffer: buffer, boxed: false) break + case .messageEntityBankCard(let offset, let length): + if boxed { + buffer.appendInt32(1981704948) + } + serializeInt32(offset, buffer: buffer, boxed: false) + serializeInt32(length, buffer: buffer, boxed: false) + break } } @@ -21156,6 +21414,8 @@ public extension Api { return ("messageEntityStrike", [("offset", offset), ("length", length)]) case .messageEntityBlockquote(let offset, let length): return ("messageEntityBlockquote", [("offset", offset), ("length", length)]) + case .messageEntityBankCard(let offset, let length): + return ("messageEntityBankCard", [("offset", offset), ("length", length)]) } } @@ -21425,6 +21685,20 @@ public extension Api { return nil } } + public static func parse_messageEntityBankCard(_ reader: BufferReader) -> MessageEntity? { + var _1: Int32? + _1 = reader.readInt32() + var _2: Int32? + _2 = reader.readInt32() + let _c1 = _1 != nil + let _c2 = _2 != nil + if _c1 && _c2 { + return Api.MessageEntity.messageEntityBankCard(offset: _1!, length: _2!) + } + else { + return nil + } + } } public enum InputPhoto: TypeConstructorDescription { @@ -21727,6 +22001,7 @@ public extension Api { } public enum PeerLocated: TypeConstructorDescription { case peerLocated(peer: Api.Peer, expires: Int32, distance: Int32) + case peerSelfLocated(expires: Int32) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -21738,6 +22013,12 @@ public extension Api { serializeInt32(expires, buffer: buffer, boxed: false) serializeInt32(distance, buffer: buffer, boxed: false) break + case .peerSelfLocated(let expires): + if boxed { + buffer.appendInt32(-118740917) + } + serializeInt32(expires, buffer: buffer, boxed: false) + break } } @@ -21745,6 +22026,8 @@ public extension Api { switch self { case .peerLocated(let peer, let expires, let distance): return ("peerLocated", [("peer", peer), ("expires", expires), ("distance", distance)]) + case .peerSelfLocated(let expires): + return ("peerSelfLocated", [("expires", expires)]) } } @@ -21767,6 +22050,17 @@ public extension Api { return nil } } + public static func parse_peerSelfLocated(_ reader: BufferReader) -> PeerLocated? { + var _1: Int32? + _1 = reader.readInt32() + let _c1 = _1 != nil + if _c1 { + return Api.PeerLocated.peerSelfLocated(expires: _1!) + } + else { + return nil + } + } } public enum Document: TypeConstructorDescription { diff --git a/submodules/TelegramApi/Sources/Api2.swift b/submodules/TelegramApi/Sources/Api2.swift index f0cb6195e9..4f499c6615 100644 --- a/submodules/TelegramApi/Sources/Api2.swift +++ b/submodules/TelegramApi/Sources/Api2.swift @@ -490,6 +490,176 @@ public struct payments { } } + public enum BankCardData: TypeConstructorDescription { + case bankCardData(flags: Int32, title: String, url: String?, urlName: String?) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .bankCardData(let flags, let title, let url, let urlName): + if boxed { + buffer.appendInt32(-419239361) + } + serializeInt32(flags, buffer: buffer, boxed: false) + serializeString(title, buffer: buffer, boxed: false) + if Int(flags) & Int(1 << 0) != 0 {serializeString(url!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 0) != 0 {serializeString(urlName!, buffer: buffer, boxed: false)} + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .bankCardData(let flags, let title, let url, let urlName): + return ("bankCardData", [("flags", flags), ("title", title), ("url", url), ("urlName", urlName)]) + } + } + + public static func parse_bankCardData(_ reader: BufferReader) -> BankCardData? { + var _1: Int32? + _1 = reader.readInt32() + var _2: String? + _2 = parseString(reader) + var _3: String? + if Int(_1!) & Int(1 << 0) != 0 {_3 = parseString(reader) } + var _4: String? + if Int(_1!) & Int(1 << 0) != 0 {_4 = parseString(reader) } + let _c1 = _1 != nil + let _c2 = _2 != nil + let _c3 = (Int(_1!) & Int(1 << 0) == 0) || _3 != nil + let _c4 = (Int(_1!) & Int(1 << 0) == 0) || _4 != nil + if _c1 && _c2 && _c3 && _c4 { + return Api.payments.BankCardData.bankCardData(flags: _1!, title: _2!, url: _3, urlName: _4) + } + else { + return nil + } + } + + } +} +} +public extension Api { +public struct stats { + public enum BroadcastStats: TypeConstructorDescription { + case broadcastStats(period: Api.StatsDateRangeDays, followers: Api.StatsAbsValueAndPrev, viewsPerPost: Api.StatsAbsValueAndPrev, sharesPerPost: Api.StatsAbsValueAndPrev, enabledNotifications: Api.StatsPercentValue, viewsBySource: [Api.StatsRowAbsValueAndPrev], newFollowersBySource: [Api.StatsRowAbsValueAndPrev], languages: [Api.StatsRowAbsValueAndPrev], growthGraph: Api.StatsGraph, followersGraph: Api.StatsGraph, muteGraph: Api.StatsGraph, topHoursGraph: Api.StatsGraph, interactionsGraph: Api.StatsGraph) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .broadcastStats(let period, let followers, let viewsPerPost, let sharesPerPost, let enabledNotifications, let viewsBySource, let newFollowersBySource, let languages, let growthGraph, let followersGraph, let muteGraph, let topHoursGraph, let interactionsGraph): + if boxed { + buffer.appendInt32(205195937) + } + period.serialize(buffer, true) + followers.serialize(buffer, true) + viewsPerPost.serialize(buffer, true) + sharesPerPost.serialize(buffer, true) + enabledNotifications.serialize(buffer, true) + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(viewsBySource.count)) + for item in viewsBySource { + item.serialize(buffer, true) + } + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(newFollowersBySource.count)) + for item in newFollowersBySource { + item.serialize(buffer, true) + } + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(languages.count)) + for item in languages { + item.serialize(buffer, true) + } + growthGraph.serialize(buffer, true) + followersGraph.serialize(buffer, true) + muteGraph.serialize(buffer, true) + topHoursGraph.serialize(buffer, true) + interactionsGraph.serialize(buffer, true) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .broadcastStats(let period, let followers, let viewsPerPost, let sharesPerPost, let enabledNotifications, let viewsBySource, let newFollowersBySource, let languages, let growthGraph, let followersGraph, let muteGraph, let topHoursGraph, let interactionsGraph): + return ("broadcastStats", [("period", period), ("followers", followers), ("viewsPerPost", viewsPerPost), ("sharesPerPost", sharesPerPost), ("enabledNotifications", enabledNotifications), ("viewsBySource", viewsBySource), ("newFollowersBySource", newFollowersBySource), ("languages", languages), ("growthGraph", growthGraph), ("followersGraph", followersGraph), ("muteGraph", muteGraph), ("topHoursGraph", topHoursGraph), ("interactionsGraph", interactionsGraph)]) + } + } + + public static func parse_broadcastStats(_ reader: BufferReader) -> BroadcastStats? { + var _1: Api.StatsDateRangeDays? + if let signature = reader.readInt32() { + _1 = Api.parse(reader, signature: signature) as? Api.StatsDateRangeDays + } + var _2: Api.StatsAbsValueAndPrev? + if let signature = reader.readInt32() { + _2 = Api.parse(reader, signature: signature) as? Api.StatsAbsValueAndPrev + } + var _3: Api.StatsAbsValueAndPrev? + if let signature = reader.readInt32() { + _3 = Api.parse(reader, signature: signature) as? Api.StatsAbsValueAndPrev + } + var _4: Api.StatsAbsValueAndPrev? + if let signature = reader.readInt32() { + _4 = Api.parse(reader, signature: signature) as? Api.StatsAbsValueAndPrev + } + var _5: Api.StatsPercentValue? + if let signature = reader.readInt32() { + _5 = Api.parse(reader, signature: signature) as? Api.StatsPercentValue + } + var _6: [Api.StatsRowAbsValueAndPrev]? + if let _ = reader.readInt32() { + _6 = Api.parseVector(reader, elementSignature: 0, elementType: Api.StatsRowAbsValueAndPrev.self) + } + var _7: [Api.StatsRowAbsValueAndPrev]? + if let _ = reader.readInt32() { + _7 = Api.parseVector(reader, elementSignature: 0, elementType: Api.StatsRowAbsValueAndPrev.self) + } + var _8: [Api.StatsRowAbsValueAndPrev]? + if let _ = reader.readInt32() { + _8 = Api.parseVector(reader, elementSignature: 0, elementType: Api.StatsRowAbsValueAndPrev.self) + } + var _9: Api.StatsGraph? + if let signature = reader.readInt32() { + _9 = Api.parse(reader, signature: signature) as? Api.StatsGraph + } + var _10: Api.StatsGraph? + if let signature = reader.readInt32() { + _10 = Api.parse(reader, signature: signature) as? Api.StatsGraph + } + var _11: Api.StatsGraph? + if let signature = reader.readInt32() { + _11 = Api.parse(reader, signature: signature) as? Api.StatsGraph + } + var _12: Api.StatsGraph? + if let signature = reader.readInt32() { + _12 = Api.parse(reader, signature: signature) as? Api.StatsGraph + } + var _13: Api.StatsGraph? + if let signature = reader.readInt32() { + _13 = Api.parse(reader, signature: signature) as? Api.StatsGraph + } + let _c1 = _1 != nil + let _c2 = _2 != nil + let _c3 = _3 != nil + let _c4 = _4 != nil + let _c5 = _5 != nil + let _c6 = _6 != nil + let _c7 = _7 != nil + let _c8 = _8 != nil + let _c9 = _9 != nil + let _c10 = _10 != nil + let _c11 = _11 != nil + let _c12 = _12 != nil + let _c13 = _13 != nil + if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 && _c12 && _c13 { + return Api.stats.BroadcastStats.broadcastStats(period: _1!, followers: _2!, viewsPerPost: _3!, sharesPerPost: _4!, enabledNotifications: _5!, viewsBySource: _6!, newFollowersBySource: _7!, languages: _8!, growthGraph: _9!, followersGraph: _10!, muteGraph: _11!, topHoursGraph: _12!, interactionsGraph: _13!) + } + else { + return nil + } + } + + } } } public extension Api { @@ -859,6 +1029,76 @@ public struct auth { return Api.auth.CodeType.codeTypeFlashCall } + } + public enum LoginTokenInfo: TypeConstructorDescription { + case loginTokenInfo(dcId: Int32, authKeyId: Int64, deviceModel: String, platform: String, systemVersion: String, apiId: Int32, appName: String, appVersion: String, ip: String, region: String) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .loginTokenInfo(let dcId, let authKeyId, let deviceModel, let platform, let systemVersion, let apiId, let appName, let appVersion, let ip, let region): + if boxed { + buffer.appendInt32(1375940666) + } + serializeInt32(dcId, buffer: buffer, boxed: false) + serializeInt64(authKeyId, buffer: buffer, boxed: false) + serializeString(deviceModel, buffer: buffer, boxed: false) + serializeString(platform, buffer: buffer, boxed: false) + serializeString(systemVersion, buffer: buffer, boxed: false) + serializeInt32(apiId, buffer: buffer, boxed: false) + serializeString(appName, buffer: buffer, boxed: false) + serializeString(appVersion, buffer: buffer, boxed: false) + serializeString(ip, buffer: buffer, boxed: false) + serializeString(region, buffer: buffer, boxed: false) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .loginTokenInfo(let dcId, let authKeyId, let deviceModel, let platform, let systemVersion, let apiId, let appName, let appVersion, let ip, let region): + return ("loginTokenInfo", [("dcId", dcId), ("authKeyId", authKeyId), ("deviceModel", deviceModel), ("platform", platform), ("systemVersion", systemVersion), ("apiId", apiId), ("appName", appName), ("appVersion", appVersion), ("ip", ip), ("region", region)]) + } + } + + public static func parse_loginTokenInfo(_ reader: BufferReader) -> LoginTokenInfo? { + var _1: Int32? + _1 = reader.readInt32() + var _2: Int64? + _2 = reader.readInt64() + var _3: String? + _3 = parseString(reader) + var _4: String? + _4 = parseString(reader) + var _5: String? + _5 = parseString(reader) + var _6: Int32? + _6 = reader.readInt32() + var _7: String? + _7 = parseString(reader) + var _8: String? + _8 = parseString(reader) + var _9: String? + _9 = parseString(reader) + var _10: String? + _10 = parseString(reader) + let _c1 = _1 != nil + let _c2 = _2 != nil + let _c3 = _3 != nil + let _c4 = _4 != nil + let _c5 = _5 != nil + let _c6 = _6 != nil + let _c7 = _7 != nil + let _c8 = _8 != nil + let _c9 = _9 != nil + let _c10 = _10 != nil + if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 { + return Api.auth.LoginTokenInfo.loginTokenInfo(dcId: _1!, authKeyId: _2!, deviceModel: _3!, platform: _4!, systemVersion: _5!, apiId: _6!, appName: _7!, appVersion: _8!, ip: _9!, region: _10!) + } + else { + return nil + } + } + } public enum SentCodeType: TypeConstructorDescription { case sentCodeTypeApp(length: Int32) @@ -1859,70 +2099,6 @@ public struct help { } } - } - public enum UserInfo: TypeConstructorDescription { - case userInfoEmpty - case userInfo(message: String, entities: [Api.MessageEntity], author: String, date: Int32) - - public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .userInfoEmpty: - if boxed { - buffer.appendInt32(-206688531) - } - - break - case .userInfo(let message, let entities, let author, let date): - if boxed { - buffer.appendInt32(32192344) - } - serializeString(message, buffer: buffer, boxed: false) - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(entities.count)) - for item in entities { - item.serialize(buffer, true) - } - serializeString(author, buffer: buffer, boxed: false) - serializeInt32(date, buffer: buffer, boxed: false) - break - } - } - - public func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .userInfoEmpty: - return ("userInfoEmpty", []) - case .userInfo(let message, let entities, let author, let date): - return ("userInfo", [("message", message), ("entities", entities), ("author", author), ("date", date)]) - } - } - - public static func parse_userInfoEmpty(_ reader: BufferReader) -> UserInfo? { - return Api.help.UserInfo.userInfoEmpty - } - public static func parse_userInfo(_ reader: BufferReader) -> UserInfo? { - var _1: String? - _1 = parseString(reader) - var _2: [Api.MessageEntity]? - if let _ = reader.readInt32() { - _2 = Api.parseVector(reader, elementSignature: 0, elementType: Api.MessageEntity.self) - } - var _3: String? - _3 = parseString(reader) - var _4: Int32? - _4 = reader.readInt32() - let _c1 = _1 != nil - let _c2 = _2 != nil - let _c3 = _3 != nil - let _c4 = _4 != nil - if _c1 && _c2 && _c3 && _c4 { - return Api.help.UserInfo.userInfo(message: _1!, entities: _2!, author: _3!, date: _4!) - } - else { - return nil - } - } - } public enum TermsOfServiceUpdate: TypeConstructorDescription { case termsOfServiceUpdateEmpty(expires: Int32) diff --git a/submodules/TelegramApi/Sources/Api3.swift b/submodules/TelegramApi/Sources/Api3.swift index 74e4884bf6..aee22f1e04 100644 --- a/submodules/TelegramApi/Sources/Api3.swift +++ b/submodules/TelegramApi/Sources/Api3.swift @@ -3196,6 +3196,25 @@ public extension Api { }) } + public static func toggleStickerSets(flags: Int32, stickersets: [Api.InputStickerSet]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(-1257951254) + serializeInt32(flags, buffer: buffer, boxed: false) + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(stickersets.count)) + for item in stickersets { + item.serialize(buffer, true) + } + return (FunctionDescription(name: "messages.toggleStickerSets", parameters: [("flags", flags), ("stickersets", stickersets)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in + let reader = BufferReader(buffer) + var result: Api.Bool? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.Bool + } + return result + }) + } + public static func getPollVotes(flags: Int32, peer: Api.InputPeer, id: Int32, option: Buffer?, offset: String?, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1200736242) @@ -3885,6 +3904,50 @@ public extension Api { return result }) } + + public static func getBankCardData(number: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(779736953) + serializeString(number, buffer: buffer, boxed: false) + return (FunctionDescription(name: "payments.getBankCardData", parameters: [("number", number)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.payments.BankCardData? in + let reader = BufferReader(buffer) + var result: Api.payments.BankCardData? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.payments.BankCardData + } + return result + }) + } + } + public struct stats { + public static func getBroadcastStats(flags: Int32, channel: Api.InputChannel) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(-1421720550) + serializeInt32(flags, buffer: buffer, boxed: false) + channel.serialize(buffer, true) + return (FunctionDescription(name: "stats.getBroadcastStats", parameters: [("flags", flags), ("channel", channel)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.stats.BroadcastStats? in + let reader = BufferReader(buffer) + var result: Api.stats.BroadcastStats? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.stats.BroadcastStats + } + return result + }) + } + + public static func loadAsyncGraph(token: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(1749505346) + serializeString(token, buffer: buffer, boxed: false) + return (FunctionDescription(name: "stats.loadAsyncGraph", parameters: [("token", token)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.StatsGraph? in + let reader = BufferReader(buffer) + var result: Api.StatsGraph? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.StatsGraph + } + return result + }) + } } public struct auth { public static func checkPhone(phoneNumber: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { @@ -4558,11 +4621,13 @@ public extension Api { }) } - public static func getLocated(geoPoint: Api.InputGeoPoint) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getLocated(flags: Int32, geoPoint: Api.InputGeoPoint, selfExpires: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() - buffer.appendInt32(171270230) + buffer.appendInt32(-750207932) + serializeInt32(flags, buffer: buffer, boxed: false) geoPoint.serialize(buffer, true) - return (FunctionDescription(name: "contacts.getLocated", parameters: [("geoPoint", geoPoint)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in + if Int(flags) & Int(1 << 0) != 0 {serializeInt32(selfExpires!, buffer: buffer, boxed: false)} + return (FunctionDescription(name: "contacts.getLocated", parameters: [("flags", flags), ("geoPoint", geoPoint), ("selfExpires", selfExpires)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in let reader = BufferReader(buffer) var result: Api.Updates? if let signature = reader.readInt32() { @@ -4815,40 +4880,6 @@ public extension Api { return result }) } - - public static func editUserInfo(userId: Api.InputUser, message: String, entities: [Api.MessageEntity]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { - let buffer = Buffer() - buffer.appendInt32(1723407216) - userId.serialize(buffer, true) - serializeString(message, buffer: buffer, boxed: false) - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(entities.count)) - for item in entities { - item.serialize(buffer, true) - } - return (FunctionDescription(name: "help.editUserInfo", parameters: [("userId", userId), ("message", message), ("entities", entities)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.help.UserInfo? in - let reader = BufferReader(buffer) - var result: Api.help.UserInfo? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.help.UserInfo - } - return result - }) - } - - public static func getUserInfo(userId: Api.InputUser) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { - let buffer = Buffer() - buffer.appendInt32(59377875) - userId.serialize(buffer, true) - return (FunctionDescription(name: "help.getUserInfo", parameters: [("userId", userId)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.help.UserInfo? in - let reader = BufferReader(buffer) - var result: Api.help.UserInfo? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.help.UserInfo - } - return result - }) - } } public struct updates { public static func getState() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { diff --git a/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift b/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift index ad168e7d01..4e870b88ce 100644 --- a/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift +++ b/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift @@ -1295,8 +1295,13 @@ private func finalStateWithUpdatesAndServerTime(postbox: Postbox, network: Netwo } case let .updatePeerLocated(peers): var peersNearby: [PeerNearby] = [] - for case let .peerLocated(peer, expires, distance) in peers { - peersNearby.append(PeerNearby(id: peer.peerId, expires: expires, distance: distance)) + for peer in peers { + switch peer { + case let .peerLocated(peer, expires, distance): + peersNearby.append(.peer(id: peer.peerId, expires: expires, distance: distance)) + case let .peerSelfLocated(expires): + peersNearby.append(.selfPeer(expires: expires)) + } } updatedState.updatePeersNearby(peersNearby) case let .updateNewScheduledMessage(apiMessage): diff --git a/submodules/TelegramCore/Sources/BankCards.swift b/submodules/TelegramCore/Sources/BankCards.swift new file mode 100644 index 0000000000..f0db9d6304 --- /dev/null +++ b/submodules/TelegramCore/Sources/BankCards.swift @@ -0,0 +1,34 @@ +import Foundation +import Postbox +import TelegramApi +import SyncCore +import SwiftSignalKit + +public struct BankCardInfo { + public let title: String + public let url: String? + public let actionTitle: String? +} + +public func getBankCardInfo(account: Account, cardNumber: String) -> Signal { + return account.network.request(Api.functions.payments.getBankCardData(number: cardNumber)) + |> map { result -> BankCardInfo? in + return BankCardInfo(apiBankCardData: result) + } + |> `catch` { _ -> Signal in + return .single(nil) + } +} + +extension BankCardInfo { + init(apiBankCardData: Api.payments.BankCardData) { + switch apiBankCardData { + case let .bankCardData(flags, title, url, urlName): + self.title = title + self.url = url + self.actionTitle = urlName + } + } +} + + diff --git a/submodules/TelegramCore/Sources/ChannelStatistics.swift b/submodules/TelegramCore/Sources/ChannelStatistics.swift new file mode 100644 index 0000000000..1e501b535b --- /dev/null +++ b/submodules/TelegramCore/Sources/ChannelStatistics.swift @@ -0,0 +1,424 @@ +import Foundation +import SwiftSignalKit +import Postbox +import TelegramApi +import MtProtoKit +import SyncCore + +public struct ChannelStatsDateRange: Equatable { + public let minDate: Int32 + public let maxDate: Int32 +} + +public struct ChannelStatsValue: Equatable { + public let current: Double + public let previous: Double +} + +public struct ChannelStatsPercentValue: Equatable { + public let fraction: Double + public let total: Double +} + +public struct ChannelStatsNamedValue: Equatable { + public let id: String + public let title: String + public let shortTitle: String + public let value: ChannelStatsValue +} + +public enum ChannelStatsGraph: Equatable { + case OnDemand(token: String) + case Failed(error: String) + case Loaded(data: String) +} + +public final class ChannelStats: Equatable { + public let period: ChannelStatsDateRange + public let followers: ChannelStatsValue + public let viewsPerPost: ChannelStatsValue + public let sharesPerPost: ChannelStatsValue + public let enabledNotifications: ChannelStatsPercentValue + public let viewsBySource: [ChannelStatsNamedValue] + public let newFollowersBySource: [ChannelStatsNamedValue] + public let languages: [ChannelStatsNamedValue] + public let growthGraph: ChannelStatsGraph + public let followersGraph: ChannelStatsGraph + public let muteGraph: ChannelStatsGraph + public let topHoursGraph: ChannelStatsGraph + public let interactionsGraph: ChannelStatsGraph + + public init(period: ChannelStatsDateRange, followers: ChannelStatsValue, viewsPerPost: ChannelStatsValue, sharesPerPost: ChannelStatsValue, enabledNotifications: ChannelStatsPercentValue, viewsBySource: [ChannelStatsNamedValue], newFollowersBySource: [ChannelStatsNamedValue], languages: [ChannelStatsNamedValue], growthGraph: ChannelStatsGraph, followersGraph: ChannelStatsGraph, muteGraph: ChannelStatsGraph, topHoursGraph: ChannelStatsGraph, interactionsGraph: ChannelStatsGraph) { + self.period = period + self.followers = followers + self.viewsPerPost = viewsPerPost + self.sharesPerPost = sharesPerPost + self.enabledNotifications = enabledNotifications + self.viewsBySource = viewsBySource + self.newFollowersBySource = newFollowersBySource + self.languages = languages + self.growthGraph = growthGraph + self.followersGraph = followersGraph + self.muteGraph = muteGraph + self.topHoursGraph = topHoursGraph + self.interactionsGraph = interactionsGraph + } + + public static func == (lhs: ChannelStats, rhs: ChannelStats) -> Bool { + if lhs.period != rhs.period { + return false + } + if lhs.followers != rhs.followers { + return false + } + if lhs.viewsPerPost != rhs.viewsPerPost { + return false + } + if lhs.sharesPerPost != rhs.sharesPerPost { + return false + } + if lhs.enabledNotifications != rhs.enabledNotifications { + return false + } + if lhs.viewsBySource != rhs.viewsBySource { + return false + } + if lhs.newFollowersBySource != rhs.newFollowersBySource { + return false + } + if lhs.languages != rhs.languages { + return false + } + if lhs.growthGraph != rhs.growthGraph { + return false + } + if lhs.followersGraph != rhs.followersGraph { + return false + } + if lhs.muteGraph != rhs.muteGraph { + return false + } + if lhs.topHoursGraph != rhs.topHoursGraph { + return false + } + if lhs.interactionsGraph != rhs.interactionsGraph { + return false + } + return true + } + + public func withUpdatedGrowthGraph(_ growthGraph: ChannelStatsGraph) -> ChannelStats { + return ChannelStats(period: self.period, followers: self.followers, viewsPerPost: self.viewsPerPost, sharesPerPost: self.sharesPerPost, enabledNotifications: self.enabledNotifications, viewsBySource: self.viewsBySource, newFollowersBySource: self.newFollowersBySource, languages: self.languages, growthGraph: growthGraph, followersGraph: self.followersGraph, muteGraph: self.muteGraph, topHoursGraph: self.topHoursGraph, interactionsGraph: self.interactionsGraph) + } + + public func withUpdatedFollowersGraph(_ followersGraph: ChannelStatsGraph) -> ChannelStats { + return ChannelStats(period: self.period, followers: self.followers, viewsPerPost: self.viewsPerPost, sharesPerPost: self.sharesPerPost, enabledNotifications: self.enabledNotifications, viewsBySource: self.viewsBySource, newFollowersBySource: self.newFollowersBySource, languages: self.languages, growthGraph: self.growthGraph, followersGraph: followersGraph, muteGraph: self.muteGraph, topHoursGraph: self.topHoursGraph, interactionsGraph: self.interactionsGraph) + } + + public func withUpdatedMuteGraph(_ muteGraph: ChannelStatsGraph) -> ChannelStats { + return ChannelStats(period: self.period, followers: self.followers, viewsPerPost: self.viewsPerPost, sharesPerPost: self.sharesPerPost, enabledNotifications: self.enabledNotifications, viewsBySource: self.viewsBySource, newFollowersBySource: self.newFollowersBySource, languages: self.languages, growthGraph: self.growthGraph, followersGraph: self.followersGraph, muteGraph: muteGraph, topHoursGraph: self.topHoursGraph, interactionsGraph: self.interactionsGraph) + } + + public func withUpdatedTopHoursGraph(_ viewsByHourGraph: ChannelStatsGraph) -> ChannelStats { + return ChannelStats(period: self.period, followers: self.followers, viewsPerPost: self.viewsPerPost, sharesPerPost: self.sharesPerPost, enabledNotifications: self.enabledNotifications, viewsBySource: self.viewsBySource, newFollowersBySource: self.newFollowersBySource, languages: self.languages, growthGraph: self.growthGraph, followersGraph: self.followersGraph, muteGraph: self.muteGraph, topHoursGraph: viewsByHourGraph, interactionsGraph: self.interactionsGraph) + } + + public func withUpdatedInteractionsGraph(_ interactionsGraph: ChannelStatsGraph) -> ChannelStats { + return ChannelStats(period: self.period, followers: self.followers, viewsPerPost: self.viewsPerPost, sharesPerPost: self.sharesPerPost, enabledNotifications: self.enabledNotifications, viewsBySource: self.viewsBySource, newFollowersBySource: self.newFollowersBySource, languages: self.languages, growthGraph: self.growthGraph, followersGraph: self.followersGraph, muteGraph: self.muteGraph, topHoursGraph: self.topHoursGraph, interactionsGraph: interactionsGraph) + } +} + +public struct ChannelStatsContextState: Equatable { + public var stats: ChannelStats? +} + +private func requestStats(network: Network, datacenterId: Int32, peer: Peer, dark: Bool = false) -> Signal { + guard let inputChannel = apiInputChannel(peer) else { + return .never() + } + + var flags: Int32 = 0 + if dark { + flags |= (1 << 1) + } + + let signal: Signal + if network.datacenterId != datacenterId { + signal = network.download(datacenterId: Int(datacenterId), isMedia: false, tag: nil) + |> castError(MTRpcError.self) + |> mapToSignal { worker in + return worker.request(Api.functions.stats.getBroadcastStats(flags: flags, channel: inputChannel)) + } + } else { + signal = network.request(Api.functions.stats.getBroadcastStats(flags: flags, channel: inputChannel)) + } + + return signal + |> map { result -> ChannelStats? in + return ChannelStats(apiBroadcastStats: result) + } + |> `catch` { _ -> Signal in + return .single(nil) + } +} + +private func requestGraph(network: Network, datacenterId: Int32, token: String) -> Signal { + let signal: Signal + if network.datacenterId != datacenterId { + signal = network.download(datacenterId: Int(datacenterId), isMedia: false, tag: nil) + |> castError(MTRpcError.self) + |> mapToSignal { worker in + return worker.request(Api.functions.stats.loadAsyncGraph(token: token)) + } + } else { + signal = network.request(Api.functions.stats.loadAsyncGraph(token: token)) + } + + return signal + |> map { result -> ChannelStatsGraph? in + return ChannelStatsGraph(apiStatsGraph: result) + } + |> `catch` { _ -> Signal in + return .single(nil) + } +} + +private final class ChannelStatsContextImpl { + private let network: Network + private let peer: Peer + private let datacenterId: Int32 + + private var _state: ChannelStatsContextState { + didSet { + if self._state != oldValue { + self._statePromise.set(.single(self._state)) + } + } + } + private let _statePromise = Promise() + var state: Signal { + return self._statePromise.get() + } + + private let disposable = MetaDisposable() + private let disposables = DisposableDict() + + init(network: Network, datacenterId: Int32, peer: Peer) { + assert(Queue.mainQueue().isCurrent()) + + self.network = network + self.peer = peer + self.datacenterId = datacenterId + self._state = ChannelStatsContextState(stats: nil) + self._statePromise.set(.single(self._state)) + + self.load() + } + + deinit { + assert(Queue.mainQueue().isCurrent()) + self.disposable.dispose() + self.disposables.dispose() + } + + private func load() { + assert(Queue.mainQueue().isCurrent()) + + self.disposable.set((requestStats(network: self.network, datacenterId: self.datacenterId, peer: self.peer) + |> deliverOnMainQueue).start(next: { [weak self] stats in + if let strongSelf = self { + strongSelf._state = ChannelStatsContextState(stats: stats) + strongSelf._statePromise.set(.single(strongSelf._state)) + } + })) + } + + func loadGrowthGraph() { + guard let stats = self._state.stats else { + return + } + if case let .OnDemand(token) = stats.growthGraph { + self.disposables.set((requestGraph(network: self.network, datacenterId: self.datacenterId, token: token) + |> deliverOnMainQueue).start(next: { [weak self] graph in + if let strongSelf = self, let graph = graph { + strongSelf._state = ChannelStatsContextState(stats: strongSelf._state.stats?.withUpdatedGrowthGraph(graph)) + strongSelf._statePromise.set(.single(strongSelf._state)) + } + }), forKey: token) + } + } + + func loadFollowersGraph() { + guard let stats = self._state.stats else { + return + } + if case let .OnDemand(token) = stats.followersGraph { + self.disposables.set((requestGraph(network: self.network, datacenterId: self.datacenterId, token: token) + |> deliverOnMainQueue).start(next: { [weak self] graph in + if let strongSelf = self, let graph = graph { + strongSelf._state = ChannelStatsContextState(stats: strongSelf._state.stats?.withUpdatedFollowersGraph(graph)) + strongSelf._statePromise.set(.single(strongSelf._state)) + } + }), forKey: token) + } + } + + func loadMuteGraph() { + guard let stats = self._state.stats else { + return + } + if case let .OnDemand(token) = stats.muteGraph { + self.disposables.set((requestGraph(network: self.network, datacenterId: self.datacenterId, token: token) + |> deliverOnMainQueue).start(next: { [weak self] graph in + if let strongSelf = self, let graph = graph { + strongSelf._state = ChannelStatsContextState(stats: strongSelf._state.stats?.withUpdatedMuteGraph(graph)) + strongSelf._statePromise.set(.single(strongSelf._state)) + } + }), forKey: token) + } + } + + func loadTopHoursGraph() { + guard let stats = self._state.stats else { + return + } + if case let .OnDemand(token) = stats.topHoursGraph { + self.disposables.set((requestGraph(network: self.network, datacenterId: self.datacenterId, token: token) + |> deliverOnMainQueue).start(next: { [weak self] graph in + if let strongSelf = self, let graph = graph { + strongSelf._state = ChannelStatsContextState(stats: strongSelf._state.stats?.withUpdatedTopHoursGraph(graph)) + strongSelf._statePromise.set(.single(strongSelf._state)) + } + }), forKey: token) + } + } + + func loadInteractionsGraph() { + guard let stats = self._state.stats else { + return + } + if case let .OnDemand(token) = stats.interactionsGraph { + self.disposables.set((requestGraph(network: self.network, datacenterId: self.datacenterId, token: token) + |> deliverOnMainQueue).start(next: { [weak self] graph in + if let strongSelf = self, let graph = graph { + strongSelf._state = ChannelStatsContextState(stats: strongSelf._state.stats?.withUpdatedInteractionsGraph(graph)) + strongSelf._statePromise.set(.single(strongSelf._state)) + } + }), forKey: token) + } + } +} + +public final class ChannelStatsContext { + private let impl: QueueLocalObject + + public var state: Signal { + return Signal { subscriber in + let disposable = MetaDisposable() + self.impl.with { impl in + disposable.set(impl.state.start(next: { value in + subscriber.putNext(value) + })) + } + return disposable + } + } + + public init(network: Network, datacenterId: Int32, peer: Peer) { + self.impl = QueueLocalObject(queue: Queue.mainQueue(), generate: { + return ChannelStatsContextImpl(network: network, datacenterId: datacenterId, peer: peer) + }) + } + + public func loadGrowthGraph() { + self.impl.with { impl in + impl.loadGrowthGraph() + } + } + + public func loadFollowersGraph() { + self.impl.with { impl in + impl.loadFollowersGraph() + } + } + + public func loadMuteGraph() { + self.impl.with { impl in + impl.loadMuteGraph() + } + } + + public func loadTopHoursGraph() { + self.impl.with { impl in + impl.loadTopHoursGraph() + } + } + + public func loadInteractionsGraph() { + self.impl.with { impl in + impl.loadInteractionsGraph() + } + } +} + +extension ChannelStatsGraph { + init(apiStatsGraph: Api.StatsGraph) { + switch apiStatsGraph { + case let .statsGraph(json): + if case let .dataJSON(string) = json { + self = .Loaded(data: string) + } else { + self = .Failed(error: "") + } + case let .statsGraphError(error): + self = .Failed(error: error) + case let .statsGraphAsync(token): + self = .OnDemand(token: token) + } + } +} + +extension ChannelStatsDateRange { + init(apiStatsDateRangeDays: Api.StatsDateRangeDays) { + switch apiStatsDateRangeDays { + case let .statsDateRangeDays(minDate, maxDate): + self = ChannelStatsDateRange(minDate: minDate, maxDate: maxDate) + } + } +} + +extension ChannelStatsValue { + init(apiStatsAbsValueAndPrev: Api.StatsAbsValueAndPrev) { + switch apiStatsAbsValueAndPrev { + case let .statsAbsValueAndPrev(current, previous): + self = ChannelStatsValue(current: current, previous: previous) + } + } +} + +extension ChannelStatsNamedValue { + init(apiStatsRowAbsValueAndPrev: Api.StatsRowAbsValueAndPrev) { + switch apiStatsRowAbsValueAndPrev { + case let .statsRowAbsValueAndPrev(id, title, shortTitle, values): + self = ChannelStatsNamedValue(id: id, title: title, shortTitle: shortTitle, value: ChannelStatsValue(apiStatsAbsValueAndPrev: values)) + } + } +} + +extension ChannelStatsPercentValue { + init(apiPercentValue: Api.StatsPercentValue) { + switch apiPercentValue { + case let .statsPercentValue(part, total): + self = ChannelStatsPercentValue(fraction: part, total: total) + } + } +} + +extension ChannelStats { + convenience init(apiBroadcastStats: Api.stats.BroadcastStats) { + switch apiBroadcastStats { + case let .broadcastStats(period, followers, viewsPerPost, sharesPerPost, enabledNotifications, viewsBySource, newFollowersBySource, languages, growthGraph, followersGraph, muteGraph, topHoursGraph, interactionsGraph): + self.init(period: ChannelStatsDateRange(apiStatsDateRangeDays: period), followers: ChannelStatsValue(apiStatsAbsValueAndPrev: followers), viewsPerPost: ChannelStatsValue(apiStatsAbsValueAndPrev: viewsPerPost), sharesPerPost: ChannelStatsValue(apiStatsAbsValueAndPrev: sharesPerPost), enabledNotifications: ChannelStatsPercentValue(apiPercentValue: enabledNotifications), viewsBySource: viewsBySource.map { ChannelStatsNamedValue(apiStatsRowAbsValueAndPrev: $0) }, newFollowersBySource: newFollowersBySource.map { ChannelStatsNamedValue(apiStatsRowAbsValueAndPrev: $0) }, languages: languages.map { ChannelStatsNamedValue(apiStatsRowAbsValueAndPrev: $0) }, growthGraph: ChannelStatsGraph(apiStatsGraph: growthGraph), followersGraph: ChannelStatsGraph(apiStatsGraph: followersGraph), muteGraph: ChannelStatsGraph(apiStatsGraph: muteGraph), topHoursGraph: ChannelStatsGraph(apiStatsGraph: topHoursGraph), interactionsGraph: ChannelStatsGraph(apiStatsGraph: interactionsGraph)) + } + } +} diff --git a/submodules/TelegramCore/Sources/JSON.swift b/submodules/TelegramCore/Sources/JSON.swift index 556085328b..43dd62bebd 100644 --- a/submodules/TelegramCore/Sources/JSON.swift +++ b/submodules/TelegramCore/Sources/JSON.swift @@ -28,8 +28,7 @@ extension JSON { } } self = .array(values) - } - else if let value = object as? String { + } else if let value = object as? String { self = .string(value) } else if let value = object as? Int { self = .number(Double(value)) diff --git a/submodules/TelegramCore/Sources/ManagedSecretChatOutgoingOperations.swift b/submodules/TelegramCore/Sources/ManagedSecretChatOutgoingOperations.swift index 7754b00b97..d490602165 100644 --- a/submodules/TelegramCore/Sources/ManagedSecretChatOutgoingOperations.swift +++ b/submodules/TelegramCore/Sources/ManagedSecretChatOutgoingOperations.swift @@ -676,6 +676,8 @@ private func decryptedEntities73(_ entities: [MessageTextEntity]?) -> [SecretApi break case .Underline: break + case .BankCard: + break case .Custom: break } @@ -723,6 +725,8 @@ private func decryptedEntities101(_ entities: [MessageTextEntity]?) -> [SecretAp result.append(.messageEntityBlockquote(offset: Int32(entity.range.lowerBound), length: Int32(entity.range.count))) case .Underline: result.append(.messageEntityUnderline(offset: Int32(entity.range.lowerBound), length: Int32(entity.range.count))) + case .BankCard: + break case .Custom: break } diff --git a/submodules/TelegramCore/Sources/PeersNearby.swift b/submodules/TelegramCore/Sources/PeersNearby.swift index b872ec5837..4ea533867d 100644 --- a/submodules/TelegramCore/Sources/PeersNearby.swift +++ b/submodules/TelegramCore/Sources/PeersNearby.swift @@ -7,12 +7,57 @@ import SyncCore private typealias SignalKitTimer = SwiftSignalKit.Timer +public enum PeerNearby { + case selfPeer(expires: Int32) + case peer(id: PeerId, expires: Int32, distance: Int32) + + var expires: Int32 { + switch self { + case let .selfPeer(expires), let .peer(_, expires, _): + return expires + } + } +} +public enum PeerNearbyVisibilityUpdate { + case visible(latitude: Double, longitude: Double) + case location(latitude: Double, longitude: Double) + case invisible +} -public struct PeerNearby { - public let id: PeerId - public let expires: Int32 - public let distance: Int32 +public func peersNearbyUpdateVisibility(network: Network, stateManager: AccountStateManager, update: PeerNearbyVisibilityUpdate, background: Bool) -> Signal { + var flags: Int32 = 0 + var geoPoint: Api.InputGeoPoint + var selfExpires: Int32? + + switch update { + case let .visible(latitude, longitude): + flags |= (1 << 0) + geoPoint = .inputGeoPoint(lat: latitude, long: longitude) + selfExpires = 86400 + case let .location(latitude, longitude): + geoPoint = .inputGeoPoint(lat: latitude, long: longitude) + case .invisible: + flags |= (1 << 0) + geoPoint = .inputGeoPointEmpty + selfExpires = 0 + } + + if background { + flags |= (1 << 1) + } + + return network.request(Api.functions.contacts.getLocated(flags: flags, geoPoint: geoPoint, selfExpires: selfExpires)) + |> map(Optional.init) + |> `catch` { _ -> Signal in + return .single(nil) + } + |> mapToSignal { updates -> Signal in + if let updates = updates { + stateManager.addUpdates(updates) + } + return .complete() + } } public final class PeersNearbyContext { @@ -23,10 +68,10 @@ public final class PeersNearbyContext { private var entries: [PeerNearby]? - public init(network: Network, accountStateManager: AccountStateManager, coordinate: (latitude: Double, longitude: Double)) { + public init(network: Network, stateManager: AccountStateManager, coordinate: (latitude: Double, longitude: Double)) { let expiryExtension: Double = 10.0 - let poll = network.request(Api.functions.contacts.getLocated(geoPoint: .inputGeoPoint(lat: coordinate.latitude, long: coordinate.longitude))) + let poll = network.request(Api.functions.contacts.getLocated(flags: 0, geoPoint: .inputGeoPoint(lat: coordinate.latitude, long: coordinate.longitude), selfExpires: nil)) |> map(Optional.init) |> `catch` { _ -> Signal in return .single(nil) @@ -39,23 +84,28 @@ public final class PeersNearbyContext { case let .updates(updates, _, _, _, _): for update in updates { if case let .updatePeerLocated(peers) = update { - for case let .peerLocated(peer, expires, distance) in peers { - peersNearby.append(PeerNearby(id: peer.peerId, expires: expires, distance: distance)) + for peer in peers { + switch peer { + case let .peerLocated(peer, expires, distance): + peersNearby.append(.peer(id: peer.peerId, expires: expires, distance: distance)) + case let .peerSelfLocated(expires): + peersNearby.append(.selfPeer(expires: expires)) + } } } } default: break } - accountStateManager.addUpdates(updates) + stateManager.addUpdates(updates) } return .single(peersNearby) |> then( - accountStateManager.updatedPeersNearby() + stateManager.updatedPeersNearby() |> castError(Void.self) ) } - + let error: Signal = .single(Void()) |> then(Signal.fail(Void()) |> suspendAwareDelay(25.0, queue: self.queue)) let combined = combineLatest(poll, error) |> map { data, _ -> [PeerNearby] in @@ -77,18 +127,37 @@ public final class PeersNearbyContext { let updatedEntries = updatedEntries.filter { Double($0.expires) + expiryExtension > timestamp } var existingPeerIds: [PeerId: Int] = [:] + var existingSelfPeer: Int? for i in 0 ..< entries.count { - existingPeerIds[entries[i].id] = i + if case let .peer(id, _, _) = entries[i] { + existingPeerIds[id] = i + } else if case .selfPeer = entries[i] { + existingSelfPeer = i + } } + var selfPeer: PeerNearby? for entry in updatedEntries { - if let index = existingPeerIds[entry.id] { - entries[index] = entry - } else { - entries.append(entry) + switch entry { + case let .selfPeer: + if let index = existingSelfPeer { + entries[index] = entry + } else { + selfPeer = entry + } + case let .peer(id, _, _): + if let index = existingPeerIds[id] { + entries[index] = entry + } else { + entries.append(entry) + } } } + if let peer = selfPeer { + entries.insert(peer, at: 0) + } + strongSelf.entries = entries for subscriber in strongSelf.subscribers.copyItems() { subscriber(strongSelf.entries) diff --git a/submodules/TelegramCore/Sources/Serialization.swift b/submodules/TelegramCore/Sources/Serialization.swift index 02470ccbac..15b20dd3d8 100644 --- a/submodules/TelegramCore/Sources/Serialization.swift +++ b/submodules/TelegramCore/Sources/Serialization.swift @@ -210,7 +210,7 @@ public class BoxedMessage: NSObject { public class Serialization: NSObject, MTSerialization { public func currentLayer() -> UInt { - return 109 + return 110 } public func parseMessage(_ data: Data!) -> Any! { diff --git a/submodules/TelegramCore/Sources/StoreMessage_Telegram.swift b/submodules/TelegramCore/Sources/StoreMessage_Telegram.swift index d5c0b31029..44751ce910 100644 --- a/submodules/TelegramCore/Sources/StoreMessage_Telegram.swift +++ b/submodules/TelegramCore/Sources/StoreMessage_Telegram.swift @@ -386,6 +386,8 @@ func messageTextEntitiesFromApiEntities(_ entities: [Api.MessageEntity]) -> [Mes result.append(MessageTextEntity(range: Int(offset) ..< Int(offset + length), type: .Strikethrough)) case let .messageEntityBlockquote(offset, length): result.append(MessageTextEntity(range: Int(offset) ..< Int(offset + length), type: .BlockQuote)) + case let .messageEntityBankCard(offset, length): + result.append(MessageTextEntity(range: Int(offset) ..< Int(offset + length), type: .BankCard)) } } return result diff --git a/submodules/TelegramCore/Sources/TextEntitiesMessageAttribute.swift b/submodules/TelegramCore/Sources/TextEntitiesMessageAttribute.swift index c898bed30f..1702002184 100644 --- a/submodules/TelegramCore/Sources/TextEntitiesMessageAttribute.swift +++ b/submodules/TelegramCore/Sources/TextEntitiesMessageAttribute.swift @@ -45,6 +45,8 @@ func apiEntitiesFromMessageTextEntities(_ entities: [MessageTextEntity], associa apiEntities.append(.messageEntityBlockquote(offset: offset, length: length)) case .Underline: apiEntities.append(.messageEntityUnderline(offset: offset, length: length)) + case .BankCard: + apiEntities.append(.messageEntityBankCard(offset: offset, length: length)) case .Custom: break } diff --git a/submodules/TelegramCore/Sources/UpdateCachedPeerData.swift b/submodules/TelegramCore/Sources/UpdateCachedPeerData.swift index 1050b92be7..d0f10bfb51 100644 --- a/submodules/TelegramCore/Sources/UpdateCachedPeerData.swift +++ b/submodules/TelegramCore/Sources/UpdateCachedPeerData.swift @@ -450,6 +450,7 @@ func fetchAndUpdateCachedPeerData(accountPeerId: PeerId, peerId rawPeerId: PeerI .withUpdatedSlowModeTimeout(slowmodeSeconds) .withUpdatedSlowModeValidUntilTimestamp(slowmodeNextSendDate) .withUpdatedHasScheduledMessages(hasScheduledMessages) +// .withUpdatedStatsDatacenterId(statsDc ?? 0) }) if let minAvailableMessageId = minAvailableMessageId, minAvailableMessageIdUpdated { diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index f55acaf222..188fb8bab7 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -334,4899 +334,4909 @@ public final class PresentationStrings: Equatable { public var SettingsSearch_Synonyms_EditProfile_Username: String { return self._s[136]! } public var Group_Username_InvalidStartsWithNumber: String { return self._s[137]! } public var UserInfo_NotificationsEnabled: String { return self._s[138]! } - public var Map_Search: String { return self._s[139]! } - public var ClearCache_StorageFree: String { return self._s[141]! } - public var Login_TermsOfServiceHeader: String { return self._s[142]! } + public var PeopleNearby_MakeVisibleDescription: String { return self._s[139]! } + public var Map_Search: String { return self._s[140]! } + public var ClearCache_StorageFree: String { return self._s[142]! } + public var Login_TermsOfServiceHeader: String { return self._s[143]! } public func Notification_PinnedVideoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[143]!, self._r[143]!, [_0]) + return formatWithArgumentRanges(self._s[144]!, self._r[144]!, [_0]) } public func Channel_AdminLog_MessageToggleSignaturesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[145]!, self._r[145]!, [_0]) + return formatWithArgumentRanges(self._s[146]!, self._r[146]!, [_0]) } - public var Wallet_Sent_Title: String { return self._s[146]! } - public var TwoStepAuth_SetupPasswordConfirmPassword: String { return self._s[147]! } - public var Weekday_Today: String { return self._s[148]! } + public var Wallet_Sent_Title: String { return self._s[147]! } + public var TwoStepAuth_SetupPasswordConfirmPassword: String { return self._s[148]! } + public var Weekday_Today: String { return self._s[149]! } public func InstantPage_AuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[150]!, self._r[150]!, [_1, _2]) + return formatWithArgumentRanges(self._s[151]!, self._r[151]!, [_1, _2]) } public func Conversation_MessageDialogRetryAll(_ _1: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[151]!, self._r[151]!, ["\(_1)"]) + return formatWithArgumentRanges(self._s[152]!, self._r[152]!, ["\(_1)"]) } - public var Notification_PassportValuePersonalDetails: String { return self._s[153]! } - public var Channel_AdminLog_MessagePreviousLink: String { return self._s[154]! } - public var ChangePhoneNumberNumber_NewNumber: String { return self._s[155]! } - public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[156]! } - public var TwoStepAuth_ChangePasswordDescription: String { return self._s[157]! } - public var PhotoEditor_BlurToolLinear: String { return self._s[158]! } - public var Contacts_PermissionsAllowInSettings: String { return self._s[159]! } - public var Weekday_ShortMonday: String { return self._s[160]! } - public var Cache_KeepMedia: String { return self._s[161]! } - public var Passport_FieldIdentitySelfieHelp: String { return self._s[162]! } + public var Notification_PassportValuePersonalDetails: String { return self._s[154]! } + public var Channel_AdminLog_MessagePreviousLink: String { return self._s[155]! } + public var ChangePhoneNumberNumber_NewNumber: String { return self._s[156]! } + public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[157]! } + public var TwoStepAuth_ChangePasswordDescription: String { return self._s[158]! } + public var PhotoEditor_BlurToolLinear: String { return self._s[159]! } + public var Contacts_PermissionsAllowInSettings: String { return self._s[160]! } + public var Weekday_ShortMonday: String { return self._s[161]! } + public var Cache_KeepMedia: String { return self._s[162]! } + public var Passport_FieldIdentitySelfieHelp: String { return self._s[163]! } public func PUSH_PINNED_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[163]!, self._r[163]!, [_1, _2]) + return formatWithArgumentRanges(self._s[164]!, self._r[164]!, [_1, _2]) } public func Chat_SlowmodeTooltip(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[164]!, self._r[164]!, [_0]) + return formatWithArgumentRanges(self._s[165]!, self._r[165]!, [_0]) } - public var Wallet_Receive_ShareUrlInfo: String { return self._s[165]! } - public var Conversation_ClousStorageInfo_Description4: String { return self._s[166]! } - public var Wallet_RestoreFailed_Title: String { return self._s[167]! } - public var Passport_Language_ru: String { return self._s[168]! } + public var Wallet_Receive_ShareUrlInfo: String { return self._s[166]! } + public var Conversation_ClousStorageInfo_Description4: String { return self._s[167]! } + public var Wallet_RestoreFailed_Title: String { return self._s[168]! } + public var Passport_Language_ru: String { return self._s[169]! } public func Notification_CreatedChatWithTitle(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[169]!, self._r[169]!, [_0, _1]) + return formatWithArgumentRanges(self._s[170]!, self._r[170]!, [_0, _1]) } - public var WallpaperPreview_PatternIntensity: String { return self._s[170]! } - public var WebBrowser_InAppSafari: String { return self._s[173]! } - public var TwoStepAuth_RecoveryUnavailable: String { return self._s[174]! } - public var EnterPasscode_TouchId: String { return self._s[175]! } - public var PhotoEditor_QualityVeryHigh: String { return self._s[178]! } - public var Checkout_NewCard_SaveInfo: String { return self._s[180]! } - public var Gif_NoGifsPlaceholder: String { return self._s[182]! } + public var WallpaperPreview_PatternIntensity: String { return self._s[171]! } + public var WebBrowser_InAppSafari: String { return self._s[174]! } + public var TwoStepAuth_RecoveryUnavailable: String { return self._s[175]! } + public var EnterPasscode_TouchId: String { return self._s[176]! } + public var PhotoEditor_QualityVeryHigh: String { return self._s[179]! } + public var Checkout_NewCard_SaveInfo: String { return self._s[181]! } + public var Gif_NoGifsPlaceholder: String { return self._s[183]! } public func Notification_InvitedMultiple(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[184]!, self._r[184]!, [_0, _1]) + return formatWithArgumentRanges(self._s[185]!, self._r[185]!, [_0, _1]) } - public var ChatSettings_AutoDownloadEnabled: String { return self._s[185]! } - public var NetworkUsageSettings_BytesSent: String { return self._s[186]! } - public var Checkout_PasswordEntry_Pay: String { return self._s[187]! } - public var AuthSessions_TerminateSession: String { return self._s[188]! } - public var Message_File: String { return self._s[189]! } - public var MediaPicker_VideoMuteDescription: String { return self._s[190]! } - public var SocksProxySetup_ProxyStatusConnected: String { return self._s[191]! } - public var TwoStepAuth_RecoveryCode: String { return self._s[192]! } - public var EnterPasscode_EnterCurrentPasscode: String { return self._s[193]! } + public var ChatSettings_AutoDownloadEnabled: String { return self._s[186]! } + public var NetworkUsageSettings_BytesSent: String { return self._s[187]! } + public var Checkout_PasswordEntry_Pay: String { return self._s[188]! } + public var AuthSessions_TerminateSession: String { return self._s[189]! } + public var Message_File: String { return self._s[190]! } + public var MediaPicker_VideoMuteDescription: String { return self._s[191]! } + public var SocksProxySetup_ProxyStatusConnected: String { return self._s[192]! } + public var TwoStepAuth_RecoveryCode: String { return self._s[193]! } + public var EnterPasscode_EnterCurrentPasscode: String { return self._s[194]! } public func TwoStepAuth_EnterPasswordHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[194]!, self._r[194]!, [_0]) + return formatWithArgumentRanges(self._s[195]!, self._r[195]!, [_0]) } - public var Conversation_Moderate_Report: String { return self._s[196]! } - public var TwoStepAuth_EmailInvalid: String { return self._s[197]! } - public var Passport_Language_ms: String { return self._s[198]! } - public var Channel_Edit_AboutItem: String { return self._s[200]! } - public var DialogList_SearchSectionGlobal: String { return self._s[204]! } - public var AttachmentMenu_WebSearch: String { return self._s[205]! } - public var PasscodeSettings_TurnPasscodeOn: String { return self._s[206]! } - public var Channel_BanUser_Title: String { return self._s[207]! } - public var WallpaperPreview_SwipeTopText: String { return self._s[208]! } - public var ChatList_DeleteSavedMessagesConfirmationText: String { return self._s[209]! } - public var ArchivedChats_IntroText2: String { return self._s[210]! } - public var Conversation_OpenBotLinkTitle: String { return self._s[211]! } - public var ChatSearch_SearchPlaceholder: String { return self._s[213]! } - public var Notification_Exceptions_DeleteAll: String { return self._s[214]! } - public var Passport_FieldAddressTranslationHelp: String { return self._s[215]! } - public var NotificationsSound_Aurora: String { return self._s[216]! } + public var Conversation_Moderate_Report: String { return self._s[197]! } + public var TwoStepAuth_EmailInvalid: String { return self._s[198]! } + public var Passport_Language_ms: String { return self._s[199]! } + public var Channel_Edit_AboutItem: String { return self._s[201]! } + public var DialogList_SearchSectionGlobal: String { return self._s[205]! } + public var AttachmentMenu_WebSearch: String { return self._s[206]! } + public var PasscodeSettings_TurnPasscodeOn: String { return self._s[207]! } + public var Channel_BanUser_Title: String { return self._s[208]! } + public var WallpaperPreview_SwipeTopText: String { return self._s[209]! } + public var ChatList_DeleteSavedMessagesConfirmationText: String { return self._s[210]! } + public var ArchivedChats_IntroText2: String { return self._s[211]! } + public var Conversation_OpenBotLinkTitle: String { return self._s[212]! } + public var ChatSearch_SearchPlaceholder: String { return self._s[214]! } + public var Notification_Exceptions_DeleteAll: String { return self._s[215]! } + public var Passport_FieldAddressTranslationHelp: String { return self._s[216]! } + public var NotificationsSound_Aurora: String { return self._s[217]! } public func Channel_AdminLog_MessageTransferedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[217]!, self._r[217]!, [_1, _2]) + return formatWithArgumentRanges(self._s[218]!, self._r[218]!, [_1, _2]) } public func FileSize_GB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[218]!, self._r[218]!, [_0]) + return formatWithArgumentRanges(self._s[219]!, self._r[219]!, [_0]) } - public var AuthSessions_LoggedInWithTelegram: String { return self._s[221]! } + public var AuthSessions_LoggedInWithTelegram: String { return self._s[222]! } public func Privacy_GroupsAndChannels_InviteToGroupError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[222]!, self._r[222]!, [_0, _1]) + return formatWithArgumentRanges(self._s[223]!, self._r[223]!, [_0, _1]) } - public var Passport_PasswordNext: String { return self._s[223]! } - public var Bot_GroupStatusReadsHistory: String { return self._s[224]! } - public var EmptyGroupInfo_Line2: String { return self._s[225]! } - public var VoiceOver_Chat_SeenByRecipients: String { return self._s[226]! } - public var Settings_FAQ_Intro: String { return self._s[229]! } - public var PrivacySettings_PasscodeAndTouchId: String { return self._s[231]! } - public var FeaturedStickerPacks_Title: String { return self._s[232]! } - public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[234]! } - public var Username_Title: String { return self._s[235]! } + public var Passport_PasswordNext: String { return self._s[224]! } + public var Bot_GroupStatusReadsHistory: String { return self._s[225]! } + public var EmptyGroupInfo_Line2: String { return self._s[226]! } + public var VoiceOver_Chat_SeenByRecipients: String { return self._s[227]! } + public var Settings_FAQ_Intro: String { return self._s[230]! } + public var PrivacySettings_PasscodeAndTouchId: String { return self._s[232]! } + public var FeaturedStickerPacks_Title: String { return self._s[233]! } + public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[235]! } + public var Username_Title: String { return self._s[236]! } public func Message_StickerText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[236]!, self._r[236]!, [_0]) + return formatWithArgumentRanges(self._s[237]!, self._r[237]!, [_0]) } - public var PasscodeSettings_AlphanumericCode: String { return self._s[237]! } - public var Localization_LanguageOther: String { return self._s[238]! } - public var Stickers_SuggestStickers: String { return self._s[239]! } + public var PasscodeSettings_AlphanumericCode: String { return self._s[238]! } + public var Localization_LanguageOther: String { return self._s[239]! } + public var Stickers_SuggestStickers: String { return self._s[240]! } public func Channel_AdminLog_MessageRemovedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[240]!, self._r[240]!, [_0]) + return formatWithArgumentRanges(self._s[241]!, self._r[241]!, [_0]) } - public var NotificationSettings_ShowNotificationsFromAccountsSection: String { return self._s[241]! } - public var Channel_AdminLogFilter_EventsAdmins: String { return self._s[242]! } - public var Conversation_DefaultRestrictedStickers: String { return self._s[243]! } + public var NotificationSettings_ShowNotificationsFromAccountsSection: String { return self._s[242]! } + public var Channel_AdminLogFilter_EventsAdmins: String { return self._s[243]! } + public var Conversation_DefaultRestrictedStickers: String { return self._s[244]! } public func Notification_PinnedDeletedMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[244]!, self._r[244]!, [_0]) + return formatWithArgumentRanges(self._s[245]!, self._r[245]!, [_0]) } - public var Wallet_TransactionInfo_CopyAddress: String { return self._s[246]! } - public var Group_UpgradeConfirmation: String { return self._s[247]! } - public var DialogList_Unpin: String { return self._s[248]! } - public var Passport_Identity_DateOfBirth: String { return self._s[249]! } - public var Month_ShortOctober: String { return self._s[250]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[251]! } - public var TwoFactorSetup_Done_Text: String { return self._s[252]! } - public var Notification_CallCanceledShort: String { return self._s[253]! } - public var Conversation_StopQuiz: String { return self._s[254]! } - public var Passport_Phone_Help: String { return self._s[255]! } - public var Passport_Language_az: String { return self._s[257]! } - public var CreatePoll_TextPlaceholder: String { return self._s[259]! } - public var VoiceOver_Chat_AnonymousPoll: String { return self._s[260]! } - public var Passport_Identity_DocumentNumber: String { return self._s[261]! } - public var PhotoEditor_CurvesRed: String { return self._s[262]! } - public var PhoneNumberHelp_Alert: String { return self._s[264]! } - public var SocksProxySetup_Port: String { return self._s[265]! } - public var Checkout_PayNone: String { return self._s[266]! } - public var AutoDownloadSettings_WiFi: String { return self._s[267]! } - public var GroupInfo_GroupType: String { return self._s[268]! } - public var StickerSettings_ContextHide: String { return self._s[269]! } - public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[270]! } - public var Group_Setup_HistoryTitle: String { return self._s[272]! } - public var Passport_Identity_FilesUploadNew: String { return self._s[273]! } - public var PasscodeSettings_AutoLock: String { return self._s[274]! } - public var Passport_Title: String { return self._s[275]! } - public var VoiceOver_Chat_ContactPhoneNumber: String { return self._s[276]! } - public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[277]! } - public var GroupPermission_NoSendGifs: String { return self._s[278]! } - public var PrivacySettings_PasscodeOn: String { return self._s[279]! } + public var Wallet_TransactionInfo_CopyAddress: String { return self._s[247]! } + public var Group_UpgradeConfirmation: String { return self._s[248]! } + public var DialogList_Unpin: String { return self._s[249]! } + public var Passport_Identity_DateOfBirth: String { return self._s[250]! } + public var Month_ShortOctober: String { return self._s[251]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[252]! } + public var TwoFactorSetup_Done_Text: String { return self._s[253]! } + public var Notification_CallCanceledShort: String { return self._s[254]! } + public var Conversation_StopQuiz: String { return self._s[255]! } + public var Passport_Phone_Help: String { return self._s[256]! } + public var Passport_Language_az: String { return self._s[258]! } + public var CreatePoll_TextPlaceholder: String { return self._s[260]! } + public var VoiceOver_Chat_AnonymousPoll: String { return self._s[261]! } + public var Passport_Identity_DocumentNumber: String { return self._s[262]! } + public var PhotoEditor_CurvesRed: String { return self._s[263]! } + public var PhoneNumberHelp_Alert: String { return self._s[265]! } + public var SocksProxySetup_Port: String { return self._s[266]! } + public var Checkout_PayNone: String { return self._s[267]! } + public var AutoDownloadSettings_WiFi: String { return self._s[268]! } + public var GroupInfo_GroupType: String { return self._s[269]! } + public var StickerSettings_ContextHide: String { return self._s[270]! } + public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[271]! } + public var Group_Setup_HistoryTitle: String { return self._s[273]! } + public var Passport_Identity_FilesUploadNew: String { return self._s[274]! } + public var PasscodeSettings_AutoLock: String { return self._s[275]! } + public var Passport_Title: String { return self._s[276]! } + public var VoiceOver_Chat_ContactPhoneNumber: String { return self._s[277]! } + public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[278]! } + public var GroupPermission_NoSendGifs: String { return self._s[279]! } + public var PrivacySettings_PasscodeOn: String { return self._s[280]! } public func Conversation_ScheduleMessage_SendTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[280]!, self._r[280]!, [_0]) + return formatWithArgumentRanges(self._s[281]!, self._r[281]!, [_0]) } - public var State_WaitingForNetwork: String { return self._s[283]! } + public var State_WaitingForNetwork: String { return self._s[284]! } public func Notification_Invited(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[284]!, self._r[284]!, [_0, _1]) + return formatWithArgumentRanges(self._s[285]!, self._r[285]!, [_0, _1]) } - public var Calls_NotNow: String { return self._s[286]! } + public var Calls_NotNow: String { return self._s[287]! } public func Channel_DiscussionGroup_HeaderSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[287]!, self._r[287]!, [_0]) + return formatWithArgumentRanges(self._s[288]!, self._r[288]!, [_0]) } - public var UserInfo_SendMessage: String { return self._s[288]! } - public var TwoStepAuth_PasswordSet: String { return self._s[289]! } - public var Passport_DeleteDocument: String { return self._s[290]! } - public var SocksProxySetup_AddProxyTitle: String { return self._s[291]! } + public var UserInfo_SendMessage: String { return self._s[289]! } + public var TwoStepAuth_PasswordSet: String { return self._s[290]! } + public var Passport_DeleteDocument: String { return self._s[291]! } + public var SocksProxySetup_AddProxyTitle: String { return self._s[292]! } public func PUSH_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[292]!, self._r[292]!, [_1]) + return formatWithArgumentRanges(self._s[293]!, self._r[293]!, [_1]) } - public var AuthSessions_AddedDeviceTitle: String { return self._s[293]! } - public var GroupRemoved_Remove: String { return self._s[294]! } - public var Passport_FieldIdentity: String { return self._s[295]! } - public var Group_Setup_TypePrivateHelp: String { return self._s[296]! } - public var Conversation_Processing: String { return self._s[299]! } - public var Wallet_Settings_BackupWallet: String { return self._s[301]! } - public var ChatSettings_AutoPlayAnimations: String { return self._s[302]! } - public var AuthSessions_LogOutApplicationsHelp: String { return self._s[305]! } - public var Forward_ErrorPublicQuizDisabledInChannels: String { return self._s[306]! } - public var Month_GenFebruary: String { return self._s[307]! } - public var Wallet_Send_NetworkErrorTitle: String { return self._s[308]! } + public var AuthSessions_AddedDeviceTitle: String { return self._s[294]! } + public var GroupRemoved_Remove: String { return self._s[295]! } + public var Passport_FieldIdentity: String { return self._s[296]! } + public var Group_Setup_TypePrivateHelp: String { return self._s[297]! } + public var Conversation_Processing: String { return self._s[300]! } + public var Wallet_Settings_BackupWallet: String { return self._s[302]! } + public var ChatSettings_AutoPlayAnimations: String { return self._s[303]! } + public var AuthSessions_LogOutApplicationsHelp: String { return self._s[306]! } + public var Forward_ErrorPublicQuizDisabledInChannels: String { return self._s[307]! } + public var Month_GenFebruary: String { return self._s[308]! } + public var Wallet_Send_NetworkErrorTitle: String { return self._s[309]! } public func Login_InvalidPhoneEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[310]!, self._r[310]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[311]!, self._r[311]!, [_1, _2, _3, _4, _5]) } - public var Passport_Identity_TypeIdentityCard: String { return self._s[311]! } - public var Wallet_Month_ShortJune: String { return self._s[313]! } - public var AutoDownloadSettings_DataUsageMedium: String { return self._s[314]! } - public var GroupInfo_AddParticipant: String { return self._s[315]! } - public var KeyCommand_SendMessage: String { return self._s[316]! } - public var VoiceOver_Chat_YourContact: String { return self._s[318]! } - public var Map_LiveLocationShowAll: String { return self._s[319]! } - public var WallpaperSearch_ColorOrange: String { return self._s[321]! } - public var Appearance_AppIconDefaultX: String { return self._s[322]! } - public var Checkout_Receipt_Title: String { return self._s[323]! } - public var Group_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[324]! } - public var WallpaperPreview_PreviewTopText: String { return self._s[325]! } - public var Message_Contact: String { return self._s[326]! } - public var Call_StatusIncoming: String { return self._s[327]! } - public var Wallet_TransactionInfo_StorageFeeInfo: String { return self._s[328]! } + public var Passport_Identity_TypeIdentityCard: String { return self._s[312]! } + public var Wallet_Month_ShortJune: String { return self._s[314]! } + public var AutoDownloadSettings_DataUsageMedium: String { return self._s[315]! } + public var GroupInfo_AddParticipant: String { return self._s[316]! } + public var KeyCommand_SendMessage: String { return self._s[317]! } + public var VoiceOver_Chat_YourContact: String { return self._s[319]! } + public var Map_LiveLocationShowAll: String { return self._s[320]! } + public var WallpaperSearch_ColorOrange: String { return self._s[322]! } + public var Appearance_AppIconDefaultX: String { return self._s[323]! } + public var Checkout_Receipt_Title: String { return self._s[324]! } + public var Group_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[325]! } + public var WallpaperPreview_PreviewTopText: String { return self._s[326]! } + public var Message_Contact: String { return self._s[327]! } + public var Call_StatusIncoming: String { return self._s[328]! } + public var Wallet_TransactionInfo_StorageFeeInfo: String { return self._s[329]! } public func Channel_AdminLog_MessageKickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[329]!, self._r[329]!, [_1]) + return formatWithArgumentRanges(self._s[330]!, self._r[330]!, [_1]) } public func PUSH_ENCRYPTED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[331]!, self._r[331]!, [_1]) + return formatWithArgumentRanges(self._s[332]!, self._r[332]!, [_1]) } - public var VoiceOver_Media_PlaybackRate: String { return self._s[332]! } - public var Passport_FieldIdentityDetailsHelp: String { return self._s[333]! } - public var Conversation_ViewChannel: String { return self._s[334]! } + public var VoiceOver_Media_PlaybackRate: String { return self._s[333]! } + public var Passport_FieldIdentityDetailsHelp: String { return self._s[334]! } + public var Conversation_ViewChannel: String { return self._s[335]! } public func Time_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[335]!, self._r[335]!, [_0]) + return formatWithArgumentRanges(self._s[336]!, self._r[336]!, [_0]) } - public var Theme_Colors_Accent: String { return self._s[336]! } - public var Passport_Language_nl: String { return self._s[338]! } - public var Camera_Retake: String { return self._s[339]! } + public var Theme_Colors_Accent: String { return self._s[337]! } + public var Passport_Language_nl: String { return self._s[339]! } + public var Camera_Retake: String { return self._s[340]! } public func UserInfo_BlockActionTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[340]!, self._r[340]!, [_0]) + return formatWithArgumentRanges(self._s[341]!, self._r[341]!, [_0]) } - public var AuthSessions_LogOutApplications: String { return self._s[341]! } - public var ApplyLanguage_ApplySuccess: String { return self._s[342]! } - public var Tour_Title6: String { return self._s[343]! } - public var Map_ChooseAPlace: String { return self._s[344]! } - public var CallSettings_Never: String { return self._s[346]! } + public var AuthSessions_LogOutApplications: String { return self._s[342]! } + public var ApplyLanguage_ApplySuccess: String { return self._s[343]! } + public var Tour_Title6: String { return self._s[344]! } + public var Map_ChooseAPlace: String { return self._s[345]! } + public var CallSettings_Never: String { return self._s[347]! } public func Notification_ChangedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[347]!, self._r[347]!, [_0]) + return formatWithArgumentRanges(self._s[348]!, self._r[348]!, [_0]) } - public var ChannelRemoved_RemoveInfo: String { return self._s[348]! } + public var ChannelRemoved_RemoveInfo: String { return self._s[349]! } public func AutoDownloadSettings_PreloadVideoInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[349]!, self._r[349]!, [_0]) + return formatWithArgumentRanges(self._s[350]!, self._r[350]!, [_0]) } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsExceptions: String { return self._s[350]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsExceptions: String { return self._s[351]! } public func Conversation_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[351]!, self._r[351]!, [_0]) + return formatWithArgumentRanges(self._s[352]!, self._r[352]!, [_0]) } - public var GroupInfo_InviteLink_Title: String { return self._s[352]! } + public var GroupInfo_InviteLink_Title: String { return self._s[353]! } public func Channel_AdminLog_MessageUnkickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[353]!, self._r[353]!, [_1, _2]) + return formatWithArgumentRanges(self._s[354]!, self._r[354]!, [_1, _2]) } - public var KeyCommand_ScrollUp: String { return self._s[354]! } - public var ContactInfo_URLLabelHomepage: String { return self._s[355]! } - public var Channel_OwnershipTransfer_ChangeOwner: String { return self._s[356]! } + public var KeyCommand_ScrollUp: String { return self._s[355]! } + public var ContactInfo_URLLabelHomepage: String { return self._s[356]! } + public var Channel_OwnershipTransfer_ChangeOwner: String { return self._s[357]! } public func Channel_AdminLog_DisabledSlowmode(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[357]!, self._r[357]!, [_0]) + return formatWithArgumentRanges(self._s[358]!, self._r[358]!, [_0]) } - public var TwoFactorSetup_Done_Title: String { return self._s[358]! } + public var TwoFactorSetup_Done_Title: String { return self._s[359]! } public func Conversation_EncryptedPlaceholderTitleOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[359]!, self._r[359]!, [_0]) + return formatWithArgumentRanges(self._s[360]!, self._r[360]!, [_0]) } - public var CallFeedback_ReasonDistortedSpeech: String { return self._s[360]! } - public var Watch_LastSeen_WithinAWeek: String { return self._s[361]! } - public var ContactList_Context_SendMessage: String { return self._s[363]! } - public var Weekday_Tuesday: String { return self._s[364]! } - public var Wallet_Created_Title: String { return self._s[366]! } - public var ScheduledMessages_Delete: String { return self._s[367]! } - public var UserInfo_StartSecretChat: String { return self._s[368]! } - public var Passport_Identity_FilesTitle: String { return self._s[369]! } - public var Permissions_NotificationsAllow_v0: String { return self._s[370]! } - public var DialogList_DeleteConversationConfirmation: String { return self._s[372]! } - public var ChatList_UndoArchiveRevealedTitle: String { return self._s[373]! } + public var CallFeedback_ReasonDistortedSpeech: String { return self._s[361]! } + public var Watch_LastSeen_WithinAWeek: String { return self._s[362]! } + public var ContactList_Context_SendMessage: String { return self._s[364]! } + public var Weekday_Tuesday: String { return self._s[365]! } + public var Wallet_Created_Title: String { return self._s[367]! } + public var ScheduledMessages_Delete: String { return self._s[368]! } + public var UserInfo_StartSecretChat: String { return self._s[369]! } + public var Passport_Identity_FilesTitle: String { return self._s[370]! } + public var Permissions_NotificationsAllow_v0: String { return self._s[371]! } + public var DialogList_DeleteConversationConfirmation: String { return self._s[373]! } + public var ChatList_UndoArchiveRevealedTitle: String { return self._s[374]! } public func Wallet_Configuration_ApplyErrorTextURLUnreachable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[374]!, self._r[374]!, [_0]) + return formatWithArgumentRanges(self._s[375]!, self._r[375]!, [_0]) } - public var AuthSessions_Sessions: String { return self._s[375]! } + public var AuthSessions_Sessions: String { return self._s[376]! } public func Settings_KeepPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[377]!, self._r[377]!, [_0]) + return formatWithArgumentRanges(self._s[378]!, self._r[378]!, [_0]) } - public var TwoStepAuth_RecoveryEmailChangeDescription: String { return self._s[378]! } - public var Call_StatusWaiting: String { return self._s[379]! } - public var CreateGroup_SoftUserLimitAlert: String { return self._s[380]! } - public var FastTwoStepSetup_HintHelp: String { return self._s[381]! } - public var WallpaperPreview_CustomColorBottomText: String { return self._s[382]! } - public var EditTheme_Expand_Preview_OutgoingText: String { return self._s[383]! } - public var LogoutOptions_AddAccountText: String { return self._s[384]! } - public var PasscodeSettings_6DigitCode: String { return self._s[385]! } - public var Settings_LogoutConfirmationText: String { return self._s[386]! } - public var Passport_Identity_TypePassport: String { return self._s[388]! } - public var Map_Work: String { return self._s[391]! } + public var TwoStepAuth_RecoveryEmailChangeDescription: String { return self._s[379]! } + public var Call_StatusWaiting: String { return self._s[380]! } + public var CreateGroup_SoftUserLimitAlert: String { return self._s[381]! } + public var FastTwoStepSetup_HintHelp: String { return self._s[382]! } + public var WallpaperPreview_CustomColorBottomText: String { return self._s[383]! } + public var EditTheme_Expand_Preview_OutgoingText: String { return self._s[384]! } + public var LogoutOptions_AddAccountText: String { return self._s[385]! } + public var PasscodeSettings_6DigitCode: String { return self._s[386]! } + public var Settings_LogoutConfirmationText: String { return self._s[387]! } + public var Passport_Identity_TypePassport: String { return self._s[389]! } + public var Map_Work: String { return self._s[392]! } public func PUSH_MESSAGE_VIDEOS(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[392]!, self._r[392]!, [_1, _2]) + return formatWithArgumentRanges(self._s[393]!, self._r[393]!, [_1, _2]) } - public var SocksProxySetup_SaveProxy: String { return self._s[393]! } - public var AccessDenied_SaveMedia: String { return self._s[394]! } - public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[396]! } - public var CreatePoll_MultipleChoice: String { return self._s[397]! } - public var Settings_Title: String { return self._s[399]! } - public var VoiceOver_Chat_RecordModeVideoMessageInfo: String { return self._s[400]! } - public var Contacts_InviteSearchLabel: String { return self._s[402]! } - public var PrivacySettings_WebSessions: String { return self._s[403]! } - public var ConvertToSupergroup_Title: String { return self._s[404]! } + public var SocksProxySetup_SaveProxy: String { return self._s[394]! } + public var AccessDenied_SaveMedia: String { return self._s[395]! } + public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[397]! } + public var CreatePoll_MultipleChoice: String { return self._s[398]! } + public var Settings_Title: String { return self._s[400]! } + public var VoiceOver_Chat_RecordModeVideoMessageInfo: String { return self._s[401]! } + public var Contacts_InviteSearchLabel: String { return self._s[403]! } + public var PrivacySettings_WebSessions: String { return self._s[404]! } + public var ConvertToSupergroup_Title: String { return self._s[405]! } public func Channel_AdminLog_CaptionEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[405]!, self._r[405]!, [_0]) + return formatWithArgumentRanges(self._s[406]!, self._r[406]!, [_0]) } - public var TwoFactorSetup_Hint_Text: String { return self._s[406]! } - public var InfoPlist_NSSiriUsageDescription: String { return self._s[407]! } + public var TwoFactorSetup_Hint_Text: String { return self._s[407]! } + public var InfoPlist_NSSiriUsageDescription: String { return self._s[408]! } public func PUSH_MESSAGE_CHANNEL_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[408]!, self._r[408]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[409]!, self._r[409]!, [_1, _2, _3]) } - public var ChatSettings_AutomaticPhotoDownload: String { return self._s[409]! } - public var UserInfo_BotHelp: String { return self._s[410]! } - public var PrivacySettings_LastSeenEverybody: String { return self._s[411]! } - public var Checkout_Name: String { return self._s[412]! } - public var AutoDownloadSettings_DataUsage: String { return self._s[413]! } - public var Channel_BanUser_BlockFor: String { return self._s[414]! } - public var Checkout_ShippingAddress: String { return self._s[415]! } - public var AutoDownloadSettings_MaxVideoSize: String { return self._s[416]! } - public var Privacy_PaymentsClearInfoDoneHelp: String { return self._s[417]! } - public var Privacy_Forwards: String { return self._s[418]! } - public var Channel_BanUser_PermissionSendPolls: String { return self._s[419]! } - public var Appearance_ThemeCarouselNewNight: String { return self._s[420]! } + public var ChatSettings_AutomaticPhotoDownload: String { return self._s[410]! } + public var UserInfo_BotHelp: String { return self._s[411]! } + public var PrivacySettings_LastSeenEverybody: String { return self._s[412]! } + public var Checkout_Name: String { return self._s[413]! } + public var AutoDownloadSettings_DataUsage: String { return self._s[414]! } + public var Channel_BanUser_BlockFor: String { return self._s[415]! } + public var Checkout_ShippingAddress: String { return self._s[416]! } + public var AutoDownloadSettings_MaxVideoSize: String { return self._s[417]! } + public var Privacy_PaymentsClearInfoDoneHelp: String { return self._s[418]! } + public var Privacy_Forwards: String { return self._s[419]! } + public var Channel_BanUser_PermissionSendPolls: String { return self._s[420]! } + public var Appearance_ThemeCarouselNewNight: String { return self._s[421]! } public func SecretVideo_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[423]!, self._r[423]!, [_0]) + return formatWithArgumentRanges(self._s[424]!, self._r[424]!, [_0]) } - public var Contacts_SortedByName: String { return self._s[424]! } - public var Group_OwnershipTransfer_Title: String { return self._s[425]! } - public var VoiceOver_Chat_OpenHint: String { return self._s[427]! } - public var Group_LeaveGroup: String { return self._s[428]! } - public var Settings_UsernameEmpty: String { return self._s[429]! } + public var Contacts_SortedByName: String { return self._s[425]! } + public var Group_OwnershipTransfer_Title: String { return self._s[426]! } + public var VoiceOver_Chat_OpenHint: String { return self._s[428]! } + public var Group_LeaveGroup: String { return self._s[429]! } + public var Settings_UsernameEmpty: String { return self._s[430]! } public func Notification_PinnedPollMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[430]!, self._r[430]!, [_0]) + return formatWithArgumentRanges(self._s[431]!, self._r[431]!, [_0]) } public func TwoStepAuth_ConfirmEmailDescription(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[431]!, self._r[431]!, [_1]) + return formatWithArgumentRanges(self._s[432]!, self._r[432]!, [_1]) } public func Channel_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[432]!, self._r[432]!, [_1, _2]) + return formatWithArgumentRanges(self._s[433]!, self._r[433]!, [_1, _2]) } - public var Message_ImageExpired: String { return self._s[433]! } - public var TwoStepAuth_RecoveryFailed: String { return self._s[435]! } - public var EditTheme_Edit_Preview_OutgoingText: String { return self._s[436]! } - public var UserInfo_AddToExisting: String { return self._s[437]! } - public var TwoStepAuth_EnabledSuccess: String { return self._s[438]! } - public var Wallet_Send_SyncInProgress: String { return self._s[439]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_SetColor: String { return self._s[440]! } + public var Message_ImageExpired: String { return self._s[434]! } + public var TwoStepAuth_RecoveryFailed: String { return self._s[436]! } + public var EditTheme_Edit_Preview_OutgoingText: String { return self._s[437]! } + public var UserInfo_AddToExisting: String { return self._s[438]! } + public var TwoStepAuth_EnabledSuccess: String { return self._s[439]! } + public var Wallet_Send_SyncInProgress: String { return self._s[440]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_SetColor: String { return self._s[441]! } public func PUSH_CHANNEL_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[441]!, self._r[441]!, [_1]) + return formatWithArgumentRanges(self._s[442]!, self._r[442]!, [_1]) } - public var Notifications_GroupNotificationsAlert: String { return self._s[442]! } - public var Passport_Language_km: String { return self._s[443]! } - public var SocksProxySetup_AdNoticeHelp: String { return self._s[445]! } - public var VoiceOver_Media_PlaybackPlay: String { return self._s[446]! } - public var Notification_CallMissedShort: String { return self._s[447]! } - public var Wallet_Info_YourBalance: String { return self._s[448]! } - public var ReportPeer_ReasonOther_Send: String { return self._s[449]! } - public var Watch_Compose_Send: String { return self._s[450]! } - public var Passport_Identity_TypeInternalPassportUploadScan: String { return self._s[453]! } - public var TwoFactorSetup_Email_Action: String { return self._s[454]! } - public var Conversation_HoldForVideo: String { return self._s[455]! } - public var Wallet_Configuration_ApplyErrorTextURLInvalidData: String { return self._s[456]! } - public var AuthSessions_OtherDevices: String { return self._s[457]! } - public var Wallet_TransactionInfo_CommentHeader: String { return self._s[458]! } - public var CheckoutInfo_ErrorCityInvalid: String { return self._s[460]! } - public var Appearance_AutoNightThemeDisabled: String { return self._s[462]! } - public var Channel_LinkItem: String { return self._s[463]! } + public var Notifications_GroupNotificationsAlert: String { return self._s[443]! } + public var Passport_Language_km: String { return self._s[444]! } + public var SocksProxySetup_AdNoticeHelp: String { return self._s[446]! } + public var VoiceOver_Media_PlaybackPlay: String { return self._s[447]! } + public var Notification_CallMissedShort: String { return self._s[448]! } + public var Wallet_Info_YourBalance: String { return self._s[449]! } + public var ReportPeer_ReasonOther_Send: String { return self._s[451]! } + public var Watch_Compose_Send: String { return self._s[452]! } + public var Passport_Identity_TypeInternalPassportUploadScan: String { return self._s[455]! } + public var TwoFactorSetup_Email_Action: String { return self._s[456]! } + public var Conversation_HoldForVideo: String { return self._s[457]! } + public var Wallet_Configuration_ApplyErrorTextURLInvalidData: String { return self._s[458]! } + public var AuthSessions_OtherDevices: String { return self._s[459]! } + public var Wallet_TransactionInfo_CommentHeader: String { return self._s[460]! } + public var CheckoutInfo_ErrorCityInvalid: String { return self._s[462]! } + public var Appearance_AutoNightThemeDisabled: String { return self._s[464]! } + public var Channel_LinkItem: String { return self._s[465]! } public func PrivacySettings_LastSeenContactsMinusPlus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[464]!, self._r[464]!, [_0, _1]) + return formatWithArgumentRanges(self._s[466]!, self._r[466]!, [_0, _1]) } public func Passport_Identity_NativeNameTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[467]!, self._r[467]!, [_0]) + return formatWithArgumentRanges(self._s[469]!, self._r[469]!, [_0]) } - public var VoiceOver_Recording_StopAndPreview: String { return self._s[468]! } - public var Passport_Language_dv: String { return self._s[469]! } - public var Undo_LeftChannel: String { return self._s[470]! } - public var Notifications_ExceptionsMuted: String { return self._s[471]! } - public var ChatList_UnhideAction: String { return self._s[472]! } - public var Conversation_ContextMenuShare: String { return self._s[473]! } - public var Conversation_ContextMenuStickerPackInfo: String { return self._s[474]! } - public var ShareFileTip_Title: String { return self._s[475]! } - public var NotificationsSound_Chord: String { return self._s[476]! } - public var Wallet_TransactionInfo_OtherFeeHeader: String { return self._s[477]! } + public var VoiceOver_Recording_StopAndPreview: String { return self._s[470]! } + public var Passport_Language_dv: String { return self._s[471]! } + public var Undo_LeftChannel: String { return self._s[472]! } + public var Notifications_ExceptionsMuted: String { return self._s[473]! } + public var ChatList_UnhideAction: String { return self._s[474]! } + public var Conversation_ContextMenuShare: String { return self._s[475]! } + public var Conversation_ContextMenuStickerPackInfo: String { return self._s[476]! } + public var ShareFileTip_Title: String { return self._s[477]! } + public var NotificationsSound_Chord: String { return self._s[478]! } + public var Wallet_TransactionInfo_OtherFeeHeader: String { return self._s[479]! } public func PUSH_CHAT_RETURNED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[478]!, self._r[478]!, [_1, _2]) + return formatWithArgumentRanges(self._s[480]!, self._r[480]!, [_1, _2]) } - public var Passport_Address_EditTemporaryRegistration: String { return self._s[479]! } + public var Passport_Address_EditTemporaryRegistration: String { return self._s[481]! } public func Notification_Joined(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[480]!, self._r[480]!, [_0]) + return formatWithArgumentRanges(self._s[482]!, self._r[482]!, [_0]) } public func Wallet_Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[481]!, self._r[481]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[483]!, self._r[483]!, [_1, _2, _3]) } - public var Wallet_Settings_ConfigurationInfo: String { return self._s[482]! } - public var Wallpaper_ErrorNotFound: String { return self._s[483]! } - public var Notification_CallOutgoingShort: String { return self._s[485]! } - public var Wallet_WordImport_IncorrectText: String { return self._s[486]! } + public var Wallet_Settings_ConfigurationInfo: String { return self._s[484]! } + public var Wallpaper_ErrorNotFound: String { return self._s[485]! } + public var Notification_CallOutgoingShort: String { return self._s[487]! } + public var Wallet_WordImport_IncorrectText: String { return self._s[488]! } public func Watch_Time_ShortFullAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[487]!, self._r[487]!, [_1, _2]) + return formatWithArgumentRanges(self._s[489]!, self._r[489]!, [_1, _2]) } - public var Passport_Address_TypeUtilityBill: String { return self._s[488]! } - public var Privacy_Forwards_LinkIfAllowed: String { return self._s[489]! } - public var ReportPeer_Report: String { return self._s[490]! } - public var SettingsSearch_Synonyms_Proxy_Title: String { return self._s[491]! } - public var GroupInfo_DeactivatedStatus: String { return self._s[492]! } + public var Passport_Address_TypeUtilityBill: String { return self._s[490]! } + public var Privacy_Forwards_LinkIfAllowed: String { return self._s[491]! } + public var ReportPeer_Report: String { return self._s[492]! } + public var SettingsSearch_Synonyms_Proxy_Title: String { return self._s[493]! } + public var GroupInfo_DeactivatedStatus: String { return self._s[494]! } public func VoiceOver_Chat_MusicTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[493]!, self._r[493]!, [_1, _2]) + return formatWithArgumentRanges(self._s[495]!, self._r[495]!, [_1, _2]) } - public var StickerPack_Send: String { return self._s[494]! } - public var Login_CodeSentInternal: String { return self._s[495]! } - public var Wallet_Month_GenJanuary: String { return self._s[496]! } - public var GroupInfo_InviteLink_LinkSection: String { return self._s[497]! } + public var StickerPack_Send: String { return self._s[496]! } + public var Login_CodeSentInternal: String { return self._s[497]! } + public var Wallet_Month_GenJanuary: String { return self._s[498]! } + public var GroupInfo_InviteLink_LinkSection: String { return self._s[499]! } public func Channel_AdminLog_MessageDeleted(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[498]!, self._r[498]!, [_0]) - } - public func Conversation_EncryptionWaiting(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[500]!, self._r[500]!, [_0]) } - public var Channel_BanUser_PermissionSendStickersAndGifs: String { return self._s[501]! } - public func PUSH_PINNED_GAME(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[502]!, self._r[502]!, [_1]) + public func Conversation_EncryptionWaiting(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[502]!, self._r[502]!, [_0]) } - public var ReportPeer_ReasonViolence: String { return self._s[504]! } - public var Appearance_ShareThemeColor: String { return self._s[505]! } - public var Map_Locating: String { return self._s[506]! } + public var Channel_BanUser_PermissionSendStickersAndGifs: String { return self._s[503]! } + public func PUSH_PINNED_GAME(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[504]!, self._r[504]!, [_1]) + } + public var ReportPeer_ReasonViolence: String { return self._s[506]! } + public var Appearance_ShareThemeColor: String { return self._s[507]! } + public var Map_Locating: String { return self._s[508]! } public func VoiceOver_Chat_VideoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[507]!, self._r[507]!, [_0]) + return formatWithArgumentRanges(self._s[509]!, self._r[509]!, [_0]) } public func PUSH_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[508]!, self._r[508]!, [_1]) + return formatWithArgumentRanges(self._s[510]!, self._r[510]!, [_1]) } - public var AutoDownloadSettings_GroupChats: String { return self._s[510]! } - public var CheckoutInfo_SaveInfo: String { return self._s[511]! } - public var SharedMedia_EmptyLinksText: String { return self._s[513]! } - public var Passport_Address_CityPlaceholder: String { return self._s[514]! } - public var CheckoutInfo_ErrorStateInvalid: String { return self._s[515]! } - public var Privacy_ProfilePhoto_CustomHelp: String { return self._s[516]! } - public var Wallet_Send_OwnAddressAlertTitle: String { return self._s[518]! } - public var Channel_AdminLog_CanAddAdmins: String { return self._s[519]! } + public var AutoDownloadSettings_GroupChats: String { return self._s[512]! } + public var CheckoutInfo_SaveInfo: String { return self._s[513]! } + public var SharedMedia_EmptyLinksText: String { return self._s[515]! } + public var Passport_Address_CityPlaceholder: String { return self._s[516]! } + public var CheckoutInfo_ErrorStateInvalid: String { return self._s[517]! } + public var Privacy_ProfilePhoto_CustomHelp: String { return self._s[518]! } + public var Wallet_Send_OwnAddressAlertTitle: String { return self._s[520]! } + public var Channel_AdminLog_CanAddAdmins: String { return self._s[521]! } public func PUSH_CHANNEL_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[520]!, self._r[520]!, [_1]) + return formatWithArgumentRanges(self._s[522]!, self._r[522]!, [_1]) } public func Time_MonthOfYear_m8(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[521]!, self._r[521]!, [_0]) + return formatWithArgumentRanges(self._s[523]!, self._r[523]!, [_0]) } - public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[522]! } - public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[523]! } - public var ChangePhoneNumberCode_Code: String { return self._s[524]! } - public var Appearance_CreateTheme: String { return self._s[525]! } + public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[524]! } + public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[525]! } + public var ChangePhoneNumberCode_Code: String { return self._s[526]! } + public var Appearance_CreateTheme: String { return self._s[527]! } public func UserInfo_NotificationsDefaultSound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[526]!, self._r[526]!, [_0]) + return formatWithArgumentRanges(self._s[528]!, self._r[528]!, [_0]) } - public var TwoStepAuth_SetupEmail: String { return self._s[527]! } - public var HashtagSearch_AllChats: String { return self._s[528]! } - public var MediaPlayer_UnknownTrack: String { return self._s[529]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[531]! } + public var TwoStepAuth_SetupEmail: String { return self._s[529]! } + public var HashtagSearch_AllChats: String { return self._s[530]! } + public var MediaPlayer_UnknownTrack: String { return self._s[531]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[533]! } public func ChatList_DeleteForEveryone(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[532]!, self._r[532]!, [_0]) + return formatWithArgumentRanges(self._s[534]!, self._r[534]!, [_0]) } - public var PhotoEditor_QualityHigh: String { return self._s[534]! } + public var PhotoEditor_QualityHigh: String { return self._s[536]! } public func Passport_Phone_UseTelegramNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[535]!, self._r[535]!, [_0]) + return formatWithArgumentRanges(self._s[537]!, self._r[537]!, [_0]) } - public var ApplyLanguage_ApplyLanguageAction: String { return self._s[536]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[537]! } - public var Message_LiveLocation: String { return self._s[538]! } - public var Cache_LowDiskSpaceText: String { return self._s[539]! } - public var Wallet_Receive_ShareAddress: String { return self._s[540]! } - public var EditTheme_ErrorLinkTaken: String { return self._s[541]! } - public var Conversation_SendMessage: String { return self._s[542]! } - public var AuthSessions_EmptyTitle: String { return self._s[543]! } - public var Privacy_PhoneNumber: String { return self._s[544]! } - public var PeopleNearby_CreateGroup: String { return self._s[545]! } - public var CallSettings_UseLessData: String { return self._s[546]! } - public var NetworkUsageSettings_MediaDocumentDataSection: String { return self._s[547]! } - public var Stickers_AddToFavorites: String { return self._s[548]! } - public var Wallet_WordImport_Title: String { return self._s[549]! } - public var PhotoEditor_QualityLow: String { return self._s[550]! } - public var Watch_UserInfo_Unblock: String { return self._s[551]! } - public var Settings_Logout: String { return self._s[552]! } + public var ApplyLanguage_ApplyLanguageAction: String { return self._s[538]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[539]! } + public var Message_LiveLocation: String { return self._s[540]! } + public var Cache_LowDiskSpaceText: String { return self._s[541]! } + public var Wallet_Receive_ShareAddress: String { return self._s[542]! } + public var EditTheme_ErrorLinkTaken: String { return self._s[543]! } + public var Conversation_SendMessage: String { return self._s[544]! } + public var AuthSessions_EmptyTitle: String { return self._s[545]! } + public var Privacy_PhoneNumber: String { return self._s[546]! } + public var PeopleNearby_CreateGroup: String { return self._s[547]! } + public var CallSettings_UseLessData: String { return self._s[549]! } + public var NetworkUsageSettings_MediaDocumentDataSection: String { return self._s[550]! } + public var Stickers_AddToFavorites: String { return self._s[551]! } + public var Wallet_WordImport_Title: String { return self._s[552]! } + public var PhotoEditor_QualityLow: String { return self._s[553]! } + public var Watch_UserInfo_Unblock: String { return self._s[554]! } + public var Settings_Logout: String { return self._s[555]! } public func PUSH_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[553]!, self._r[553]!, [_1]) + return formatWithArgumentRanges(self._s[556]!, self._r[556]!, [_1]) } - public var ContactInfo_PhoneLabelWork: String { return self._s[554]! } - public var ChannelInfo_Stats: String { return self._s[555]! } - public var TextFormat_Link: String { return self._s[556]! } + public var ContactInfo_PhoneLabelWork: String { return self._s[557]! } + public var ChannelInfo_Stats: String { return self._s[558]! } + public var TextFormat_Link: String { return self._s[559]! } public func Date_ChatDateHeader(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[557]!, self._r[557]!, [_1, _2]) + return formatWithArgumentRanges(self._s[560]!, self._r[560]!, [_1, _2]) } - public var Wallet_TransactionInfo_Title: String { return self._s[558]! } + public var Wallet_TransactionInfo_Title: String { return self._s[561]! } public func Message_ForwardedMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[559]!, self._r[559]!, [_0]) + return formatWithArgumentRanges(self._s[562]!, self._r[562]!, [_0]) } - public var Watch_Notification_Joined: String { return self._s[560]! } - public var Group_Setup_TypePublicHelp: String { return self._s[561]! } - public var Passport_Scans_UploadNew: String { return self._s[562]! } - public var Checkout_LiabilityAlertTitle: String { return self._s[563]! } - public var DialogList_Title: String { return self._s[566]! } - public var NotificationSettings_ContactJoined: String { return self._s[567]! } - public var GroupInfo_LabelAdmin: String { return self._s[568]! } - public var KeyCommand_ChatInfo: String { return self._s[569]! } - public var Conversation_EditingCaptionPanelTitle: String { return self._s[570]! } - public var Call_ReportIncludeLog: String { return self._s[571]! } + public var Watch_Notification_Joined: String { return self._s[563]! } + public var Group_Setup_TypePublicHelp: String { return self._s[564]! } + public var Passport_Scans_UploadNew: String { return self._s[565]! } + public var Checkout_LiabilityAlertTitle: String { return self._s[566]! } + public var DialogList_Title: String { return self._s[569]! } + public var NotificationSettings_ContactJoined: String { return self._s[570]! } + public var GroupInfo_LabelAdmin: String { return self._s[571]! } + public var KeyCommand_ChatInfo: String { return self._s[572]! } + public var Conversation_EditingCaptionPanelTitle: String { return self._s[573]! } + public var Call_ReportIncludeLog: String { return self._s[574]! } public func Notifications_ExceptionsChangeSound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[574]!, self._r[574]!, [_0]) + return formatWithArgumentRanges(self._s[577]!, self._r[577]!, [_0]) } - public var Channel_AdminLog_InfoPanelChannelAlertText: String { return self._s[575]! } - public var ChatAdmins_AllMembersAreAdmins: String { return self._s[576]! } - public var LocalGroup_IrrelevantWarning: String { return self._s[577]! } - public var Conversation_DefaultRestrictedInline: String { return self._s[578]! } - public var Message_Sticker: String { return self._s[579]! } - public var LastSeen_JustNow: String { return self._s[581]! } - public var Passport_Email_EmailPlaceholder: String { return self._s[583]! } - public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[584]! } - public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[585]! } - public var Channel_EditAdmin_PermissionsHeader: String { return self._s[586]! } - public var TwoStepAuth_Email: String { return self._s[587]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsSound: String { return self._s[588]! } - public var PhotoEditor_BlurToolOff: String { return self._s[589]! } - public var Message_PinnedStickerMessage: String { return self._s[590]! } - public var ContactInfo_PhoneLabelPager: String { return self._s[591]! } - public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[592]! } - public var Passport_DiscardMessageTitle: String { return self._s[593]! } - public var Privacy_PaymentsTitle: String { return self._s[594]! } - public var EditTheme_Edit_Preview_IncomingReplyName: String { return self._s[595]! } - public var ClearCache_StorageCache: String { return self._s[596]! } - public var Appearance_TextSizeSetting: String { return self._s[597]! } - public var Channel_DiscussionGroup_Header: String { return self._s[599]! } - public var VoiceOver_Chat_OptionSelected: String { return self._s[600]! } - public var Appearance_ColorTheme: String { return self._s[601]! } - public var UserInfo_ShareContact: String { return self._s[602]! } - public var Passport_Address_TypePassportRegistration: String { return self._s[603]! } - public var Common_More: String { return self._s[604]! } - public var Watch_Message_Call: String { return self._s[605]! } - public var Profile_EncryptionKey: String { return self._s[608]! } - public var Privacy_TopPeers: String { return self._s[609]! } - public var Conversation_StopPollConfirmation: String { return self._s[610]! } - public var Wallet_Words_NotDoneText: String { return self._s[612]! } - public var Privacy_TopPeersWarning: String { return self._s[614]! } - public var SettingsSearch_Synonyms_Data_DownloadInBackground: String { return self._s[615]! } - public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[616]! } - public var Wallet_RestoreFailed_EnterWords: String { return self._s[619]! } - public var DialogList_SearchSectionMessages: String { return self._s[620]! } - public var Notifications_ChannelNotifications: String { return self._s[621]! } - public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[622]! } - public var Passport_Language_sk: String { return self._s[623]! } - public var Notification_MessageLifetime1h: String { return self._s[624]! } - public var Wallpaper_ResetWallpapersInfo: String { return self._s[625]! } - public var Appearance_ThemePreview_Chat_5_Text: String { return self._s[626]! } - public var Call_ReportSkip: String { return self._s[628]! } - public var Cache_ServiceFiles: String { return self._s[629]! } - public var Group_ErrorAddTooMuchAdmins: String { return self._s[630]! } - public var VoiceOver_Chat_YourFile: String { return self._s[631]! } - public var Map_Hybrid: String { return self._s[632]! } - public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[634]! } - public var ChatSettings_AutoDownloadVideos: String { return self._s[636]! } - public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[637]! } - public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[638]! } - public var SocksProxySetup_ProxyTelegram: String { return self._s[641]! } + public var Channel_AdminLog_InfoPanelChannelAlertText: String { return self._s[578]! } + public var ChatAdmins_AllMembersAreAdmins: String { return self._s[579]! } + public var LocalGroup_IrrelevantWarning: String { return self._s[580]! } + public var Conversation_DefaultRestrictedInline: String { return self._s[581]! } + public var Message_Sticker: String { return self._s[582]! } + public var LastSeen_JustNow: String { return self._s[584]! } + public var Passport_Email_EmailPlaceholder: String { return self._s[586]! } + public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[587]! } + public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[588]! } + public var Channel_EditAdmin_PermissionsHeader: String { return self._s[589]! } + public var TwoStepAuth_Email: String { return self._s[590]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsSound: String { return self._s[591]! } + public var PhotoEditor_BlurToolOff: String { return self._s[592]! } + public var Message_PinnedStickerMessage: String { return self._s[593]! } + public var ContactInfo_PhoneLabelPager: String { return self._s[594]! } + public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[595]! } + public var Passport_DiscardMessageTitle: String { return self._s[596]! } + public var Privacy_PaymentsTitle: String { return self._s[597]! } + public var EditTheme_Edit_Preview_IncomingReplyName: String { return self._s[598]! } + public var ClearCache_StorageCache: String { return self._s[599]! } + public var Appearance_TextSizeSetting: String { return self._s[600]! } + public var Channel_DiscussionGroup_Header: String { return self._s[602]! } + public var VoiceOver_Chat_OptionSelected: String { return self._s[603]! } + public var Appearance_ColorTheme: String { return self._s[604]! } + public var UserInfo_ShareContact: String { return self._s[605]! } + public var Passport_Address_TypePassportRegistration: String { return self._s[606]! } + public var Common_More: String { return self._s[607]! } + public var Watch_Message_Call: String { return self._s[608]! } + public var Profile_EncryptionKey: String { return self._s[611]! } + public var Privacy_TopPeers: String { return self._s[612]! } + public var Conversation_StopPollConfirmation: String { return self._s[613]! } + public var Wallet_Words_NotDoneText: String { return self._s[615]! } + public var Privacy_TopPeersWarning: String { return self._s[617]! } + public var SettingsSearch_Synonyms_Data_DownloadInBackground: String { return self._s[618]! } + public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[619]! } + public var Wallet_RestoreFailed_EnterWords: String { return self._s[622]! } + public var DialogList_SearchSectionMessages: String { return self._s[623]! } + public var Notifications_ChannelNotifications: String { return self._s[624]! } + public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[625]! } + public var Passport_Language_sk: String { return self._s[626]! } + public var Notification_MessageLifetime1h: String { return self._s[627]! } + public var Wallpaper_ResetWallpapersInfo: String { return self._s[628]! } + public var Appearance_ThemePreview_Chat_5_Text: String { return self._s[629]! } + public var Call_ReportSkip: String { return self._s[631]! } + public var Cache_ServiceFiles: String { return self._s[632]! } + public var Group_ErrorAddTooMuchAdmins: String { return self._s[633]! } + public var VoiceOver_Chat_YourFile: String { return self._s[634]! } + public var Map_Hybrid: String { return self._s[635]! } + public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[637]! } + public var ChatSettings_AutoDownloadVideos: String { return self._s[639]! } + public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[640]! } + public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[641]! } + public var SocksProxySetup_ProxyTelegram: String { return self._s[644]! } public func PUSH_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[642]!, self._r[642]!, [_1]) + return formatWithArgumentRanges(self._s[645]!, self._r[645]!, [_1]) } - public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[644]! } - public var ScheduledMessages_ScheduledToday: String { return self._s[645]! } + public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[647]! } + public var ScheduledMessages_ScheduledToday: String { return self._s[648]! } public func PUSH_CHAT_TITLE_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[646]!, self._r[646]!, [_1, _2]) + return formatWithArgumentRanges(self._s[649]!, self._r[649]!, [_1, _2]) } - public var Conversation_LiveLocationYou: String { return self._s[647]! } - public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[648]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[649]! } - public var UserInfo_ShareBot: String { return self._s[652]! } + public var Conversation_LiveLocationYou: String { return self._s[650]! } + public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[651]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[652]! } + public var UserInfo_ShareBot: String { return self._s[655]! } public func PUSH_AUTH_REGION(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[653]!, self._r[653]!, [_1, _2]) + return formatWithArgumentRanges(self._s[656]!, self._r[656]!, [_1, _2]) } - public var Conversation_ClearCache: String { return self._s[654]! } - public var PhotoEditor_ShadowsTint: String { return self._s[655]! } - public var Message_Audio: String { return self._s[656]! } - public var Passport_Language_lt: String { return self._s[657]! } + public var Conversation_ClearCache: String { return self._s[657]! } + public var PhotoEditor_ShadowsTint: String { return self._s[658]! } + public var Message_Audio: String { return self._s[659]! } + public var Passport_Language_lt: String { return self._s[660]! } public func Message_PinnedTextMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[658]!, self._r[658]!, [_0]) + return formatWithArgumentRanges(self._s[661]!, self._r[661]!, [_0]) } - public var Permissions_SiriText_v0: String { return self._s[659]! } - public var Conversation_FileICloudDrive: String { return self._s[660]! } - public var ChatList_DeleteForEveryoneConfirmationTitle: String { return self._s[661]! } - public var Notifications_Badge_IncludeMutedChats: String { return self._s[662]! } + public var Permissions_SiriText_v0: String { return self._s[662]! } + public var Conversation_FileICloudDrive: String { return self._s[663]! } + public var ChatList_DeleteForEveryoneConfirmationTitle: String { return self._s[664]! } + public var Notifications_Badge_IncludeMutedChats: String { return self._s[665]! } public func Notification_NewAuthDetected(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[663]!, self._r[663]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[666]!, self._r[666]!, [_1, _2, _3, _4, _5, _6]) } - public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[664]! } + public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[667]! } public func Time_MonthOfYear_m5(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[665]!, self._r[665]!, [_0]) + return formatWithArgumentRanges(self._s[668]!, self._r[668]!, [_0]) } - public var Channel_SignMessages: String { return self._s[666]! } + public var Channel_SignMessages: String { return self._s[669]! } public func PUSH_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[667]!, self._r[667]!, [_1]) + return formatWithArgumentRanges(self._s[670]!, self._r[670]!, [_1]) } - public var Compose_ChannelTokenListPlaceholder: String { return self._s[668]! } - public var Passport_ScanPassport: String { return self._s[669]! } - public var Watch_Suggestion_Thanks: String { return self._s[670]! } - public var BlockedUsers_AddNew: String { return self._s[671]! } + public var Compose_ChannelTokenListPlaceholder: String { return self._s[671]! } + public var Passport_ScanPassport: String { return self._s[672]! } + public var Watch_Suggestion_Thanks: String { return self._s[673]! } + public var BlockedUsers_AddNew: String { return self._s[674]! } public func PUSH_CHAT_MESSAGE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[672]!, self._r[672]!, [_1, _2]) + return formatWithArgumentRanges(self._s[675]!, self._r[675]!, [_1, _2]) } - public var Watch_Message_Invoice: String { return self._s[673]! } - public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[674]! } - public var Month_GenJuly: String { return self._s[675]! } - public var CreatePoll_QuizInfo: String { return self._s[676]! } - public var UserInfo_StartSecretChatStart: String { return self._s[677]! } - public var SocksProxySetup_ProxySocks5: String { return self._s[678]! } - public var IntentsSettings_SuggestByShare: String { return self._s[680]! } - public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[681]! } - public var Notification_ChannelInviterSelf: String { return self._s[682]! } - public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[683]! } + public var Watch_Message_Invoice: String { return self._s[676]! } + public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[677]! } + public var Month_GenJuly: String { return self._s[678]! } + public var CreatePoll_QuizInfo: String { return self._s[679]! } + public var UserInfo_StartSecretChatStart: String { return self._s[680]! } + public var SocksProxySetup_ProxySocks5: String { return self._s[681]! } + public var IntentsSettings_SuggestByShare: String { return self._s[683]! } + public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[684]! } + public var Notification_ChannelInviterSelf: String { return self._s[685]! } + public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[686]! } public func ApplyLanguage_ChangeLanguageUnofficialText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[684]!, self._r[684]!, [_1, _2]) + return formatWithArgumentRanges(self._s[687]!, self._r[687]!, [_1, _2]) } - public var CheckoutInfo_Title: String { return self._s[685]! } - public var Watch_Stickers_RecentPlaceholder: String { return self._s[686]! } + public var CheckoutInfo_Title: String { return self._s[688]! } + public var Watch_Stickers_RecentPlaceholder: String { return self._s[689]! } public func Map_DistanceAway(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[687]!, self._r[687]!, [_0]) + return formatWithArgumentRanges(self._s[690]!, self._r[690]!, [_0]) } - public var Passport_Identity_MainPage: String { return self._s[688]! } - public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[689]! } - public var Passport_Language_de: String { return self._s[690]! } - public var Update_Title: String { return self._s[691]! } - public var ContactInfo_PhoneLabelWorkFax: String { return self._s[692]! } - public var Channel_AdminLog_BanEmbedLinks: String { return self._s[693]! } - public var Passport_Email_UseTelegramEmailHelp: String { return self._s[694]! } - public var Notifications_ChannelNotificationsPreview: String { return self._s[695]! } - public var NotificationsSound_Telegraph: String { return self._s[696]! } - public var Watch_LastSeen_ALongTimeAgo: String { return self._s[697]! } - public var ChannelMembers_WhoCanAddMembers: String { return self._s[698]! } + public var Passport_Identity_MainPage: String { return self._s[691]! } + public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[692]! } + public var Passport_Language_de: String { return self._s[693]! } + public var Update_Title: String { return self._s[694]! } + public var ContactInfo_PhoneLabelWorkFax: String { return self._s[695]! } + public var Channel_AdminLog_BanEmbedLinks: String { return self._s[696]! } + public var Passport_Email_UseTelegramEmailHelp: String { return self._s[697]! } + public var Notifications_ChannelNotificationsPreview: String { return self._s[698]! } + public var NotificationsSound_Telegraph: String { return self._s[699]! } + public var Watch_LastSeen_ALongTimeAgo: String { return self._s[700]! } + public var ChannelMembers_WhoCanAddMembers: String { return self._s[701]! } public func AutoDownloadSettings_UpTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[699]!, self._r[699]!, [_0]) + return formatWithArgumentRanges(self._s[702]!, self._r[702]!, [_0]) } - public var ClearCache_Description: String { return self._s[700]! } - public var Stickers_SuggestAll: String { return self._s[701]! } - public var Conversation_ForwardTitle: String { return self._s[702]! } - public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[703]! } + public var ClearCache_Description: String { return self._s[703]! } + public var Stickers_SuggestAll: String { return self._s[704]! } + public var Conversation_ForwardTitle: String { return self._s[705]! } + public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[706]! } public func Notification_JoinedChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[704]!, self._r[704]!, [_0]) + return formatWithArgumentRanges(self._s[707]!, self._r[707]!, [_0]) } - public var Calls_NewCall: String { return self._s[705]! } - public var Call_StatusEnded: String { return self._s[706]! } - public var AutoDownloadSettings_DataUsageLow: String { return self._s[707]! } - public var Settings_ProxyConnected: String { return self._s[708]! } - public var Channel_AdminLogFilter_EventsPinned: String { return self._s[709]! } - public var PhotoEditor_QualityVeryLow: String { return self._s[710]! } - public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[711]! } - public var Passport_PasswordPlaceholder: String { return self._s[712]! } - public var Message_PinnedInvoice: String { return self._s[713]! } - public var Passport_Identity_IssueDate: String { return self._s[714]! } - public var Passport_Language_pl: String { return self._s[715]! } + public var Calls_NewCall: String { return self._s[708]! } + public var Call_StatusEnded: String { return self._s[709]! } + public var AutoDownloadSettings_DataUsageLow: String { return self._s[710]! } + public var Settings_ProxyConnected: String { return self._s[711]! } + public var Channel_AdminLogFilter_EventsPinned: String { return self._s[712]! } + public var PhotoEditor_QualityVeryLow: String { return self._s[713]! } + public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[714]! } + public var Passport_PasswordPlaceholder: String { return self._s[715]! } + public var Message_PinnedInvoice: String { return self._s[716]! } + public var Passport_Identity_IssueDate: String { return self._s[717]! } + public var Passport_Language_pl: String { return self._s[718]! } public func ChannelInfo_ChannelForbidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[716]!, self._r[716]!, [_0]) - } - public var SocksProxySetup_PasteFromClipboard: String { return self._s[717]! } - public var Call_StatusConnecting: String { return self._s[718]! } - public func Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[719]!, self._r[719]!, [_0]) } - public var ChatSettings_ConnectionType_UseProxy: String { return self._s[721]! } - public var Common_Edit: String { return self._s[722]! } - public var PrivacySettings_LastSeenNobody: String { return self._s[723]! } + public var SocksProxySetup_PasteFromClipboard: String { return self._s[720]! } + public var Call_StatusConnecting: String { return self._s[721]! } + public func Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[722]!, self._r[722]!, [_0]) + } + public var ChatSettings_ConnectionType_UseProxy: String { return self._s[724]! } + public var Common_Edit: String { return self._s[725]! } + public var PrivacySettings_LastSeenNobody: String { return self._s[726]! } public func Notification_LeftChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[724]!, self._r[724]!, [_0]) + return formatWithArgumentRanges(self._s[727]!, self._r[727]!, [_0]) } - public var GroupInfo_ChatAdmins: String { return self._s[725]! } - public var PrivateDataSettings_Title: String { return self._s[726]! } - public var Login_CancelPhoneVerificationStop: String { return self._s[727]! } - public var ChatList_Read: String { return self._s[728]! } - public var Wallet_WordImport_Text: String { return self._s[729]! } - public var Undo_ChatClearedForBothSides: String { return self._s[730]! } - public var GroupPermission_SectionTitle: String { return self._s[731]! } - public var TwoFactorSetup_Intro_Title: String { return self._s[733]! } + public var GroupInfo_ChatAdmins: String { return self._s[728]! } + public var PrivateDataSettings_Title: String { return self._s[729]! } + public var Login_CancelPhoneVerificationStop: String { return self._s[730]! } + public var ChatList_Read: String { return self._s[731]! } + public var Wallet_WordImport_Text: String { return self._s[732]! } + public var Undo_ChatClearedForBothSides: String { return self._s[733]! } + public var GroupPermission_SectionTitle: String { return self._s[734]! } + public var TwoFactorSetup_Intro_Title: String { return self._s[736]! } public func PUSH_CHAT_LEFT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[734]!, self._r[734]!, [_1, _2]) + return formatWithArgumentRanges(self._s[737]!, self._r[737]!, [_1, _2]) } - public var Checkout_ErrorPaymentFailed: String { return self._s[735]! } - public var Update_UpdateApp: String { return self._s[736]! } - public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[737]! } - public var Settings_Appearance: String { return self._s[738]! } - public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[742]! } - public var Watch_Location_Access: String { return self._s[743]! } - public var ShareMenu_CopyShareLink: String { return self._s[745]! } - public var TwoStepAuth_SetupHintTitle: String { return self._s[746]! } - public var Conversation_Theme: String { return self._s[748]! } + public var Checkout_ErrorPaymentFailed: String { return self._s[738]! } + public var Update_UpdateApp: String { return self._s[739]! } + public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[740]! } + public var Settings_Appearance: String { return self._s[741]! } + public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[745]! } + public var Watch_Location_Access: String { return self._s[746]! } + public var ShareMenu_CopyShareLink: String { return self._s[748]! } + public var TwoStepAuth_SetupHintTitle: String { return self._s[749]! } + public var Conversation_Theme: String { return self._s[751]! } public func DialogList_SingleRecordingVideoMessageSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[749]!, self._r[749]!, [_0]) + return formatWithArgumentRanges(self._s[752]!, self._r[752]!, [_0]) } - public var Notifications_ClassicTones: String { return self._s[750]! } - public var Weekday_ShortWednesday: String { return self._s[751]! } - public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[752]! } - public var Undo_LeftGroup: String { return self._s[755]! } - public var Wallet_RestoreFailed_Text: String { return self._s[756]! } - public var Conversation_LinkDialogCopy: String { return self._s[757]! } - public var Wallet_TransactionInfo_NoAddress: String { return self._s[759]! } - public var Wallet_Navigation_Back: String { return self._s[760]! } - public var KeyCommand_FocusOnInputField: String { return self._s[761]! } - public var Contacts_SelectAll: String { return self._s[762]! } - public var Preview_SaveToCameraRoll: String { return self._s[763]! } - public var PrivacySettings_PasscodeOff: String { return self._s[764]! } - public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[765]! } - public var Wallpaper_Title: String { return self._s[766]! } - public var Conversation_FilePhotoOrVideo: String { return self._s[767]! } - public var AccessDenied_Camera: String { return self._s[768]! } - public var Watch_Compose_CurrentLocation: String { return self._s[769]! } - public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[771]! } + public var Notifications_ClassicTones: String { return self._s[753]! } + public var Weekday_ShortWednesday: String { return self._s[754]! } + public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[755]! } + public var Undo_LeftGroup: String { return self._s[758]! } + public var Wallet_RestoreFailed_Text: String { return self._s[759]! } + public var Conversation_LinkDialogCopy: String { return self._s[760]! } + public var Wallet_TransactionInfo_NoAddress: String { return self._s[762]! } + public var Wallet_Navigation_Back: String { return self._s[763]! } + public var KeyCommand_FocusOnInputField: String { return self._s[764]! } + public var Contacts_SelectAll: String { return self._s[765]! } + public var Preview_SaveToCameraRoll: String { return self._s[766]! } + public var PrivacySettings_PasscodeOff: String { return self._s[767]! } + public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[768]! } + public var Wallpaper_Title: String { return self._s[769]! } + public var Conversation_FilePhotoOrVideo: String { return self._s[770]! } + public var AccessDenied_Camera: String { return self._s[771]! } + public var Watch_Compose_CurrentLocation: String { return self._s[772]! } + public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[774]! } public func SecretImage_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[772]!, self._r[772]!, [_0]) + return formatWithArgumentRanges(self._s[775]!, self._r[775]!, [_0]) } - public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[773]! } - public var Passport_Language_ro: String { return self._s[774]! } - public var EditTheme_UploadNewTheme: String { return self._s[775]! } - public var CheckoutInfo_SaveInfoHelp: String { return self._s[776]! } - public var Wallet_Intro_Terms: String { return self._s[777]! } + public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[776]! } + public var Passport_Language_ro: String { return self._s[777]! } + public var EditTheme_UploadNewTheme: String { return self._s[778]! } + public var CheckoutInfo_SaveInfoHelp: String { return self._s[779]! } + public var Wallet_Intro_Terms: String { return self._s[780]! } public func Notification_SecretChatMessageScreenshot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[778]!, self._r[778]!, [_0]) + return formatWithArgumentRanges(self._s[781]!, self._r[781]!, [_0]) } - public var Login_CancelPhoneVerification: String { return self._s[779]! } - public var State_ConnectingToProxy: String { return self._s[780]! } - public var Calls_RatingTitle: String { return self._s[781]! } - public var Generic_ErrorMoreInfo: String { return self._s[782]! } - public var ChatList_Search_ShowMore: String { return self._s[783]! } - public var Appearance_PreviewReplyText: String { return self._s[784]! } - public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[785]! } + public var Login_CancelPhoneVerification: String { return self._s[782]! } + public var State_ConnectingToProxy: String { return self._s[783]! } + public var Calls_RatingTitle: String { return self._s[784]! } + public var Generic_ErrorMoreInfo: String { return self._s[785]! } + public var ChatList_Search_ShowMore: String { return self._s[786]! } + public var Appearance_PreviewReplyText: String { return self._s[787]! } + public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[788]! } public func Wallet_Send_Balance(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[786]!, self._r[786]!, [_0]) + return formatWithArgumentRanges(self._s[789]!, self._r[789]!, [_0]) } - public var IntentsSettings_SuggestedChatsContacts: String { return self._s[787]! } - public var SharedMedia_CategoryLinks: String { return self._s[788]! } - public var Calls_Missed: String { return self._s[789]! } - public var Cache_Photos: String { return self._s[793]! } - public var GroupPermission_NoAddMembers: String { return self._s[794]! } - public var ScheduledMessages_Title: String { return self._s[795]! } + public var IntentsSettings_SuggestedChatsContacts: String { return self._s[790]! } + public var SharedMedia_CategoryLinks: String { return self._s[791]! } + public var Calls_Missed: String { return self._s[792]! } + public var Cache_Photos: String { return self._s[796]! } + public var GroupPermission_NoAddMembers: String { return self._s[797]! } + public var ScheduledMessages_Title: String { return self._s[798]! } public func Channel_AdminLog_MessageUnpinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[796]!, self._r[796]!, [_0]) + return formatWithArgumentRanges(self._s[799]!, self._r[799]!, [_0]) } - public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[797]! } - public var Settings_ProxyDisabled: String { return self._s[798]! } + public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[800]! } + public var Settings_ProxyDisabled: String { return self._s[801]! } public func Settings_ApplyProxyAlertCredentials(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[799]!, self._r[799]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[802]!, self._r[802]!, [_1, _2, _3, _4]) } public func Conversation_RestrictedMediaTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[800]!, self._r[800]!, [_0]) + return formatWithArgumentRanges(self._s[803]!, self._r[803]!, [_0]) } - public var ChatList_Context_RemoveFromRecents: String { return self._s[802]! } - public var Appearance_Title: String { return self._s[803]! } + public var ChatList_Context_RemoveFromRecents: String { return self._s[805]! } + public var Appearance_Title: String { return self._s[806]! } public func Time_MonthOfYear_m2(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[805]!, self._r[805]!, [_0]) + return formatWithArgumentRanges(self._s[808]!, self._r[808]!, [_0]) } - public var Conversation_WalletRequiredText: String { return self._s[806]! } - public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[807]! } - public var OldChannels_NoticeCreateText: String { return self._s[808]! } - public var Channel_EditMessageErrorGeneric: String { return self._s[809]! } - public var Privacy_Calls_IntegrationHelp: String { return self._s[810]! } - public var Preview_DeletePhoto: String { return self._s[811]! } - public var Appearance_AppIconFilledX: String { return self._s[812]! } - public var PrivacySettings_PrivacyTitle: String { return self._s[813]! } + public var Conversation_WalletRequiredText: String { return self._s[809]! } + public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[810]! } + public var OldChannels_NoticeCreateText: String { return self._s[811]! } + public var Channel_EditMessageErrorGeneric: String { return self._s[812]! } + public var Privacy_Calls_IntegrationHelp: String { return self._s[813]! } + public var Preview_DeletePhoto: String { return self._s[814]! } + public var Appearance_AppIconFilledX: String { return self._s[815]! } + public var PrivacySettings_PrivacyTitle: String { return self._s[816]! } public func Conversation_BotInteractiveUrlAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[814]!, self._r[814]!, [_0]) + return formatWithArgumentRanges(self._s[817]!, self._r[817]!, [_0]) } - public var Coub_TapForSound: String { return self._s[817]! } - public var Map_LocatingError: String { return self._s[818]! } - public var TwoStepAuth_EmailChangeSuccess: String { return self._s[820]! } - public var Conversation_SendMessage_SendSilently: String { return self._s[821]! } - public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[822]! } + public var Coub_TapForSound: String { return self._s[820]! } + public var Map_LocatingError: String { return self._s[821]! } + public var TwoStepAuth_EmailChangeSuccess: String { return self._s[823]! } + public var Conversation_SendMessage_SendSilently: String { return self._s[824]! } + public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[825]! } public func Wallet_Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[823]!, self._r[823]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[826]!, self._r[826]!, [_1, _2, _3]) } - public var Passport_ForgottenPassword: String { return self._s[824]! } - public var GroupInfo_InviteLink_RevokeLink: String { return self._s[825]! } - public var StickerPacksSettings_ArchivedPacks: String { return self._s[826]! } - public var Login_TermsOfServiceSignupDecline: String { return self._s[828]! } - public var Channel_Moderator_AccessLevelRevoke: String { return self._s[829]! } - public var Message_Location: String { return self._s[830]! } - public var Passport_Identity_NamePlaceholder: String { return self._s[831]! } - public var Channel_Management_Title: String { return self._s[832]! } - public var DialogList_SearchSectionDialogs: String { return self._s[834]! } - public var Compose_NewChannel_Members: String { return self._s[835]! } + public var Passport_ForgottenPassword: String { return self._s[827]! } + public var GroupInfo_InviteLink_RevokeLink: String { return self._s[828]! } + public var StickerPacksSettings_ArchivedPacks: String { return self._s[829]! } + public var Login_TermsOfServiceSignupDecline: String { return self._s[831]! } + public var Channel_Moderator_AccessLevelRevoke: String { return self._s[832]! } + public var Message_Location: String { return self._s[833]! } + public var Passport_Identity_NamePlaceholder: String { return self._s[834]! } + public var Channel_Management_Title: String { return self._s[835]! } + public var DialogList_SearchSectionDialogs: String { return self._s[837]! } + public var Compose_NewChannel_Members: String { return self._s[838]! } public func DialogList_SingleUploadingFileSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[836]!, self._r[836]!, [_0]) + return formatWithArgumentRanges(self._s[839]!, self._r[839]!, [_0]) } - public var GroupInfo_Location: String { return self._s[837]! } - public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[838]! } - public var ClearCache_Clear: String { return self._s[839]! } - public var AutoNightTheme_ScheduledFrom: String { return self._s[840]! } - public var PhotoEditor_WarmthTool: String { return self._s[841]! } - public var Passport_Language_tr: String { return self._s[842]! } + public var GroupInfo_Location: String { return self._s[840]! } + public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[841]! } + public var ClearCache_Clear: String { return self._s[842]! } + public var AutoNightTheme_ScheduledFrom: String { return self._s[843]! } + public var PhotoEditor_WarmthTool: String { return self._s[844]! } + public var Passport_Language_tr: String { return self._s[845]! } public func PUSH_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[843]!, self._r[843]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[846]!, self._r[846]!, [_1, _2, _3]) } - public var OldChannels_NoticeUpgradeText: String { return self._s[844]! } - public var Login_ResetAccountProtected_Reset: String { return self._s[846]! } - public var Watch_PhotoView_Title: String { return self._s[847]! } - public var Passport_Phone_Delete: String { return self._s[848]! } - public var Undo_ChatDeletedForBothSides: String { return self._s[849]! } - public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[850]! } - public var GroupInfo_Permissions: String { return self._s[851]! } - public var PasscodeSettings_TurnPasscodeOff: String { return self._s[852]! } - public var Profile_ShareContactButton: String { return self._s[853]! } - public var ChatSettings_Other: String { return self._s[854]! } - public var UserInfo_NotificationsDisabled: String { return self._s[855]! } - public var CheckoutInfo_ShippingInfoCity: String { return self._s[856]! } - public var LastSeen_WithinAMonth: String { return self._s[857]! } - public var VoiceOver_Chat_PlayHint: String { return self._s[858]! } - public var Conversation_ReportGroupLocation: String { return self._s[859]! } - public var Conversation_EncryptionCanceled: String { return self._s[860]! } - public var MediaPicker_GroupDescription: String { return self._s[861]! } - public var WebSearch_Images: String { return self._s[862]! } + public var OldChannels_NoticeUpgradeText: String { return self._s[847]! } + public var Login_ResetAccountProtected_Reset: String { return self._s[849]! } + public var Watch_PhotoView_Title: String { return self._s[850]! } + public var Passport_Phone_Delete: String { return self._s[851]! } + public var Undo_ChatDeletedForBothSides: String { return self._s[852]! } + public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[853]! } + public var GroupInfo_Permissions: String { return self._s[854]! } + public var PasscodeSettings_TurnPasscodeOff: String { return self._s[855]! } + public var Profile_ShareContactButton: String { return self._s[856]! } + public var ChatSettings_Other: String { return self._s[857]! } + public var UserInfo_NotificationsDisabled: String { return self._s[858]! } + public var CheckoutInfo_ShippingInfoCity: String { return self._s[859]! } + public var LastSeen_WithinAMonth: String { return self._s[860]! } + public var VoiceOver_Chat_PlayHint: String { return self._s[861]! } + public var Conversation_ReportGroupLocation: String { return self._s[862]! } + public var Conversation_EncryptionCanceled: String { return self._s[863]! } + public var MediaPicker_GroupDescription: String { return self._s[864]! } + public var WebSearch_Images: String { return self._s[865]! } public func Channel_Management_PromotedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[863]!, self._r[863]!, [_0]) + return formatWithArgumentRanges(self._s[866]!, self._r[866]!, [_0]) } - public var Message_Photo: String { return self._s[864]! } - public var PasscodeSettings_HelpBottom: String { return self._s[865]! } - public var AutoDownloadSettings_VideosTitle: String { return self._s[866]! } - public var VoiceOver_Media_PlaybackRateChange: String { return self._s[867]! } - public var Passport_Identity_AddDriversLicense: String { return self._s[868]! } - public var TwoStepAuth_EnterPasswordPassword: String { return self._s[869]! } - public var NotificationsSound_Calypso: String { return self._s[870]! } - public var Map_Map: String { return self._s[871]! } + public var Message_Photo: String { return self._s[867]! } + public var PasscodeSettings_HelpBottom: String { return self._s[868]! } + public var AutoDownloadSettings_VideosTitle: String { return self._s[869]! } + public var VoiceOver_Media_PlaybackRateChange: String { return self._s[870]! } + public var Passport_Identity_AddDriversLicense: String { return self._s[871]! } + public var TwoStepAuth_EnterPasswordPassword: String { return self._s[872]! } + public var NotificationsSound_Calypso: String { return self._s[873]! } + public var Map_Map: String { return self._s[874]! } public func Conversation_LiveLocationYouAndOther(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[872]!, self._r[872]!, [_0]) + return formatWithArgumentRanges(self._s[875]!, self._r[875]!, [_0]) } - public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[874]! } - public var ChatSettings_TextSizeUnits: String { return self._s[875]! } + public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[877]! } + public var ChatSettings_TextSizeUnits: String { return self._s[878]! } public func VoiceOver_Chat_FileFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[876]!, self._r[876]!, [_0]) + return formatWithArgumentRanges(self._s[879]!, self._r[879]!, [_0]) } - public var Common_of: String { return self._s[877]! } - public var Conversation_ForwardContacts: String { return self._s[880]! } - public var IntentsSettings_SuggestByAll: String { return self._s[882]! } + public var Common_of: String { return self._s[880]! } + public var Conversation_ForwardContacts: String { return self._s[883]! } + public var IntentsSettings_SuggestByAll: String { return self._s[885]! } public func Call_AnsweringWithAccount(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[883]!, self._r[883]!, [_0]) + return formatWithArgumentRanges(self._s[886]!, self._r[886]!, [_0]) } - public var Passport_Language_hy: String { return self._s[884]! } - public var Notifications_MessageNotificationsHelp: String { return self._s[885]! } - public var AutoDownloadSettings_Reset: String { return self._s[886]! } - public var Wallet_TransactionInfo_AddressCopied: String { return self._s[887]! } - public var Paint_ClearConfirm: String { return self._s[888]! } - public var Camera_VideoMode: String { return self._s[889]! } + public var Passport_Language_hy: String { return self._s[887]! } + public var Notifications_MessageNotificationsHelp: String { return self._s[888]! } + public var AutoDownloadSettings_Reset: String { return self._s[889]! } + public var Wallet_TransactionInfo_AddressCopied: String { return self._s[890]! } + public var Paint_ClearConfirm: String { return self._s[891]! } + public var Camera_VideoMode: String { return self._s[892]! } public func Conversation_RestrictedStickersTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[890]!, self._r[890]!, [_0]) + return formatWithArgumentRanges(self._s[893]!, self._r[893]!, [_0]) } - public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[891]! } - public var Conversation_ViewBackground: String { return self._s[892]! } + public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[894]! } + public var Conversation_ViewBackground: String { return self._s[895]! } public func Wallet_Info_TransactionDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[893]!, self._r[893]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[896]!, self._r[896]!, [_1, _2, _3]) } - public var Passport_Language_el: String { return self._s[894]! } - public var PhotoEditor_Original: String { return self._s[895]! } - public var Settings_FAQ_Button: String { return self._s[897]! } - public var Channel_Setup_PublicNoLink: String { return self._s[899]! } - public var Conversation_UnsupportedMedia: String { return self._s[900]! } - public var Conversation_SlideToCancel: String { return self._s[901]! } - public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[902]! } - public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[903]! } - public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[904]! } - public var Conversation_ReportSpamChannelConfirmation: String { return self._s[905]! } - public var AutoNightTheme_NotAvailable: String { return self._s[906]! } - public var Conversation_Owner: String { return self._s[907]! } - public var Common_Create: String { return self._s[908]! } - public var Settings_ApplyProxyAlertEnable: String { return self._s[909]! } - public var ContactList_Context_Call: String { return self._s[910]! } - public var Localization_ChooseLanguage: String { return self._s[912]! } - public var ChatList_Context_AddToContacts: String { return self._s[914]! } - public var OldChannels_NoticeTitle: String { return self._s[915]! } - public var Settings_Proxy: String { return self._s[917]! } - public var Privacy_TopPeersHelp: String { return self._s[918]! } - public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[919]! } - public var Chat_UnsendMyMessages: String { return self._s[920]! } + public var Passport_Language_el: String { return self._s[897]! } + public var PhotoEditor_Original: String { return self._s[898]! } + public var Settings_FAQ_Button: String { return self._s[900]! } + public var Channel_Setup_PublicNoLink: String { return self._s[902]! } + public var Conversation_UnsupportedMedia: String { return self._s[903]! } + public var Conversation_SlideToCancel: String { return self._s[904]! } + public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[905]! } + public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[906]! } + public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[907]! } + public var Conversation_ReportSpamChannelConfirmation: String { return self._s[908]! } + public var AutoNightTheme_NotAvailable: String { return self._s[909]! } + public var Conversation_Owner: String { return self._s[910]! } + public var Common_Create: String { return self._s[911]! } + public var Settings_ApplyProxyAlertEnable: String { return self._s[912]! } + public var ContactList_Context_Call: String { return self._s[913]! } + public var Localization_ChooseLanguage: String { return self._s[915]! } + public var ChatList_Context_AddToContacts: String { return self._s[917]! } + public var OldChannels_NoticeTitle: String { return self._s[918]! } + public var Settings_Proxy: String { return self._s[920]! } + public var Privacy_TopPeersHelp: String { return self._s[921]! } + public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[922]! } + public var Chat_UnsendMyMessages: String { return self._s[923]! } public func VoiceOver_Chat_Duration(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[921]!, self._r[921]!, [_0]) - } - public var TwoStepAuth_ConfirmationAbort: String { return self._s[922]! } - public func Contacts_AccessDeniedHelpPortrait(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[924]!, self._r[924]!, [_0]) } - public var Contacts_SortedByPresence: String { return self._s[925]! } - public var Passport_Identity_SurnamePlaceholder: String { return self._s[926]! } - public var Cache_Title: String { return self._s[927]! } + public var TwoStepAuth_ConfirmationAbort: String { return self._s[925]! } + public func Contacts_AccessDeniedHelpPortrait(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[927]!, self._r[927]!, [_0]) + } + public var Contacts_SortedByPresence: String { return self._s[928]! } + public var Passport_Identity_SurnamePlaceholder: String { return self._s[929]! } + public var Cache_Title: String { return self._s[930]! } public func Login_PhoneBannedEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[928]!, self._r[928]!, [_0]) + return formatWithArgumentRanges(self._s[931]!, self._r[931]!, [_0]) } - public var TwoStepAuth_EmailCodeExpired: String { return self._s[929]! } - public var Channel_Moderator_Title: String { return self._s[930]! } - public var InstantPage_AutoNightTheme: String { return self._s[932]! } + public var TwoStepAuth_EmailCodeExpired: String { return self._s[932]! } + public var Channel_Moderator_Title: String { return self._s[933]! } + public var InstantPage_AutoNightTheme: String { return self._s[935]! } public func PUSH_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[935]!, self._r[935]!, [_1]) + return formatWithArgumentRanges(self._s[938]!, self._r[938]!, [_1]) } - public var Passport_Scans_Upload: String { return self._s[936]! } - public var Undo_Undo: String { return self._s[938]! } - public var Contacts_AccessDeniedHelpON: String { return self._s[939]! } - public var TwoStepAuth_RemovePassword: String { return self._s[940]! } - public var Common_Delete: String { return self._s[941]! } - public var Contacts_AddPeopleNearby: String { return self._s[943]! } - public var Conversation_ContextMenuDelete: String { return self._s[944]! } - public var SocksProxySetup_Credentials: String { return self._s[945]! } - public var Appearance_EditTheme: String { return self._s[947]! } - public var ClearCache_StorageOtherApps: String { return self._s[948]! } - public var PasscodeSettings_AutoLock_Disabled: String { return self._s[949]! } - public var Wallet_Send_NetworkErrorText: String { return self._s[950]! } - public var AuthSessions_DevicesTitle: String { return self._s[952]! } - public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[954]! } - public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[955]! } - public var Passport_Language_id: String { return self._s[957]! } - public var WallpaperSearch_ColorTeal: String { return self._s[958]! } - public var ChannelIntro_Title: String { return self._s[959]! } + public var Passport_Scans_Upload: String { return self._s[939]! } + public var Undo_Undo: String { return self._s[941]! } + public var Contacts_AccessDeniedHelpON: String { return self._s[942]! } + public var TwoStepAuth_RemovePassword: String { return self._s[943]! } + public var Common_Delete: String { return self._s[944]! } + public var Contacts_AddPeopleNearby: String { return self._s[946]! } + public var Conversation_ContextMenuDelete: String { return self._s[947]! } + public var SocksProxySetup_Credentials: String { return self._s[948]! } + public var Appearance_EditTheme: String { return self._s[950]! } + public var ClearCache_StorageOtherApps: String { return self._s[951]! } + public var PasscodeSettings_AutoLock_Disabled: String { return self._s[952]! } + public var Wallet_Send_NetworkErrorText: String { return self._s[953]! } + public var AuthSessions_DevicesTitle: String { return self._s[955]! } + public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[957]! } + public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[958]! } + public var Passport_Language_id: String { return self._s[960]! } + public var WallpaperSearch_ColorTeal: String { return self._s[961]! } + public var ChannelIntro_Title: String { return self._s[962]! } public func Channel_AdminLog_MessageToggleSignaturesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[960]!, self._r[960]!, [_0]) + return formatWithArgumentRanges(self._s[963]!, self._r[963]!, [_0]) } - public var VoiceOver_Chat_OpenLinkHint: String { return self._s[962]! } - public var VoiceOver_Chat_Reply: String { return self._s[963]! } - public var ScheduledMessages_BotActionUnavailable: String { return self._s[964]! } - public var Channel_Info_Description: String { return self._s[965]! } - public var Stickers_FavoriteStickers: String { return self._s[966]! } - public var Channel_BanUser_PermissionAddMembers: String { return self._s[967]! } - public var Notifications_DisplayNamesOnLockScreen: String { return self._s[968]! } - public var ChatSearch_ResultsTooltip: String { return self._s[969]! } - public var Wallet_VoiceOver_Editing_ClearText: String { return self._s[970]! } - public var Calls_NoMissedCallsPlacehoder: String { return self._s[971]! } - public var Group_PublicLink_Placeholder: String { return self._s[972]! } - public var Notifications_ExceptionsDefaultSound: String { return self._s[973]! } + public var VoiceOver_Chat_OpenLinkHint: String { return self._s[965]! } + public var VoiceOver_Chat_Reply: String { return self._s[966]! } + public var ScheduledMessages_BotActionUnavailable: String { return self._s[967]! } + public var Channel_Info_Description: String { return self._s[968]! } + public var Stickers_FavoriteStickers: String { return self._s[969]! } + public var Channel_BanUser_PermissionAddMembers: String { return self._s[970]! } + public var Notifications_DisplayNamesOnLockScreen: String { return self._s[971]! } + public var ChatSearch_ResultsTooltip: String { return self._s[972]! } + public var Wallet_VoiceOver_Editing_ClearText: String { return self._s[973]! } + public var Calls_NoMissedCallsPlacehoder: String { return self._s[974]! } + public var Group_PublicLink_Placeholder: String { return self._s[975]! } + public var Notifications_ExceptionsDefaultSound: String { return self._s[976]! } public func PUSH_CHANNEL_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[974]!, self._r[974]!, [_1]) + return formatWithArgumentRanges(self._s[977]!, self._r[977]!, [_1]) } - public var TextFormat_Underline: String { return self._s[975]! } + public var TextFormat_Underline: String { return self._s[978]! } public func DialogList_SearchSubtitleFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[977]!, self._r[977]!, [_1, _2]) - } - public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[978]!, self._r[978]!, [_0]) - } - public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[979]! } - public func Channel_OwnershipTransfer_TransferCompleted(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[980]!, self._r[980]!, [_1, _2]) } - public var Wallet_Intro_ImportExisting: String { return self._s[981]! } - public var GroupPermission_Delete: String { return self._s[982]! } - public var Passport_Language_uk: String { return self._s[983]! } - public var StickerPack_HideStickers: String { return self._s[985]! } - public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[986]! } + public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[981]!, self._r[981]!, [_0]) + } + public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[982]! } + public func Channel_OwnershipTransfer_TransferCompleted(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[983]!, self._r[983]!, [_1, _2]) + } + public var Wallet_Intro_ImportExisting: String { return self._s[984]! } + public var GroupPermission_Delete: String { return self._s[985]! } + public var Passport_Language_uk: String { return self._s[986]! } + public var StickerPack_HideStickers: String { return self._s[988]! } + public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[989]! } public func PUSH_CHAT_MESSAGE_PHOTO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[987]!, self._r[987]!, [_1, _2]) + return formatWithArgumentRanges(self._s[990]!, self._r[990]!, [_1, _2]) } - public var Activity_UploadingVideoMessage: String { return self._s[988]! } + public var Activity_UploadingVideoMessage: String { return self._s[991]! } public func GroupPermission_ApplyAlertText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[989]!, self._r[989]!, [_0]) + return formatWithArgumentRanges(self._s[992]!, self._r[992]!, [_0]) } - public var Channel_TitleInfo: String { return self._s[990]! } - public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[991]! } - public var Settings_CallSettings: String { return self._s[992]! } - public var Camera_SquareMode: String { return self._s[993]! } - public var Conversation_SendMessage_ScheduleMessage: String { return self._s[994]! } - public var GroupInfo_SharedMediaNone: String { return self._s[995]! } + public var Channel_TitleInfo: String { return self._s[993]! } + public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[994]! } + public var Settings_CallSettings: String { return self._s[995]! } + public var Camera_SquareMode: String { return self._s[996]! } + public var Conversation_SendMessage_ScheduleMessage: String { return self._s[997]! } + public var GroupInfo_SharedMediaNone: String { return self._s[998]! } public func PUSH_MESSAGE_VIDEO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[996]!, self._r[996]!, [_1]) + return formatWithArgumentRanges(self._s[999]!, self._r[999]!, [_1]) } - public var Bot_GenericBotStatus: String { return self._s[997]! } - public var Application_Update: String { return self._s[999]! } - public var Month_ShortJanuary: String { return self._s[1000]! } - public var Contacts_PermissionsKeepDisabled: String { return self._s[1001]! } - public var Channel_AdminLog_BanReadMessages: String { return self._s[1002]! } - public var Settings_AppLanguage_Unofficial: String { return self._s[1003]! } - public var Passport_Address_Street2Placeholder: String { return self._s[1004]! } + public var Bot_GenericBotStatus: String { return self._s[1000]! } + public var Application_Update: String { return self._s[1002]! } + public var Month_ShortJanuary: String { return self._s[1003]! } + public var Contacts_PermissionsKeepDisabled: String { return self._s[1004]! } + public var Channel_AdminLog_BanReadMessages: String { return self._s[1005]! } + public var Settings_AppLanguage_Unofficial: String { return self._s[1006]! } + public var Passport_Address_Street2Placeholder: String { return self._s[1007]! } public func Map_LiveLocationShortHour(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1005]!, self._r[1005]!, [_0]) - } - public var NetworkUsageSettings_Cellular: String { return self._s[1006]! } - public var Appearance_PreviewOutgoingText: String { return self._s[1007]! } - public func StickerPackActionInfo_RemovedText(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1008]!, self._r[1008]!, [_0]) } - public var Notifications_PermissionsAllowInSettings: String { return self._s[1009]! } - public var AutoDownloadSettings_OnForAll: String { return self._s[1011]! } - public var Map_Directions: String { return self._s[1012]! } - public var Passport_FieldIdentityTranslationHelp: String { return self._s[1014]! } - public var Appearance_ThemeDay: String { return self._s[1015]! } - public var LogoutOptions_LogOut: String { return self._s[1016]! } - public var Group_PublicLink_Title: String { return self._s[1018]! } - public var Channel_AddBotErrorNoRights: String { return self._s[1019]! } - public var ChatList_Search_ShowLess: String { return self._s[1020]! } - public var Passport_Identity_AddPassport: String { return self._s[1021]! } - public var LocalGroup_ButtonTitle: String { return self._s[1022]! } - public var Call_Message: String { return self._s[1023]! } - public var PhotoEditor_ExposureTool: String { return self._s[1024]! } - public var Wallet_Receive_CommentInfo: String { return self._s[1026]! } - public var Passport_FieldOneOf_Delimeter: String { return self._s[1027]! } - public var Channel_AdminLog_CanBanUsers: String { return self._s[1029]! } - public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[1030]! } - public var Appearance_Preview: String { return self._s[1031]! } - public var Compose_ChannelMembers: String { return self._s[1032]! } - public var Conversation_DeleteManyMessages: String { return self._s[1033]! } - public var ReportPeer_ReasonOther_Title: String { return self._s[1034]! } - public var Checkout_ErrorProviderAccountTimeout: String { return self._s[1035]! } - public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[1036]! } - public var Channel_Stickers_CreateYourOwn: String { return self._s[1039]! } - public var Conversation_UpdateTelegram: String { return self._s[1040]! } - public var EditTheme_Create_TopInfo: String { return self._s[1041]! } + public var NetworkUsageSettings_Cellular: String { return self._s[1009]! } + public var Appearance_PreviewOutgoingText: String { return self._s[1010]! } + public func StickerPackActionInfo_RemovedText(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1011]!, self._r[1011]!, [_0]) + } + public var Notifications_PermissionsAllowInSettings: String { return self._s[1012]! } + public var AutoDownloadSettings_OnForAll: String { return self._s[1014]! } + public var Map_Directions: String { return self._s[1015]! } + public var Passport_FieldIdentityTranslationHelp: String { return self._s[1017]! } + public var Appearance_ThemeDay: String { return self._s[1018]! } + public var LogoutOptions_LogOut: String { return self._s[1019]! } + public var Group_PublicLink_Title: String { return self._s[1021]! } + public var Channel_AddBotErrorNoRights: String { return self._s[1022]! } + public var ChatList_Search_ShowLess: String { return self._s[1023]! } + public var Passport_Identity_AddPassport: String { return self._s[1024]! } + public var LocalGroup_ButtonTitle: String { return self._s[1025]! } + public var Call_Message: String { return self._s[1026]! } + public var PhotoEditor_ExposureTool: String { return self._s[1027]! } + public var Wallet_Receive_CommentInfo: String { return self._s[1029]! } + public var Passport_FieldOneOf_Delimeter: String { return self._s[1030]! } + public var Channel_AdminLog_CanBanUsers: String { return self._s[1032]! } + public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[1033]! } + public var Appearance_Preview: String { return self._s[1034]! } + public var Compose_ChannelMembers: String { return self._s[1035]! } + public var Conversation_DeleteManyMessages: String { return self._s[1036]! } + public var ReportPeer_ReasonOther_Title: String { return self._s[1037]! } + public var Checkout_ErrorProviderAccountTimeout: String { return self._s[1038]! } + public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[1039]! } + public var Channel_Stickers_CreateYourOwn: String { return self._s[1042]! } + public var Conversation_UpdateTelegram: String { return self._s[1043]! } + public var EditTheme_Create_TopInfo: String { return self._s[1044]! } public func Notification_PinnedPhotoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1042]!, self._r[1042]!, [_0]) + return formatWithArgumentRanges(self._s[1045]!, self._r[1045]!, [_0]) } - public var Wallet_WordCheck_Continue: String { return self._s[1043]! } - public var TwoFactorSetup_Hint_Action: String { return self._s[1044]! } - public var IntentsSettings_ResetAll: String { return self._s[1045]! } + public var Wallet_WordCheck_Continue: String { return self._s[1046]! } + public var TwoFactorSetup_Hint_Action: String { return self._s[1047]! } + public var IntentsSettings_ResetAll: String { return self._s[1048]! } public func PUSH_PINNED_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1046]!, self._r[1046]!, [_1]) + return formatWithArgumentRanges(self._s[1049]!, self._r[1049]!, [_1]) } - public var GroupInfo_Administrators_Title: String { return self._s[1047]! } - public var Privacy_Forwards_PreviewMessageText: String { return self._s[1048]! } + public var GroupInfo_Administrators_Title: String { return self._s[1050]! } + public var Privacy_Forwards_PreviewMessageText: String { return self._s[1051]! } public func PrivacySettings_LastSeenNobodyPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1049]!, self._r[1049]!, [_0]) + return formatWithArgumentRanges(self._s[1052]!, self._r[1052]!, [_0]) } - public var Tour_Title3: String { return self._s[1050]! } - public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[1051]! } - public var Clipboard_SendPhoto: String { return self._s[1055]! } - public var MediaPicker_Videos: String { return self._s[1056]! } - public var Passport_Email_Title: String { return self._s[1057]! } + public var Tour_Title3: String { return self._s[1053]! } + public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[1054]! } + public var Clipboard_SendPhoto: String { return self._s[1058]! } + public var MediaPicker_Videos: String { return self._s[1059]! } + public var Passport_Email_Title: String { return self._s[1060]! } public func PrivacySettings_LastSeenEverybodyMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1058]!, self._r[1058]!, [_0]) + return formatWithArgumentRanges(self._s[1061]!, self._r[1061]!, [_0]) } - public var StickerPacksSettings_Title: String { return self._s[1059]! } - public var Conversation_MessageDialogDelete: String { return self._s[1060]! } - public var Privacy_Calls_CustomHelp: String { return self._s[1062]! } - public var Message_Wallpaper: String { return self._s[1063]! } - public var MemberSearch_BotSection: String { return self._s[1064]! } - public var GroupInfo_SetSound: String { return self._s[1065]! } - public var Core_ServiceUserStatus: String { return self._s[1066]! } - public var LiveLocationUpdated_JustNow: String { return self._s[1067]! } - public var Call_StatusFailed: String { return self._s[1068]! } - public var TwoFactorSetup_Email_Placeholder: String { return self._s[1069]! } - public var TwoStepAuth_SetupPasswordDescription: String { return self._s[1070]! } - public var TwoStepAuth_SetPassword: String { return self._s[1071]! } - public var Permissions_PeopleNearbyText_v0: String { return self._s[1072]! } + public var StickerPacksSettings_Title: String { return self._s[1062]! } + public var Conversation_MessageDialogDelete: String { return self._s[1063]! } + public var Privacy_Calls_CustomHelp: String { return self._s[1065]! } + public var Message_Wallpaper: String { return self._s[1066]! } + public var MemberSearch_BotSection: String { return self._s[1067]! } + public var GroupInfo_SetSound: String { return self._s[1068]! } + public func Time_TomorrowAt(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1069]!, self._r[1069]!, [_0]) + } + public var Core_ServiceUserStatus: String { return self._s[1070]! } + public var LiveLocationUpdated_JustNow: String { return self._s[1071]! } + public var Call_StatusFailed: String { return self._s[1072]! } + public var TwoFactorSetup_Email_Placeholder: String { return self._s[1073]! } + public var TwoStepAuth_SetupPasswordDescription: String { return self._s[1074]! } + public var TwoStepAuth_SetPassword: String { return self._s[1075]! } + public var Permissions_PeopleNearbyText_v0: String { return self._s[1076]! } public func SocksProxySetup_ProxyStatusPing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1074]!, self._r[1074]!, [_0]) + return formatWithArgumentRanges(self._s[1078]!, self._r[1078]!, [_0]) } - public var Calls_SubmitRating: String { return self._s[1075]! } - public var Map_NoPlacesNearby: String { return self._s[1076]! } - public var Profile_Username: String { return self._s[1077]! } - public var Bot_DescriptionTitle: String { return self._s[1078]! } - public var MaskStickerSettings_Title: String { return self._s[1079]! } - public var SharedMedia_CategoryOther: String { return self._s[1080]! } - public var GroupInfo_SetGroupPhoto: String { return self._s[1081]! } - public var Common_NotNow: String { return self._s[1082]! } - public var CallFeedback_IncludeLogsInfo: String { return self._s[1083]! } - public var Conversation_ShareMyPhoneNumber: String { return self._s[1084]! } - public var Map_Location: String { return self._s[1085]! } - public var Invitation_JoinGroup: String { return self._s[1086]! } - public var AutoDownloadSettings_Title: String { return self._s[1088]! } - public var Conversation_DiscardVoiceMessageDescription: String { return self._s[1089]! } - public var Channel_ErrorAddBlocked: String { return self._s[1090]! } - public var Conversation_UnblockUser: String { return self._s[1091]! } - public var EditTheme_Edit_TopInfo: String { return self._s[1092]! } - public var Watch_Bot_Restart: String { return self._s[1093]! } - public var TwoStepAuth_Title: String { return self._s[1094]! } - public var Channel_AdminLog_BanSendMessages: String { return self._s[1095]! } - public var Checkout_ShippingMethod: String { return self._s[1096]! } - public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[1097]! } + public var Calls_SubmitRating: String { return self._s[1079]! } + public var Map_NoPlacesNearby: String { return self._s[1080]! } + public var Profile_Username: String { return self._s[1081]! } + public var Bot_DescriptionTitle: String { return self._s[1082]! } + public var MaskStickerSettings_Title: String { return self._s[1083]! } + public var SharedMedia_CategoryOther: String { return self._s[1084]! } + public var GroupInfo_SetGroupPhoto: String { return self._s[1085]! } + public var Common_NotNow: String { return self._s[1086]! } + public var CallFeedback_IncludeLogsInfo: String { return self._s[1087]! } + public var Conversation_ShareMyPhoneNumber: String { return self._s[1088]! } + public var Map_Location: String { return self._s[1089]! } + public var Invitation_JoinGroup: String { return self._s[1090]! } + public var AutoDownloadSettings_Title: String { return self._s[1092]! } + public var Conversation_DiscardVoiceMessageDescription: String { return self._s[1093]! } + public var Channel_ErrorAddBlocked: String { return self._s[1094]! } + public var Conversation_UnblockUser: String { return self._s[1095]! } + public var EditTheme_Edit_TopInfo: String { return self._s[1096]! } + public var Watch_Bot_Restart: String { return self._s[1097]! } + public var TwoStepAuth_Title: String { return self._s[1098]! } + public var Channel_AdminLog_BanSendMessages: String { return self._s[1099]! } + public var Checkout_ShippingMethod: String { return self._s[1100]! } + public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[1101]! } public func PUSH_CHAT_MESSAGE_STICKER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1098]!, self._r[1098]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1102]!, self._r[1102]!, [_1, _2, _3]) } - public var EditTheme_ChangeColors: String { return self._s[1100]! } + public var EditTheme_ChangeColors: String { return self._s[1104]! } public func Chat_UnsendMyMessagesAlertTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1101]!, self._r[1101]!, [_0]) + return formatWithArgumentRanges(self._s[1105]!, self._r[1105]!, [_0]) } public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1102]!, self._r[1102]!, [_0]) + return formatWithArgumentRanges(self._s[1106]!, self._r[1106]!, [_0]) } - public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[1103]! } - public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[1104]! } - public var AuthSessions_TerminateOtherSessions: String { return self._s[1105]! } - public var Contacts_FailedToSendInvitesMessage: String { return self._s[1106]! } - public var PrivacySettings_TwoStepAuth: String { return self._s[1107]! } - public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[1108]! } - public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[1109]! } - public var Conversation_EditingMessagePanelMedia: String { return self._s[1110]! } - public var Checkout_PaymentMethod_Title: String { return self._s[1111]! } - public var SocksProxySetup_Connection: String { return self._s[1112]! } - public var Group_MessagePhotoRemoved: String { return self._s[1113]! } - public var Channel_Stickers_NotFound: String { return self._s[1116]! } - public var Group_About_Help: String { return self._s[1117]! } - public var Notification_PassportValueProofOfIdentity: String { return self._s[1118]! } - public var PeopleNearby_Title: String { return self._s[1120]! } + public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[1107]! } + public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[1108]! } + public var AuthSessions_TerminateOtherSessions: String { return self._s[1109]! } + public var Contacts_FailedToSendInvitesMessage: String { return self._s[1110]! } + public var PrivacySettings_TwoStepAuth: String { return self._s[1111]! } + public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[1112]! } + public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[1113]! } + public var Conversation_EditingMessagePanelMedia: String { return self._s[1114]! } + public var Checkout_PaymentMethod_Title: String { return self._s[1115]! } + public var SocksProxySetup_Connection: String { return self._s[1116]! } + public var Group_MessagePhotoRemoved: String { return self._s[1117]! } + public var PeopleNearby_MakeInvisible: String { return self._s[1119]! } + public var Channel_Stickers_NotFound: String { return self._s[1121]! } + public var Group_About_Help: String { return self._s[1122]! } + public var Notification_PassportValueProofOfIdentity: String { return self._s[1123]! } + public var PeopleNearby_Title: String { return self._s[1125]! } public func ApplyLanguage_ChangeLanguageOfficialText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1121]!, self._r[1121]!, [_1]) + return formatWithArgumentRanges(self._s[1126]!, self._r[1126]!, [_1]) } - public var Map_Home: String { return self._s[1122]! } - public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[1124]! } - public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[1125]! } - public var SocksProxySetup_Password: String { return self._s[1126]! } - public var Notifications_PermissionsEnable: String { return self._s[1127]! } - public var TwoStepAuth_ChangeEmail: String { return self._s[1129]! } + public var Map_Home: String { return self._s[1127]! } + public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[1129]! } + public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[1130]! } + public var SocksProxySetup_Password: String { return self._s[1131]! } + public var Notifications_PermissionsEnable: String { return self._s[1132]! } + public var TwoStepAuth_ChangeEmail: String { return self._s[1134]! } public func Channel_AdminLog_MessageInvitedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1130]!, self._r[1130]!, [_1]) + return formatWithArgumentRanges(self._s[1135]!, self._r[1135]!, [_1]) } public func Time_MonthOfYear_m10(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1132]!, self._r[1132]!, [_0]) + return formatWithArgumentRanges(self._s[1137]!, self._r[1137]!, [_0]) } - public var Passport_Identity_TypeDriversLicense: String { return self._s[1133]! } - public var ArchivedPacksAlert_Title: String { return self._s[1134]! } - public var Wallet_Receive_InvoiceUrlCopied: String { return self._s[1135]! } - public var Map_PlacesNearby: String { return self._s[1136]! } + public var Passport_Identity_TypeDriversLicense: String { return self._s[1138]! } + public var ArchivedPacksAlert_Title: String { return self._s[1139]! } + public var Wallet_Receive_InvoiceUrlCopied: String { return self._s[1140]! } + public var Map_PlacesNearby: String { return self._s[1141]! } public func Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1137]!, self._r[1137]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1142]!, self._r[1142]!, [_1, _2, _3]) } - public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1138]! } - public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1140]! } - public var Conversation_StatusTyping: String { return self._s[1141]! } - public var Broadcast_AdminLog_EmptyText: String { return self._s[1142]! } - public var Notification_PassportValueProofOfAddress: String { return self._s[1143]! } - public var UserInfo_CreateNewContact: String { return self._s[1144]! } - public var Passport_Identity_FrontSide: String { return self._s[1145]! } - public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1146]! } - public var Calls_CallTabTitle: String { return self._s[1147]! } - public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1148]! } + public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1143]! } + public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1145]! } + public var Conversation_StatusTyping: String { return self._s[1146]! } + public var Broadcast_AdminLog_EmptyText: String { return self._s[1147]! } + public var Notification_PassportValueProofOfAddress: String { return self._s[1148]! } + public var UserInfo_CreateNewContact: String { return self._s[1149]! } + public var Passport_Identity_FrontSide: String { return self._s[1150]! } + public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1151]! } + public var Calls_CallTabTitle: String { return self._s[1152]! } + public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1153]! } public func Login_BannedPhoneBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1150]!, self._r[1150]!, [_0]) + return formatWithArgumentRanges(self._s[1155]!, self._r[1155]!, [_0]) } - public var Watch_UserInfo_MuteTitle: String { return self._s[1151]! } - public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1152]! } - public var SharedMedia_EmptyMusicText: String { return self._s[1153]! } - public var Wallet_Completed_Text: String { return self._s[1154]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1155]! } - public var Paint_Stickers: String { return self._s[1156]! } - public var Privacy_GroupsAndChannels: String { return self._s[1157]! } - public var ChatList_Context_Delete: String { return self._s[1159]! } - public var UserInfo_AddContact: String { return self._s[1160]! } + public var Watch_UserInfo_MuteTitle: String { return self._s[1156]! } + public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1157]! } + public var SharedMedia_EmptyMusicText: String { return self._s[1158]! } + public var Wallet_Completed_Text: String { return self._s[1159]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1160]! } + public var Paint_Stickers: String { return self._s[1161]! } + public var Privacy_GroupsAndChannels: String { return self._s[1162]! } + public var ChatList_Context_Delete: String { return self._s[1164]! } + public var UserInfo_AddContact: String { return self._s[1165]! } public func Conversation_MessageViaUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1161]!, self._r[1161]!, [_0]) + return formatWithArgumentRanges(self._s[1166]!, self._r[1166]!, [_0]) } - public var PhoneNumberHelp_ChangeNumber: String { return self._s[1163]! } + public var PhoneNumberHelp_ChangeNumber: String { return self._s[1168]! } public func ChatList_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1165]!, self._r[1165]!, [_0]) + return formatWithArgumentRanges(self._s[1170]!, self._r[1170]!, [_0]) } - public var DialogList_NoMessagesTitle: String { return self._s[1166]! } - public var EditProfile_NameAndPhotoHelp: String { return self._s[1167]! } - public var BlockedUsers_BlockUser: String { return self._s[1168]! } - public var Notifications_PermissionsOpenSettings: String { return self._s[1169]! } - public var MediaPicker_UngroupDescription: String { return self._s[1171]! } - public var Watch_NoConnection: String { return self._s[1172]! } - public var Month_GenSeptember: String { return self._s[1173]! } - public var Conversation_ViewGroup: String { return self._s[1175]! } - public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1178]! } - public var Privacy_Forwards_AlwaysLink: String { return self._s[1179]! } - public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1180]! } - public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1181]! } - public var Wallet_WordCheck_IncorrectHeader: String { return self._s[1182]! } - public var MediaPicker_CameraRoll: String { return self._s[1184]! } - public var Month_GenAugust: String { return self._s[1185]! } - public var Wallet_Configuration_SourceHeader: String { return self._s[1186]! } - public var AccessDenied_VideoMessageMicrophone: String { return self._s[1187]! } - public var SharedMedia_EmptyText: String { return self._s[1188]! } - public var Map_ShareLiveLocation: String { return self._s[1189]! } - public var Calls_All: String { return self._s[1190]! } - public var Map_SendThisPlace: String { return self._s[1192]! } - public var Appearance_ThemeNight: String { return self._s[1194]! } - public var Conversation_HoldForAudio: String { return self._s[1195]! } - public var SettingsSearch_Synonyms_Support: String { return self._s[1198]! } - public var GroupInfo_GroupHistoryHidden: String { return self._s[1199]! } - public var SocksProxySetup_Secret: String { return self._s[1200]! } + public var DialogList_NoMessagesTitle: String { return self._s[1171]! } + public var EditProfile_NameAndPhotoHelp: String { return self._s[1172]! } + public var BlockedUsers_BlockUser: String { return self._s[1173]! } + public var Notifications_PermissionsOpenSettings: String { return self._s[1174]! } + public var MediaPicker_UngroupDescription: String { return self._s[1176]! } + public var Watch_NoConnection: String { return self._s[1177]! } + public var Month_GenSeptember: String { return self._s[1178]! } + public var Conversation_ViewGroup: String { return self._s[1180]! } + public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1183]! } + public var Privacy_Forwards_AlwaysLink: String { return self._s[1184]! } + public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1185]! } + public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1186]! } + public var Wallet_WordCheck_IncorrectHeader: String { return self._s[1187]! } + public var MediaPicker_CameraRoll: String { return self._s[1189]! } + public var Month_GenAugust: String { return self._s[1190]! } + public var Wallet_Configuration_SourceHeader: String { return self._s[1191]! } + public var AccessDenied_VideoMessageMicrophone: String { return self._s[1192]! } + public var SharedMedia_EmptyText: String { return self._s[1193]! } + public var Map_ShareLiveLocation: String { return self._s[1194]! } + public var Calls_All: String { return self._s[1195]! } + public var Map_SendThisPlace: String { return self._s[1197]! } + public var Appearance_ThemeNight: String { return self._s[1199]! } + public var Conversation_HoldForAudio: String { return self._s[1200]! } + public var SettingsSearch_Synonyms_Support: String { return self._s[1203]! } + public var GroupInfo_GroupHistoryHidden: String { return self._s[1204]! } + public var SocksProxySetup_Secret: String { return self._s[1205]! } public func Activity_RemindAboutChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1201]!, self._r[1201]!, [_0]) + return formatWithArgumentRanges(self._s[1206]!, self._r[1206]!, [_0]) } - public var Channel_BanList_RestrictedTitle: String { return self._s[1203]! } - public var Conversation_Location: String { return self._s[1204]! } + public var Channel_BanList_RestrictedTitle: String { return self._s[1208]! } + public var Conversation_Location: String { return self._s[1209]! } public func AutoDownloadSettings_UpToFor(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1205]!, self._r[1205]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1210]!, self._r[1210]!, [_1, _2]) } - public var ChatSettings_AutoDownloadPhotos: String { return self._s[1207]! } - public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1208]! } - public var Notifications_PermissionsText: String { return self._s[1209]! } - public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1210]! } - public var Call_Flip: String { return self._s[1211]! } - public var Channel_AdminLog_CanDeleteMessagesOfOthers: String { return self._s[1213]! } - public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1214]! } - public var Wallet_TransactionInfo_StorageFeeInfoUrl: String { return self._s[1215]! } - public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[1216]! } - public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1218]! } - public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1220]! } - public var Channel_TooMuchBots: String { return self._s[1222]! } - public var Passport_DeletePassportConfirmation: String { return self._s[1223]! } - public var Login_InvalidCodeError: String { return self._s[1224]! } - public var StickerPacksSettings_FeaturedPacks: String { return self._s[1225]! } + public var ChatSettings_AutoDownloadPhotos: String { return self._s[1212]! } + public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1213]! } + public var Notifications_PermissionsText: String { return self._s[1214]! } + public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1215]! } + public var Call_Flip: String { return self._s[1216]! } + public var Channel_AdminLog_CanDeleteMessagesOfOthers: String { return self._s[1218]! } + public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1219]! } + public var Wallet_TransactionInfo_StorageFeeInfoUrl: String { return self._s[1220]! } + public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[1221]! } + public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1223]! } + public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1225]! } + public var Channel_TooMuchBots: String { return self._s[1227]! } + public var Passport_DeletePassportConfirmation: String { return self._s[1228]! } + public var Login_InvalidCodeError: String { return self._s[1229]! } + public var StickerPacksSettings_FeaturedPacks: String { return self._s[1230]! } public func ChatList_DeleteSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1226]!, self._r[1226]!, [_0]) + return formatWithArgumentRanges(self._s[1231]!, self._r[1231]!, [_0]) } public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1227]!, self._r[1227]!, [_0]) + return formatWithArgumentRanges(self._s[1232]!, self._r[1232]!, [_0]) } - public var VoiceOver_Navigation_ProxySettings: String { return self._s[1228]! } - public var Call_CallInProgressTitle: String { return self._s[1229]! } - public var Month_ShortSeptember: String { return self._s[1230]! } - public var Watch_ChannelInfo_Title: String { return self._s[1231]! } - public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1234]! } - public var DialogList_PasscodeLockHelp: String { return self._s[1235]! } - public var Chat_MultipleTextMessagesDisabled: String { return self._s[1236]! } - public var Wallet_Receive_Title: String { return self._s[1237]! } - public var Notifications_Badge_IncludePublicGroups: String { return self._s[1238]! } - public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1239]! } - public var PhotoEditor_CropReset: String { return self._s[1240]! } - public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1242]! } - public var Channel_Management_LabelEditor: String { return self._s[1243]! } - public var Passport_Identity_LatinNameHelp: String { return self._s[1245]! } - public var PhotoEditor_HighlightsTool: String { return self._s[1246]! } - public var Wallet_Info_WalletCreated: String { return self._s[1247]! } - public var UserInfo_Title: String { return self._s[1248]! } - public var ChatList_HideAction: String { return self._s[1249]! } - public var AccessDenied_Title: String { return self._s[1250]! } - public var DialogList_SearchLabel: String { return self._s[1251]! } - public var Group_Setup_HistoryHidden: String { return self._s[1252]! } - public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1253]! } - public var State_Updating: String { return self._s[1255]! } - public var Contacts_TabTitle: String { return self._s[1256]! } - public var Notifications_Badge_CountUnreadMessages: String { return self._s[1258]! } - public var GroupInfo_GroupHistory: String { return self._s[1259]! } - public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1260]! } - public var Wallpaper_SetColor: String { return self._s[1261]! } - public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1262]! } - public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1263]! } - public var Chat_AttachmentLimitReached: String { return self._s[1264]! } - public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1265]! } - public var Contacts_NotRegisteredSection: String { return self._s[1266]! } + public var VoiceOver_Navigation_ProxySettings: String { return self._s[1233]! } + public var Call_CallInProgressTitle: String { return self._s[1234]! } + public var Month_ShortSeptember: String { return self._s[1235]! } + public var Watch_ChannelInfo_Title: String { return self._s[1236]! } + public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1239]! } + public var DialogList_PasscodeLockHelp: String { return self._s[1240]! } + public var Chat_MultipleTextMessagesDisabled: String { return self._s[1241]! } + public var Wallet_Receive_Title: String { return self._s[1242]! } + public var Notifications_Badge_IncludePublicGroups: String { return self._s[1243]! } + public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1244]! } + public var PhotoEditor_CropReset: String { return self._s[1245]! } + public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1247]! } + public var Channel_Management_LabelEditor: String { return self._s[1248]! } + public var Passport_Identity_LatinNameHelp: String { return self._s[1250]! } + public var PhotoEditor_HighlightsTool: String { return self._s[1251]! } + public var Wallet_Info_WalletCreated: String { return self._s[1252]! } + public var UserInfo_Title: String { return self._s[1253]! } + public var ChatList_HideAction: String { return self._s[1254]! } + public var AccessDenied_Title: String { return self._s[1255]! } + public var DialogList_SearchLabel: String { return self._s[1256]! } + public var Group_Setup_HistoryHidden: String { return self._s[1257]! } + public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1258]! } + public var State_Updating: String { return self._s[1260]! } + public var Contacts_TabTitle: String { return self._s[1261]! } + public var Notifications_Badge_CountUnreadMessages: String { return self._s[1263]! } + public var GroupInfo_GroupHistory: String { return self._s[1264]! } + public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1265]! } + public var Wallpaper_SetColor: String { return self._s[1266]! } + public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1267]! } + public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1268]! } + public var Chat_AttachmentLimitReached: String { return self._s[1269]! } + public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1270]! } + public var Contacts_NotRegisteredSection: String { return self._s[1271]! } public func Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1267]!, self._r[1267]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1272]!, self._r[1272]!, [_1, _2, _3]) } - public var Paint_Clear: String { return self._s[1268]! } - public var StickerPacksSettings_ArchivedMasks: String { return self._s[1269]! } - public var SocksProxySetup_Connecting: String { return self._s[1270]! } - public var ExplicitContent_AlertChannel: String { return self._s[1271]! } - public var CreatePoll_AllOptionsAdded: String { return self._s[1272]! } - public var Conversation_Contact: String { return self._s[1273]! } - public var Login_CodeExpired: String { return self._s[1274]! } - public var Passport_DiscardMessageAction: String { return self._s[1275]! } - public var ChatList_Context_Unpin: String { return self._s[1276]! } - public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1277]! } + public var Paint_Clear: String { return self._s[1273]! } + public var StickerPacksSettings_ArchivedMasks: String { return self._s[1274]! } + public var SocksProxySetup_Connecting: String { return self._s[1275]! } + public var ExplicitContent_AlertChannel: String { return self._s[1276]! } + public var CreatePoll_AllOptionsAdded: String { return self._s[1277]! } + public var Conversation_Contact: String { return self._s[1278]! } + public var Login_CodeExpired: String { return self._s[1279]! } + public var Passport_DiscardMessageAction: String { return self._s[1280]! } + public var ChatList_Context_Unpin: String { return self._s[1281]! } + public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1282]! } public func VoiceOver_Chat_MusicFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1278]!, self._r[1278]!, [_0]) + return formatWithArgumentRanges(self._s[1283]!, self._r[1283]!, [_0]) } - public var Channel_AdminLog_EmptyMessageText: String { return self._s[1279]! } - public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1280]! } + public var Channel_AdminLog_EmptyMessageText: String { return self._s[1284]! } + public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1285]! } public func Group_EditAdmin_RankInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1281]!, self._r[1281]!, [_0]) + return formatWithArgumentRanges(self._s[1286]!, self._r[1286]!, [_0]) } - public var Month_ShortApril: String { return self._s[1282]! } - public var AuthSessions_CurrentSession: String { return self._s[1283]! } - public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1286]! } - public var Wallet_Navigation_Cancel: String { return self._s[1288]! } - public var WallpaperPreview_CropTopText: String { return self._s[1289]! } - public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1290]! } - public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1291]! } + public var Month_ShortApril: String { return self._s[1287]! } + public var AuthSessions_CurrentSession: String { return self._s[1288]! } + public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1291]! } + public var Wallet_Navigation_Cancel: String { return self._s[1293]! } + public var WallpaperPreview_CropTopText: String { return self._s[1294]! } + public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1295]! } + public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1296]! } public func Conversation_ScheduleMessage_SendOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1292]!, self._r[1292]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1297]!, self._r[1297]!, [_0, _1]) } - public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1293]! } - public var Channel_Setup_TypePrivate: String { return self._s[1295]! } - public var Forward_ChannelReadOnly: String { return self._s[1298]! } - public var PhotoEditor_CurvesBlue: String { return self._s[1299]! } - public var AddContact_SharedContactException: String { return self._s[1300]! } - public var UserInfo_BotPrivacy: String { return self._s[1302]! } - public var Wallet_CreateInvoice_Title: String { return self._s[1303]! } - public var Notification_PassportValueEmail: String { return self._s[1304]! } - public var EmptyGroupInfo_Subtitle: String { return self._s[1305]! } - public var GroupPermission_NewTitle: String { return self._s[1306]! } - public var CallFeedback_ReasonDropped: String { return self._s[1307]! } - public var GroupInfo_Permissions_AddException: String { return self._s[1308]! } - public var Channel_SignMessages_Help: String { return self._s[1310]! } - public var Undo_ChatDeleted: String { return self._s[1312]! } - public var Conversation_ChatBackground: String { return self._s[1313]! } + public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1298]! } + public var Channel_Setup_TypePrivate: String { return self._s[1300]! } + public var Forward_ChannelReadOnly: String { return self._s[1303]! } + public var PhotoEditor_CurvesBlue: String { return self._s[1304]! } + public var AddContact_SharedContactException: String { return self._s[1305]! } + public var UserInfo_BotPrivacy: String { return self._s[1307]! } + public var Wallet_CreateInvoice_Title: String { return self._s[1308]! } + public var Notification_PassportValueEmail: String { return self._s[1309]! } + public var EmptyGroupInfo_Subtitle: String { return self._s[1310]! } + public var GroupPermission_NewTitle: String { return self._s[1311]! } + public var CallFeedback_ReasonDropped: String { return self._s[1312]! } + public var GroupInfo_Permissions_AddException: String { return self._s[1313]! } + public var Channel_SignMessages_Help: String { return self._s[1315]! } + public var Undo_ChatDeleted: String { return self._s[1317]! } + public var Conversation_ChatBackground: String { return self._s[1318]! } public func Wallet_WordCheck_Text(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1314]!, self._r[1314]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1319]!, self._r[1319]!, [_1, _2, _3]) } - public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1315]! } - public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1316]! } - public var Passport_Language_pt: String { return self._s[1317]! } - public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1318]! } - public var NotificationsSound_Popcorn: String { return self._s[1321]! } - public var AutoNightTheme_Disabled: String { return self._s[1322]! } - public var BlockedUsers_LeavePrefix: String { return self._s[1323]! } - public var WallpaperPreview_CustomColorTopText: String { return self._s[1324]! } - public var Contacts_PermissionsSuppressWarningText: String { return self._s[1325]! } - public var WallpaperSearch_ColorBlue: String { return self._s[1326]! } + public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1320]! } + public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1321]! } + public var Passport_Language_pt: String { return self._s[1322]! } + public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1323]! } + public var NotificationsSound_Popcorn: String { return self._s[1326]! } + public var AutoNightTheme_Disabled: String { return self._s[1327]! } + public var BlockedUsers_LeavePrefix: String { return self._s[1328]! } + public var WallpaperPreview_CustomColorTopText: String { return self._s[1329]! } + public var Contacts_PermissionsSuppressWarningText: String { return self._s[1330]! } + public var WallpaperSearch_ColorBlue: String { return self._s[1331]! } public func CancelResetAccount_TextSMS(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1327]!, self._r[1327]!, [_0]) + return formatWithArgumentRanges(self._s[1332]!, self._r[1332]!, [_0]) } - public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1328]! } - public var SocksProxySetup_UseForCalls: String { return self._s[1329]! } - public var Passport_DeleteDocumentConfirmation: String { return self._s[1331]! } + public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1333]! } + public var SocksProxySetup_UseForCalls: String { return self._s[1334]! } + public var Passport_DeleteDocumentConfirmation: String { return self._s[1336]! } public func Conversation_Megabytes(_ _0: Float) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1332]!, self._r[1332]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1337]!, self._r[1337]!, ["\(_0)"]) } - public var SocksProxySetup_Hostname: String { return self._s[1335]! } - public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1336]! } - public var Compose_NewEncryptedChat: String { return self._s[1337]! } - public var Login_CodeFloodError: String { return self._s[1338]! } - public var Calls_TabTitle: String { return self._s[1339]! } - public var Privacy_ProfilePhoto: String { return self._s[1340]! } - public var Passport_Language_he: String { return self._s[1341]! } + public var SocksProxySetup_Hostname: String { return self._s[1340]! } + public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1341]! } + public var Compose_NewEncryptedChat: String { return self._s[1342]! } + public var Login_CodeFloodError: String { return self._s[1343]! } + public var Calls_TabTitle: String { return self._s[1344]! } + public var Privacy_ProfilePhoto: String { return self._s[1345]! } + public var Passport_Language_he: String { return self._s[1346]! } public func Conversation_SetReminder_RemindToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1342]!, self._r[1342]!, [_0]) + return formatWithArgumentRanges(self._s[1347]!, self._r[1347]!, [_0]) } - public var GroupPermission_Title: String { return self._s[1343]! } + public var GroupPermission_Title: String { return self._s[1348]! } public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1344]!, self._r[1344]!, [_0]) + return formatWithArgumentRanges(self._s[1349]!, self._r[1349]!, [_0]) } - public var Wallet_TransactionInfo_SenderHeader: String { return self._s[1345]! } - public var GroupPermission_NoChangeInfo: String { return self._s[1346]! } - public var ChatList_DeleteForCurrentUser: String { return self._s[1347]! } - public var Tour_Text1: String { return self._s[1348]! } - public var Channel_EditAdmin_TransferOwnership: String { return self._s[1349]! } - public var Month_ShortFebruary: String { return self._s[1350]! } - public var TwoStepAuth_EmailSkip: String { return self._s[1351]! } + public var Wallet_TransactionInfo_SenderHeader: String { return self._s[1350]! } + public var GroupPermission_NoChangeInfo: String { return self._s[1351]! } + public var ChatList_DeleteForCurrentUser: String { return self._s[1352]! } + public var Tour_Text1: String { return self._s[1353]! } + public var Channel_EditAdmin_TransferOwnership: String { return self._s[1354]! } + public var Month_ShortFebruary: String { return self._s[1355]! } + public var TwoStepAuth_EmailSkip: String { return self._s[1356]! } public func Wallet_Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1352]!, self._r[1352]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1357]!, self._r[1357]!, [_1, _2, _3]) } - public var NotificationsSound_Glass: String { return self._s[1353]! } - public var Appearance_ThemeNightBlue: String { return self._s[1354]! } - public var CheckoutInfo_Pay: String { return self._s[1355]! } - public var Invite_LargeRecipientsCountWarning: String { return self._s[1357]! } - public var Call_CallAgain: String { return self._s[1359]! } - public var AttachmentMenu_SendAsFile: String { return self._s[1360]! } - public var AccessDenied_MicrophoneRestricted: String { return self._s[1361]! } - public var Passport_InvalidPasswordError: String { return self._s[1362]! } - public var Watch_Message_Game: String { return self._s[1363]! } - public var Stickers_Install: String { return self._s[1364]! } - public var VoiceOver_Chat_Message: String { return self._s[1365]! } - public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1366]! } - public var Passport_Identity_ResidenceCountry: String { return self._s[1368]! } - public var Notifications_GroupNotificationsHelp: String { return self._s[1369]! } - public var AuthSessions_OtherSessions: String { return self._s[1370]! } - public var Channel_Username_Help: String { return self._s[1371]! } - public var Camera_Title: String { return self._s[1372]! } - public var IntentsSettings_Title: String { return self._s[1373]! } - public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1375]! } - public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1376]! } - public var Channel_AdminLog_SendPolls: String { return self._s[1377]! } - public var Channel_AdminLog_TitleAllEvents: String { return self._s[1378]! } - public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1379]! } - public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1380]! } - public var ScheduledMessages_DeleteMany: String { return self._s[1381]! } - public var Conversation_RestrictedStickers: String { return self._s[1382]! } - public var Notifications_ExceptionsResetToDefaults: String { return self._s[1384]! } - public var UserInfo_TelegramCall: String { return self._s[1386]! } - public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1387]! } - public var CreatePoll_OptionsHeader: String { return self._s[1388]! } - public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1389]! } - public var ArchivedChats_IntroTitle1: String { return self._s[1390]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1391]! } - public var Theme_Colors_Proceed: String { return self._s[1392]! } - public var Passport_Identity_EditPersonalDetails: String { return self._s[1393]! } + public var NotificationsSound_Glass: String { return self._s[1358]! } + public var Appearance_ThemeNightBlue: String { return self._s[1359]! } + public var CheckoutInfo_Pay: String { return self._s[1360]! } + public var Invite_LargeRecipientsCountWarning: String { return self._s[1362]! } + public var Call_CallAgain: String { return self._s[1364]! } + public var AttachmentMenu_SendAsFile: String { return self._s[1365]! } + public var AccessDenied_MicrophoneRestricted: String { return self._s[1366]! } + public var Passport_InvalidPasswordError: String { return self._s[1367]! } + public var Watch_Message_Game: String { return self._s[1368]! } + public var Stickers_Install: String { return self._s[1369]! } + public var VoiceOver_Chat_Message: String { return self._s[1370]! } + public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1371]! } + public var Passport_Identity_ResidenceCountry: String { return self._s[1373]! } + public var Notifications_GroupNotificationsHelp: String { return self._s[1374]! } + public var AuthSessions_OtherSessions: String { return self._s[1375]! } + public var Channel_Username_Help: String { return self._s[1376]! } + public var Camera_Title: String { return self._s[1377]! } + public var IntentsSettings_Title: String { return self._s[1378]! } + public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1380]! } + public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1381]! } + public var Channel_AdminLog_SendPolls: String { return self._s[1382]! } + public var Channel_AdminLog_TitleAllEvents: String { return self._s[1383]! } + public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1384]! } + public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1385]! } + public var ScheduledMessages_DeleteMany: String { return self._s[1386]! } + public var Conversation_RestrictedStickers: String { return self._s[1387]! } + public var Notifications_ExceptionsResetToDefaults: String { return self._s[1389]! } + public var UserInfo_TelegramCall: String { return self._s[1391]! } + public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1392]! } + public var CreatePoll_OptionsHeader: String { return self._s[1393]! } + public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1394]! } + public var ArchivedChats_IntroTitle1: String { return self._s[1395]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1396]! } + public var Theme_Colors_Proceed: String { return self._s[1397]! } + public var Passport_Identity_EditPersonalDetails: String { return self._s[1398]! } public func Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1394]!, self._r[1394]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1399]!, self._r[1399]!, [_1, _2, _3]) } - public var Wallet_Month_GenAugust: String { return self._s[1395]! } - public var Settings_SaveEditedPhotos: String { return self._s[1396]! } - public var TwoStepAuth_ConfirmationTitle: String { return self._s[1397]! } - public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1398]! } - public var Conversation_MessageDialogRetry: String { return self._s[1399]! } - public var ChatList_Context_MarkAsUnread: String { return self._s[1400]! } - public var MessagePoll_SubmitVote: String { return self._s[1401]! } - public var Conversation_DiscardVoiceMessageAction: String { return self._s[1402]! } - public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1403]! } - public var Group_Setup_TypeHeader: String { return self._s[1404]! } - public var Paint_RecentStickers: String { return self._s[1405]! } - public var PhotoEditor_GrainTool: String { return self._s[1406]! } - public var CheckoutInfo_ShippingInfoState: String { return self._s[1407]! } - public var EmptyGroupInfo_Line4: String { return self._s[1408]! } - public var Watch_AuthRequired: String { return self._s[1410]! } + public var Wallet_Month_GenAugust: String { return self._s[1400]! } + public var Settings_SaveEditedPhotos: String { return self._s[1401]! } + public var TwoStepAuth_ConfirmationTitle: String { return self._s[1402]! } + public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1403]! } + public var Conversation_MessageDialogRetry: String { return self._s[1404]! } + public var ChatList_Context_MarkAsUnread: String { return self._s[1405]! } + public var MessagePoll_SubmitVote: String { return self._s[1406]! } + public var Conversation_DiscardVoiceMessageAction: String { return self._s[1407]! } + public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1408]! } + public var Group_Setup_TypeHeader: String { return self._s[1409]! } + public var Paint_RecentStickers: String { return self._s[1410]! } + public var PhotoEditor_GrainTool: String { return self._s[1411]! } + public var CheckoutInfo_ShippingInfoState: String { return self._s[1412]! } + public var EmptyGroupInfo_Line4: String { return self._s[1413]! } + public var Watch_AuthRequired: String { return self._s[1415]! } public func Passport_Email_UseTelegramEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1411]!, self._r[1411]!, [_0]) + return formatWithArgumentRanges(self._s[1416]!, self._r[1416]!, [_0]) } - public var Conversation_EncryptedDescriptionTitle: String { return self._s[1412]! } - public var ChannelIntro_Text: String { return self._s[1413]! } - public var DialogList_DeleteBotConfirmation: String { return self._s[1414]! } - public var GroupPermission_NoSendMedia: String { return self._s[1415]! } - public var Calls_AddTab: String { return self._s[1416]! } - public var Message_ReplyActionButtonShowReceipt: String { return self._s[1417]! } - public var Channel_AdminLog_EmptyFilterText: String { return self._s[1418]! } - public var Conversation_WalletRequiredSetup: String { return self._s[1419]! } - public var Notification_MessageLifetime1d: String { return self._s[1420]! } - public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1421]! } - public var Channel_BanUser_PermissionsHeader: String { return self._s[1422]! } - public var Passport_Identity_GenderFemale: String { return self._s[1423]! } - public var BlockedUsers_BlockTitle: String { return self._s[1424]! } + public var Conversation_EncryptedDescriptionTitle: String { return self._s[1417]! } + public var ChannelIntro_Text: String { return self._s[1418]! } + public var DialogList_DeleteBotConfirmation: String { return self._s[1419]! } + public var GroupPermission_NoSendMedia: String { return self._s[1420]! } + public var Calls_AddTab: String { return self._s[1421]! } + public var Message_ReplyActionButtonShowReceipt: String { return self._s[1422]! } + public var Channel_AdminLog_EmptyFilterText: String { return self._s[1423]! } + public var Conversation_WalletRequiredSetup: String { return self._s[1424]! } + public var Notification_MessageLifetime1d: String { return self._s[1425]! } + public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1426]! } + public var Channel_BanUser_PermissionsHeader: String { return self._s[1427]! } + public var Passport_Identity_GenderFemale: String { return self._s[1428]! } + public var BlockedUsers_BlockTitle: String { return self._s[1429]! } public func PUSH_CHANNEL_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1425]!, self._r[1425]!, [_1]) + return formatWithArgumentRanges(self._s[1430]!, self._r[1430]!, [_1]) } - public var Weekday_Yesterday: String { return self._s[1426]! } - public var WallpaperSearch_ColorBlack: String { return self._s[1427]! } - public var Settings_Context_Logout: String { return self._s[1428]! } - public var Wallet_Info_UnknownTransaction: String { return self._s[1429]! } - public var ChatList_ArchiveAction: String { return self._s[1430]! } - public var AutoNightTheme_Scheduled: String { return self._s[1431]! } - public var TwoFactorSetup_Email_SkipAction: String { return self._s[1432]! } - public var Settings_Devices: String { return self._s[1433]! } - public var ContactInfo_Note: String { return self._s[1434]! } + public var Weekday_Yesterday: String { return self._s[1431]! } + public var WallpaperSearch_ColorBlack: String { return self._s[1432]! } + public var Settings_Context_Logout: String { return self._s[1433]! } + public var Wallet_Info_UnknownTransaction: String { return self._s[1434]! } + public var ChatList_ArchiveAction: String { return self._s[1435]! } + public var AutoNightTheme_Scheduled: String { return self._s[1436]! } + public var TwoFactorSetup_Email_SkipAction: String { return self._s[1437]! } + public var Settings_Devices: String { return self._s[1438]! } + public var ContactInfo_Note: String { return self._s[1439]! } public func Login_PhoneGenericEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1435]!, self._r[1435]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[1440]!, self._r[1440]!, [_1, _2, _3, _4, _5, _6]) } - public var EditTheme_ThemeTemplateAlertTitle: String { return self._s[1436]! } - public var Wallet_Receive_CreateInvoice: String { return self._s[1437]! } - public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1438]! } - public var Theme_Colors_ColorWallpaperWarningProceed: String { return self._s[1439]! } + public var EditTheme_ThemeTemplateAlertTitle: String { return self._s[1441]! } + public var Wallet_Receive_CreateInvoice: String { return self._s[1442]! } + public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1443]! } + public var Theme_Colors_ColorWallpaperWarningProceed: String { return self._s[1444]! } public func PUSH_CHAT_JOINED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1440]!, self._r[1440]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1445]!, self._r[1445]!, [_1, _2]) } - public var CreatePoll_Create: String { return self._s[1441]! } - public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1442]! } + public var CreatePoll_Create: String { return self._s[1446]! } + public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1447]! } public func Notification_CallFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1443]!, self._r[1443]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1448]!, self._r[1448]!, [_1, _2]) } - public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1444]! } - public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1445]! } - public var Notifications_InAppNotificationsSounds: String { return self._s[1447]! } + public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1449]! } + public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1450]! } + public var Notifications_InAppNotificationsSounds: String { return self._s[1452]! } public func PUSH_PINNED_GAME_SCORE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1448]!, self._r[1448]!, [_1]) + return formatWithArgumentRanges(self._s[1453]!, self._r[1453]!, [_1]) } - public var Preview_OpenInInstagram: String { return self._s[1449]! } - public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1450]! } + public var Preview_OpenInInstagram: String { return self._s[1454]! } + public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1455]! } public func PUSH_CHAT_ADD_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1451]!, self._r[1451]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1456]!, self._r[1456]!, [_1, _2, _3]) } public func Passport_PrivacyPolicy(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1452]!, self._r[1452]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1457]!, self._r[1457]!, [_1, _2]) } - public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1453]! } - public var ArchivedChats_IntroText3: String { return self._s[1454]! } - public var ChatList_UndoArchiveHiddenText: String { return self._s[1455]! } - public var NetworkUsageSettings_TotalSection: String { return self._s[1456]! } - public var Wallet_Month_GenSeptember: String { return self._s[1457]! } - public var Channel_Setup_TypePrivateHelp: String { return self._s[1458]! } + public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1458]! } + public var ArchivedChats_IntroText3: String { return self._s[1459]! } + public var ChatList_UndoArchiveHiddenText: String { return self._s[1460]! } + public var NetworkUsageSettings_TotalSection: String { return self._s[1461]! } + public var Wallet_Month_GenSeptember: String { return self._s[1462]! } + public var Channel_Setup_TypePrivateHelp: String { return self._s[1463]! } public func PUSH_CHAT_MESSAGE_POLL(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1459]!, self._r[1459]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1464]!, self._r[1464]!, [_1, _2, _3]) } - public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1461]! } - public var FastTwoStepSetup_HintSection: String { return self._s[1462]! } - public var Wallpaper_PhotoLibrary: String { return self._s[1463]! } - public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1464]! } - public var Gif_NoGifsFound: String { return self._s[1465]! } - public var Watch_LastSeen_WithinAMonth: String { return self._s[1466]! } - public var VoiceOver_MessageContextDelete: String { return self._s[1467]! } - public var EditTheme_Preview: String { return self._s[1468]! } + public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1466]! } + public var FastTwoStepSetup_HintSection: String { return self._s[1467]! } + public var Wallpaper_PhotoLibrary: String { return self._s[1468]! } + public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1469]! } + public var Gif_NoGifsFound: String { return self._s[1470]! } + public var Watch_LastSeen_WithinAMonth: String { return self._s[1471]! } + public var VoiceOver_MessageContextDelete: String { return self._s[1472]! } + public var EditTheme_Preview: String { return self._s[1473]! } public func ClearCache_StorageTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1469]!, self._r[1469]!, [_0]) + return formatWithArgumentRanges(self._s[1474]!, self._r[1474]!, [_0]) } - public var GroupInfo_ActionPromote: String { return self._s[1470]! } - public var PasscodeSettings_SimplePasscode: String { return self._s[1471]! } - public var GroupInfo_Permissions_Title: String { return self._s[1472]! } - public var Permissions_ContactsText_v0: String { return self._s[1473]! } - public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[1474]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1475]! } - public var PrivacySettings_DataSettingsHelp: String { return self._s[1478]! } - public var Passport_FieldEmailHelp: String { return self._s[1479]! } + public var GroupInfo_ActionPromote: String { return self._s[1475]! } + public var PasscodeSettings_SimplePasscode: String { return self._s[1476]! } + public var GroupInfo_Permissions_Title: String { return self._s[1477]! } + public var Permissions_ContactsText_v0: String { return self._s[1478]! } + public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[1479]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1480]! } + public var PrivacySettings_DataSettingsHelp: String { return self._s[1483]! } + public var Passport_FieldEmailHelp: String { return self._s[1484]! } public func Activity_RemindAboutUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1480]!, self._r[1480]!, [_0]) + return formatWithArgumentRanges(self._s[1485]!, self._r[1485]!, [_0]) } - public var Passport_Identity_GenderPlaceholder: String { return self._s[1481]! } - public var Weekday_ShortSaturday: String { return self._s[1482]! } - public var ContactInfo_PhoneLabelMain: String { return self._s[1483]! } - public var Watch_Conversation_UserInfo: String { return self._s[1484]! } - public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1485]! } - public var GroupPermission_PermissionDisabledByDefault: String { return self._s[1486]! } - public var PrivacyLastSeenSettings_Title: String { return self._s[1487]! } - public var Conversation_ShareBotLocationConfirmation: String { return self._s[1488]! } - public var PhotoEditor_VignetteTool: String { return self._s[1489]! } - public var Passport_Address_Street1Placeholder: String { return self._s[1490]! } - public var Passport_Language_et: String { return self._s[1491]! } - public var AppUpgrade_Running: String { return self._s[1492]! } - public var Channel_DiscussionGroup_Info: String { return self._s[1494]! } - public var EditTheme_Create_Preview_IncomingReplyName: String { return self._s[1495]! } - public var Passport_Language_bg: String { return self._s[1496]! } - public var Stickers_NoStickersFound: String { return self._s[1498]! } + public var Passport_Identity_GenderPlaceholder: String { return self._s[1486]! } + public var Weekday_ShortSaturday: String { return self._s[1487]! } + public var ContactInfo_PhoneLabelMain: String { return self._s[1488]! } + public var Watch_Conversation_UserInfo: String { return self._s[1489]! } + public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1490]! } + public var GroupPermission_PermissionDisabledByDefault: String { return self._s[1491]! } + public var PrivacyLastSeenSettings_Title: String { return self._s[1492]! } + public var Conversation_ShareBotLocationConfirmation: String { return self._s[1493]! } + public var PhotoEditor_VignetteTool: String { return self._s[1494]! } + public var Passport_Address_Street1Placeholder: String { return self._s[1495]! } + public var Passport_Language_et: String { return self._s[1496]! } + public var AppUpgrade_Running: String { return self._s[1497]! } + public var Channel_DiscussionGroup_Info: String { return self._s[1499]! } + public var EditTheme_Create_Preview_IncomingReplyName: String { return self._s[1500]! } + public var Passport_Language_bg: String { return self._s[1501]! } + public var Stickers_NoStickersFound: String { return self._s[1503]! } public func PUSH_CHANNEL_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1500]!, self._r[1500]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1505]!, self._r[1505]!, [_1, _2]) } public func VoiceOver_Chat_ContactFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1501]!, self._r[1501]!, [_0]) + return formatWithArgumentRanges(self._s[1506]!, self._r[1506]!, [_0]) } - public var Wallet_Month_GenJuly: String { return self._s[1502]! } - public var Wallet_Receive_AddressHeader: String { return self._s[1503]! } - public var Wallet_Send_AmountText: String { return self._s[1504]! } - public var Settings_About: String { return self._s[1505]! } + public var Wallet_Month_GenJuly: String { return self._s[1507]! } + public var Wallet_Receive_AddressHeader: String { return self._s[1508]! } + public var Wallet_Send_AmountText: String { return self._s[1509]! } + public var Settings_About: String { return self._s[1510]! } public func Channel_AdminLog_MessageRestricted(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1506]!, self._r[1506]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1511]!, self._r[1511]!, [_0, _1, _2]) } - public var ChatList_Context_MarkAsRead: String { return self._s[1508]! } - public var KeyCommand_NewMessage: String { return self._s[1509]! } - public var Group_ErrorAddBlocked: String { return self._s[1510]! } + public var ChatList_Context_MarkAsRead: String { return self._s[1513]! } + public var KeyCommand_NewMessage: String { return self._s[1514]! } + public var Group_ErrorAddBlocked: String { return self._s[1515]! } public func Message_PaymentSent(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1511]!, self._r[1511]!, [_0]) - } - public var Map_LocationTitle: String { return self._s[1512]! } - public var ReportGroupLocation_Title: String { return self._s[1513]! } - public var CallSettings_UseLessDataLongDescription: String { return self._s[1514]! } - public var Cache_ClearProgress: String { return self._s[1515]! } - public func Channel_Management_ErrorNotMember(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1516]!, self._r[1516]!, [_0]) } - public var GroupRemoved_AddToGroup: String { return self._s[1517]! } - public var Passport_UpdateRequiredError: String { return self._s[1518]! } - public var Wallet_SecureStorageNotAvailable_Text: String { return self._s[1519]! } + public var Map_LocationTitle: String { return self._s[1517]! } + public var ReportGroupLocation_Title: String { return self._s[1518]! } + public var CallSettings_UseLessDataLongDescription: String { return self._s[1519]! } + public var Cache_ClearProgress: String { return self._s[1520]! } + public func Channel_Management_ErrorNotMember(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1521]!, self._r[1521]!, [_0]) + } + public var GroupRemoved_AddToGroup: String { return self._s[1522]! } + public var Passport_UpdateRequiredError: String { return self._s[1523]! } + public var Wallet_SecureStorageNotAvailable_Text: String { return self._s[1524]! } public func PUSH_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1520]!, self._r[1520]!, [_1]) + return formatWithArgumentRanges(self._s[1525]!, self._r[1525]!, [_1]) } - public var Notifications_PermissionsSuppressWarningText: String { return self._s[1522]! } - public var Passport_Identity_MainPageHelp: String { return self._s[1523]! } - public var Conversation_StatusKickedFromGroup: String { return self._s[1524]! } - public var Passport_Language_ka: String { return self._s[1525]! } + public var Notifications_PermissionsSuppressWarningText: String { return self._s[1527]! } + public var Passport_Identity_MainPageHelp: String { return self._s[1528]! } + public var Conversation_StatusKickedFromGroup: String { return self._s[1529]! } + public var Passport_Language_ka: String { return self._s[1530]! } public func Wallet_Time_PreciseDate_m12(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1526]!, self._r[1526]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1531]!, self._r[1531]!, [_1, _2, _3]) } - public var Call_Decline: String { return self._s[1527]! } - public var SocksProxySetup_ProxyEnabled: String { return self._s[1528]! } - public var TwoFactorSetup_Email_SkipConfirmationText: String { return self._s[1531]! } + public var Call_Decline: String { return self._s[1532]! } + public var SocksProxySetup_ProxyEnabled: String { return self._s[1533]! } + public var TwoFactorSetup_Email_SkipConfirmationText: String { return self._s[1536]! } public func AuthCode_Alert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1532]!, self._r[1532]!, [_0]) + return formatWithArgumentRanges(self._s[1537]!, self._r[1537]!, [_0]) } - public var CallFeedback_Send: String { return self._s[1533]! } - public var EditTheme_EditTitle: String { return self._s[1534]! } + public var CallFeedback_Send: String { return self._s[1538]! } + public var EditTheme_EditTitle: String { return self._s[1539]! } public func Channel_AdminLog_MessagePromotedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1535]!, self._r[1535]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1540]!, self._r[1540]!, [_1, _2]) } - public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1536]! } + public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1541]! } public func Wallet_Updated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1538]!, self._r[1538]!, [_0]) + return formatWithArgumentRanges(self._s[1543]!, self._r[1543]!, [_0]) } - public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1539]! } - public var Passport_DeletePassport: String { return self._s[1540]! } - public var Appearance_AppIconFilled: String { return self._s[1541]! } - public var Privacy_Calls_P2PAlways: String { return self._s[1542]! } - public var Month_ShortDecember: String { return self._s[1543]! } - public var Channel_AdminLog_CanEditMessages: String { return self._s[1545]! } + public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1544]! } + public var Passport_DeletePassport: String { return self._s[1545]! } + public var Appearance_AppIconFilled: String { return self._s[1546]! } + public var Privacy_Calls_P2PAlways: String { return self._s[1547]! } + public var Month_ShortDecember: String { return self._s[1548]! } + public var Channel_AdminLog_CanEditMessages: String { return self._s[1550]! } public func Contacts_AccessDeniedHelpLandscape(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1546]!, self._r[1546]!, [_0]) + return formatWithArgumentRanges(self._s[1551]!, self._r[1551]!, [_0]) } - public var Channel_Stickers_Searching: String { return self._s[1547]! } - public var Conversation_EncryptedDescription1: String { return self._s[1548]! } - public var Conversation_EncryptedDescription2: String { return self._s[1549]! } - public var PasscodeSettings_PasscodeOptions: String { return self._s[1550]! } - public var Conversation_EncryptedDescription3: String { return self._s[1552]! } - public var PhotoEditor_SharpenTool: String { return self._s[1553]! } - public var Wallet_Configuration_Title: String { return self._s[1554]! } + public var Channel_Stickers_Searching: String { return self._s[1552]! } + public var Conversation_EncryptedDescription1: String { return self._s[1553]! } + public var Conversation_EncryptedDescription2: String { return self._s[1554]! } + public var PasscodeSettings_PasscodeOptions: String { return self._s[1555]! } + public var Conversation_EncryptedDescription3: String { return self._s[1557]! } + public var PhotoEditor_SharpenTool: String { return self._s[1558]! } + public var Wallet_Configuration_Title: String { return self._s[1559]! } public func Conversation_AddNameToContacts(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1555]!, self._r[1555]!, [_0]) + return formatWithArgumentRanges(self._s[1560]!, self._r[1560]!, [_0]) } - public var Conversation_EncryptedDescription4: String { return self._s[1557]! } - public var Channel_Members_AddMembers: String { return self._s[1558]! } - public var Wallpaper_Search: String { return self._s[1559]! } - public var Weekday_Friday: String { return self._s[1561]! } - public var Privacy_ContactsSync: String { return self._s[1562]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1563]! } - public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1564]! } + public var Conversation_EncryptedDescription4: String { return self._s[1562]! } + public var Channel_Members_AddMembers: String { return self._s[1563]! } + public var Wallpaper_Search: String { return self._s[1564]! } + public var Weekday_Friday: String { return self._s[1566]! } + public var Privacy_ContactsSync: String { return self._s[1567]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1568]! } + public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1569]! } public func Channel_Management_RestrictedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1565]!, self._r[1565]!, [_0]) - } - public var Wallet_Configuration_BlockchainIdHeader: String { return self._s[1566]! } - public var GroupInfo_Permissions_Removed: String { return self._s[1567]! } - public var ScheduledMessages_ScheduledOnline: String { return self._s[1568]! } - public var Passport_Identity_GenderMale: String { return self._s[1569]! } - public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1570]!, self._r[1570]!, [_0]) } - public var Notifications_PermissionsKeepDisabled: String { return self._s[1571]! } - public var Conversation_JumpToDate: String { return self._s[1572]! } - public var Contacts_GlobalSearch: String { return self._s[1573]! } - public var AutoDownloadSettings_ResetHelp: String { return self._s[1574]! } - public var SettingsSearch_Synonyms_FAQ: String { return self._s[1575]! } - public var Profile_MessageLifetime1d: String { return self._s[1576]! } + public var Wallet_Configuration_BlockchainIdHeader: String { return self._s[1571]! } + public var GroupInfo_Permissions_Removed: String { return self._s[1572]! } + public var ScheduledMessages_ScheduledOnline: String { return self._s[1573]! } + public var Passport_Identity_GenderMale: String { return self._s[1574]! } + public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1575]!, self._r[1575]!, [_0]) + } + public var Notifications_PermissionsKeepDisabled: String { return self._s[1576]! } + public var Conversation_JumpToDate: String { return self._s[1577]! } + public var Contacts_GlobalSearch: String { return self._s[1578]! } + public var AutoDownloadSettings_ResetHelp: String { return self._s[1579]! } + public var SettingsSearch_Synonyms_FAQ: String { return self._s[1580]! } + public var Profile_MessageLifetime1d: String { return self._s[1581]! } public func MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1577]!, self._r[1577]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1582]!, self._r[1582]!, [_1, _2]) } - public var StickerPack_BuiltinPackName: String { return self._s[1580]! } + public var StickerPack_BuiltinPackName: String { return self._s[1585]! } public func PUSH_CHAT_MESSAGE_AUDIO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1581]!, self._r[1581]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1586]!, self._r[1586]!, [_1, _2]) } - public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1582]! } - public var Passport_InfoTitle: String { return self._s[1584]! } - public var Notifications_PermissionsUnreachableText: String { return self._s[1585]! } + public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1587]! } + public var Passport_InfoTitle: String { return self._s[1589]! } + public var Notifications_PermissionsUnreachableText: String { return self._s[1590]! } public func NetworkUsageSettings_CellularUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1589]!, self._r[1589]!, [_0]) + return formatWithArgumentRanges(self._s[1594]!, self._r[1594]!, [_0]) } public func PUSH_CHAT_MESSAGE_GEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1590]!, self._r[1590]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1595]!, self._r[1595]!, [_1, _2]) } - public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1591]! } - public var Profile_BotInfo: String { return self._s[1592]! } - public var Watch_Compose_CreateMessage: String { return self._s[1593]! } - public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1594]! } - public var Month_ShortNovember: String { return self._s[1595]! } - public var Conversation_ScamWarning: String { return self._s[1596]! } - public var Wallpaper_SetCustomBackground: String { return self._s[1597]! } - public var Appearance_TextSize_Title: String { return self._s[1598]! } - public var Passport_Identity_TranslationsHelp: String { return self._s[1599]! } - public var NotificationsSound_Chime: String { return self._s[1600]! } - public var Passport_Language_ko: String { return self._s[1602]! } - public var InviteText_URL: String { return self._s[1603]! } - public var TextFormat_Monospace: String { return self._s[1604]! } + public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1596]! } + public var Profile_BotInfo: String { return self._s[1597]! } + public var Watch_Compose_CreateMessage: String { return self._s[1598]! } + public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1599]! } + public var Month_ShortNovember: String { return self._s[1600]! } + public var Conversation_ScamWarning: String { return self._s[1601]! } + public var Wallpaper_SetCustomBackground: String { return self._s[1602]! } + public var Appearance_TextSize_Title: String { return self._s[1603]! } + public var Passport_Identity_TranslationsHelp: String { return self._s[1604]! } + public var NotificationsSound_Chime: String { return self._s[1605]! } + public var Passport_Language_ko: String { return self._s[1607]! } + public var InviteText_URL: String { return self._s[1608]! } + public var TextFormat_Monospace: String { return self._s[1609]! } public func Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1605]!, self._r[1605]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1610]!, self._r[1610]!, [_1, _2, _3]) } - public var EditTheme_Edit_BottomInfo: String { return self._s[1606]! } + public var EditTheme_Edit_BottomInfo: String { return self._s[1611]! } public func Login_WillSendSms(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1607]!, self._r[1607]!, [_0]) + return formatWithArgumentRanges(self._s[1612]!, self._r[1612]!, [_0]) } public func Watch_Time_ShortWeekdayAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1608]!, self._r[1608]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1613]!, self._r[1613]!, [_1, _2]) } - public var Wallet_Words_Title: String { return self._s[1609]! } - public var Wallet_Month_ShortMay: String { return self._s[1610]! } - public var EditTheme_CreateTitle: String { return self._s[1612]! } - public var Passport_InfoLearnMore: String { return self._s[1613]! } - public var TwoStepAuth_EmailPlaceholder: String { return self._s[1614]! } - public var Passport_Identity_AddIdentityCard: String { return self._s[1615]! } - public var Your_card_has_expired: String { return self._s[1616]! } - public var StickerPacksSettings_StickerPacksSection: String { return self._s[1617]! } - public var GroupInfo_InviteLink_Help: String { return self._s[1618]! } - public var TwoFactorSetup_EmailVerification_ResendAction: String { return self._s[1622]! } - public var Conversation_Report: String { return self._s[1624]! } - public var Notifications_MessageNotificationsSound: String { return self._s[1625]! } - public var Notification_MessageLifetime1m: String { return self._s[1626]! } - public var Privacy_ContactsTitle: String { return self._s[1627]! } - public var Conversation_ShareMyContactInfo: String { return self._s[1628]! } - public var Wallet_WordCheck_Title: String { return self._s[1629]! } - public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1630]! } - public var Channel_Members_Title: String { return self._s[1631]! } - public var Map_OpenInWaze: String { return self._s[1632]! } - public var Appearance_RemoveThemeColorConfirmation: String { return self._s[1633]! } - public var Login_PhoneBannedError: String { return self._s[1634]! } + public var Wallet_Words_Title: String { return self._s[1614]! } + public var Wallet_Month_ShortMay: String { return self._s[1615]! } + public var EditTheme_CreateTitle: String { return self._s[1617]! } + public var Passport_InfoLearnMore: String { return self._s[1618]! } + public var TwoStepAuth_EmailPlaceholder: String { return self._s[1619]! } + public var Passport_Identity_AddIdentityCard: String { return self._s[1620]! } + public var Your_card_has_expired: String { return self._s[1621]! } + public var StickerPacksSettings_StickerPacksSection: String { return self._s[1622]! } + public var GroupInfo_InviteLink_Help: String { return self._s[1623]! } + public var TwoFactorSetup_EmailVerification_ResendAction: String { return self._s[1627]! } + public var Conversation_Report: String { return self._s[1629]! } + public var Notifications_MessageNotificationsSound: String { return self._s[1630]! } + public var Notification_MessageLifetime1m: String { return self._s[1631]! } + public var Privacy_ContactsTitle: String { return self._s[1632]! } + public var Conversation_ShareMyContactInfo: String { return self._s[1633]! } + public var Wallet_WordCheck_Title: String { return self._s[1634]! } + public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1635]! } + public var Channel_Members_Title: String { return self._s[1636]! } + public var Map_OpenInWaze: String { return self._s[1637]! } + public var Appearance_RemoveThemeColorConfirmation: String { return self._s[1638]! } + public var Login_PhoneBannedError: String { return self._s[1639]! } public func LiveLocationUpdated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1635]!, self._r[1635]!, [_0]) + return formatWithArgumentRanges(self._s[1640]!, self._r[1640]!, [_0]) } - public var IntentsSettings_MainAccount: String { return self._s[1636]! } - public var Group_Management_AddModeratorHelp: String { return self._s[1637]! } - public var AutoDownloadSettings_WifiTitle: String { return self._s[1638]! } - public var Common_OK: String { return self._s[1639]! } - public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1640]! } - public var Wallet_Words_NotDoneResponse: String { return self._s[1641]! } - public var Cache_Music: String { return self._s[1642]! } - public var Wallet_Configuration_SourceURL: String { return self._s[1643]! } - public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1644]! } - public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1646]! } - public var TwoStepAuth_HintPlaceholder: String { return self._s[1647]! } + public var IntentsSettings_MainAccount: String { return self._s[1641]! } + public var Group_Management_AddModeratorHelp: String { return self._s[1642]! } + public var AutoDownloadSettings_WifiTitle: String { return self._s[1643]! } + public var Common_OK: String { return self._s[1644]! } + public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1645]! } + public var Wallet_Words_NotDoneResponse: String { return self._s[1646]! } + public var Cache_Music: String { return self._s[1647]! } + public var Wallet_Configuration_SourceURL: String { return self._s[1648]! } + public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1649]! } + public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1652]! } + public var TwoStepAuth_HintPlaceholder: String { return self._s[1653]! } public func PUSH_PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1648]!, self._r[1648]!, [_1]) + return formatWithArgumentRanges(self._s[1654]!, self._r[1654]!, [_1]) } public func Passport_RequestHeader(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1649]!, self._r[1649]!, [_0]) + return formatWithArgumentRanges(self._s[1655]!, self._r[1655]!, [_0]) } - public var TwoFactorSetup_Done_Action: String { return self._s[1650]! } + public var TwoFactorSetup_Done_Action: String { return self._s[1656]! } public func VoiceOver_Chat_ContactOrganization(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1651]!, self._r[1651]!, [_0]) + return formatWithArgumentRanges(self._s[1657]!, self._r[1657]!, [_0]) } - public var Wallet_Send_ErrorNotEnoughFundsText: String { return self._s[1652]! } - public var Watch_MessageView_ViewOnPhone: String { return self._s[1654]! } - public var Privacy_Calls_CustomShareHelp: String { return self._s[1655]! } - public var Wallet_Receive_CreateInvoiceInfo: String { return self._s[1657]! } - public var ChangePhoneNumberNumber_Title: String { return self._s[1658]! } - public var State_ConnectingToProxyInfo: String { return self._s[1659]! } - public var Conversation_SwipeToReplyHintTitle: String { return self._s[1660]! } - public var Message_VideoMessage: String { return self._s[1662]! } - public var ChannelInfo_DeleteChannel: String { return self._s[1663]! } - public var ContactInfo_PhoneLabelOther: String { return self._s[1664]! } - public var Channel_EditAdmin_CannotEdit: String { return self._s[1665]! } - public var Passport_DeleteAddressConfirmation: String { return self._s[1666]! } + public var Wallet_Send_ErrorNotEnoughFundsText: String { return self._s[1658]! } + public var Watch_MessageView_ViewOnPhone: String { return self._s[1660]! } + public var Privacy_Calls_CustomShareHelp: String { return self._s[1661]! } + public var Wallet_Receive_CreateInvoiceInfo: String { return self._s[1663]! } + public var ChangePhoneNumberNumber_Title: String { return self._s[1664]! } + public var State_ConnectingToProxyInfo: String { return self._s[1665]! } + public var Conversation_SwipeToReplyHintTitle: String { return self._s[1666]! } + public var Message_VideoMessage: String { return self._s[1668]! } + public var ChannelInfo_DeleteChannel: String { return self._s[1669]! } + public var ContactInfo_PhoneLabelOther: String { return self._s[1670]! } + public var Channel_EditAdmin_CannotEdit: String { return self._s[1671]! } + public var Passport_DeleteAddressConfirmation: String { return self._s[1672]! } public func Wallet_Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1667]!, self._r[1667]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1673]!, self._r[1673]!, [_1, _2, _3]) } - public var WallpaperPreview_SwipeBottomText: String { return self._s[1668]! } - public var Activity_RecordingAudio: String { return self._s[1669]! } - public var SettingsSearch_Synonyms_Watch: String { return self._s[1670]! } - public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1671]! } - public var Wallet_Info_Address: String { return self._s[1672]! } + public var WallpaperPreview_SwipeBottomText: String { return self._s[1674]! } + public var Activity_RecordingAudio: String { return self._s[1675]! } + public var SettingsSearch_Synonyms_Watch: String { return self._s[1676]! } + public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1677]! } + public var Wallet_Info_Address: String { return self._s[1678]! } public func Notification_ChangedGroupName(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1674]!, self._r[1674]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1680]!, self._r[1680]!, [_0, _1]) } public func EmptyGroupInfo_Line1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1678]!, self._r[1678]!, [_0]) + return formatWithArgumentRanges(self._s[1684]!, self._r[1684]!, [_0]) } - public var Conversation_ApplyLocalization: String { return self._s[1679]! } - public var TwoFactorSetup_Intro_Action: String { return self._s[1680]! } - public var UserInfo_AddPhone: String { return self._s[1681]! } - public var Map_ShareLiveLocationHelp: String { return self._s[1682]! } + public var Conversation_ApplyLocalization: String { return self._s[1685]! } + public var TwoFactorSetup_Intro_Action: String { return self._s[1686]! } + public var UserInfo_AddPhone: String { return self._s[1687]! } + public var Map_ShareLiveLocationHelp: String { return self._s[1688]! } public func Passport_Identity_NativeNameGenericHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1683]!, self._r[1683]!, [_0]) + return formatWithArgumentRanges(self._s[1689]!, self._r[1689]!, [_0]) } - public var Passport_Scans: String { return self._s[1685]! } - public var BlockedUsers_Unblock: String { return self._s[1686]! } + public var Passport_Scans: String { return self._s[1691]! } + public var BlockedUsers_Unblock: String { return self._s[1692]! } public func PUSH_ENCRYPTION_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1687]!, self._r[1687]!, [_1]) + return formatWithArgumentRanges(self._s[1693]!, self._r[1693]!, [_1]) } - public var Channel_Management_LabelCreator: String { return self._s[1688]! } - public var Conversation_ReportSpamAndLeave: String { return self._s[1689]! } - public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1690]! } - public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1691]! } - public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1692]! } + public var Channel_Management_LabelCreator: String { return self._s[1694]! } + public var Conversation_ReportSpamAndLeave: String { return self._s[1695]! } + public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1696]! } + public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1697]! } + public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1698]! } public func Login_EmailPhoneBody(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1693]!, self._r[1693]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1699]!, self._r[1699]!, [_0, _1, _2]) } - public var Login_PhoneNumberHelp: String { return self._s[1694]! } - public var LastSeen_ALongTimeAgo: String { return self._s[1695]! } - public var Channel_AdminLog_CanPinMessages: String { return self._s[1696]! } - public var ChannelIntro_CreateChannel: String { return self._s[1697]! } - public var Conversation_UnreadMessages: String { return self._s[1698]! } - public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1699]! } - public var Channel_AdminLog_EmptyText: String { return self._s[1700]! } - public var Theme_Context_Apply: String { return self._s[1701]! } - public var Notification_GroupActivated: String { return self._s[1702]! } - public var NotificationSettings_ContactJoinedInfo: String { return self._s[1703]! } - public var Wallet_Intro_CreateWallet: String { return self._s[1704]! } + public var Login_PhoneNumberHelp: String { return self._s[1700]! } + public var LastSeen_ALongTimeAgo: String { return self._s[1701]! } + public var Channel_AdminLog_CanPinMessages: String { return self._s[1702]! } + public var ChannelIntro_CreateChannel: String { return self._s[1703]! } + public var Conversation_UnreadMessages: String { return self._s[1704]! } + public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1705]! } + public var Channel_AdminLog_EmptyText: String { return self._s[1706]! } + public var Theme_Context_Apply: String { return self._s[1707]! } + public var Notification_GroupActivated: String { return self._s[1708]! } + public var NotificationSettings_ContactJoinedInfo: String { return self._s[1709]! } + public var Wallet_Intro_CreateWallet: String { return self._s[1710]! } public func Notification_PinnedContactMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1705]!, self._r[1705]!, [_0]) + return formatWithArgumentRanges(self._s[1711]!, self._r[1711]!, [_0]) } public func DownloadingStatus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1706]!, self._r[1706]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1712]!, self._r[1712]!, [_0, _1]) } - public var GroupInfo_ConvertToSupergroup: String { return self._s[1708]! } + public var GroupInfo_ConvertToSupergroup: String { return self._s[1714]! } public func PrivacyPolicy_AgeVerificationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1709]!, self._r[1709]!, [_0]) + return formatWithArgumentRanges(self._s[1715]!, self._r[1715]!, [_0]) } - public var Undo_DeletedChannel: String { return self._s[1710]! } - public var CallFeedback_AddComment: String { return self._s[1711]! } + public var Undo_DeletedChannel: String { return self._s[1716]! } + public var CallFeedback_AddComment: String { return self._s[1717]! } public func Conversation_OpenBotLinkAllowMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1712]!, self._r[1712]!, [_0]) + return formatWithArgumentRanges(self._s[1718]!, self._r[1718]!, [_0]) } - public var Document_TargetConfirmationFormat: String { return self._s[1713]! } + public var Document_TargetConfirmationFormat: String { return self._s[1719]! } public func Call_StatusOngoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1714]!, self._r[1714]!, [_0]) + return formatWithArgumentRanges(self._s[1720]!, self._r[1720]!, [_0]) } - public var LogoutOptions_SetPasscodeTitle: String { return self._s[1715]! } + public var LogoutOptions_SetPasscodeTitle: String { return self._s[1721]! } public func PUSH_CHAT_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1716]!, self._r[1716]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[1722]!, self._r[1722]!, [_1, _2, _3, _4]) } - public var Wallet_SecureStorageChanged_PasscodeText: String { return self._s[1717]! } - public var Theme_ErrorNotFound: String { return self._s[1718]! } - public var Contacts_SortByName: String { return self._s[1719]! } - public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1720]! } + public var Wallet_SecureStorageChanged_PasscodeText: String { return self._s[1723]! } + public var Theme_ErrorNotFound: String { return self._s[1724]! } + public var Contacts_SortByName: String { return self._s[1725]! } + public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1726]! } public func CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1722]!, self._r[1722]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1728]!, self._r[1728]!, [_1, _2, _3]) } - public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1723]! } - public var ScheduledMessages_EditTime: String { return self._s[1724]! } - public var Conversation_ClearSelfHistory: String { return self._s[1725]! } - public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1726]! } - public var PasscodeSettings_DoNotMatch: String { return self._s[1727]! } - public var Stickers_SuggestNone: String { return self._s[1728]! } - public var ChatSettings_Cache: String { return self._s[1729]! } - public var Settings_SaveIncomingPhotos: String { return self._s[1730]! } - public var Media_ShareThisPhoto: String { return self._s[1731]! } - public var Chat_SlowmodeTooltipPending: String { return self._s[1732]! } - public var InfoPlist_NSContactsUsageDescription: String { return self._s[1733]! } - public var Conversation_ContextMenuCopyLink: String { return self._s[1734]! } - public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1735]! } - public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1736]! } - public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1737]! } - public var Appearance_ThemePreview_Chat_6_Text: String { return self._s[1738]! } + public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1729]! } + public var ScheduledMessages_EditTime: String { return self._s[1730]! } + public var Conversation_ClearSelfHistory: String { return self._s[1731]! } + public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1732]! } + public var PasscodeSettings_DoNotMatch: String { return self._s[1733]! } + public var Stickers_SuggestNone: String { return self._s[1734]! } + public var ChatSettings_Cache: String { return self._s[1735]! } + public var Settings_SaveIncomingPhotos: String { return self._s[1736]! } + public var Media_ShareThisPhoto: String { return self._s[1737]! } + public var Chat_SlowmodeTooltipPending: String { return self._s[1738]! } + public var InfoPlist_NSContactsUsageDescription: String { return self._s[1739]! } + public var Conversation_ContextMenuCopyLink: String { return self._s[1740]! } + public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1741]! } + public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1742]! } + public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1743]! } + public var Appearance_ThemePreview_Chat_6_Text: String { return self._s[1744]! } public func Wallet_SecureStorageReset_BiometryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1739]!, self._r[1739]!, [_0]) + return formatWithArgumentRanges(self._s[1745]!, self._r[1745]!, [_0]) } - public var Permissions_CellularDataTitle_v0: String { return self._s[1740]! } - public var WallpaperSearch_ColorWhite: String { return self._s[1742]! } - public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1743]! } - public var Conversation_ErrorInaccessibleMessage: String { return self._s[1744]! } - public var Map_OpenIn: String { return self._s[1745]! } + public var Permissions_CellularDataTitle_v0: String { return self._s[1746]! } + public var WallpaperSearch_ColorWhite: String { return self._s[1748]! } + public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1749]! } + public var Conversation_ErrorInaccessibleMessage: String { return self._s[1750]! } + public var Map_OpenIn: String { return self._s[1751]! } public func PUSH_PHONE_CALL_MISSED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1748]!, self._r[1748]!, [_1]) + return formatWithArgumentRanges(self._s[1754]!, self._r[1754]!, [_1]) } public func ChannelInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1749]!, self._r[1749]!, [_0]) + return formatWithArgumentRanges(self._s[1755]!, self._r[1755]!, [_0]) } - public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1750]! } - public var MessagePoll_LabelClosed: String { return self._s[1751]! } - public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1753]! } - public var Wallet_Send_SendAnyway: String { return self._s[1754]! } - public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1755]! } - public var UserInfo_FirstNamePlaceholder: String { return self._s[1756]! } - public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1757]! } - public var Map_SetThisPlace: String { return self._s[1758]! } - public var Login_SelectCountry_Title: String { return self._s[1759]! } - public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1760]! } + public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1756]! } + public var MessagePoll_LabelClosed: String { return self._s[1757]! } + public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1759]! } + public var Wallet_Send_SendAnyway: String { return self._s[1760]! } + public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1761]! } + public var UserInfo_FirstNamePlaceholder: String { return self._s[1762]! } + public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1763]! } + public var Map_SetThisPlace: String { return self._s[1764]! } + public var Login_SelectCountry_Title: String { return self._s[1765]! } + public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1766]! } public func Conversation_OpenBotLinkLogin(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1761]!, self._r[1761]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1767]!, self._r[1767]!, [_1, _2]) } - public var Channel_AdminLog_ChangeInfo: String { return self._s[1762]! } - public var Watch_Suggestion_BRB: String { return self._s[1763]! } - public var Passport_Identity_EditIdentityCard: String { return self._s[1764]! } - public var Contacts_PermissionsTitle: String { return self._s[1765]! } - public var Conversation_RestrictedInline: String { return self._s[1766]! } - public var Appearance_RemoveThemeColor: String { return self._s[1768]! } - public var StickerPack_ViewPack: String { return self._s[1769]! } - public var Wallet_UnknownError: String { return self._s[1770]! } + public var Channel_AdminLog_ChangeInfo: String { return self._s[1768]! } + public var Watch_Suggestion_BRB: String { return self._s[1769]! } + public var Passport_Identity_EditIdentityCard: String { return self._s[1770]! } + public var Contacts_PermissionsTitle: String { return self._s[1771]! } + public var Conversation_RestrictedInline: String { return self._s[1772]! } + public var Appearance_RemoveThemeColor: String { return self._s[1774]! } + public var StickerPack_ViewPack: String { return self._s[1775]! } + public var Wallet_UnknownError: String { return self._s[1776]! } public func Update_AppVersion(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1771]!, self._r[1771]!, [_0]) + return formatWithArgumentRanges(self._s[1777]!, self._r[1777]!, [_0]) } - public var Compose_NewChannel: String { return self._s[1773]! } - public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1776]! } - public var MessagePoll_LabelQuiz: String { return self._s[1778]! } - public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1779]! } - public var Channel_Info_Stickers: String { return self._s[1780]! } - public var AutoNightTheme_PreferredTheme: String { return self._s[1781]! } - public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1782]! } - public var Passport_DeletePersonalDetails: String { return self._s[1783]! } - public var LogoutOptions_AddAccountTitle: String { return self._s[1784]! } - public var Channel_DiscussionGroupInfo: String { return self._s[1785]! } - public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1786]! } - public var Conversation_SearchNoResults: String { return self._s[1789]! } - public var Wallet_Configuration_ApplyErrorTextURLInvalid: String { return self._s[1790]! } - public var MessagePoll_LabelAnonymous: String { return self._s[1791]! } - public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1792]! } - public var Login_Code: String { return self._s[1793]! } - public var EditTheme_Create_BottomInfo: String { return self._s[1794]! } - public var Watch_Suggestion_WhatsUp: String { return self._s[1795]! } - public var Weekday_ShortThursday: String { return self._s[1796]! } - public var Resolve_ErrorNotFound: String { return self._s[1798]! } - public var LastSeen_Offline: String { return self._s[1799]! } - public var PeopleNearby_NoMembers: String { return self._s[1800]! } - public var GroupPermission_AddMembersNotAvailable: String { return self._s[1801]! } - public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1802]! } - public var GroupInfo_Title: String { return self._s[1804]! } - public var NotificationsSound_Note: String { return self._s[1805]! } - public var Conversation_EditingMessagePanelTitle: String { return self._s[1806]! } - public var Watch_Message_Poll: String { return self._s[1807]! } - public var Privacy_Calls: String { return self._s[1808]! } + public var Compose_NewChannel: String { return self._s[1779]! } + public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1782]! } + public var MessagePoll_LabelQuiz: String { return self._s[1784]! } + public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1785]! } + public var Channel_Info_Stickers: String { return self._s[1786]! } + public var AutoNightTheme_PreferredTheme: String { return self._s[1787]! } + public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1788]! } + public var Passport_DeletePersonalDetails: String { return self._s[1789]! } + public var LogoutOptions_AddAccountTitle: String { return self._s[1790]! } + public var Channel_DiscussionGroupInfo: String { return self._s[1791]! } + public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1792]! } + public var Conversation_SearchNoResults: String { return self._s[1795]! } + public var Wallet_Configuration_ApplyErrorTextURLInvalid: String { return self._s[1796]! } + public var MessagePoll_LabelAnonymous: String { return self._s[1797]! } + public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1798]! } + public var Login_Code: String { return self._s[1799]! } + public var EditTheme_Create_BottomInfo: String { return self._s[1800]! } + public var Watch_Suggestion_WhatsUp: String { return self._s[1801]! } + public var Weekday_ShortThursday: String { return self._s[1802]! } + public var Resolve_ErrorNotFound: String { return self._s[1804]! } + public var LastSeen_Offline: String { return self._s[1805]! } + public var PeopleNearby_NoMembers: String { return self._s[1806]! } + public var GroupPermission_AddMembersNotAvailable: String { return self._s[1807]! } + public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1808]! } + public var GroupInfo_Title: String { return self._s[1810]! } + public var NotificationsSound_Note: String { return self._s[1811]! } + public var Conversation_EditingMessagePanelTitle: String { return self._s[1812]! } + public var Watch_Message_Poll: String { return self._s[1813]! } + public var Privacy_Calls: String { return self._s[1814]! } public func Channel_AdminLog_MessageRankUsername(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1809]!, self._r[1809]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1815]!, self._r[1815]!, [_1, _2, _3]) } - public var Month_ShortAugust: String { return self._s[1810]! } - public var TwoStepAuth_SetPasswordHelp: String { return self._s[1811]! } - public var Notifications_Reset: String { return self._s[1812]! } - public var Conversation_Pin: String { return self._s[1813]! } - public var Passport_Language_lv: String { return self._s[1814]! } - public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1815]! } - public var BlockedUsers_Info: String { return self._s[1816]! } - public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1818]! } - public var Watch_Conversation_Unblock: String { return self._s[1820]! } + public var Month_ShortAugust: String { return self._s[1816]! } + public var TwoStepAuth_SetPasswordHelp: String { return self._s[1817]! } + public var Notifications_Reset: String { return self._s[1818]! } + public var Conversation_Pin: String { return self._s[1819]! } + public var Passport_Language_lv: String { return self._s[1820]! } + public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1821]! } + public var BlockedUsers_Info: String { return self._s[1822]! } + public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1824]! } + public var Watch_Conversation_Unblock: String { return self._s[1826]! } public func Time_MonthOfYear_m9(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1821]!, self._r[1821]!, [_0]) + return formatWithArgumentRanges(self._s[1827]!, self._r[1827]!, [_0]) } - public var CloudStorage_Title: String { return self._s[1822]! } - public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1823]! } + public var CloudStorage_Title: String { return self._s[1828]! } + public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1829]! } public func NetworkUsageSettings_WifiUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1824]!, self._r[1824]!, [_0]) + return formatWithArgumentRanges(self._s[1830]!, self._r[1830]!, [_0]) } - public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1825]! } - public var Watch_Suggestion_OnMyWay: String { return self._s[1826]! } - public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1827]! } - public var Passport_Address_EditBankStatement: String { return self._s[1828]! } + public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1831]! } + public var Watch_Suggestion_OnMyWay: String { return self._s[1832]! } + public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1833]! } + public var Passport_Address_EditBankStatement: String { return self._s[1834]! } public func Channel_AdminLog_MessageChangedUnlinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1829]!, self._r[1829]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1835]!, self._r[1835]!, [_1, _2]) } - public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1830]! } - public var ShareMenu_Comment: String { return self._s[1831]! } - public var Permissions_ContactsTitle_v0: String { return self._s[1832]! } - public var Notifications_PermissionsTitle: String { return self._s[1833]! } - public var GroupPermission_NoSendLinks: String { return self._s[1834]! } - public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1835]! } - public var Wallet_SecureStorageChanged_ImportWallet: String { return self._s[1836]! } - public var Settings_Support: String { return self._s[1837]! } - public var Notifications_ChannelNotificationsSound: String { return self._s[1838]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1839]! } - public var Privacy_Forwards_Preview: String { return self._s[1840]! } - public var GroupPermission_ApplyAlertAction: String { return self._s[1841]! } - public var Watch_Stickers_StickerPacks: String { return self._s[1842]! } - public var Common_Select: String { return self._s[1844]! } - public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1845]! } - public var WallpaperSearch_ColorGray: String { return self._s[1848]! } - public var TwoFactorSetup_Password_PlaceholderPassword: String { return self._s[1849]! } - public var TwoFactorSetup_Hint_SkipAction: String { return self._s[1850]! } - public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1851]! } - public var PollResults_Title: String { return self._s[1852]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1853]! } - public var Appearance_PreviewReplyAuthor: String { return self._s[1854]! } - public var TwoStepAuth_RecoveryTitle: String { return self._s[1855]! } - public var Widget_AuthRequired: String { return self._s[1856]! } - public var Camera_FlashOn: String { return self._s[1857]! } - public var Conversation_ContextMenuLookUp: String { return self._s[1858]! } - public var Channel_Stickers_NotFoundHelp: String { return self._s[1859]! } - public var Watch_Suggestion_OK: String { return self._s[1860]! } + public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1836]! } + public var ShareMenu_Comment: String { return self._s[1837]! } + public var Permissions_ContactsTitle_v0: String { return self._s[1838]! } + public var Notifications_PermissionsTitle: String { return self._s[1839]! } + public var GroupPermission_NoSendLinks: String { return self._s[1840]! } + public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1841]! } + public var Wallet_SecureStorageChanged_ImportWallet: String { return self._s[1842]! } + public var Settings_Support: String { return self._s[1843]! } + public var Notifications_ChannelNotificationsSound: String { return self._s[1844]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1845]! } + public var Privacy_Forwards_Preview: String { return self._s[1846]! } + public var GroupPermission_ApplyAlertAction: String { return self._s[1847]! } + public var Watch_Stickers_StickerPacks: String { return self._s[1848]! } + public var Common_Select: String { return self._s[1850]! } + public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1851]! } + public var WallpaperSearch_ColorGray: String { return self._s[1854]! } + public var TwoFactorSetup_Password_PlaceholderPassword: String { return self._s[1855]! } + public var TwoFactorSetup_Hint_SkipAction: String { return self._s[1856]! } + public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1857]! } + public var PollResults_Title: String { return self._s[1858]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1859]! } + public var Appearance_PreviewReplyAuthor: String { return self._s[1860]! } + public var TwoStepAuth_RecoveryTitle: String { return self._s[1861]! } + public var Widget_AuthRequired: String { return self._s[1862]! } + public var Camera_FlashOn: String { return self._s[1863]! } + public var Conversation_ContextMenuLookUp: String { return self._s[1864]! } + public var Channel_Stickers_NotFoundHelp: String { return self._s[1865]! } + public var Watch_Suggestion_OK: String { return self._s[1866]! } public func Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1862]!, self._r[1862]!, [_0]) + return formatWithArgumentRanges(self._s[1868]!, self._r[1868]!, [_0]) } public func Notification_PinnedLiveLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1864]!, self._r[1864]!, [_0]) + return formatWithArgumentRanges(self._s[1870]!, self._r[1870]!, [_0]) } - public var TextFormat_Strikethrough: String { return self._s[1865]! } - public var DialogList_AdLabel: String { return self._s[1866]! } - public var WatchRemote_NotificationText: String { return self._s[1867]! } - public var IntentsSettings_SuggestedChatsSavedMessages: String { return self._s[1868]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1869]! } - public var Conversation_ReportSpam: String { return self._s[1870]! } - public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1871]! } - public var Settings_LogoutConfirmationTitle: String { return self._s[1873]! } - public var PhoneLabel_Title: String { return self._s[1874]! } - public var Passport_Address_EditRentalAgreement: String { return self._s[1875]! } - public var Settings_ChangePhoneNumber: String { return self._s[1876]! } - public var Notifications_ExceptionsTitle: String { return self._s[1877]! } - public var Notifications_AlertTones: String { return self._s[1878]! } - public var Call_ReportIncludeLogDescription: String { return self._s[1879]! } - public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1880]! } - public var AutoDownloadSettings_PrivateChats: String { return self._s[1881]! } - public var VoiceOver_Chat_Photo: String { return self._s[1883]! } - public var TwoStepAuth_AddHintTitle: String { return self._s[1884]! } - public var ReportPeer_ReasonOther: String { return self._s[1885]! } - public var ChatList_Context_JoinChannel: String { return self._s[1886]! } - public var KeyCommand_ScrollDown: String { return self._s[1888]! } - public var Conversation_ScheduleMessage_Title: String { return self._s[1889]! } + public var TextFormat_Strikethrough: String { return self._s[1871]! } + public var DialogList_AdLabel: String { return self._s[1872]! } + public var WatchRemote_NotificationText: String { return self._s[1873]! } + public var IntentsSettings_SuggestedChatsSavedMessages: String { return self._s[1874]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1875]! } + public var Conversation_ReportSpam: String { return self._s[1876]! } + public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1877]! } + public var Settings_LogoutConfirmationTitle: String { return self._s[1879]! } + public var PhoneLabel_Title: String { return self._s[1880]! } + public var Passport_Address_EditRentalAgreement: String { return self._s[1881]! } + public var Settings_ChangePhoneNumber: String { return self._s[1882]! } + public var Notifications_ExceptionsTitle: String { return self._s[1883]! } + public var Notifications_AlertTones: String { return self._s[1884]! } + public var Call_ReportIncludeLogDescription: String { return self._s[1885]! } + public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1886]! } + public var AutoDownloadSettings_PrivateChats: String { return self._s[1887]! } + public var VoiceOver_Chat_Photo: String { return self._s[1889]! } + public var TwoStepAuth_AddHintTitle: String { return self._s[1890]! } + public var ReportPeer_ReasonOther: String { return self._s[1891]! } + public var ChatList_Context_JoinChannel: String { return self._s[1892]! } + public var KeyCommand_ScrollDown: String { return self._s[1894]! } + public var Conversation_ScheduleMessage_Title: String { return self._s[1895]! } public func Login_BannedPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1890]!, self._r[1890]!, [_0]) + return formatWithArgumentRanges(self._s[1896]!, self._r[1896]!, [_0]) } - public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1891]! } - public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1892]! } - public var AuthSessions_LogOut: String { return self._s[1893]! } - public var Passport_Identity_TypeInternalPassport: String { return self._s[1894]! } - public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1895]! } - public var Passport_Phone_Title: String { return self._s[1896]! } - public var ContactList_Context_StartSecretChat: String { return self._s[1897]! } - public var Settings_PhoneNumber: String { return self._s[1898]! } + public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1897]! } + public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1898]! } + public var AuthSessions_LogOut: String { return self._s[1899]! } + public var Passport_Identity_TypeInternalPassport: String { return self._s[1900]! } + public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1901]! } + public var Passport_Phone_Title: String { return self._s[1902]! } + public var ContactList_Context_StartSecretChat: String { return self._s[1903]! } + public var Settings_PhoneNumber: String { return self._s[1904]! } public func Conversation_ScheduleMessage_SendToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1899]!, self._r[1899]!, [_0]) + return formatWithArgumentRanges(self._s[1905]!, self._r[1905]!, [_0]) } - public var NotificationsSound_Alert: String { return self._s[1901]! } - public var Wallet_SecureStorageChanged_CreateWallet: String { return self._s[1902]! } - public var WebSearch_SearchNoResults: String { return self._s[1903]! } - public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1905]! } - public var Wallet_Configuration_SourceInfo: String { return self._s[1906]! } - public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1907]! } - public var SettingsSearch_Synonyms_Passport: String { return self._s[1908]! } - public var PhotoEditor_CurvesTool: String { return self._s[1909]! } - public var Checkout_PaymentMethod: String { return self._s[1911]! } + public var NotificationsSound_Alert: String { return self._s[1907]! } + public var Wallet_SecureStorageChanged_CreateWallet: String { return self._s[1908]! } + public var WebSearch_SearchNoResults: String { return self._s[1909]! } + public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1911]! } + public var Wallet_Configuration_SourceInfo: String { return self._s[1912]! } + public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1913]! } + public var SettingsSearch_Synonyms_Passport: String { return self._s[1914]! } + public var PhotoEditor_CurvesTool: String { return self._s[1915]! } + public var Checkout_PaymentMethod: String { return self._s[1917]! } public func PUSH_CHAT_ADD_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1912]!, self._r[1912]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1918]!, self._r[1918]!, [_1, _2]) } - public var Contacts_AccessDeniedError: String { return self._s[1913]! } - public var Camera_PhotoMode: String { return self._s[1916]! } - public var EditTheme_Expand_Preview_IncomingText: String { return self._s[1917]! } - public var Appearance_TextSize_Apply: String { return self._s[1918]! } - public var Passport_Address_AddUtilityBill: String { return self._s[1920]! } - public var CallSettings_OnMobile: String { return self._s[1921]! } - public var Tour_Text2: String { return self._s[1922]! } + public var Contacts_AccessDeniedError: String { return self._s[1919]! } + public var Camera_PhotoMode: String { return self._s[1922]! } + public var EditTheme_Expand_Preview_IncomingText: String { return self._s[1923]! } + public var Appearance_TextSize_Apply: String { return self._s[1924]! } + public var Passport_Address_AddUtilityBill: String { return self._s[1926]! } + public var CallSettings_OnMobile: String { return self._s[1927]! } + public var Tour_Text2: String { return self._s[1928]! } public func PUSH_CHAT_MESSAGE_ROUND(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1923]!, self._r[1923]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1929]!, self._r[1929]!, [_1, _2]) } - public var DialogList_EncryptionProcessing: String { return self._s[1925]! } - public var Permissions_Skip: String { return self._s[1926]! } - public var Wallet_Words_NotDoneOk: String { return self._s[1927]! } - public var SecretImage_Title: String { return self._s[1928]! } - public var Watch_MessageView_Title: String { return self._s[1929]! } - public var Channel_DiscussionGroupAdd: String { return self._s[1930]! } - public var AttachmentMenu_Poll: String { return self._s[1931]! } + public var DialogList_EncryptionProcessing: String { return self._s[1931]! } + public var Permissions_Skip: String { return self._s[1932]! } + public var Wallet_Words_NotDoneOk: String { return self._s[1933]! } + public var SecretImage_Title: String { return self._s[1934]! } + public var Watch_MessageView_Title: String { return self._s[1935]! } + public var Channel_DiscussionGroupAdd: String { return self._s[1936]! } + public var AttachmentMenu_Poll: String { return self._s[1937]! } public func Notification_GroupInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1932]!, self._r[1932]!, [_0]) + return formatWithArgumentRanges(self._s[1938]!, self._r[1938]!, [_0]) } public func Channel_DiscussionGroup_PrivateChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1933]!, self._r[1933]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1939]!, self._r[1939]!, [_1, _2]) } - public var Notification_CallCanceled: String { return self._s[1934]! } - public var WallpaperPreview_Title: String { return self._s[1935]! } - public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1936]! } - public var Settings_ProxyConnecting: String { return self._s[1937]! } - public var Settings_CheckPhoneNumberText: String { return self._s[1939]! } - public var VoiceOver_Chat_YourVideo: String { return self._s[1940]! } - public var Wallet_Intro_Title: String { return self._s[1941]! } - public var TwoFactorSetup_Password_Action: String { return self._s[1942]! } - public var Profile_MessageLifetime5s: String { return self._s[1943]! } - public var Username_InvalidCharacters: String { return self._s[1944]! } - public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1945]! } - public var ScheduledMessages_ClearAll: String { return self._s[1946]! } - public var WallpaperPreview_CropBottomText: String { return self._s[1947]! } - public var AutoDownloadSettings_LimitBySize: String { return self._s[1948]! } - public var Settings_AddAccount: String { return self._s[1949]! } - public var Notification_CreatedChannel: String { return self._s[1952]! } + public var Notification_CallCanceled: String { return self._s[1940]! } + public var WallpaperPreview_Title: String { return self._s[1941]! } + public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1942]! } + public var Settings_ProxyConnecting: String { return self._s[1943]! } + public var Settings_CheckPhoneNumberText: String { return self._s[1945]! } + public var VoiceOver_Chat_YourVideo: String { return self._s[1946]! } + public var Wallet_Intro_Title: String { return self._s[1947]! } + public var TwoFactorSetup_Password_Action: String { return self._s[1948]! } + public var Profile_MessageLifetime5s: String { return self._s[1949]! } + public var Username_InvalidCharacters: String { return self._s[1950]! } + public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1951]! } + public var ScheduledMessages_ClearAll: String { return self._s[1952]! } + public var WallpaperPreview_CropBottomText: String { return self._s[1953]! } + public var AutoDownloadSettings_LimitBySize: String { return self._s[1954]! } + public var Settings_AddAccount: String { return self._s[1955]! } + public var Notification_CreatedChannel: String { return self._s[1958]! } public func PUSH_CHAT_DELETE_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1953]!, self._r[1953]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1959]!, self._r[1959]!, [_1, _2, _3]) } - public var Passcode_AppLockedAlert: String { return self._s[1955]! } - public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1956]! } - public var VoiceOver_Media_PlaybackStop: String { return self._s[1957]! } - public var Contacts_TopSection: String { return self._s[1958]! } - public var ChatList_DeleteForEveryoneConfirmationAction: String { return self._s[1959]! } + public var Passcode_AppLockedAlert: String { return self._s[1961]! } + public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1962]! } + public var VoiceOver_Media_PlaybackStop: String { return self._s[1963]! } + public var Contacts_TopSection: String { return self._s[1964]! } + public var ChatList_DeleteForEveryoneConfirmationAction: String { return self._s[1965]! } public func Conversation_SetReminder_RemindOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1960]!, self._r[1960]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1966]!, self._r[1966]!, [_0, _1]) } - public var Wallet_Info_Receive: String { return self._s[1961]! } - public var Wallet_Completed_ViewWallet: String { return self._s[1962]! } + public var Wallet_Info_Receive: String { return self._s[1967]! } + public var Wallet_Completed_ViewWallet: String { return self._s[1968]! } public func Time_MonthOfYear_m6(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1963]!, self._r[1963]!, [_0]) + return formatWithArgumentRanges(self._s[1969]!, self._r[1969]!, [_0]) } - public var ReportPeer_ReasonSpam: String { return self._s[1964]! } - public var UserInfo_TapToCall: String { return self._s[1965]! } - public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1967]! } - public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1968]! } - public var Common_Search: String { return self._s[1969]! } - public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1970]! } + public var ReportPeer_ReasonSpam: String { return self._s[1970]! } + public var UserInfo_TapToCall: String { return self._s[1971]! } + public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1973]! } + public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1974]! } + public var Common_Search: String { return self._s[1975]! } + public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1976]! } public func Channel_AdminLog_MessageChangedGroupGeoLocation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1971]!, self._r[1971]!, [_0]) + return formatWithArgumentRanges(self._s[1977]!, self._r[1977]!, [_0]) } - public var Wallet_Month_ShortJuly: String { return self._s[1972]! } - public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1974]! } - public var Message_InvoiceLabel: String { return self._s[1975]! } - public var Conversation_InputTextPlaceholder: String { return self._s[1976]! } - public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1977]! } + public var Wallet_Month_ShortJuly: String { return self._s[1978]! } + public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1980]! } + public var Message_InvoiceLabel: String { return self._s[1981]! } + public var Conversation_InputTextPlaceholder: String { return self._s[1982]! } + public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1983]! } public func Passport_Address_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1978]!, self._r[1978]!, [_0]) + return formatWithArgumentRanges(self._s[1984]!, self._r[1984]!, [_0]) } - public var IntentsSettings_Reset: String { return self._s[1979]! } - public var Conversation_Info: String { return self._s[1980]! } - public var Login_InfoDeletePhoto: String { return self._s[1981]! } - public var Passport_Language_vi: String { return self._s[1983]! } - public var UserInfo_ScamUserWarning: String { return self._s[1984]! } - public var Conversation_Search: String { return self._s[1985]! } - public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1987]! } - public var ReportPeer_ReasonPornography: String { return self._s[1988]! } - public var AutoDownloadSettings_PhotosTitle: String { return self._s[1989]! } - public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1990]! } - public var Map_LiveLocationGroupDescription: String { return self._s[1991]! } - public var Channel_Setup_TypeHeader: String { return self._s[1992]! } - public var AuthSessions_LoggedIn: String { return self._s[1993]! } - public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1994]! } - public var Login_SmsRequestState3: String { return self._s[1995]! } - public var Passport_Address_EditUtilityBill: String { return self._s[1996]! } - public var Appearance_ReduceMotionInfo: String { return self._s[1997]! } - public var Join_ChannelsTooMuch: String { return self._s[1998]! } - public var Channel_Edit_LinkItem: String { return self._s[1999]! } - public var Privacy_Calls_P2PNever: String { return self._s[2000]! } - public var Conversation_AddToReadingList: String { return self._s[2002]! } - public var Share_MultipleMessagesDisabled: String { return self._s[2003]! } - public var Message_Animation: String { return self._s[2004]! } - public var Conversation_DefaultRestrictedMedia: String { return self._s[2005]! } - public var Map_Unknown: String { return self._s[2006]! } - public var AutoDownloadSettings_LastDelimeter: String { return self._s[2007]! } + public var IntentsSettings_Reset: String { return self._s[1985]! } + public var Conversation_Info: String { return self._s[1986]! } + public var Login_InfoDeletePhoto: String { return self._s[1987]! } + public var Passport_Language_vi: String { return self._s[1989]! } + public var UserInfo_ScamUserWarning: String { return self._s[1990]! } + public var Conversation_Search: String { return self._s[1991]! } + public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1993]! } + public var ReportPeer_ReasonPornography: String { return self._s[1994]! } + public var AutoDownloadSettings_PhotosTitle: String { return self._s[1995]! } + public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1996]! } + public var Map_LiveLocationGroupDescription: String { return self._s[1997]! } + public var Channel_Setup_TypeHeader: String { return self._s[1998]! } + public var AuthSessions_LoggedIn: String { return self._s[1999]! } + public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[2000]! } + public var Login_SmsRequestState3: String { return self._s[2001]! } + public var Passport_Address_EditUtilityBill: String { return self._s[2002]! } + public var Appearance_ReduceMotionInfo: String { return self._s[2003]! } + public var Join_ChannelsTooMuch: String { return self._s[2004]! } + public var Channel_Edit_LinkItem: String { return self._s[2005]! } + public var Privacy_Calls_P2PNever: String { return self._s[2006]! } + public var Conversation_AddToReadingList: String { return self._s[2008]! } + public var Share_MultipleMessagesDisabled: String { return self._s[2009]! } + public var Message_Animation: String { return self._s[2010]! } + public var Conversation_DefaultRestrictedMedia: String { return self._s[2011]! } + public var Map_Unknown: String { return self._s[2012]! } + public var AutoDownloadSettings_LastDelimeter: String { return self._s[2013]! } public func PUSH_PINNED_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2008]!, self._r[2008]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2014]!, self._r[2014]!, [_1, _2]) } public func Passport_FieldOneOf_Or(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2009]!, self._r[2009]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2015]!, self._r[2015]!, [_1, _2]) } - public var Call_StatusRequesting: String { return self._s[2010]! } - public var Conversation_SecretChatContextBotAlert: String { return self._s[2011]! } - public var SocksProxySetup_ProxyStatusChecking: String { return self._s[2012]! } + public var Call_StatusRequesting: String { return self._s[2016]! } + public var Conversation_SecretChatContextBotAlert: String { return self._s[2017]! } + public var SocksProxySetup_ProxyStatusChecking: String { return self._s[2018]! } public func PUSH_CHAT_MESSAGE_DOC(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2013]!, self._r[2013]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2019]!, self._r[2019]!, [_1, _2]) } public func Notification_PinnedLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2014]!, self._r[2014]!, [_0]) + return formatWithArgumentRanges(self._s[2020]!, self._r[2020]!, [_0]) } - public var Update_Skip: String { return self._s[2015]! } - public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[2016]! } - public var Message_PinnedPollMessage: String { return self._s[2017]! } - public var BlockedUsers_Title: String { return self._s[2018]! } + public var Update_Skip: String { return self._s[2021]! } + public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[2022]! } + public var Message_PinnedPollMessage: String { return self._s[2023]! } + public var BlockedUsers_Title: String { return self._s[2024]! } public func PUSH_CHANNEL_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2019]!, self._r[2019]!, [_1]) + return formatWithArgumentRanges(self._s[2025]!, self._r[2025]!, [_1]) } - public var Username_CheckingUsername: String { return self._s[2020]! } - public var NotificationsSound_Bell: String { return self._s[2021]! } - public var Conversation_SendMessageErrorFlood: String { return self._s[2022]! } - public var Weekday_Monday: String { return self._s[2023]! } - public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[2024]! } - public var ChannelMembers_ChannelAdminsTitle: String { return self._s[2025]! } - public var ChatSettings_Groups: String { return self._s[2026]! } - public var WallpaperPreview_PatternPaternDiscard: String { return self._s[2027]! } + public var Username_CheckingUsername: String { return self._s[2026]! } + public var NotificationsSound_Bell: String { return self._s[2027]! } + public var Conversation_SendMessageErrorFlood: String { return self._s[2028]! } + public var Weekday_Monday: String { return self._s[2029]! } + public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[2030]! } + public var ChannelMembers_ChannelAdminsTitle: String { return self._s[2031]! } + public var ChatSettings_Groups: String { return self._s[2032]! } + public var WallpaperPreview_PatternPaternDiscard: String { return self._s[2033]! } public func Conversation_SetReminder_RemindTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2028]!, self._r[2028]!, [_0]) + return formatWithArgumentRanges(self._s[2034]!, self._r[2034]!, [_0]) } - public var Your_card_was_declined: String { return self._s[2029]! } - public var TwoStepAuth_EnterPasswordHelp: String { return self._s[2031]! } - public var Wallet_Month_ShortApril: String { return self._s[2032]! } - public var ChatList_Unmute: String { return self._s[2033]! } - public var AuthSessions_AddDevice_ScanTitle: String { return self._s[2034]! } - public var PhotoEditor_CurvesAll: String { return self._s[2035]! } - public var Weekday_ShortTuesday: String { return self._s[2036]! } - public var DialogList_Read: String { return self._s[2037]! } - public var Appearance_AppIconClassic: String { return self._s[2038]! } - public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[2039]! } - public var Passport_Identity_Gender: String { return self._s[2040]! } + public var Your_card_was_declined: String { return self._s[2035]! } + public var TwoStepAuth_EnterPasswordHelp: String { return self._s[2037]! } + public var Wallet_Month_ShortApril: String { return self._s[2038]! } + public var ChatList_Unmute: String { return self._s[2039]! } + public var AuthSessions_AddDevice_ScanTitle: String { return self._s[2040]! } + public var PhotoEditor_CurvesAll: String { return self._s[2041]! } + public var Weekday_ShortTuesday: String { return self._s[2042]! } + public var DialogList_Read: String { return self._s[2043]! } + public var Appearance_AppIconClassic: String { return self._s[2044]! } + public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[2045]! } + public var Passport_Identity_Gender: String { return self._s[2046]! } public func Target_ShareGameConfirmationPrivate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2041]!, self._r[2041]!, [_0]) + return formatWithArgumentRanges(self._s[2047]!, self._r[2047]!, [_0]) } - public var Target_SelectGroup: String { return self._s[2042]! } - public var Map_HomeAndWorkInfo: String { return self._s[2044]! } + public var Target_SelectGroup: String { return self._s[2048]! } + public var Map_HomeAndWorkInfo: String { return self._s[2050]! } public func DialogList_EncryptedChatStartedIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2045]!, self._r[2045]!, [_0]) + return formatWithArgumentRanges(self._s[2051]!, self._r[2051]!, [_0]) } - public var Passport_Language_en: String { return self._s[2046]! } - public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[2047]! } - public var Channel_Username_CreatePublicLinkHelp: String { return self._s[2048]! } - public var Login_CancelPhoneVerificationContinue: String { return self._s[2049]! } - public var ScheduledMessages_SendNow: String { return self._s[2050]! } - public var Checkout_NewCard_PaymentCard: String { return self._s[2052]! } - public var Login_InfoHelp: String { return self._s[2053]! } - public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[2054]! } - public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[2055]! } + public var Passport_Language_en: String { return self._s[2052]! } + public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[2053]! } + public var Channel_Username_CreatePublicLinkHelp: String { return self._s[2054]! } + public var Login_CancelPhoneVerificationContinue: String { return self._s[2055]! } + public var ScheduledMessages_SendNow: String { return self._s[2056]! } + public var Checkout_NewCard_PaymentCard: String { return self._s[2058]! } + public var Login_InfoHelp: String { return self._s[2059]! } + public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[2060]! } + public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[2061]! } public func Channel_AdminLog_MessageChangedLinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2056]!, self._r[2056]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2062]!, self._r[2062]!, [_1, _2]) } - public var SocksProxySetup_AddProxy: String { return self._s[2059]! } - public var CreatePoll_Title: String { return self._s[2060]! } - public var MessagePoll_QuizNoUsers: String { return self._s[2061]! } - public var Conversation_ViewTheme: String { return self._s[2062]! } - public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[2063]! } - public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[2064]! } - public var TwoFactorSetup_Intro_Text: String { return self._s[2065]! } - public var UserInfo_GroupsInCommon: String { return self._s[2066]! } - public var TelegramWallet_Intro_TermsUrl: String { return self._s[2067]! } - public var Call_AudioRouteHide: String { return self._s[2068]! } + public var SocksProxySetup_AddProxy: String { return self._s[2065]! } + public var CreatePoll_Title: String { return self._s[2066]! } + public var MessagePoll_QuizNoUsers: String { return self._s[2067]! } + public var Conversation_ViewTheme: String { return self._s[2068]! } + public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[2069]! } + public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[2070]! } + public var TwoFactorSetup_Intro_Text: String { return self._s[2071]! } + public var UserInfo_GroupsInCommon: String { return self._s[2072]! } + public var TelegramWallet_Intro_TermsUrl: String { return self._s[2073]! } + public var Call_AudioRouteHide: String { return self._s[2074]! } public func Wallet_Info_TransactionDateHeader(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2070]!, self._r[2070]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2076]!, self._r[2076]!, [_1, _2]) } - public var ContactInfo_PhoneLabelMobile: String { return self._s[2071]! } - public var IntentsSettings_SuggestedChatsInfo: String { return self._s[2072]! } - public var CreatePoll_QuizOptionsHeader: String { return self._s[2073]! } + public var ContactInfo_PhoneLabelMobile: String { return self._s[2077]! } + public var IntentsSettings_SuggestedChatsInfo: String { return self._s[2078]! } + public var CreatePoll_QuizOptionsHeader: String { return self._s[2079]! } public func ChatList_LeaveGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2074]!, self._r[2074]!, [_0]) + return formatWithArgumentRanges(self._s[2080]!, self._r[2080]!, [_0]) } - public var TextFormat_Bold: String { return self._s[2075]! } - public var FastTwoStepSetup_EmailSection: String { return self._s[2076]! } - public var StickerPackActionInfo_AddedTitle: String { return self._s[2077]! } - public var Notifications_Title: String { return self._s[2078]! } - public var Group_Username_InvalidTooShort: String { return self._s[2079]! } - public var Channel_ErrorAddTooMuch: String { return self._s[2080]! } + public var TextFormat_Bold: String { return self._s[2081]! } + public var FastTwoStepSetup_EmailSection: String { return self._s[2082]! } + public var StickerPackActionInfo_AddedTitle: String { return self._s[2083]! } + public var Notifications_Title: String { return self._s[2084]! } + public var Group_Username_InvalidTooShort: String { return self._s[2085]! } + public var Channel_ErrorAddTooMuch: String { return self._s[2086]! } public func DialogList_MultipleTypingSuffix(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2081]!, self._r[2081]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[2087]!, self._r[2087]!, ["\(_0)"]) } - public var VoiceOver_DiscardPreparedContent: String { return self._s[2083]! } - public var Stickers_SuggestAdded: String { return self._s[2084]! } - public var Login_CountryCode: String { return self._s[2085]! } - public var ChatSettings_AutoPlayVideos: String { return self._s[2086]! } - public var Map_GetDirections: String { return self._s[2087]! } - public var Wallet_Receive_ShareInvoiceUrl: String { return self._s[2088]! } - public var Login_PhoneFloodError: String { return self._s[2089]! } + public var VoiceOver_DiscardPreparedContent: String { return self._s[2089]! } + public var Stickers_SuggestAdded: String { return self._s[2090]! } + public var Login_CountryCode: String { return self._s[2091]! } + public var ChatSettings_AutoPlayVideos: String { return self._s[2092]! } + public var Map_GetDirections: String { return self._s[2093]! } + public var Wallet_Receive_ShareInvoiceUrl: String { return self._s[2094]! } + public var Login_PhoneFloodError: String { return self._s[2095]! } public func Time_MonthOfYear_m3(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2090]!, self._r[2090]!, [_0]) + return formatWithArgumentRanges(self._s[2096]!, self._r[2096]!, [_0]) } public func Wallet_Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2091]!, self._r[2091]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2097]!, self._r[2097]!, [_1, _2, _3]) } - public var IntentsSettings_SuggestedChatsPrivateChats: String { return self._s[2092]! } - public var Settings_SetUsername: String { return self._s[2094]! } - public var Group_Location_ChangeLocation: String { return self._s[2095]! } - public var Notification_GroupInviterSelf: String { return self._s[2096]! } - public var InstantPage_TapToOpenLink: String { return self._s[2097]! } + public var IntentsSettings_SuggestedChatsPrivateChats: String { return self._s[2098]! } + public var Settings_SetUsername: String { return self._s[2100]! } + public var Group_Location_ChangeLocation: String { return self._s[2101]! } + public var Notification_GroupInviterSelf: String { return self._s[2102]! } + public var InstantPage_TapToOpenLink: String { return self._s[2103]! } public func Notification_ChannelInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2098]!, self._r[2098]!, [_0]) + return formatWithArgumentRanges(self._s[2104]!, self._r[2104]!, [_0]) } - public var Watch_Suggestion_TalkLater: String { return self._s[2099]! } - public var SecretChat_Title: String { return self._s[2100]! } - public var Group_UpgradeNoticeText1: String { return self._s[2101]! } - public var AuthSessions_Title: String { return self._s[2102]! } + public var Watch_Suggestion_TalkLater: String { return self._s[2105]! } + public var SecretChat_Title: String { return self._s[2106]! } + public var Group_UpgradeNoticeText1: String { return self._s[2107]! } + public var AuthSessions_Title: String { return self._s[2108]! } public func TextFormat_AddLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2103]!, self._r[2103]!, [_0]) + return formatWithArgumentRanges(self._s[2109]!, self._r[2109]!, [_0]) } - public var PhotoEditor_CropAuto: String { return self._s[2104]! } - public var Channel_About_Title: String { return self._s[2105]! } - public var Theme_ThemeChanged: String { return self._s[2106]! } - public var FastTwoStepSetup_EmailHelp: String { return self._s[2107]! } + public var PhotoEditor_CropAuto: String { return self._s[2110]! } + public var Channel_About_Title: String { return self._s[2111]! } + public var Theme_ThemeChanged: String { return self._s[2112]! } + public var FastTwoStepSetup_EmailHelp: String { return self._s[2113]! } public func Conversation_Bytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2109]!, self._r[2109]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[2115]!, self._r[2115]!, ["\(_0)"]) } - public var VoiceOver_MessageContextReport: String { return self._s[2110]! } - public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[2112]! } - public var Group_Setup_HistoryVisibleHelp: String { return self._s[2113]! } + public var VoiceOver_MessageContextReport: String { return self._s[2116]! } + public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[2118]! } + public var Group_Setup_HistoryVisibleHelp: String { return self._s[2119]! } public func PUSH_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2114]!, self._r[2114]!, [_1]) + return formatWithArgumentRanges(self._s[2120]!, self._r[2120]!, [_1]) } public func SharedMedia_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2116]!, self._r[2116]!, [_0]) + return formatWithArgumentRanges(self._s[2122]!, self._r[2122]!, [_0]) } public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2117]!, self._r[2117]!, [_0]) + return formatWithArgumentRanges(self._s[2123]!, self._r[2123]!, [_0]) } - public var Privacy_PaymentsClearInfoHelp: String { return self._s[2118]! } - public var Presence_online: String { return self._s[2121]! } - public var PasscodeSettings_Title: String { return self._s[2122]! } - public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[2123]! } - public var Web_OpenExternal: String { return self._s[2124]! } - public var AutoDownloadSettings_AutoDownload: String { return self._s[2126]! } - public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[2127]! } - public var LocalGroup_Title: String { return self._s[2128]! } + public var Privacy_PaymentsClearInfoHelp: String { return self._s[2124]! } + public var PeopleNearby_DiscoverDescription: String { return self._s[2126]! } + public var Presence_online: String { return self._s[2128]! } + public var PasscodeSettings_Title: String { return self._s[2129]! } + public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[2130]! } + public var Web_OpenExternal: String { return self._s[2131]! } + public var AutoDownloadSettings_AutoDownload: String { return self._s[2133]! } + public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[2134]! } + public var LocalGroup_Title: String { return self._s[2135]! } public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2129]!, self._r[2129]!, [_0]) + return formatWithArgumentRanges(self._s[2136]!, self._r[2136]!, [_0]) } - public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[2130]! } - public var Conversation_StopQuizConfirmation: String { return self._s[2131]! } - public var Map_YouAreHere: String { return self._s[2132]! } + public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[2137]! } + public var Conversation_StopQuizConfirmation: String { return self._s[2138]! } + public var Map_YouAreHere: String { return self._s[2139]! } public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2133]!, self._r[2133]!, [_0]) + return formatWithArgumentRanges(self._s[2140]!, self._r[2140]!, [_0]) } public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2134]!, self._r[2134]!, [_0]) + return formatWithArgumentRanges(self._s[2141]!, self._r[2141]!, [_0]) } - public var Theme_Context_ChangeColors: String { return self._s[2135]! } - public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[2136]! } - public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[2137]! } + public var Theme_Context_ChangeColors: String { return self._s[2142]! } + public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[2143]! } + public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[2144]! } public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2138]!, self._r[2138]!, [_0]) + return formatWithArgumentRanges(self._s[2145]!, self._r[2145]!, [_0]) } public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2139]!, self._r[2139]!, [_0]) + return formatWithArgumentRanges(self._s[2146]!, self._r[2146]!, [_0]) } - public var SocksProxySetup_Username: String { return self._s[2140]! } - public var Bot_Start: String { return self._s[2141]! } + public var SocksProxySetup_Username: String { return self._s[2147]! } + public var Bot_Start: String { return self._s[2148]! } public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2142]!, self._r[2142]!, [_0]) - } - public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2143]!, self._r[2143]!, [_0]) - } - public var Contacts_SortByPresence: String { return self._s[2144]! } - public var AccentColor_Title: String { return self._s[2146]! } - public var Conversation_DiscardVoiceMessageTitle: String { return self._s[2147]! } - public func PUSH_CHAT_CREATED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2148]!, self._r[2148]!, [_1, _2]) - } - public func PrivacySettings_LastSeenContactsMinus(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2149]!, self._r[2149]!, [_0]) } + public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2150]!, self._r[2150]!, [_0]) + } + public var Contacts_SortByPresence: String { return self._s[2151]! } + public var AccentColor_Title: String { return self._s[2153]! } + public var Conversation_DiscardVoiceMessageTitle: String { return self._s[2154]! } + public func PUSH_CHAT_CREATED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2155]!, self._r[2155]!, [_1, _2]) + } + public func PrivacySettings_LastSeenContactsMinus(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2156]!, self._r[2156]!, [_0]) + } public func Channel_AdminLog_MessageChangedLinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2150]!, self._r[2150]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2157]!, self._r[2157]!, [_1, _2]) } - public var Passport_Email_EnterOtherEmail: String { return self._s[2151]! } - public var Login_InfoAvatarPhoto: String { return self._s[2152]! } - public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[2153]! } - public var Tour_Title4: String { return self._s[2154]! } - public var Passport_Identity_Translation: String { return self._s[2155]! } - public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[2156]! } - public var Login_TermsOfServiceLabel: String { return self._s[2158]! } - public var Passport_Language_it: String { return self._s[2159]! } - public var KeyCommand_JumpToNextUnreadChat: String { return self._s[2160]! } - public var Passport_Identity_SelfieHelp: String { return self._s[2161]! } - public var Conversation_ClearAll: String { return self._s[2163]! } - public var Wallet_Send_UninitializedText: String { return self._s[2165]! } - public var Channel_OwnershipTransfer_Title: String { return self._s[2166]! } - public var TwoStepAuth_FloodError: String { return self._s[2167]! } + public var Passport_Email_EnterOtherEmail: String { return self._s[2158]! } + public var Login_InfoAvatarPhoto: String { return self._s[2159]! } + public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[2160]! } + public var Tour_Title4: String { return self._s[2161]! } + public var Passport_Identity_Translation: String { return self._s[2162]! } + public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[2163]! } + public var Login_TermsOfServiceLabel: String { return self._s[2165]! } + public var Passport_Language_it: String { return self._s[2166]! } + public var KeyCommand_JumpToNextUnreadChat: String { return self._s[2167]! } + public var Passport_Identity_SelfieHelp: String { return self._s[2168]! } + public var Conversation_ClearAll: String { return self._s[2170]! } + public var Wallet_Send_UninitializedText: String { return self._s[2172]! } + public var Channel_OwnershipTransfer_Title: String { return self._s[2173]! } + public var TwoStepAuth_FloodError: String { return self._s[2174]! } public func PUSH_CHANNEL_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2168]!, self._r[2168]!, [_1]) + return formatWithArgumentRanges(self._s[2175]!, self._r[2175]!, [_1]) } - public var Paint_Delete: String { return self._s[2169]! } + public var Paint_Delete: String { return self._s[2176]! } public func Wallet_Sent_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2170]!, self._r[2170]!, [_0]) + return formatWithArgumentRanges(self._s[2177]!, self._r[2177]!, [_0]) } - public var Privacy_AddNewPeer: String { return self._s[2171]! } + public var Privacy_AddNewPeer: String { return self._s[2178]! } public func Channel_AdminLog_MessageRank(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2172]!, self._r[2172]!, [_1]) + return formatWithArgumentRanges(self._s[2179]!, self._r[2179]!, [_1]) } - public var LogoutOptions_SetPasscodeText: String { return self._s[2173]! } + public var LogoutOptions_SetPasscodeText: String { return self._s[2180]! } public func Passport_AcceptHelp(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2174]!, self._r[2174]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2181]!, self._r[2181]!, [_1, _2]) } - public var Message_PinnedAudioMessage: String { return self._s[2175]! } + public var Message_PinnedAudioMessage: String { return self._s[2182]! } public func Watch_Time_ShortTodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2176]!, self._r[2176]!, [_0]) + return formatWithArgumentRanges(self._s[2183]!, self._r[2183]!, [_0]) } - public var Notification_Mute1hMin: String { return self._s[2177]! } - public var Notifications_GroupNotificationsSound: String { return self._s[2178]! } - public var Wallet_Month_GenNovember: String { return self._s[2179]! } - public var SocksProxySetup_ShareProxyList: String { return self._s[2180]! } - public var Conversation_MessageEditedLabel: String { return self._s[2181]! } + public var Notification_Mute1hMin: String { return self._s[2184]! } + public var Notifications_GroupNotificationsSound: String { return self._s[2185]! } + public var Wallet_Month_GenNovember: String { return self._s[2186]! } + public var SocksProxySetup_ShareProxyList: String { return self._s[2187]! } + public var Conversation_MessageEditedLabel: String { return self._s[2188]! } public func ClearCache_Success(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2182]!, self._r[2182]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2189]!, self._r[2189]!, [_0, _1]) } - public var Notification_Exceptions_AlwaysOff: String { return self._s[2183]! } - public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[2184]! } + public var Notification_Exceptions_AlwaysOff: String { return self._s[2190]! } + public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[2191]! } public func Channel_AdminLog_MessageAdmin(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2185]!, self._r[2185]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[2192]!, self._r[2192]!, [_0, _1, _2]) } - public var NetworkUsageSettings_ResetStats: String { return self._s[2186]! } + public var NetworkUsageSettings_ResetStats: String { return self._s[2193]! } public func PUSH_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2187]!, self._r[2187]!, [_1]) + return formatWithArgumentRanges(self._s[2194]!, self._r[2194]!, [_1]) } - public var AccessDenied_LocationTracking: String { return self._s[2188]! } - public var Month_GenOctober: String { return self._s[2189]! } - public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[2190]! } - public var EnterPasscode_EnterPasscode: String { return self._s[2191]! } - public var MediaPicker_TimerTooltip: String { return self._s[2193]! } - public var SharedMedia_TitleAll: String { return self._s[2194]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[2197]! } - public var Conversation_RestrictedMedia: String { return self._s[2198]! } - public var AccessDenied_PhotosRestricted: String { return self._s[2199]! } - public var Privacy_Forwards_WhoCanForward: String { return self._s[2201]! } - public var ChangePhoneNumberCode_Called: String { return self._s[2202]! } + public var AccessDenied_LocationTracking: String { return self._s[2195]! } + public var Month_GenOctober: String { return self._s[2196]! } + public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[2197]! } + public var EnterPasscode_EnterPasscode: String { return self._s[2198]! } + public var MediaPicker_TimerTooltip: String { return self._s[2200]! } + public var SharedMedia_TitleAll: String { return self._s[2201]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[2204]! } + public var Conversation_RestrictedMedia: String { return self._s[2205]! } + public var AccessDenied_PhotosRestricted: String { return self._s[2206]! } + public var Privacy_Forwards_WhoCanForward: String { return self._s[2208]! } + public var ChangePhoneNumberCode_Called: String { return self._s[2209]! } public func Notification_PinnedDocumentMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2203]!, self._r[2203]!, [_0]) + return formatWithArgumentRanges(self._s[2210]!, self._r[2210]!, [_0]) } - public var Conversation_SavedMessages: String { return self._s[2206]! } - public var Your_cards_expiration_month_is_invalid: String { return self._s[2208]! } - public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[2209]! } + public var Conversation_SavedMessages: String { return self._s[2213]! } + public var Your_cards_expiration_month_is_invalid: String { return self._s[2215]! } + public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[2216]! } public func Target_ShareGameConfirmationGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2211]!, self._r[2211]!, [_0]) + return formatWithArgumentRanges(self._s[2218]!, self._r[2218]!, [_0]) } - public var VoiceOver_Chat_YourMessage: String { return self._s[2212]! } + public var VoiceOver_Chat_YourMessage: String { return self._s[2219]! } public func VoiceOver_Chat_Title(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2213]!, self._r[2213]!, [_0]) + return formatWithArgumentRanges(self._s[2220]!, self._r[2220]!, [_0]) } - public var ReportPeer_AlertSuccess: String { return self._s[2214]! } - public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[2215]! } + public var ReportPeer_AlertSuccess: String { return self._s[2221]! } + public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[2222]! } public func InstantPage_RelatedArticleAuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2216]!, self._r[2216]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2223]!, self._r[2223]!, [_1, _2]) } - public var Checkout_PasswordEntry_Title: String { return self._s[2217]! } - public var PhotoEditor_FadeTool: String { return self._s[2218]! } - public var Privacy_ContactsReset: String { return self._s[2219]! } + public var Checkout_PasswordEntry_Title: String { return self._s[2224]! } + public var PhotoEditor_FadeTool: String { return self._s[2225]! } + public var Privacy_ContactsReset: String { return self._s[2226]! } public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2221]!, self._r[2221]!, [_0]) + return formatWithArgumentRanges(self._s[2228]!, self._r[2228]!, [_0]) } - public var Message_PinnedVideoMessage: String { return self._s[2222]! } - public var ChatList_Mute: String { return self._s[2223]! } + public var Message_PinnedVideoMessage: String { return self._s[2229]! } + public var ChatList_Mute: String { return self._s[2230]! } public func Wallet_Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2224]!, self._r[2224]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2231]!, self._r[2231]!, [_1, _2, _3]) } - public var Permissions_CellularDataText_v0: String { return self._s[2225]! } - public var ShareMenu_SelectChats: String { return self._s[2228]! } - public var ChatList_Context_Unarchive: String { return self._s[2229]! } - public var MusicPlayer_VoiceNote: String { return self._s[2230]! } - public var Conversation_RestrictedText: String { return self._s[2231]! } - public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[2232]! } - public var Wallet_Month_GenApril: String { return self._s[2233]! } - public var Wallet_Month_ShortMarch: String { return self._s[2234]! } - public var TwoStepAuth_DisableSuccess: String { return self._s[2235]! } - public var Cache_Videos: String { return self._s[2236]! } - public var PrivacySettings_PhoneNumber: String { return self._s[2237]! } - public var Wallet_Month_GenFebruary: String { return self._s[2238]! } - public var FeatureDisabled_Oops: String { return self._s[2240]! } - public var Passport_Address_PostcodePlaceholder: String { return self._s[2241]! } + public var Permissions_CellularDataText_v0: String { return self._s[2232]! } + public var ShareMenu_SelectChats: String { return self._s[2235]! } + public var ChatList_Context_Unarchive: String { return self._s[2236]! } + public var MusicPlayer_VoiceNote: String { return self._s[2237]! } + public var Conversation_RestrictedText: String { return self._s[2238]! } + public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[2239]! } + public var Wallet_Month_GenApril: String { return self._s[2240]! } + public var Wallet_Month_ShortMarch: String { return self._s[2241]! } + public var TwoStepAuth_DisableSuccess: String { return self._s[2242]! } + public var Cache_Videos: String { return self._s[2243]! } + public var PrivacySettings_PhoneNumber: String { return self._s[2244]! } + public var Wallet_Month_GenFebruary: String { return self._s[2245]! } + public var FeatureDisabled_Oops: String { return self._s[2247]! } + public var Passport_Address_PostcodePlaceholder: String { return self._s[2248]! } public func AddContact_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2242]!, self._r[2242]!, [_0]) + return formatWithArgumentRanges(self._s[2249]!, self._r[2249]!, [_0]) } - public var Stickers_GroupStickersHelp: String { return self._s[2243]! } - public var GroupPermission_NoSendPolls: String { return self._s[2244]! } - public var Wallet_Qr_ScanCode: String { return self._s[2245]! } - public var Message_VideoExpired: String { return self._s[2247]! } - public var GroupInfo_GroupHistoryVisible: String { return self._s[2248]! } - public var Notifications_Badge: String { return self._s[2249]! } - public var Wallet_Receive_AddressCopied: String { return self._s[2250]! } - public var CreatePoll_OptionPlaceholder: String { return self._s[2251]! } - public var Username_InvalidTooShort: String { return self._s[2252]! } - public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[2253]! } - public var Channel_AdminLog_PinMessages: String { return self._s[2254]! } - public var ArchivedChats_IntroTitle3: String { return self._s[2255]! } + public var Stickers_GroupStickersHelp: String { return self._s[2251]! } + public var GroupPermission_NoSendPolls: String { return self._s[2252]! } + public var Wallet_Qr_ScanCode: String { return self._s[2253]! } + public var Message_VideoExpired: String { return self._s[2255]! } + public var GroupInfo_GroupHistoryVisible: String { return self._s[2256]! } + public var Notifications_Badge: String { return self._s[2257]! } + public var Wallet_Receive_AddressCopied: String { return self._s[2258]! } + public var CreatePoll_OptionPlaceholder: String { return self._s[2259]! } + public var Username_InvalidTooShort: String { return self._s[2260]! } + public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[2261]! } + public var Channel_AdminLog_PinMessages: String { return self._s[2262]! } + public var ArchivedChats_IntroTitle3: String { return self._s[2263]! } public func Notification_MessageLifetimeRemoved(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2256]!, self._r[2256]!, [_1]) + return formatWithArgumentRanges(self._s[2264]!, self._r[2264]!, [_1]) } - public var Permissions_SiriAllowInSettings_v0: String { return self._s[2257]! } - public var Conversation_DefaultRestrictedText: String { return self._s[2258]! } - public var SharedMedia_CategoryDocs: String { return self._s[2261]! } + public var Permissions_SiriAllowInSettings_v0: String { return self._s[2265]! } + public var Conversation_DefaultRestrictedText: String { return self._s[2266]! } + public var SharedMedia_CategoryDocs: String { return self._s[2269]! } public func PUSH_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2262]!, self._r[2262]!, [_1]) + return formatWithArgumentRanges(self._s[2270]!, self._r[2270]!, [_1]) } - public var Wallet_Send_UninitializedTitle: String { return self._s[2263]! } - public var StickerPackActionInfo_ArchivedTitle: String { return self._s[2264]! } - public var Privacy_Forwards_NeverLink: String { return self._s[2266]! } + public var Wallet_Send_UninitializedTitle: String { return self._s[2271]! } + public var StickerPackActionInfo_ArchivedTitle: String { return self._s[2272]! } + public var Privacy_Forwards_NeverLink: String { return self._s[2274]! } public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2267]!, self._r[2267]!, [_1]) + return formatWithArgumentRanges(self._s[2275]!, self._r[2275]!, [_1]) } - public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[2268]! } + public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[2276]! } public func Time_MonthOfYear_m12(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2269]!, self._r[2269]!, [_0]) + return formatWithArgumentRanges(self._s[2277]!, self._r[2277]!, [_0]) } - public var ChatSettings_PrivateChats: String { return self._s[2270]! } - public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[2271]! } - public var Conversation_PrivateMessageLinkCopied: String { return self._s[2272]! } - public var Channel_UpdatePhotoItem: String { return self._s[2273]! } - public var GroupInfo_LeftStatus: String { return self._s[2274]! } - public var Watch_MessageView_Forward: String { return self._s[2276]! } - public var ReportPeer_ReasonChildAbuse: String { return self._s[2277]! } - public var Cache_ClearEmpty: String { return self._s[2279]! } - public var Localization_LanguageName: String { return self._s[2280]! } - public var Wallet_AccessDenied_Title: String { return self._s[2281]! } - public var WebSearch_GIFs: String { return self._s[2282]! } - public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2283]! } - public var Wallet_AccessDenied_Settings: String { return self._s[2284]! } - public var Username_InvalidStartsWithNumber: String { return self._s[2285]! } - public var Common_Back: String { return self._s[2286]! } - public var GroupInfo_Permissions_EditingDisabled: String { return self._s[2287]! } - public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2288]! } - public var Wallet_Send_Send: String { return self._s[2289]! } + public var ChatSettings_PrivateChats: String { return self._s[2278]! } + public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[2279]! } + public var Conversation_PrivateMessageLinkCopied: String { return self._s[2280]! } + public var Channel_UpdatePhotoItem: String { return self._s[2281]! } + public var GroupInfo_LeftStatus: String { return self._s[2282]! } + public var Watch_MessageView_Forward: String { return self._s[2284]! } + public var ReportPeer_ReasonChildAbuse: String { return self._s[2285]! } + public var Cache_ClearEmpty: String { return self._s[2287]! } + public var Localization_LanguageName: String { return self._s[2288]! } + public var Wallet_AccessDenied_Title: String { return self._s[2289]! } + public var WebSearch_GIFs: String { return self._s[2290]! } + public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2291]! } + public var Wallet_AccessDenied_Settings: String { return self._s[2292]! } + public var Username_InvalidStartsWithNumber: String { return self._s[2293]! } + public var Common_Back: String { return self._s[2294]! } + public var GroupInfo_Permissions_EditingDisabled: String { return self._s[2295]! } + public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2296]! } + public var Wallet_Send_Send: String { return self._s[2297]! } public func PUSH_CHANNEL_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2291]!, self._r[2291]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2299]!, self._r[2299]!, [_1, _2]) } - public var Wallet_Info_RefreshErrorTitle: String { return self._s[2292]! } - public var Wallet_Month_GenJune: String { return self._s[2293]! } - public var Passport_Email_Help: String { return self._s[2294]! } - public var Watch_Conversation_Reply: String { return self._s[2296]! } - public var Conversation_EditingMessageMediaChange: String { return self._s[2299]! } - public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2300]! } - public var Channel_BanUser_Unban: String { return self._s[2302]! } - public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2303]! } - public var Group_Username_CreatePublicLinkHelp: String { return self._s[2304]! } - public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2306]! } - public var Wallet_Send_AddressHeader: String { return self._s[2307]! } - public var Passport_Identity_Name: String { return self._s[2308]! } + public var Wallet_Info_RefreshErrorTitle: String { return self._s[2300]! } + public var Wallet_Month_GenJune: String { return self._s[2301]! } + public var Passport_Email_Help: String { return self._s[2302]! } + public var Watch_Conversation_Reply: String { return self._s[2304]! } + public var Conversation_EditingMessageMediaChange: String { return self._s[2307]! } + public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2308]! } + public var Channel_BanUser_Unban: String { return self._s[2310]! } + public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2311]! } + public var Group_Username_CreatePublicLinkHelp: String { return self._s[2312]! } + public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2314]! } + public var Wallet_Send_AddressHeader: String { return self._s[2315]! } + public var Passport_Identity_Name: String { return self._s[2316]! } public func Channel_DiscussionGroup_HeaderGroupSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2309]!, self._r[2309]!, [_0]) + return formatWithArgumentRanges(self._s[2317]!, self._r[2317]!, [_0]) } - public var GroupRemoved_ViewUserInfo: String { return self._s[2310]! } - public var Conversation_BlockUser: String { return self._s[2311]! } - public var Month_GenJanuary: String { return self._s[2312]! } - public var ChatSettings_TextSize: String { return self._s[2313]! } - public var Notification_PassportValuePhone: String { return self._s[2314]! } - public var MediaPlayer_UnknownArtist: String { return self._s[2315]! } - public var Passport_Language_ne: String { return self._s[2316]! } - public var Notification_CallBack: String { return self._s[2317]! } - public var Wallet_SecureStorageReset_BiometryTouchId: String { return self._s[2318]! } - public var TwoStepAuth_EmailHelp: String { return self._s[2319]! } + public var GroupRemoved_ViewUserInfo: String { return self._s[2318]! } + public var Conversation_BlockUser: String { return self._s[2319]! } + public var Month_GenJanuary: String { return self._s[2320]! } + public var ChatSettings_TextSize: String { return self._s[2321]! } + public var Notification_PassportValuePhone: String { return self._s[2322]! } + public var MediaPlayer_UnknownArtist: String { return self._s[2323]! } + public var Passport_Language_ne: String { return self._s[2324]! } + public var Notification_CallBack: String { return self._s[2325]! } + public var Wallet_SecureStorageReset_BiometryTouchId: String { return self._s[2326]! } + public var TwoStepAuth_EmailHelp: String { return self._s[2327]! } public func Time_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2320]!, self._r[2320]!, [_0]) + return formatWithArgumentRanges(self._s[2328]!, self._r[2328]!, [_0]) } - public var Channel_Info_Management: String { return self._s[2321]! } - public var Passport_FieldIdentityUploadHelp: String { return self._s[2322]! } - public var Stickers_FrequentlyUsed: String { return self._s[2323]! } - public var Channel_BanUser_PermissionSendMessages: String { return self._s[2324]! } - public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2326]! } + public var Channel_Info_Management: String { return self._s[2329]! } + public var Passport_FieldIdentityUploadHelp: String { return self._s[2330]! } + public var Stickers_FrequentlyUsed: String { return self._s[2331]! } + public var Channel_BanUser_PermissionSendMessages: String { return self._s[2332]! } + public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2334]! } public func LOCAL_CHANNEL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2327]!, self._r[2327]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[2335]!, self._r[2335]!, [_1, "\(_2)"]) } - public var TwoFactorSetup_Password_Title: String { return self._s[2328]! } - public var Passport_Address_EditResidentialAddress: String { return self._s[2329]! } - public var PrivacyPolicy_DeclineTitle: String { return self._s[2330]! } - public var CreatePoll_TextHeader: String { return self._s[2331]! } + public var TwoFactorSetup_Password_Title: String { return self._s[2336]! } + public var Passport_Address_EditResidentialAddress: String { return self._s[2337]! } + public var PrivacyPolicy_DeclineTitle: String { return self._s[2338]! } + public var CreatePoll_TextHeader: String { return self._s[2339]! } public func Checkout_SavePasswordTimeoutAndTouchId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2332]!, self._r[2332]!, [_0]) + return formatWithArgumentRanges(self._s[2340]!, self._r[2340]!, [_0]) } - public var PhotoEditor_QualityMedium: String { return self._s[2333]! } - public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2334]! } - public var Conversation_StatusKickedFromChannel: String { return self._s[2336]! } - public var CheckoutInfo_ReceiverInfoName: String { return self._s[2337]! } - public var Group_ErrorSendRestrictedStickers: String { return self._s[2338]! } + public var PhotoEditor_QualityMedium: String { return self._s[2341]! } + public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2342]! } + public var Conversation_StatusKickedFromChannel: String { return self._s[2344]! } + public var CheckoutInfo_ReceiverInfoName: String { return self._s[2345]! } + public var Group_ErrorSendRestrictedStickers: String { return self._s[2346]! } public func Conversation_RestrictedInlineTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2339]!, self._r[2339]!, [_0]) + return formatWithArgumentRanges(self._s[2347]!, self._r[2347]!, [_0]) } public func Channel_AdminLog_MessageTransferedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2340]!, self._r[2340]!, [_1]) + return formatWithArgumentRanges(self._s[2348]!, self._r[2348]!, [_1]) } - public var LogoutOptions_LogOutWalletInfo: String { return self._s[2341]! } - public var TwoFactorSetup_Email_SkipConfirmationTitle: String { return self._s[2342]! } - public var Conversation_LinkDialogOpen: String { return self._s[2344]! } - public var TwoFactorSetup_Hint_Title: String { return self._s[2345]! } - public var VoiceOver_Chat_PollNoVotes: String { return self._s[2346]! } - public var Settings_Username: String { return self._s[2348]! } - public var Conversation_Block: String { return self._s[2350]! } - public var Wallpaper_Wallpaper: String { return self._s[2351]! } - public var SocksProxySetup_UseProxy: String { return self._s[2353]! } - public var Wallet_Send_Confirmation: String { return self._s[2354]! } - public var EditTheme_UploadEditedTheme: String { return self._s[2355]! } - public var UserInfo_ShareMyContactInfo: String { return self._s[2356]! } - public var MessageTimer_Forever: String { return self._s[2357]! } - public var Privacy_Calls_WhoCanCallMe: String { return self._s[2358]! } - public var PhotoEditor_DiscardChanges: String { return self._s[2359]! } - public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2360]! } - public var Passport_Language_da: String { return self._s[2361]! } - public var SocksProxySetup_PortPlaceholder: String { return self._s[2362]! } + public var LogoutOptions_LogOutWalletInfo: String { return self._s[2349]! } + public var TwoFactorSetup_Email_SkipConfirmationTitle: String { return self._s[2350]! } + public var Conversation_LinkDialogOpen: String { return self._s[2352]! } + public var TwoFactorSetup_Hint_Title: String { return self._s[2353]! } + public var VoiceOver_Chat_PollNoVotes: String { return self._s[2354]! } + public var Settings_Username: String { return self._s[2356]! } + public var Conversation_Block: String { return self._s[2358]! } + public var Wallpaper_Wallpaper: String { return self._s[2359]! } + public var SocksProxySetup_UseProxy: String { return self._s[2361]! } + public var Wallet_Send_Confirmation: String { return self._s[2362]! } + public var EditTheme_UploadEditedTheme: String { return self._s[2363]! } + public var UserInfo_ShareMyContactInfo: String { return self._s[2364]! } + public var MessageTimer_Forever: String { return self._s[2365]! } + public var Privacy_Calls_WhoCanCallMe: String { return self._s[2366]! } + public var PhotoEditor_DiscardChanges: String { return self._s[2367]! } + public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2368]! } + public var Passport_Language_da: String { return self._s[2369]! } + public var SocksProxySetup_PortPlaceholder: String { return self._s[2370]! } public func SecretGIF_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2363]!, self._r[2363]!, [_0]) + return formatWithArgumentRanges(self._s[2371]!, self._r[2371]!, [_0]) } - public var Passport_Address_EditPassportRegistration: String { return self._s[2364]! } + public var Passport_Address_EditPassportRegistration: String { return self._s[2372]! } public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2366]!, self._r[2366]!, [_0]) + return formatWithArgumentRanges(self._s[2374]!, self._r[2374]!, [_0]) } - public var Settings_AddDevice: String { return self._s[2367]! } - public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2369]! } - public var AuthSessions_AddDeviceIntro_Text1: String { return self._s[2370]! } - public var Conversation_SearchByName_Prefix: String { return self._s[2371]! } - public var Conversation_PinnedPoll: String { return self._s[2372]! } - public var AuthSessions_AddDeviceIntro_Text2: String { return self._s[2373]! } - public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2374]! } - public var AuthSessions_AddDeviceIntro_Text3: String { return self._s[2375]! } + public var Settings_AddDevice: String { return self._s[2375]! } + public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2377]! } + public var AuthSessions_AddDeviceIntro_Text1: String { return self._s[2378]! } + public var Conversation_SearchByName_Prefix: String { return self._s[2379]! } + public var Conversation_PinnedPoll: String { return self._s[2380]! } + public var AuthSessions_AddDeviceIntro_Text2: String { return self._s[2381]! } + public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2382]! } + public var AuthSessions_AddDeviceIntro_Text3: String { return self._s[2383]! } public func PUSH_ENCRYPTION_ACCEPT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2376]!, self._r[2376]!, [_1]) + return formatWithArgumentRanges(self._s[2384]!, self._r[2384]!, [_1]) } - public var WallpaperSearch_ColorPurple: String { return self._s[2377]! } - public var Cache_ByPeerHeader: String { return self._s[2378]! } + public var WallpaperSearch_ColorPurple: String { return self._s[2385]! } + public var Cache_ByPeerHeader: String { return self._s[2386]! } public func Conversation_EncryptedPlaceholderTitleIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2379]!, self._r[2379]!, [_0]) + return formatWithArgumentRanges(self._s[2387]!, self._r[2387]!, [_0]) } - public var ChatSettings_AutoDownloadDocuments: String { return self._s[2380]! } - public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2383]! } - public var Wallet_Completed_Title: String { return self._s[2384]! } - public var Notification_PinnedMessage: String { return self._s[2385]! } - public var TwoFactorSetup_EmailVerification_Placeholder: String { return self._s[2386]! } - public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2388]! } - public var Contacts_SortBy: String { return self._s[2389]! } + public var ChatSettings_AutoDownloadDocuments: String { return self._s[2388]! } + public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2391]! } + public var Wallet_Completed_Title: String { return self._s[2392]! } + public var Notification_PinnedMessage: String { return self._s[2393]! } + public var TwoFactorSetup_EmailVerification_Placeholder: String { return self._s[2394]! } + public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2396]! } + public var Contacts_SortBy: String { return self._s[2397]! } public func PUSH_CHANNEL_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2390]!, self._r[2390]!, [_1]) + return formatWithArgumentRanges(self._s[2398]!, self._r[2398]!, [_1]) } - public var Appearance_ColorThemeNight: String { return self._s[2392]! } + public var Appearance_ColorThemeNight: String { return self._s[2400]! } public func PUSH_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2393]!, self._r[2393]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2401]!, self._r[2401]!, [_1, _2]) } - public var Call_EncryptionKey_Title: String { return self._s[2394]! } - public var Watch_UserInfo_Service: String { return self._s[2395]! } - public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2397]! } - public var Conversation_Unpin: String { return self._s[2399]! } - public var CancelResetAccount_Title: String { return self._s[2400]! } - public var Map_LiveLocationFor15Minutes: String { return self._s[2401]! } + public var Call_EncryptionKey_Title: String { return self._s[2402]! } + public var Watch_UserInfo_Service: String { return self._s[2403]! } + public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2405]! } + public var Conversation_Unpin: String { return self._s[2407]! } + public var CancelResetAccount_Title: String { return self._s[2408]! } + public var Map_LiveLocationFor15Minutes: String { return self._s[2409]! } public func Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2403]!, self._r[2403]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2411]!, self._r[2411]!, [_1, _2, _3]) } - public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2404]! } - public var CallSettings_Title: String { return self._s[2405]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2406]! } - public var PasscodeSettings_EncryptDataHelp: String { return self._s[2408]! } - public var AutoDownloadSettings_Contacts: String { return self._s[2409]! } + public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2412]! } + public var CallSettings_Title: String { return self._s[2413]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2414]! } + public var PasscodeSettings_EncryptDataHelp: String { return self._s[2416]! } + public var AutoDownloadSettings_Contacts: String { return self._s[2417]! } public func Channel_AdminLog_MessageRankName(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2410]!, self._r[2410]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2418]!, self._r[2418]!, [_1, _2]) } - public var Passport_Identity_DocumentDetails: String { return self._s[2411]! } - public var LoginPassword_PasswordHelp: String { return self._s[2412]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2413]! } - public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2414]! } - public var ChatContextMenu_TextSelectionTip: String { return self._s[2415]! } - public var Checkout_TotalPaidAmount: String { return self._s[2416]! } + public var Passport_Identity_DocumentDetails: String { return self._s[2419]! } + public var LoginPassword_PasswordHelp: String { return self._s[2420]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2421]! } + public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2422]! } + public var ChatContextMenu_TextSelectionTip: String { return self._s[2423]! } + public var Checkout_TotalPaidAmount: String { return self._s[2424]! } public func FileSize_KB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2417]!, self._r[2417]!, [_0]) + return formatWithArgumentRanges(self._s[2425]!, self._r[2425]!, [_0]) } - public var PasscodeSettings_ChangePasscode: String { return self._s[2418]! } - public var Conversation_SecretLinkPreviewAlert: String { return self._s[2420]! } - public var Privacy_SecretChatsLinkPreviews: String { return self._s[2421]! } + public var PasscodeSettings_ChangePasscode: String { return self._s[2426]! } + public var Conversation_SecretLinkPreviewAlert: String { return self._s[2428]! } + public var Privacy_SecretChatsLinkPreviews: String { return self._s[2429]! } public func PUSH_CHANNEL_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2422]!, self._r[2422]!, [_1]) + return formatWithArgumentRanges(self._s[2430]!, self._r[2430]!, [_1]) } - public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2423]! } - public var Contacts_InviteFriends: String { return self._s[2425]! } - public var Map_ChooseLocationTitle: String { return self._s[2426]! } - public var Conversation_StopPoll: String { return self._s[2428]! } + public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2431]! } + public var Contacts_InviteFriends: String { return self._s[2433]! } + public var Map_ChooseLocationTitle: String { return self._s[2434]! } + public var Conversation_StopPoll: String { return self._s[2436]! } public func WebSearch_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2429]!, self._r[2429]!, [_0]) + return formatWithArgumentRanges(self._s[2437]!, self._r[2437]!, [_0]) } - public var Call_Camera: String { return self._s[2430]! } - public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2431]! } - public var AppWallet_Intro_Text: String { return self._s[2432]! } - public var Calls_RatingFeedback: String { return self._s[2433]! } - public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2435]! } - public var Wallet_Alert_OK: String { return self._s[2436]! } - public var NotificationsSound_Pulse: String { return self._s[2437]! } - public var Watch_LastSeen_Lately: String { return self._s[2438]! } - public var ReportGroupLocation_Report: String { return self._s[2441]! } - public var Widget_NoUsers: String { return self._s[2442]! } - public var Conversation_UnvotePoll: String { return self._s[2443]! } - public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2445]! } - public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2446]! } - public var NotificationsSound_Circles: String { return self._s[2447]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2450]! } - public var Wallet_Settings_DeleteWallet: String { return self._s[2451]! } - public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2452]! } - public var Proxy_TooltipUnavailable: String { return self._s[2453]! } - public var Passport_Identity_CountryPlaceholder: String { return self._s[2455]! } - public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2457]! } - public var Conversation_FileDropbox: String { return self._s[2458]! } - public var Notifications_ExceptionsUnmuted: String { return self._s[2459]! } - public var Tour_Text3: String { return self._s[2461]! } - public var Login_ResetAccountProtected_Title: String { return self._s[2463]! } - public var GroupPermission_NoSendMessages: String { return self._s[2464]! } - public var WallpaperSearch_ColorTitle: String { return self._s[2465]! } - public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2466]! } + public var Call_Camera: String { return self._s[2438]! } + public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2439]! } + public var AppWallet_Intro_Text: String { return self._s[2440]! } + public var Calls_RatingFeedback: String { return self._s[2441]! } + public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2443]! } + public var Wallet_Alert_OK: String { return self._s[2444]! } + public var NotificationsSound_Pulse: String { return self._s[2445]! } + public var Watch_LastSeen_Lately: String { return self._s[2446]! } + public var ReportGroupLocation_Report: String { return self._s[2449]! } + public var Widget_NoUsers: String { return self._s[2450]! } + public var Conversation_UnvotePoll: String { return self._s[2451]! } + public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2453]! } + public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2454]! } + public var NotificationsSound_Circles: String { return self._s[2455]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2458]! } + public var Wallet_Settings_DeleteWallet: String { return self._s[2459]! } + public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2460]! } + public var Proxy_TooltipUnavailable: String { return self._s[2461]! } + public var Passport_Identity_CountryPlaceholder: String { return self._s[2463]! } + public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2465]! } + public var Conversation_FileDropbox: String { return self._s[2466]! } + public var Notifications_ExceptionsUnmuted: String { return self._s[2467]! } + public var Tour_Text3: String { return self._s[2469]! } + public var Login_ResetAccountProtected_Title: String { return self._s[2471]! } + public var GroupPermission_NoSendMessages: String { return self._s[2472]! } + public var WallpaperSearch_ColorTitle: String { return self._s[2473]! } + public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2474]! } public func Conversation_LiveLocationYouAnd(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2468]!, self._r[2468]!, [_0]) + return formatWithArgumentRanges(self._s[2476]!, self._r[2476]!, [_0]) } - public var GroupInfo_AddParticipantTitle: String { return self._s[2469]! } - public var Checkout_ShippingOption_Title: String { return self._s[2470]! } - public var ChatSettings_AutoDownloadTitle: String { return self._s[2471]! } + public var GroupInfo_AddParticipantTitle: String { return self._s[2477]! } + public var Checkout_ShippingOption_Title: String { return self._s[2478]! } + public var ChatSettings_AutoDownloadTitle: String { return self._s[2479]! } public func DialogList_SingleTypingSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2472]!, self._r[2472]!, [_0]) + return formatWithArgumentRanges(self._s[2480]!, self._r[2480]!, [_0]) } public func ChatSettings_AutoDownloadSettings_TypeVideo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2473]!, self._r[2473]!, [_0]) + return formatWithArgumentRanges(self._s[2481]!, self._r[2481]!, [_0]) } - public var Channel_Management_LabelAdministrator: String { return self._s[2474]! } - public var EditTheme_FileReadError: String { return self._s[2475]! } - public var OwnershipTransfer_ComeBackLater: String { return self._s[2476]! } - public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2477]! } - public var AutoDownloadSettings_Photos: String { return self._s[2479]! } - public var Appearance_PreviewIncomingText: String { return self._s[2480]! } - public var ChatList_Context_MarkAllAsRead: String { return self._s[2481]! } - public var ChannelInfo_ConfirmLeave: String { return self._s[2482]! } - public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2483]! } - public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2484]! } - public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2485]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2486]! } - public var GroupInfo_SetGroupPhotoStop: String { return self._s[2487]! } - public var Notification_SecretChatScreenshot: String { return self._s[2488]! } - public var AccessDenied_Wallpapers: String { return self._s[2489]! } - public var ChatList_Context_Mute: String { return self._s[2491]! } - public var Passport_Address_City: String { return self._s[2492]! } - public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2493]! } - public var Appearance_ThemeCarouselClassic: String { return self._s[2494]! } - public var SocksProxySetup_SecretPlaceholder: String { return self._s[2495]! } - public var AccessDenied_LocationDisabled: String { return self._s[2496]! } - public var Group_Location_Title: String { return self._s[2497]! } - public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2499]! } - public var GroupInfo_Sound: String { return self._s[2500]! } - public var SettingsSearch_Synonyms_ChatSettings_OpenLinksIn: String { return self._s[2501]! } - public var ChannelInfo_ScamChannelWarning: String { return self._s[2502]! } - public var Stickers_RemoveFromFavorites: String { return self._s[2503]! } - public var Contacts_Title: String { return self._s[2504]! } - public var EditTheme_ThemeTemplateAlertText: String { return self._s[2505]! } - public var Passport_Language_fr: String { return self._s[2506]! } - public var TwoFactorSetup_EmailVerification_Action: String { return self._s[2507]! } - public var Notifications_ResetAllNotifications: String { return self._s[2508]! } - public var IntentsSettings_SuggestedChats: String { return self._s[2510]! } - public var PrivacySettings_SecurityTitle: String { return self._s[2512]! } - public var Checkout_NewCard_Title: String { return self._s[2513]! } - public var Login_HaveNotReceivedCodeInternal: String { return self._s[2514]! } - public var Conversation_ForwardChats: String { return self._s[2515]! } - public var Wallet_SecureStorageReset_PasscodeText: String { return self._s[2517]! } - public var PasscodeSettings_4DigitCode: String { return self._s[2518]! } - public var Settings_FAQ: String { return self._s[2520]! } - public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2521]! } - public var Conversation_ContextMenuForward: String { return self._s[2522]! } - public var VoiceOver_Chat_YourPhoto: String { return self._s[2525]! } - public var PrivacyPolicy_Title: String { return self._s[2528]! } - public var Notifications_TextTone: String { return self._s[2529]! } - public var Profile_CreateNewContact: String { return self._s[2530]! } - public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2531]! } - public var TwoFactorSetup_EmailVerification_Title: String { return self._s[2533]! } - public var Call_Speaker: String { return self._s[2534]! } - public var AutoNightTheme_AutomaticSection: String { return self._s[2535]! } - public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2537]! } - public var Channel_Username_InvalidCharacters: String { return self._s[2538]! } + public var Channel_Management_LabelAdministrator: String { return self._s[2482]! } + public var EditTheme_FileReadError: String { return self._s[2483]! } + public var OwnershipTransfer_ComeBackLater: String { return self._s[2484]! } + public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2485]! } + public var AutoDownloadSettings_Photos: String { return self._s[2487]! } + public var Appearance_PreviewIncomingText: String { return self._s[2488]! } + public var ChatList_Context_MarkAllAsRead: String { return self._s[2489]! } + public var ChannelInfo_ConfirmLeave: String { return self._s[2490]! } + public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2491]! } + public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2492]! } + public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2493]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2494]! } + public var GroupInfo_SetGroupPhotoStop: String { return self._s[2495]! } + public var Notification_SecretChatScreenshot: String { return self._s[2496]! } + public var AccessDenied_Wallpapers: String { return self._s[2497]! } + public var ChatList_Context_Mute: String { return self._s[2499]! } + public var Passport_Address_City: String { return self._s[2500]! } + public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2501]! } + public var Appearance_ThemeCarouselClassic: String { return self._s[2502]! } + public var SocksProxySetup_SecretPlaceholder: String { return self._s[2503]! } + public var AccessDenied_LocationDisabled: String { return self._s[2504]! } + public var Group_Location_Title: String { return self._s[2505]! } + public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2507]! } + public var GroupInfo_Sound: String { return self._s[2508]! } + public var SettingsSearch_Synonyms_ChatSettings_OpenLinksIn: String { return self._s[2509]! } + public var ChannelInfo_ScamChannelWarning: String { return self._s[2510]! } + public var Stickers_RemoveFromFavorites: String { return self._s[2511]! } + public var Contacts_Title: String { return self._s[2512]! } + public var EditTheme_ThemeTemplateAlertText: String { return self._s[2513]! } + public var Passport_Language_fr: String { return self._s[2514]! } + public var TwoFactorSetup_EmailVerification_Action: String { return self._s[2515]! } + public var Notifications_ResetAllNotifications: String { return self._s[2516]! } + public var IntentsSettings_SuggestedChats: String { return self._s[2518]! } + public var PrivacySettings_SecurityTitle: String { return self._s[2520]! } + public var Checkout_NewCard_Title: String { return self._s[2521]! } + public var Login_HaveNotReceivedCodeInternal: String { return self._s[2522]! } + public var Conversation_ForwardChats: String { return self._s[2523]! } + public var Wallet_SecureStorageReset_PasscodeText: String { return self._s[2525]! } + public var PasscodeSettings_4DigitCode: String { return self._s[2526]! } + public var Settings_FAQ: String { return self._s[2528]! } + public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2529]! } + public var Conversation_ContextMenuForward: String { return self._s[2530]! } + public var VoiceOver_Chat_YourPhoto: String { return self._s[2533]! } + public var PrivacyPolicy_Title: String { return self._s[2536]! } + public var Notifications_TextTone: String { return self._s[2537]! } + public var Profile_CreateNewContact: String { return self._s[2538]! } + public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2539]! } + public var TwoFactorSetup_EmailVerification_Title: String { return self._s[2541]! } + public var Call_Speaker: String { return self._s[2542]! } + public var AutoNightTheme_AutomaticSection: String { return self._s[2543]! } + public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2545]! } + public var Channel_Username_InvalidCharacters: String { return self._s[2546]! } public func Channel_AdminLog_MessageChangedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2539]!, self._r[2539]!, [_0]) + return formatWithArgumentRanges(self._s[2547]!, self._r[2547]!, [_0]) } - public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2540]! } - public var PrivacySettings_LastSeenTitle: String { return self._s[2541]! } - public var Channel_AdminLog_CanInviteUsers: String { return self._s[2542]! } - public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2543]! } - public var OwnershipTransfer_SecurityCheck: String { return self._s[2544]! } - public var Conversation_MessageDeliveryFailed: String { return self._s[2545]! } - public var Watch_ChatList_NoConversationsText: String { return self._s[2546]! } - public var Bot_Unblock: String { return self._s[2547]! } - public var TextFormat_Italic: String { return self._s[2548]! } - public var WallpaperSearch_ColorPink: String { return self._s[2549]! } - public var Settings_About_Help: String { return self._s[2551]! } - public var SearchImages_Title: String { return self._s[2552]! } - public var Weekday_Wednesday: String { return self._s[2553]! } - public var Conversation_ClousStorageInfo_Description1: String { return self._s[2554]! } - public var ExplicitContent_AlertTitle: String { return self._s[2555]! } + public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2548]! } + public var PrivacySettings_LastSeenTitle: String { return self._s[2549]! } + public var Channel_AdminLog_CanInviteUsers: String { return self._s[2550]! } + public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2551]! } + public var OwnershipTransfer_SecurityCheck: String { return self._s[2552]! } + public var Conversation_MessageDeliveryFailed: String { return self._s[2553]! } + public var Watch_ChatList_NoConversationsText: String { return self._s[2554]! } + public var Bot_Unblock: String { return self._s[2555]! } + public var TextFormat_Italic: String { return self._s[2556]! } + public var WallpaperSearch_ColorPink: String { return self._s[2557]! } + public var Settings_About_Help: String { return self._s[2559]! } + public var SearchImages_Title: String { return self._s[2560]! } + public var Weekday_Wednesday: String { return self._s[2561]! } + public var Conversation_ClousStorageInfo_Description1: String { return self._s[2562]! } + public var ExplicitContent_AlertTitle: String { return self._s[2563]! } public func Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2556]!, self._r[2556]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2564]!, self._r[2564]!, [_1, _2, _3]) } - public var Channel_DiscussionGroup_Create: String { return self._s[2557]! } - public var Weekday_Thursday: String { return self._s[2558]! } - public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2559]! } - public var Channel_Members_AddMembersHelp: String { return self._s[2560]! } + public var Channel_DiscussionGroup_Create: String { return self._s[2565]! } + public var Weekday_Thursday: String { return self._s[2566]! } + public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2567]! } + public var Channel_Members_AddMembersHelp: String { return self._s[2568]! } public func Checkout_SavePasswordTimeout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2561]!, self._r[2561]!, [_0]) + return formatWithArgumentRanges(self._s[2569]!, self._r[2569]!, [_0]) } - public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2562]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2563]! } - public var Passport_RequestedInformation: String { return self._s[2564]! } - public var Login_PhoneAndCountryHelp: String { return self._s[2565]! } - public var Conversation_EncryptionProcessing: String { return self._s[2567]! } - public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2568]! } - public var PhotoEditor_EnhanceTool: String { return self._s[2570]! } - public var Channel_Setup_Title: String { return self._s[2571]! } - public var Conversation_SearchPlaceholder: String { return self._s[2572]! } - public var OldChannels_GroupEmptyFormat: String { return self._s[2573]! } - public var AccessDenied_LocationAlwaysDenied: String { return self._s[2574]! } - public var Checkout_ErrorGeneric: String { return self._s[2575]! } - public var Passport_Language_hu: String { return self._s[2576]! } - public var GroupPermission_EditingDisabled: String { return self._s[2577]! } - public var Wallet_Month_ShortSeptember: String { return self._s[2579]! } + public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2570]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2571]! } + public var Passport_RequestedInformation: String { return self._s[2572]! } + public var Login_PhoneAndCountryHelp: String { return self._s[2573]! } + public var Conversation_EncryptionProcessing: String { return self._s[2575]! } + public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2576]! } + public var PhotoEditor_EnhanceTool: String { return self._s[2578]! } + public var Channel_Setup_Title: String { return self._s[2579]! } + public var Conversation_SearchPlaceholder: String { return self._s[2580]! } + public var OldChannels_GroupEmptyFormat: String { return self._s[2581]! } + public var AccessDenied_LocationAlwaysDenied: String { return self._s[2582]! } + public var Checkout_ErrorGeneric: String { return self._s[2583]! } + public var Passport_Language_hu: String { return self._s[2584]! } + public var GroupPermission_EditingDisabled: String { return self._s[2585]! } + public var Wallet_Month_ShortSeptember: String { return self._s[2587]! } public func Passport_Identity_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2580]!, self._r[2580]!, [_0]) + return formatWithArgumentRanges(self._s[2588]!, self._r[2588]!, [_0]) } public func PUSH_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2583]!, self._r[2583]!, [_1]) + return formatWithArgumentRanges(self._s[2591]!, self._r[2591]!, [_1]) } - public var ChatList_DeleteSavedMessagesConfirmationTitle: String { return self._s[2584]! } + public var ChatList_DeleteSavedMessagesConfirmationTitle: String { return self._s[2592]! } public func UserInfo_BlockConfirmationTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2585]!, self._r[2585]!, [_0]) + return formatWithArgumentRanges(self._s[2593]!, self._r[2593]!, [_0]) } - public var Conversation_CloudStorageInfo_Title: String { return self._s[2586]! } - public var Group_Location_Info: String { return self._s[2587]! } - public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2588]! } - public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2589]! } + public var Conversation_CloudStorageInfo_Title: String { return self._s[2594]! } + public var Group_Location_Info: String { return self._s[2595]! } + public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2596]! } + public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2597]! } public func Notification_Exceptions_MutedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2590]!, self._r[2590]!, [_0]) + return formatWithArgumentRanges(self._s[2598]!, self._r[2598]!, [_0]) } - public var Conversation_ClearPrivateHistory: String { return self._s[2591]! } - public var ContactInfo_PhoneLabelHome: String { return self._s[2592]! } - public var Appearance_RemoveThemeConfirmation: String { return self._s[2593]! } - public var PrivacySettings_LastSeenContacts: String { return self._s[2594]! } + public var Conversation_ClearPrivateHistory: String { return self._s[2599]! } + public var ContactInfo_PhoneLabelHome: String { return self._s[2600]! } + public var Appearance_RemoveThemeConfirmation: String { return self._s[2601]! } + public var PrivacySettings_LastSeenContacts: String { return self._s[2602]! } public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2595]!, self._r[2595]!, [_0]) + return formatWithArgumentRanges(self._s[2603]!, self._r[2603]!, [_0]) } - public var Passport_Language_cs: String { return self._s[2596]! } - public var Message_PinnedAnimationMessage: String { return self._s[2598]! } - public var Passport_Identity_ReverseSideHelp: String { return self._s[2600]! } - public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2601]! } - public var Wallet_Info_TransactionTo: String { return self._s[2603]! } - public var ChatList_DeleteForEveryoneConfirmationText: String { return self._s[2604]! } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2605]! } - public var Embed_PlayingInPIP: String { return self._s[2606]! } - public var Appearance_ThemePreview_Chat_3_TextWithLink: String { return self._s[2607]! } - public var AutoNightTheme_ScheduleSection: String { return self._s[2608]! } + public var Passport_Language_cs: String { return self._s[2604]! } + public var Message_PinnedAnimationMessage: String { return self._s[2606]! } + public var Passport_Identity_ReverseSideHelp: String { return self._s[2608]! } + public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2609]! } + public var Wallet_Info_TransactionTo: String { return self._s[2611]! } + public var ChatList_DeleteForEveryoneConfirmationText: String { return self._s[2612]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2613]! } + public var Embed_PlayingInPIP: String { return self._s[2614]! } + public var Appearance_ThemePreview_Chat_3_TextWithLink: String { return self._s[2615]! } + public var AutoNightTheme_ScheduleSection: String { return self._s[2616]! } public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2609]!, self._r[2609]!, [_0]) + return formatWithArgumentRanges(self._s[2617]!, self._r[2617]!, [_0]) } - public var MediaPicker_LivePhotoDescription: String { return self._s[2610]! } + public var MediaPicker_LivePhotoDescription: String { return self._s[2618]! } public func Channel_AdminLog_MessageRestrictedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2611]!, self._r[2611]!, [_1]) + return formatWithArgumentRanges(self._s[2619]!, self._r[2619]!, [_1]) } - public var Notification_PaymentSent: String { return self._s[2612]! } - public var PhotoEditor_CurvesGreen: String { return self._s[2613]! } - public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2614]! } - public var AutoNightTheme_System: String { return self._s[2615]! } - public var SaveIncomingPhotosSettings_Title: String { return self._s[2616]! } - public var CreatePoll_QuizTitle: String { return self._s[2617]! } - public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2618]! } - public var VoiceOver_Chat_PagePreview: String { return self._s[2619]! } + public var Notification_PaymentSent: String { return self._s[2620]! } + public var PhotoEditor_CurvesGreen: String { return self._s[2621]! } + public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2622]! } + public var AutoNightTheme_System: String { return self._s[2623]! } + public var SaveIncomingPhotosSettings_Title: String { return self._s[2624]! } + public var CreatePoll_QuizTitle: String { return self._s[2625]! } + public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2626]! } + public var VoiceOver_Chat_PagePreview: String { return self._s[2627]! } public func PUSH_MESSAGE_SCREENSHOT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2622]!, self._r[2622]!, [_1]) + return formatWithArgumentRanges(self._s[2630]!, self._r[2630]!, [_1]) } public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2623]!, self._r[2623]!, [_1]) + return formatWithArgumentRanges(self._s[2631]!, self._r[2631]!, [_1]) } public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2624]!, self._r[2624]!, [_1]) + return formatWithArgumentRanges(self._s[2632]!, self._r[2632]!, [_1]) } - public var NetworkUsageSettings_CallDataSection: String { return self._s[2626]! } - public var PasscodeSettings_HelpTop: String { return self._s[2627]! } - public var Conversation_WalletRequiredTitle: String { return self._s[2628]! } - public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2629]! } - public var Passport_Address_TypeRentalAgreement: String { return self._s[2630]! } - public var EditTheme_ShortLink: String { return self._s[2631]! } - public var Theme_Colors_ColorWallpaperWarning: String { return self._s[2632]! } - public var ProxyServer_VoiceOver_Active: String { return self._s[2633]! } - public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2634]! } - public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2635]! } - public var Call_Accept: String { return self._s[2637]! } - public var GroupRemoved_RemoveInfo: String { return self._s[2638]! } - public var Month_GenMarch: String { return self._s[2640]! } - public var PhotoEditor_ShadowsTool: String { return self._s[2641]! } - public var LoginPassword_Title: String { return self._s[2642]! } - public var Call_End: String { return self._s[2643]! } - public var Watch_Conversation_GroupInfo: String { return self._s[2644]! } - public var VoiceOver_Chat_Contact: String { return self._s[2645]! } - public var EditTheme_Create_Preview_IncomingText: String { return self._s[2646]! } - public var CallSettings_Always: String { return self._s[2647]! } - public var CallFeedback_Success: String { return self._s[2648]! } - public var TwoStepAuth_SetupHint: String { return self._s[2649]! } + public var NetworkUsageSettings_CallDataSection: String { return self._s[2634]! } + public var PasscodeSettings_HelpTop: String { return self._s[2635]! } + public var Conversation_WalletRequiredTitle: String { return self._s[2636]! } + public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2637]! } + public var Passport_Address_TypeRentalAgreement: String { return self._s[2638]! } + public var EditTheme_ShortLink: String { return self._s[2639]! } + public var Theme_Colors_ColorWallpaperWarning: String { return self._s[2640]! } + public var ProxyServer_VoiceOver_Active: String { return self._s[2641]! } + public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2642]! } + public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2643]! } + public var Call_Accept: String { return self._s[2645]! } + public var GroupRemoved_RemoveInfo: String { return self._s[2646]! } + public var Month_GenMarch: String { return self._s[2648]! } + public var PhotoEditor_ShadowsTool: String { return self._s[2649]! } + public var LoginPassword_Title: String { return self._s[2650]! } + public var Call_End: String { return self._s[2651]! } + public var Watch_Conversation_GroupInfo: String { return self._s[2652]! } + public var VoiceOver_Chat_Contact: String { return self._s[2653]! } + public var EditTheme_Create_Preview_IncomingText: String { return self._s[2654]! } + public var CallSettings_Always: String { return self._s[2655]! } + public var CallFeedback_Success: String { return self._s[2656]! } + public var TwoStepAuth_SetupHint: String { return self._s[2657]! } public func AddContact_ContactWillBeSharedAfterMutual(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2650]!, self._r[2650]!, [_1]) + return formatWithArgumentRanges(self._s[2658]!, self._r[2658]!, [_1]) } - public var ConversationProfile_UsersTooMuchError: String { return self._s[2651]! } - public var Login_PhoneTitle: String { return self._s[2652]! } - public var Passport_FieldPhoneHelp: String { return self._s[2653]! } - public var Weekday_ShortSunday: String { return self._s[2654]! } - public var Passport_InfoFAQ_URL: String { return self._s[2655]! } - public var ContactInfo_Job: String { return self._s[2657]! } - public var UserInfo_InviteBotToGroup: String { return self._s[2658]! } - public var Appearance_ThemeCarouselNightBlue: String { return self._s[2659]! } - public var CreatePoll_QuizTip: String { return self._s[2660]! } - public var TwoFactorSetup_Email_Text: String { return self._s[2661]! } - public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2662]! } - public var Invite_ChannelsTooMuch: String { return self._s[2663]! } - public var Wallet_Send_ConfirmationConfirm: String { return self._s[2664]! } - public var Wallet_TransactionInfo_OtherFeeInfo: String { return self._s[2665]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2666]! } - public var Wallet_Receive_AmountText: String { return self._s[2667]! } - public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2668]! } - public var CallFeedback_ReasonNoise: String { return self._s[2669]! } - public var Appearance_AppIconDefault: String { return self._s[2671]! } - public var Passport_Identity_AddInternalPassport: String { return self._s[2672]! } - public var MediaPicker_AddCaption: String { return self._s[2673]! } - public var CallSettings_TabIconDescription: String { return self._s[2674]! } + public var ConversationProfile_UsersTooMuchError: String { return self._s[2659]! } + public var Login_PhoneTitle: String { return self._s[2660]! } + public var Passport_FieldPhoneHelp: String { return self._s[2661]! } + public var Weekday_ShortSunday: String { return self._s[2662]! } + public var Passport_InfoFAQ_URL: String { return self._s[2663]! } + public var ContactInfo_Job: String { return self._s[2665]! } + public var UserInfo_InviteBotToGroup: String { return self._s[2666]! } + public var Appearance_ThemeCarouselNightBlue: String { return self._s[2667]! } + public var CreatePoll_QuizTip: String { return self._s[2668]! } + public var TwoFactorSetup_Email_Text: String { return self._s[2669]! } + public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2670]! } + public var Invite_ChannelsTooMuch: String { return self._s[2671]! } + public var Wallet_Send_ConfirmationConfirm: String { return self._s[2672]! } + public var Wallet_TransactionInfo_OtherFeeInfo: String { return self._s[2673]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2674]! } + public var Wallet_Receive_AmountText: String { return self._s[2675]! } + public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2676]! } + public var CallFeedback_ReasonNoise: String { return self._s[2677]! } + public var Appearance_AppIconDefault: String { return self._s[2679]! } + public var Passport_Identity_AddInternalPassport: String { return self._s[2680]! } + public var MediaPicker_AddCaption: String { return self._s[2681]! } + public var CallSettings_TabIconDescription: String { return self._s[2682]! } public func VoiceOver_Chat_Caption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2675]!, self._r[2675]!, [_0]) + return formatWithArgumentRanges(self._s[2683]!, self._r[2683]!, [_0]) } - public var IntentsSettings_SuggestedChatsGroups: String { return self._s[2676]! } + public var IntentsSettings_SuggestedChatsGroups: String { return self._s[2684]! } public func Map_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2677]!, self._r[2677]!, [_0]) + return formatWithArgumentRanges(self._s[2685]!, self._r[2685]!, [_0]) } - public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2678]! } - public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2679]! } - public var Passport_Identity_TypePersonalDetails: String { return self._s[2680]! } - public var DialogList_SearchSectionRecent: String { return self._s[2681]! } - public var PrivacyPolicy_DeclineMessage: String { return self._s[2682]! } - public var CreatePoll_Anonymous: String { return self._s[2683]! } - public var LogoutOptions_ClearCacheText: String { return self._s[2686]! } - public var LastSeen_WithinAWeek: String { return self._s[2687]! } - public var ChannelMembers_GroupAdminsTitle: String { return self._s[2688]! } - public var Conversation_CloudStorage_ChatStatus: String { return self._s[2690]! } - public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2691]! } + public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2686]! } + public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2687]! } + public var Passport_Identity_TypePersonalDetails: String { return self._s[2688]! } + public var DialogList_SearchSectionRecent: String { return self._s[2689]! } + public var PrivacyPolicy_DeclineMessage: String { return self._s[2690]! } + public var CreatePoll_Anonymous: String { return self._s[2691]! } + public var LogoutOptions_ClearCacheText: String { return self._s[2694]! } + public var LastSeen_WithinAWeek: String { return self._s[2695]! } + public var ChannelMembers_GroupAdminsTitle: String { return self._s[2696]! } + public var Conversation_CloudStorage_ChatStatus: String { return self._s[2698]! } + public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2699]! } public func AddContact_SharedContactExceptionInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2692]!, self._r[2692]!, [_0]) + return formatWithArgumentRanges(self._s[2700]!, self._r[2700]!, [_0]) } - public var Passport_Address_TypeResidentialAddress: String { return self._s[2693]! } - public var Conversation_StatusLeftGroup: String { return self._s[2694]! } - public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2695]! } - public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2697]! } - public var GroupPermission_AddSuccess: String { return self._s[2698]! } - public var PhotoEditor_BlurToolRadial: String { return self._s[2700]! } - public var Conversation_ContextMenuCopy: String { return self._s[2701]! } - public var AccessDenied_CallMicrophone: String { return self._s[2702]! } + public var Passport_Address_TypeResidentialAddress: String { return self._s[2701]! } + public var Conversation_StatusLeftGroup: String { return self._s[2702]! } + public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2703]! } + public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2705]! } + public var GroupPermission_AddSuccess: String { return self._s[2706]! } + public var PhotoEditor_BlurToolRadial: String { return self._s[2708]! } + public var Conversation_ContextMenuCopy: String { return self._s[2709]! } + public var AccessDenied_CallMicrophone: String { return self._s[2710]! } public func Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2703]!, self._r[2703]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2711]!, self._r[2711]!, [_1, _2, _3]) } - public var Login_InvalidFirstNameError: String { return self._s[2704]! } - public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2705]! } - public var Checkout_PaymentMethod_New: String { return self._s[2706]! } - public var ShareMenu_CopyShareLinkGame: String { return self._s[2707]! } - public var PhotoEditor_QualityTool: String { return self._s[2708]! } - public var Login_SendCodeViaSms: String { return self._s[2709]! } - public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2710]! } - public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2711]! } - public var Wallet_Receive_CopyAddress: String { return self._s[2712]! } - public var Login_EmailNotConfiguredError: String { return self._s[2713]! } - public var SocksProxySetup_Status: String { return self._s[2714]! } - public var Conversation_ScheduleMessage_SendWhenOnline: String { return self._s[2715]! } - public var PrivacyPolicy_Accept: String { return self._s[2716]! } - public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2717]! } - public var Appearance_AppIconClassicX: String { return self._s[2718]! } + public var Login_InvalidFirstNameError: String { return self._s[2712]! } + public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2713]! } + public var Checkout_PaymentMethod_New: String { return self._s[2714]! } + public var ShareMenu_CopyShareLinkGame: String { return self._s[2715]! } + public var PhotoEditor_QualityTool: String { return self._s[2716]! } + public var Login_SendCodeViaSms: String { return self._s[2717]! } + public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2718]! } + public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2719]! } + public var Wallet_Receive_CopyAddress: String { return self._s[2720]! } + public var Login_EmailNotConfiguredError: String { return self._s[2721]! } + public var SocksProxySetup_Status: String { return self._s[2722]! } + public var Conversation_ScheduleMessage_SendWhenOnline: String { return self._s[2723]! } + public var PrivacyPolicy_Accept: String { return self._s[2724]! } + public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2725]! } + public var Appearance_AppIconClassicX: String { return self._s[2726]! } public func PUSH_CHAT_MESSAGE_TEXT(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2719]!, self._r[2719]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2727]!, self._r[2727]!, [_1, _2, _3]) } - public var OwnershipTransfer_SecurityRequirements: String { return self._s[2720]! } - public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2722]! } - public var AutoNightTheme_Automatic: String { return self._s[2723]! } - public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2724]! } - public var Privacy_ContactsSyncHelp: String { return self._s[2725]! } - public var Cache_Help: String { return self._s[2726]! } - public var Group_ErrorAccessDenied: String { return self._s[2727]! } - public var Passport_Language_fa: String { return self._s[2728]! } - public var Wallet_Intro_Text: String { return self._s[2729]! } - public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2730]! } - public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2731]! } - public var PrivacySettings_LastSeen: String { return self._s[2732]! } + public var OwnershipTransfer_SecurityRequirements: String { return self._s[2728]! } + public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2730]! } + public var AutoNightTheme_Automatic: String { return self._s[2731]! } + public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2732]! } + public var Privacy_ContactsSyncHelp: String { return self._s[2733]! } + public var Cache_Help: String { return self._s[2734]! } + public var Group_ErrorAccessDenied: String { return self._s[2735]! } + public var Passport_Language_fa: String { return self._s[2736]! } + public var Wallet_Intro_Text: String { return self._s[2737]! } + public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2738]! } + public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2739]! } + public var PrivacySettings_LastSeen: String { return self._s[2740]! } public func DialogList_MultipleTyping(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2733]!, self._r[2733]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2741]!, self._r[2741]!, [_0, _1]) } - public var Wallet_Configuration_Apply: String { return self._s[2737]! } - public var Preview_SaveGif: String { return self._s[2738]! } - public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2739]! } - public var Profile_About: String { return self._s[2740]! } - public var Channel_About_Placeholder: String { return self._s[2741]! } - public var Login_InfoTitle: String { return self._s[2742]! } + public var Wallet_Configuration_Apply: String { return self._s[2745]! } + public var Preview_SaveGif: String { return self._s[2746]! } + public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2747]! } + public var Profile_About: String { return self._s[2748]! } + public var Channel_About_Placeholder: String { return self._s[2749]! } + public var Login_InfoTitle: String { return self._s[2750]! } public func TwoStepAuth_SetupPendingEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2743]!, self._r[2743]!, [_0]) + return formatWithArgumentRanges(self._s[2751]!, self._r[2751]!, [_0]) } - public var EditTheme_Expand_Preview_IncomingReplyText: String { return self._s[2744]! } - public var Watch_Suggestion_CantTalk: String { return self._s[2746]! } - public var ContactInfo_Title: String { return self._s[2747]! } - public var Media_ShareThisVideo: String { return self._s[2748]! } - public var Weekday_ShortFriday: String { return self._s[2749]! } - public var AccessDenied_Contacts: String { return self._s[2751]! } - public var Notification_CallIncomingShort: String { return self._s[2752]! } - public var Group_Setup_TypePublic: String { return self._s[2753]! } - public var Notifications_MessageNotificationsExceptions: String { return self._s[2754]! } - public var Notifications_Badge_IncludeChannels: String { return self._s[2755]! } - public var Notifications_MessageNotificationsPreview: String { return self._s[2758]! } - public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2759]! } - public var Group_ErrorAddTooMuchBots: String { return self._s[2760]! } - public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2761]! } - public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2762]! } + public var EditTheme_Expand_Preview_IncomingReplyText: String { return self._s[2752]! } + public var Watch_Suggestion_CantTalk: String { return self._s[2754]! } + public var ContactInfo_Title: String { return self._s[2755]! } + public var Media_ShareThisVideo: String { return self._s[2756]! } + public var Weekday_ShortFriday: String { return self._s[2757]! } + public var AccessDenied_Contacts: String { return self._s[2759]! } + public var Notification_CallIncomingShort: String { return self._s[2760]! } + public var Group_Setup_TypePublic: String { return self._s[2761]! } + public var Notifications_MessageNotificationsExceptions: String { return self._s[2762]! } + public var Notifications_Badge_IncludeChannels: String { return self._s[2763]! } + public var Notifications_MessageNotificationsPreview: String { return self._s[2766]! } + public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2767]! } + public var Group_ErrorAddTooMuchBots: String { return self._s[2768]! } + public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2769]! } + public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2770]! } public func Wallet_SecureStorageChanged_BiometryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2763]!, self._r[2763]!, [_0]) + return formatWithArgumentRanges(self._s[2771]!, self._r[2771]!, [_0]) } - public var DialogList_Typing: String { return self._s[2764]! } - public var CallFeedback_IncludeLogs: String { return self._s[2766]! } - public var Checkout_Phone: String { return self._s[2768]! } - public var Login_InfoFirstNamePlaceholder: String { return self._s[2771]! } - public var Privacy_Calls_Integration: String { return self._s[2772]! } - public var Notifications_PermissionsAllow: String { return self._s[2773]! } - public var TwoStepAuth_AddHintDescription: String { return self._s[2777]! } - public var Settings_ChatSettings: String { return self._s[2778]! } - public var Conversation_SendingOptionsTooltip: String { return self._s[2779]! } + public var DialogList_Typing: String { return self._s[2772]! } + public var CallFeedback_IncludeLogs: String { return self._s[2774]! } + public var Checkout_Phone: String { return self._s[2776]! } + public var Login_InfoFirstNamePlaceholder: String { return self._s[2779]! } + public var Privacy_Calls_Integration: String { return self._s[2780]! } + public var Notifications_PermissionsAllow: String { return self._s[2781]! } + public var TwoStepAuth_AddHintDescription: String { return self._s[2786]! } + public var Settings_ChatSettings: String { return self._s[2787]! } + public var Conversation_SendingOptionsTooltip: String { return self._s[2788]! } public func UserInfo_StartSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2781]!, self._r[2781]!, [_0]) + return formatWithArgumentRanges(self._s[2790]!, self._r[2790]!, [_0]) } public func Channel_AdminLog_MessageInvitedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2782]!, self._r[2782]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2791]!, self._r[2791]!, [_1, _2]) } - public var GroupRemoved_DeleteUser: String { return self._s[2784]! } + public var GroupRemoved_DeleteUser: String { return self._s[2793]! } public func Channel_AdminLog_PollStopped(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2785]!, self._r[2785]!, [_0]) + return formatWithArgumentRanges(self._s[2794]!, self._r[2794]!, [_0]) } public func PUSH_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2786]!, self._r[2786]!, [_1]) + return formatWithArgumentRanges(self._s[2795]!, self._r[2795]!, [_1]) } - public var Login_ContinueWithLocalization: String { return self._s[2787]! } - public var Watch_Message_ForwardedFrom: String { return self._s[2788]! } - public var TwoStepAuth_EnterEmailCode: String { return self._s[2790]! } - public var Conversation_Unblock: String { return self._s[2791]! } - public var PrivacySettings_DataSettings: String { return self._s[2792]! } - public var WallpaperPreview_PatternPaternApply: String { return self._s[2793]! } - public var Group_PublicLink_Info: String { return self._s[2794]! } + public var Login_ContinueWithLocalization: String { return self._s[2796]! } + public var Watch_Message_ForwardedFrom: String { return self._s[2797]! } + public var TwoStepAuth_EnterEmailCode: String { return self._s[2799]! } + public var Conversation_Unblock: String { return self._s[2800]! } + public var PrivacySettings_DataSettings: String { return self._s[2801]! } + public var WallpaperPreview_PatternPaternApply: String { return self._s[2802]! } + public var Group_PublicLink_Info: String { return self._s[2803]! } public func Wallet_Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2795]!, self._r[2795]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2804]!, self._r[2804]!, [_1, _2, _3]) } - public var Notifications_InAppNotificationsVibrate: String { return self._s[2796]! } + public var Notifications_InAppNotificationsVibrate: String { return self._s[2805]! } public func Privacy_GroupsAndChannels_InviteToChannelError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2797]!, self._r[2797]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2806]!, self._r[2806]!, [_0, _1]) } - public var OldChannels_ChannelsHeader: String { return self._s[2799]! } - public var Wallet_RestoreFailed_CreateWallet: String { return self._s[2800]! } - public var PrivacySettings_Passcode: String { return self._s[2802]! } - public var Call_Mute: String { return self._s[2803]! } - public var Wallet_Weekday_Yesterday: String { return self._s[2804]! } - public var Passport_Language_dz: String { return self._s[2805]! } - public var Wallet_Receive_AmountHeader: String { return self._s[2806]! } - public var Wallet_TransactionInfo_OtherFeeInfoUrl: String { return self._s[2807]! } - public var Passport_Language_tk: String { return self._s[2808]! } + public var OldChannels_ChannelsHeader: String { return self._s[2808]! } + public var Wallet_RestoreFailed_CreateWallet: String { return self._s[2809]! } + public var PrivacySettings_Passcode: String { return self._s[2811]! } + public var Call_Mute: String { return self._s[2812]! } + public var Wallet_Weekday_Yesterday: String { return self._s[2813]! } + public var Passport_Language_dz: String { return self._s[2814]! } + public var Wallet_Receive_AmountHeader: String { return self._s[2815]! } + public var Wallet_TransactionInfo_OtherFeeInfoUrl: String { return self._s[2816]! } + public var Passport_Language_tk: String { return self._s[2817]! } public func Login_EmailCodeSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2809]!, self._r[2809]!, [_0]) + return formatWithArgumentRanges(self._s[2818]!, self._r[2818]!, [_0]) } - public var Settings_Search: String { return self._s[2810]! } - public var Wallet_Month_ShortFebruary: String { return self._s[2811]! } - public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2812]! } - public var Wallet_Configuration_SourceJSON: String { return self._s[2813]! } - public var Conversation_ContextMenuReply: String { return self._s[2814]! } - public var WallpaperSearch_ColorBrown: String { return self._s[2815]! } - public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2816]! } - public var Tour_Title1: String { return self._s[2817]! } - public var Wallet_Alert_Cancel: String { return self._s[2818]! } - public var Conversation_ClearGroupHistory: String { return self._s[2820]! } - public var Wallet_TransactionInfo_RecipientHeader: String { return self._s[2821]! } - public var WallpaperPreview_Motion: String { return self._s[2822]! } + public var Settings_Search: String { return self._s[2819]! } + public var Wallet_Month_ShortFebruary: String { return self._s[2820]! } + public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2821]! } + public var Wallet_Configuration_SourceJSON: String { return self._s[2822]! } + public var Conversation_ContextMenuReply: String { return self._s[2823]! } + public var WallpaperSearch_ColorBrown: String { return self._s[2824]! } + public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2825]! } + public var Tour_Title1: String { return self._s[2826]! } + public var Wallet_Alert_Cancel: String { return self._s[2827]! } + public var Conversation_ClearGroupHistory: String { return self._s[2829]! } + public var Wallet_TransactionInfo_RecipientHeader: String { return self._s[2830]! } + public var WallpaperPreview_Motion: String { return self._s[2831]! } public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2823]!, self._r[2823]!, [_0]) - } - public var Wallet_Configuration_ApplyErrorTextJSONInvalidData: String { return self._s[2824]! } - public var Call_RateCall: String { return self._s[2825]! } - public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2826]! } - public var Passport_PasswordCompleteSetup: String { return self._s[2827]! } - public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2828]! } - public var UserInfo_LastNamePlaceholder: String { return self._s[2830]! } - public func Login_WillCallYou(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2832]!, self._r[2832]!, [_0]) } - public var Compose_Create: String { return self._s[2833]! } - public var Contacts_InviteToTelegram: String { return self._s[2834]! } - public var GroupInfo_Notifications: String { return self._s[2835]! } - public var ChatList_DeleteSavedMessagesConfirmationAction: String { return self._s[2837]! } - public var Message_PinnedLiveLocationMessage: String { return self._s[2838]! } - public var Month_GenApril: String { return self._s[2839]! } - public var Appearance_AutoNightTheme: String { return self._s[2840]! } - public var ChatSettings_AutomaticAudioDownload: String { return self._s[2842]! } - public var Login_CodeSentSms: String { return self._s[2844]! } + public var Wallet_Configuration_ApplyErrorTextJSONInvalidData: String { return self._s[2833]! } + public var Call_RateCall: String { return self._s[2834]! } + public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2835]! } + public var Passport_PasswordCompleteSetup: String { return self._s[2836]! } + public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2837]! } + public var UserInfo_LastNamePlaceholder: String { return self._s[2839]! } + public func Login_WillCallYou(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2841]!, self._r[2841]!, [_0]) + } + public var Compose_Create: String { return self._s[2842]! } + public var Contacts_InviteToTelegram: String { return self._s[2843]! } + public var GroupInfo_Notifications: String { return self._s[2844]! } + public var ChatList_DeleteSavedMessagesConfirmationAction: String { return self._s[2846]! } + public var Message_PinnedLiveLocationMessage: String { return self._s[2847]! } + public var Month_GenApril: String { return self._s[2848]! } + public var Appearance_AutoNightTheme: String { return self._s[2849]! } + public var ChatSettings_AutomaticAudioDownload: String { return self._s[2851]! } + public var Login_CodeSentSms: String { return self._s[2853]! } public func UserInfo_UnblockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2845]!, self._r[2845]!, [_0]) + return formatWithArgumentRanges(self._s[2854]!, self._r[2854]!, [_0]) } - public var EmptyGroupInfo_Line3: String { return self._s[2846]! } - public var LogoutOptions_ContactSupportText: String { return self._s[2847]! } - public var Passport_Language_hr: String { return self._s[2848]! } - public var Common_ActionNotAllowedError: String { return self._s[2849]! } + public var EmptyGroupInfo_Line3: String { return self._s[2855]! } + public var LogoutOptions_ContactSupportText: String { return self._s[2856]! } + public var Passport_Language_hr: String { return self._s[2857]! } + public var Common_ActionNotAllowedError: String { return self._s[2858]! } public func Channel_AdminLog_MessageRestrictedNewSetting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2850]!, self._r[2850]!, [_0]) + return formatWithArgumentRanges(self._s[2859]!, self._r[2859]!, [_0]) } - public var GroupInfo_InviteLink_CopyLink: String { return self._s[2851]! } - public var Wallet_Info_TransactionFrom: String { return self._s[2852]! } - public var Wallet_Send_ErrorDecryptionFailed: String { return self._s[2853]! } - public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2854]! } - public var Privacy_SecretChatsTitle: String { return self._s[2855]! } - public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2857]! } - public var GroupInfo_AddUserLeftError: String { return self._s[2858]! } - public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2859]! } - public var LogoutOptions_ContactSupportTitle: String { return self._s[2860]! } - public var Appearance_ThemePreview_Chat_7_Text: String { return self._s[2861]! } - public var Channel_AddBotErrorHaveRights: String { return self._s[2862]! } - public var Preview_DeleteGif: String { return self._s[2863]! } - public var GroupInfo_Permissions_Exceptions: String { return self._s[2864]! } - public var Group_ErrorNotMutualContact: String { return self._s[2865]! } - public var Notification_MessageLifetime5s: String { return self._s[2866]! } - public var Wallet_Send_OwnAddressAlertText: String { return self._s[2867]! } - public var OldChannels_ChannelFormat: String { return self._s[2868]! } + public var GroupInfo_InviteLink_CopyLink: String { return self._s[2860]! } + public var Wallet_Info_TransactionFrom: String { return self._s[2861]! } + public var Wallet_Send_ErrorDecryptionFailed: String { return self._s[2862]! } + public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2863]! } + public var Privacy_SecretChatsTitle: String { return self._s[2864]! } + public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2866]! } + public var GroupInfo_AddUserLeftError: String { return self._s[2867]! } + public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2868]! } + public var LogoutOptions_ContactSupportTitle: String { return self._s[2869]! } + public var Appearance_ThemePreview_Chat_7_Text: String { return self._s[2870]! } + public var Channel_AddBotErrorHaveRights: String { return self._s[2871]! } + public var Preview_DeleteGif: String { return self._s[2872]! } + public var GroupInfo_Permissions_Exceptions: String { return self._s[2873]! } + public var Group_ErrorNotMutualContact: String { return self._s[2874]! } + public var Notification_MessageLifetime5s: String { return self._s[2875]! } + public var Wallet_Send_OwnAddressAlertText: String { return self._s[2876]! } + public var OldChannels_ChannelFormat: String { return self._s[2877]! } public func Watch_LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2869]!, self._r[2869]!, [_0]) + return formatWithArgumentRanges(self._s[2878]!, self._r[2878]!, [_0]) } - public var VoiceOver_Chat_Video: String { return self._s[2870]! } - public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2872]! } - public var ReportSpam_DeleteThisChat: String { return self._s[2873]! } - public var Passport_Address_AddBankStatement: String { return self._s[2874]! } - public var Notification_CallIncoming: String { return self._s[2875]! } - public var Wallet_Words_NotDoneTitle: String { return self._s[2876]! } - public var Compose_NewGroupTitle: String { return self._s[2877]! } - public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2879]! } - public var Passport_Address_Postcode: String { return self._s[2881]! } + public var VoiceOver_Chat_Video: String { return self._s[2879]! } + public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2881]! } + public var ReportSpam_DeleteThisChat: String { return self._s[2882]! } + public var Passport_Address_AddBankStatement: String { return self._s[2883]! } + public var Notification_CallIncoming: String { return self._s[2884]! } + public var Wallet_Words_NotDoneTitle: String { return self._s[2885]! } + public var Compose_NewGroupTitle: String { return self._s[2886]! } + public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2888]! } + public var Passport_Address_Postcode: String { return self._s[2890]! } public func LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2882]!, self._r[2882]!, [_0]) + return formatWithArgumentRanges(self._s[2891]!, self._r[2891]!, [_0]) } - public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2883]! } - public var Wallet_Month_ShortOctober: String { return self._s[2884]! } - public var VoiceOver_Chat_YourMusic: String { return self._s[2885]! } - public var WallpaperColors_Title: String { return self._s[2886]! } - public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2887]! } - public var VoiceOver_MessageContextForward: String { return self._s[2888]! } - public var GroupPermission_Duration: String { return self._s[2889]! } + public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2892]! } + public var Wallet_Month_ShortOctober: String { return self._s[2893]! } + public var VoiceOver_Chat_YourMusic: String { return self._s[2894]! } + public var WallpaperColors_Title: String { return self._s[2895]! } + public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2896]! } + public var VoiceOver_MessageContextForward: String { return self._s[2897]! } + public var GroupPermission_Duration: String { return self._s[2898]! } public func Cache_Clear(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2890]!, self._r[2890]!, [_0]) + return formatWithArgumentRanges(self._s[2899]!, self._r[2899]!, [_0]) } - public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2891]! } - public var Username_Placeholder: String { return self._s[2892]! } - public var CallFeedback_WhatWentWrong: String { return self._s[2893]! } - public var Passport_FieldAddressUploadHelp: String { return self._s[2894]! } - public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2895]! } + public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2900]! } + public var Username_Placeholder: String { return self._s[2901]! } + public var CallFeedback_WhatWentWrong: String { return self._s[2902]! } + public var Passport_FieldAddressUploadHelp: String { return self._s[2903]! } + public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2904]! } public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2897]!, self._r[2897]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2906]!, self._r[2906]!, [_1, _2]) } - public var Passport_PasswordDescription: String { return self._s[2898]! } - public var Channel_MessagePhotoUpdated: String { return self._s[2899]! } - public var MediaPicker_TapToUngroupDescription: String { return self._s[2900]! } - public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2901]! } - public var AttachmentMenu_PhotoOrVideo: String { return self._s[2902]! } - public var Conversation_ContextMenuMore: String { return self._s[2903]! } - public var Privacy_PaymentsClearInfo: String { return self._s[2904]! } - public var CallSettings_TabIcon: String { return self._s[2905]! } - public var KeyCommand_Find: String { return self._s[2906]! } - public var ClearCache_FreeSpaceDescription: String { return self._s[2907]! } - public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2908]! } - public var EditTheme_Edit_Preview_IncomingText: String { return self._s[2909]! } - public var Message_PinnedGame: String { return self._s[2910]! } - public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2911]! } - public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2913]! } - public var Login_CallRequestState2: String { return self._s[2915]! } - public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2917]! } + public var Passport_PasswordDescription: String { return self._s[2907]! } + public var Channel_MessagePhotoUpdated: String { return self._s[2908]! } + public var MediaPicker_TapToUngroupDescription: String { return self._s[2909]! } + public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2910]! } + public var AttachmentMenu_PhotoOrVideo: String { return self._s[2911]! } + public var Conversation_ContextMenuMore: String { return self._s[2912]! } + public var Privacy_PaymentsClearInfo: String { return self._s[2913]! } + public var CallSettings_TabIcon: String { return self._s[2914]! } + public var KeyCommand_Find: String { return self._s[2915]! } + public var ClearCache_FreeSpaceDescription: String { return self._s[2916]! } + public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2917]! } + public var EditTheme_Edit_Preview_IncomingText: String { return self._s[2918]! } + public var Message_PinnedGame: String { return self._s[2919]! } + public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2920]! } + public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2922]! } + public var Login_CallRequestState2: String { return self._s[2924]! } + public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2926]! } public func VoiceOver_Chat_PhotoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2918]!, self._r[2918]!, [_0]) + return formatWithArgumentRanges(self._s[2927]!, self._r[2927]!, [_0]) } public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2920]!, self._r[2920]!, [_0]) + return formatWithArgumentRanges(self._s[2929]!, self._r[2929]!, [_0]) } - public var AuthSessions_AddDevice: String { return self._s[2921]! } - public var WallpaperPreview_Blurred: String { return self._s[2922]! } - public var Conversation_InstantPagePreview: String { return self._s[2923]! } + public var AuthSessions_AddDevice: String { return self._s[2930]! } + public var WallpaperPreview_Blurred: String { return self._s[2931]! } + public var Conversation_InstantPagePreview: String { return self._s[2932]! } public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2924]!, self._r[2924]!, [_0]) + return formatWithArgumentRanges(self._s[2933]!, self._r[2933]!, [_0]) } - public var SecretTimer_VideoDescription: String { return self._s[2927]! } - public var WallpaperSearch_ColorRed: String { return self._s[2928]! } - public var GroupPermission_NoPinMessages: String { return self._s[2929]! } - public var Passport_Language_es: String { return self._s[2930]! } - public var Permissions_ContactsAllow_v0: String { return self._s[2932]! } - public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2933]! } + public var SecretTimer_VideoDescription: String { return self._s[2936]! } + public var WallpaperSearch_ColorRed: String { return self._s[2937]! } + public var GroupPermission_NoPinMessages: String { return self._s[2938]! } + public var Passport_Language_es: String { return self._s[2939]! } + public var Permissions_ContactsAllow_v0: String { return self._s[2941]! } + public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2942]! } public func PUSH_CHAT_MESSAGE_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2934]!, self._r[2934]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2943]!, self._r[2943]!, [_1, _2]) } - public var Privacy_Forwards_CustomHelp: String { return self._s[2935]! } - public var WebPreview_GettingLinkInfo: String { return self._s[2936]! } - public var Watch_UserInfo_Unmute: String { return self._s[2937]! } - public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2938]! } - public var AccessDenied_CameraRestricted: String { return self._s[2940]! } + public var Privacy_Forwards_CustomHelp: String { return self._s[2944]! } + public var WebPreview_GettingLinkInfo: String { return self._s[2945]! } + public var Watch_UserInfo_Unmute: String { return self._s[2946]! } + public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2947]! } + public var AccessDenied_CameraRestricted: String { return self._s[2949]! } public func Conversation_Kilobytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2941]!, self._r[2941]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[2950]!, self._r[2950]!, ["\(_0)"]) } - public var ChatList_ReadAll: String { return self._s[2943]! } - public var Settings_CopyUsername: String { return self._s[2944]! } - public var Contacts_SearchLabel: String { return self._s[2945]! } - public var Map_OpenInYandexNavigator: String { return self._s[2947]! } - public var PasscodeSettings_EncryptData: String { return self._s[2948]! } - public var Settings_Wallet: String { return self._s[2949]! } - public var Group_ErrorSupergroupConversionNotPossible: String { return self._s[2950]! } - public var WallpaperSearch_ColorPrefix: String { return self._s[2951]! } - public var Notifications_GroupNotificationsPreview: String { return self._s[2952]! } - public var DialogList_AdNoticeAlert: String { return self._s[2953]! } - public var Wallet_Month_GenMay: String { return self._s[2955]! } - public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2956]! } - public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2957]! } - public var Localization_LanguageCustom: String { return self._s[2958]! } - public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2959]! } - public var CallFeedback_Title: String { return self._s[2960]! } - public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2963]! } - public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2964]! } - public var Wallet_Intro_CreateErrorTitle: String { return self._s[2965]! } - public var Conversation_InfoGroup: String { return self._s[2966]! } - public var Compose_NewMessage: String { return self._s[2967]! } - public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2968]! } - public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2969]! } - public var Wallet_SecureStorageReset_BiometryFaceId: String { return self._s[2970]! } - public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2971]! } + public var ChatList_ReadAll: String { return self._s[2952]! } + public var Settings_CopyUsername: String { return self._s[2953]! } + public var Contacts_SearchLabel: String { return self._s[2954]! } + public var Map_OpenInYandexNavigator: String { return self._s[2956]! } + public var PasscodeSettings_EncryptData: String { return self._s[2957]! } + public var Settings_Wallet: String { return self._s[2958]! } + public var Group_ErrorSupergroupConversionNotPossible: String { return self._s[2959]! } + public var WallpaperSearch_ColorPrefix: String { return self._s[2960]! } + public var Notifications_GroupNotificationsPreview: String { return self._s[2961]! } + public var DialogList_AdNoticeAlert: String { return self._s[2962]! } + public var Wallet_Month_GenMay: String { return self._s[2964]! } + public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2965]! } + public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2966]! } + public var Localization_LanguageCustom: String { return self._s[2967]! } + public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2968]! } + public var CallFeedback_Title: String { return self._s[2969]! } + public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2972]! } + public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2973]! } + public var Wallet_Intro_CreateErrorTitle: String { return self._s[2974]! } + public var Conversation_InfoGroup: String { return self._s[2975]! } + public var Compose_NewMessage: String { return self._s[2976]! } + public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2977]! } + public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2978]! } + public var Wallet_SecureStorageReset_BiometryFaceId: String { return self._s[2979]! } + public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2980]! } public func Passport_Scans_ScanIndex(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2972]!, self._r[2972]!, [_0]) + return formatWithArgumentRanges(self._s[2981]!, self._r[2981]!, [_0]) } - public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2973]! } - public var Login_CancelSignUpConfirmation: String { return self._s[2974]! } - public var ChangePhoneNumberCode_Help: String { return self._s[2975]! } - public var PrivacySettings_DeleteAccountHelp: String { return self._s[2976]! } - public var Channel_BlackList_Title: String { return self._s[2977]! } - public var UserInfo_PhoneCall: String { return self._s[2978]! } - public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2980]! } - public var Wallet_Month_ShortJanuary: String { return self._s[2981]! } - public var State_connecting: String { return self._s[2982]! } - public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2983]! } - public var Wallet_Month_GenMarch: String { return self._s[2984]! } - public var EditTheme_Expand_BottomInfo: String { return self._s[2985]! } - public var AuthSessions_AddedDeviceTerminate: String { return self._s[2986]! } + public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2982]! } + public var Login_CancelSignUpConfirmation: String { return self._s[2983]! } + public var ChangePhoneNumberCode_Help: String { return self._s[2984]! } + public var PrivacySettings_DeleteAccountHelp: String { return self._s[2985]! } + public var Channel_BlackList_Title: String { return self._s[2986]! } + public var UserInfo_PhoneCall: String { return self._s[2987]! } + public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2989]! } + public var Wallet_Month_ShortJanuary: String { return self._s[2990]! } + public var State_connecting: String { return self._s[2991]! } + public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2992]! } + public var Wallet_Month_GenMarch: String { return self._s[2993]! } + public var EditTheme_Expand_BottomInfo: String { return self._s[2994]! } + public var AuthSessions_AddedDeviceTerminate: String { return self._s[2995]! } public func LastSeen_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2987]!, self._r[2987]!, [_0]) + return formatWithArgumentRanges(self._s[2996]!, self._r[2996]!, [_0]) } public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2988]!, self._r[2988]!, [_0]) + return formatWithArgumentRanges(self._s[2997]!, self._r[2997]!, [_0]) } - public var Notifications_GroupNotifications: String { return self._s[2989]! } - public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[2990]! } - public var Passport_Identity_EditPassport: String { return self._s[2991]! } - public var EnterPasscode_RepeatNewPasscode: String { return self._s[2993]! } - public var Localization_EnglishLanguageName: String { return self._s[2994]! } - public var Share_AuthDescription: String { return self._s[2995]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2996]! } - public var Passport_Identity_Surname: String { return self._s[2997]! } - public var Compose_TokenListPlaceholder: String { return self._s[2998]! } - public var Wallet_AccessDenied_Camera: String { return self._s[2999]! } - public var Passport_Identity_OneOfTypePassport: String { return self._s[3000]! } - public var Settings_AboutEmpty: String { return self._s[3001]! } - public var Conversation_Unmute: String { return self._s[3002]! } - public var CreateGroup_ChannelsTooMuch: String { return self._s[3004]! } - public var Wallet_Sending_Text: String { return self._s[3005]! } + public var Notifications_GroupNotifications: String { return self._s[2998]! } + public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[2999]! } + public var Passport_Identity_EditPassport: String { return self._s[3000]! } + public var EnterPasscode_RepeatNewPasscode: String { return self._s[3002]! } + public var Localization_EnglishLanguageName: String { return self._s[3003]! } + public var Share_AuthDescription: String { return self._s[3004]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[3005]! } + public var Passport_Identity_Surname: String { return self._s[3006]! } + public var Compose_TokenListPlaceholder: String { return self._s[3007]! } + public var Wallet_AccessDenied_Camera: String { return self._s[3008]! } + public var Passport_Identity_OneOfTypePassport: String { return self._s[3009]! } + public var Settings_AboutEmpty: String { return self._s[3010]! } + public var Conversation_Unmute: String { return self._s[3011]! } + public var CreateGroup_ChannelsTooMuch: String { return self._s[3013]! } + public var Wallet_Sending_Text: String { return self._s[3014]! } public func PUSH_CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3006]!, self._r[3006]!, [_1]) + return formatWithArgumentRanges(self._s[3015]!, self._r[3015]!, [_1]) } - public var Login_CodeSentCall: String { return self._s[3007]! } - public var ContactInfo_PhoneLabelHomeFax: String { return self._s[3009]! } - public var ChatSettings_Appearance: String { return self._s[3010]! } - public var ClearCache_StorageUsage: String { return self._s[3011]! } - public var Appearance_PickAccentColor: String { return self._s[3012]! } + public var Login_CodeSentCall: String { return self._s[3016]! } + public var ContactInfo_PhoneLabelHomeFax: String { return self._s[3018]! } + public var ChatSettings_Appearance: String { return self._s[3019]! } + public var ClearCache_StorageUsage: String { return self._s[3020]! } + public var Appearance_PickAccentColor: String { return self._s[3021]! } public func PUSH_CHAT_MESSAGE_NOTEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3013]!, self._r[3013]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3022]!, self._r[3022]!, [_1, _2]) } public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3014]!, self._r[3014]!, [_1]) + return formatWithArgumentRanges(self._s[3023]!, self._r[3023]!, [_1]) } - public var Notification_CallMissed: String { return self._s[3015]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[3016]! } - public var Channel_AdminLogFilter_EventsInfo: String { return self._s[3017]! } - public var Wallet_Month_GenOctober: String { return self._s[3019]! } - public var ChatAdmins_AdminLabel: String { return self._s[3020]! } - public var KeyCommand_JumpToNextChat: String { return self._s[3021]! } - public var Conversation_StopPollConfirmationTitle: String { return self._s[3023]! } - public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[3024]! } - public var Month_GenJune: String { return self._s[3025]! } - public var IntentsSettings_MainAccountInfo: String { return self._s[3026]! } - public var Watch_Location_Current: String { return self._s[3027]! } - public var Wallet_Receive_CopyInvoiceUrl: String { return self._s[3028]! } - public var Conversation_TitleMute: String { return self._s[3029]! } - public var Map_PlacesInThisArea: String { return self._s[3030]! } + public var Notification_CallMissed: String { return self._s[3024]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[3025]! } + public var Channel_AdminLogFilter_EventsInfo: String { return self._s[3026]! } + public var Wallet_Month_GenOctober: String { return self._s[3028]! } + public var ChatAdmins_AdminLabel: String { return self._s[3029]! } + public var KeyCommand_JumpToNextChat: String { return self._s[3030]! } + public var Conversation_StopPollConfirmationTitle: String { return self._s[3032]! } + public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[3033]! } + public var Month_GenJune: String { return self._s[3034]! } + public var IntentsSettings_MainAccountInfo: String { return self._s[3035]! } + public var Watch_Location_Current: String { return self._s[3036]! } + public var Wallet_Receive_CopyInvoiceUrl: String { return self._s[3037]! } + public var Conversation_TitleMute: String { return self._s[3038]! } + public var Map_PlacesInThisArea: String { return self._s[3039]! } public func PUSH_CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3031]!, self._r[3031]!, [_1]) + return formatWithArgumentRanges(self._s[3040]!, self._r[3040]!, [_1]) } - public var GroupInfo_DeleteAndExit: String { return self._s[3032]! } + public var GroupInfo_DeleteAndExit: String { return self._s[3041]! } public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3033]!, self._r[3033]!, [_0]) + return formatWithArgumentRanges(self._s[3042]!, self._r[3042]!, [_0]) } - public var Call_ReportPlaceholder: String { return self._s[3034]! } - public var Chat_SlowmodeSendError: String { return self._s[3035]! } - public var MaskStickerSettings_Info: String { return self._s[3036]! } - public var EditTheme_Expand_TopInfo: String { return self._s[3037]! } + public var Call_ReportPlaceholder: String { return self._s[3043]! } + public var Chat_SlowmodeSendError: String { return self._s[3044]! } + public var MaskStickerSettings_Info: String { return self._s[3045]! } + public var EditTheme_Expand_TopInfo: String { return self._s[3046]! } public func GroupInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3038]!, self._r[3038]!, [_0]) + return formatWithArgumentRanges(self._s[3047]!, self._r[3047]!, [_0]) } - public var Checkout_NewCard_PostcodeTitle: String { return self._s[3039]! } - public var Passport_Address_RegionPlaceholder: String { return self._s[3041]! } - public var Contacts_ShareTelegram: String { return self._s[3042]! } - public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[3043]! } - public var Map_AddressOnMap: String { return self._s[3044]! } - public var Channel_ErrorAccessDenied: String { return self._s[3045]! } - public var UserInfo_ScamBotWarning: String { return self._s[3047]! } - public var Stickers_GroupChooseStickerPack: String { return self._s[3048]! } - public var Call_ConnectionErrorTitle: String { return self._s[3049]! } - public var UserInfo_NotificationsEnable: String { return self._s[3050]! } - public var ArchivedChats_IntroText1: String { return self._s[3051]! } - public var Tour_Text4: String { return self._s[3054]! } - public var WallpaperSearch_Recent: String { return self._s[3055]! } - public var GroupInfo_ScamGroupWarning: String { return self._s[3056]! } - public var Profile_MessageLifetime2s: String { return self._s[3058]! } - public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[3059]! } - public var Notification_MessageLifetime2s: String { return self._s[3060]! } + public var Checkout_NewCard_PostcodeTitle: String { return self._s[3048]! } + public var Passport_Address_RegionPlaceholder: String { return self._s[3050]! } + public var Contacts_ShareTelegram: String { return self._s[3051]! } + public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[3052]! } + public var Map_AddressOnMap: String { return self._s[3053]! } + public var Channel_ErrorAccessDenied: String { return self._s[3054]! } + public var UserInfo_ScamBotWarning: String { return self._s[3056]! } + public var Stickers_GroupChooseStickerPack: String { return self._s[3057]! } + public var Call_ConnectionErrorTitle: String { return self._s[3058]! } + public var UserInfo_NotificationsEnable: String { return self._s[3059]! } + public var ArchivedChats_IntroText1: String { return self._s[3060]! } + public var Tour_Text4: String { return self._s[3063]! } + public var WallpaperSearch_Recent: String { return self._s[3064]! } + public var GroupInfo_ScamGroupWarning: String { return self._s[3065]! } + public var PeopleNearby_MakeVisibleTitle: String { return self._s[3066]! } + public var Profile_MessageLifetime2s: String { return self._s[3068]! } + public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[3069]! } + public var Notification_MessageLifetime2s: String { return self._s[3070]! } public func Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3061]!, self._r[3061]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3071]!, self._r[3071]!, [_1, _2, _3]) } - public var Cache_ClearCache: String { return self._s[3062]! } - public var AutoNightTheme_UpdateLocation: String { return self._s[3063]! } - public var Permissions_NotificationsUnreachableText_v0: String { return self._s[3064]! } + public var Cache_ClearCache: String { return self._s[3072]! } + public var AutoNightTheme_UpdateLocation: String { return self._s[3073]! } + public var Permissions_NotificationsUnreachableText_v0: String { return self._s[3074]! } public func Channel_AdminLog_MessageChangedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3068]!, self._r[3068]!, [_0]) + return formatWithArgumentRanges(self._s[3078]!, self._r[3078]!, [_0]) } public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3070]!, self._r[3070]!, [_0]) + return formatWithArgumentRanges(self._s[3080]!, self._r[3080]!, [_0]) } - public var LocalGroup_Text: String { return self._s[3071]! } - public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[3072]! } - public var SocksProxySetup_TypeSocks: String { return self._s[3073]! } - public var ChatList_UnarchiveAction: String { return self._s[3074]! } - public var AutoNightTheme_Title: String { return self._s[3075]! } - public var InstantPage_FeedbackButton: String { return self._s[3076]! } - public var Passport_FieldAddress: String { return self._s[3077]! } + public var LocalGroup_Text: String { return self._s[3081]! } + public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[3082]! } + public var SocksProxySetup_TypeSocks: String { return self._s[3083]! } + public var ChatList_UnarchiveAction: String { return self._s[3084]! } + public var AutoNightTheme_Title: String { return self._s[3085]! } + public var InstantPage_FeedbackButton: String { return self._s[3086]! } + public var Passport_FieldAddress: String { return self._s[3087]! } public func Channel_AdminLog_SetSlowmode(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3078]!, self._r[3078]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3088]!, self._r[3088]!, [_1, _2]) } - public var Month_ShortMarch: String { return self._s[3079]! } + public var Month_ShortMarch: String { return self._s[3089]! } public func PUSH_MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3080]!, self._r[3080]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3090]!, self._r[3090]!, [_1, _2]) } - public var SocksProxySetup_UsernamePlaceholder: String { return self._s[3081]! } - public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[3082]! } - public var Passport_FloodError: String { return self._s[3083]! } - public var SecretGif_Title: String { return self._s[3084]! } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[3085]! } - public var ChatList_Context_UnhideArchive: String { return self._s[3086]! } - public var Passport_Language_th: String { return self._s[3088]! } - public var Passport_Address_Address: String { return self._s[3089]! } - public var Login_InvalidLastNameError: String { return self._s[3090]! } - public var Notifications_InAppNotificationsPreview: String { return self._s[3091]! } - public var Notifications_PermissionsUnreachableTitle: String { return self._s[3092]! } - public var ChatList_Context_Archive: String { return self._s[3093]! } - public var SettingsSearch_FAQ: String { return self._s[3094]! } - public var ShareMenu_Send: String { return self._s[3095]! } - public var WallpaperSearch_ColorYellow: String { return self._s[3097]! } - public var Month_GenNovember: String { return self._s[3099]! } - public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[3101]! } + public var SocksProxySetup_UsernamePlaceholder: String { return self._s[3091]! } + public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[3092]! } + public var Passport_FloodError: String { return self._s[3093]! } + public var SecretGif_Title: String { return self._s[3094]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[3095]! } + public var ChatList_Context_UnhideArchive: String { return self._s[3096]! } + public var Passport_Language_th: String { return self._s[3098]! } + public var Passport_Address_Address: String { return self._s[3099]! } + public var Login_InvalidLastNameError: String { return self._s[3100]! } + public var Notifications_InAppNotificationsPreview: String { return self._s[3101]! } + public var Notifications_PermissionsUnreachableTitle: String { return self._s[3102]! } + public var ChatList_Context_Archive: String { return self._s[3103]! } + public var SettingsSearch_FAQ: String { return self._s[3104]! } + public var ShareMenu_Send: String { return self._s[3105]! } + public var WallpaperSearch_ColorYellow: String { return self._s[3107]! } + public var Month_GenNovember: String { return self._s[3109]! } + public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[3111]! } public func Conversation_ShareMyPhoneNumberConfirmation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3102]!, self._r[3102]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3112]!, self._r[3112]!, [_1, _2]) } - public var Conversation_SwipeToReplyHintText: String { return self._s[3103]! } - public var Checkout_Email: String { return self._s[3104]! } - public var NotificationsSound_Tritone: String { return self._s[3105]! } - public var StickerPacksSettings_ManagingHelp: String { return self._s[3107]! } - public var Wallet_ContextMenuCopy: String { return self._s[3109]! } + public var Conversation_SwipeToReplyHintText: String { return self._s[3113]! } + public var Checkout_Email: String { return self._s[3114]! } + public var NotificationsSound_Tritone: String { return self._s[3115]! } + public var StickerPacksSettings_ManagingHelp: String { return self._s[3117]! } + public var Wallet_ContextMenuCopy: String { return self._s[3119]! } public func Wallet_Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3111]!, self._r[3111]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3121]!, self._r[3121]!, [_1, _2, _3]) } - public var Appearance_TextSize_Automatic: String { return self._s[3112]! } + public var Appearance_TextSize_Automatic: String { return self._s[3122]! } public func PUSH_PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3113]!, self._r[3113]!, [_1]) + return formatWithArgumentRanges(self._s[3123]!, self._r[3123]!, [_1]) } public func StickerPackActionInfo_AddedText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3114]!, self._r[3114]!, [_0]) + return formatWithArgumentRanges(self._s[3124]!, self._r[3124]!, [_0]) } - public var ChangePhoneNumberNumber_Help: String { return self._s[3115]! } + public var ChangePhoneNumberNumber_Help: String { return self._s[3125]! } public func Checkout_LiabilityAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3116]!, self._r[3116]!, [_1, _1, _1, _2]) + return formatWithArgumentRanges(self._s[3126]!, self._r[3126]!, [_1, _1, _1, _2]) } - public var ChatList_UndoArchiveTitle: String { return self._s[3117]! } - public var Notification_Exceptions_Add: String { return self._s[3118]! } - public var DialogList_You: String { return self._s[3119]! } - public var MediaPicker_Send: String { return self._s[3122]! } - public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[3123]! } - public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[3124]! } - public var Call_AudioRouteSpeaker: String { return self._s[3125]! } - public var Watch_UserInfo_Title: String { return self._s[3126]! } - public var VoiceOver_Chat_PollFinalResults: String { return self._s[3127]! } - public var Appearance_AccentColor: String { return self._s[3129]! } + public var ChatList_UndoArchiveTitle: String { return self._s[3127]! } + public var Notification_Exceptions_Add: String { return self._s[3128]! } + public var DialogList_You: String { return self._s[3129]! } + public var MediaPicker_Send: String { return self._s[3132]! } + public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[3133]! } + public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[3134]! } + public var Call_AudioRouteSpeaker: String { return self._s[3135]! } + public var Watch_UserInfo_Title: String { return self._s[3136]! } + public var VoiceOver_Chat_PollFinalResults: String { return self._s[3137]! } + public var Appearance_AccentColor: String { return self._s[3139]! } public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3130]!, self._r[3130]!, [_0]) + return formatWithArgumentRanges(self._s[3140]!, self._r[3140]!, [_0]) } - public var Permissions_ContactsAllowInSettings_v0: String { return self._s[3131]! } + public var Permissions_ContactsAllowInSettings_v0: String { return self._s[3141]! } public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3132]!, self._r[3132]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3142]!, self._r[3142]!, [_1, _2]) } - public var Conversation_ClousStorageInfo_Description2: String { return self._s[3133]! } - public var WebSearch_RecentClearConfirmation: String { return self._s[3134]! } - public var Notification_CallOutgoing: String { return self._s[3135]! } - public var PrivacySettings_PasscodeAndFaceId: String { return self._s[3136]! } - public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[3137]! } - public var Call_RecordingDisabledMessage: String { return self._s[3138]! } - public var Message_Game: String { return self._s[3139]! } - public var Conversation_PressVolumeButtonForSound: String { return self._s[3140]! } - public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[3141]! } - public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[3142]! } - public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[3143]! } - public var Date_DialogDateFormat: String { return self._s[3145]! } - public var WallpaperColors_SetCustomColor: String { return self._s[3146]! } - public var Notifications_InAppNotifications: String { return self._s[3147]! } + public var Conversation_ClousStorageInfo_Description2: String { return self._s[3143]! } + public var WebSearch_RecentClearConfirmation: String { return self._s[3144]! } + public var Notification_CallOutgoing: String { return self._s[3145]! } + public var PrivacySettings_PasscodeAndFaceId: String { return self._s[3146]! } + public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[3147]! } + public var Call_RecordingDisabledMessage: String { return self._s[3148]! } + public var Message_Game: String { return self._s[3149]! } + public var Conversation_PressVolumeButtonForSound: String { return self._s[3150]! } + public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[3151]! } + public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[3152]! } + public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[3153]! } + public var Date_DialogDateFormat: String { return self._s[3155]! } + public var WallpaperColors_SetCustomColor: String { return self._s[3156]! } + public var Notifications_InAppNotifications: String { return self._s[3157]! } public func Channel_Management_RemovedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3148]!, self._r[3148]!, [_0]) + return formatWithArgumentRanges(self._s[3158]!, self._r[3158]!, [_0]) } public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3149]!, self._r[3149]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3159]!, self._r[3159]!, [_1, _2]) } - public var NewContact_Title: String { return self._s[3150]! } + public var NewContact_Title: String { return self._s[3160]! } public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3151]!, self._r[3151]!, [_0]) + return formatWithArgumentRanges(self._s[3161]!, self._r[3161]!, [_0]) } - public var Conversation_ViewContactDetails: String { return self._s[3152]! } + public var Conversation_ViewContactDetails: String { return self._s[3162]! } public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3154]!, self._r[3154]!, [_1]) + return formatWithArgumentRanges(self._s[3164]!, self._r[3164]!, [_1]) } - public var Checkout_NewCard_CardholderNameTitle: String { return self._s[3155]! } - public var Passport_Identity_ExpiryDateNone: String { return self._s[3156]! } - public var PrivacySettings_Title: String { return self._s[3157]! } - public var Conversation_SilentBroadcastTooltipOff: String { return self._s[3160]! } - public var GroupRemoved_UsersSectionTitle: String { return self._s[3161]! } - public var VoiceOver_Chat_ContactEmail: String { return self._s[3162]! } - public var Contacts_PhoneNumber: String { return self._s[3163]! } - public var TwoFactorSetup_Password_PlaceholderConfirmPassword: String { return self._s[3165]! } - public var Map_ShowPlaces: String { return self._s[3166]! } - public var ChatAdmins_Title: String { return self._s[3167]! } - public var InstantPage_Reference: String { return self._s[3169]! } - public var Wallet_Info_Updating: String { return self._s[3170]! } - public var ReportGroupLocation_Text: String { return self._s[3171]! } + public var Checkout_NewCard_CardholderNameTitle: String { return self._s[3165]! } + public var Passport_Identity_ExpiryDateNone: String { return self._s[3166]! } + public var PrivacySettings_Title: String { return self._s[3167]! } + public var Conversation_SilentBroadcastTooltipOff: String { return self._s[3170]! } + public var GroupRemoved_UsersSectionTitle: String { return self._s[3171]! } + public var VoiceOver_Chat_ContactEmail: String { return self._s[3172]! } + public var Contacts_PhoneNumber: String { return self._s[3173]! } + public var TwoFactorSetup_Password_PlaceholderConfirmPassword: String { return self._s[3175]! } + public var Map_ShowPlaces: String { return self._s[3176]! } + public var ChatAdmins_Title: String { return self._s[3177]! } + public var InstantPage_Reference: String { return self._s[3179]! } + public var Wallet_Info_Updating: String { return self._s[3180]! } + public var ReportGroupLocation_Text: String { return self._s[3181]! } public func PUSH_CHAT_MESSAGE_FWD(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3172]!, self._r[3172]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3182]!, self._r[3182]!, [_1, _2]) } - public var Camera_FlashOff: String { return self._s[3173]! } - public var Watch_UserInfo_Block: String { return self._s[3174]! } - public var ChatSettings_Stickers: String { return self._s[3175]! } - public var ChatSettings_DownloadInBackground: String { return self._s[3176]! } - public var Appearance_ThemeCarouselTintedNight: String { return self._s[3177]! } + public var Camera_FlashOff: String { return self._s[3183]! } + public var Watch_UserInfo_Block: String { return self._s[3184]! } + public var ChatSettings_Stickers: String { return self._s[3185]! } + public var ChatSettings_DownloadInBackground: String { return self._s[3186]! } + public var Appearance_ThemeCarouselTintedNight: String { return self._s[3187]! } public func UserInfo_BlockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3178]!, self._r[3178]!, [_0]) + return formatWithArgumentRanges(self._s[3188]!, self._r[3188]!, [_0]) } - public var Settings_ViewPhoto: String { return self._s[3179]! } - public var Login_CheckOtherSessionMessages: String { return self._s[3180]! } - public var AutoDownloadSettings_Cellular: String { return self._s[3181]! } - public var Wallet_Created_ExportErrorTitle: String { return self._s[3182]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[3183]! } - public var VoiceOver_MessageContextShare: String { return self._s[3184]! } + public var Settings_ViewPhoto: String { return self._s[3189]! } + public var Login_CheckOtherSessionMessages: String { return self._s[3190]! } + public var AutoDownloadSettings_Cellular: String { return self._s[3191]! } + public var Wallet_Created_ExportErrorTitle: String { return self._s[3192]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[3193]! } + public var VoiceOver_MessageContextShare: String { return self._s[3194]! } public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3186]!, self._r[3186]!, [_0]) + return formatWithArgumentRanges(self._s[3196]!, self._r[3196]!, [_0]) } - public var Privacy_DeleteDrafts: String { return self._s[3187]! } - public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[3188]! } + public var Privacy_DeleteDrafts: String { return self._s[3197]! } + public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[3198]! } public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3189]!, self._r[3189]!, [_0]) + return formatWithArgumentRanges(self._s[3199]!, self._r[3199]!, [_0]) } - public var DialogList_SavedMessagesHelp: String { return self._s[3190]! } - public var Wallet_SecureStorageNotAvailable_Title: String { return self._s[3191]! } - public var DialogList_SavedMessages: String { return self._s[3192]! } - public var GroupInfo_UpgradeButton: String { return self._s[3193]! } - public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[3195]! } - public var DialogList_Pin: String { return self._s[3196]! } + public var DialogList_SavedMessagesHelp: String { return self._s[3200]! } + public var Wallet_SecureStorageNotAvailable_Title: String { return self._s[3201]! } + public var DialogList_SavedMessages: String { return self._s[3202]! } + public var GroupInfo_UpgradeButton: String { return self._s[3203]! } + public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[3205]! } + public var DialogList_Pin: String { return self._s[3206]! } public func ForwardedAuthors2(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3197]!, self._r[3197]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3207]!, self._r[3207]!, [_0, _1]) } public func Login_PhoneGenericEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3198]!, self._r[3198]!, [_0]) + return formatWithArgumentRanges(self._s[3208]!, self._r[3208]!, [_0]) } - public var Notification_Exceptions_AlwaysOn: String { return self._s[3199]! } - public var UserInfo_NotificationsDisable: String { return self._s[3200]! } - public var Conversation_ContextMenuCancelEditing: String { return self._s[3201]! } - public var Paint_Outlined: String { return self._s[3202]! } - public var Activity_PlayingGame: String { return self._s[3203]! } - public var SearchImages_NoImagesFound: String { return self._s[3204]! } - public var SocksProxySetup_ProxyType: String { return self._s[3205]! } - public var AppleWatch_ReplyPresetsHelp: String { return self._s[3207]! } - public var Conversation_ContextMenuCancelSending: String { return self._s[3208]! } - public var Settings_AppLanguage: String { return self._s[3209]! } - public var TwoStepAuth_ResetAccountHelp: String { return self._s[3210]! } - public var Common_ChoosePhoto: String { return self._s[3211]! } - public var AuthSessions_AddDevice_InvalidQRCode: String { return self._s[3212]! } - public var CallFeedback_ReasonEcho: String { return self._s[3213]! } + public var Notification_Exceptions_AlwaysOn: String { return self._s[3209]! } + public var UserInfo_NotificationsDisable: String { return self._s[3210]! } + public var Conversation_ContextMenuCancelEditing: String { return self._s[3211]! } + public var Paint_Outlined: String { return self._s[3212]! } + public var Activity_PlayingGame: String { return self._s[3213]! } + public var SearchImages_NoImagesFound: String { return self._s[3214]! } + public var SocksProxySetup_ProxyType: String { return self._s[3215]! } + public var AppleWatch_ReplyPresetsHelp: String { return self._s[3217]! } + public var Conversation_ContextMenuCancelSending: String { return self._s[3218]! } + public var Settings_AppLanguage: String { return self._s[3219]! } + public var TwoStepAuth_ResetAccountHelp: String { return self._s[3220]! } + public var Common_ChoosePhoto: String { return self._s[3221]! } + public var AuthSessions_AddDevice_InvalidQRCode: String { return self._s[3222]! } + public var CallFeedback_ReasonEcho: String { return self._s[3223]! } public func PUSH_PINNED_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3214]!, self._r[3214]!, [_1]) + return formatWithArgumentRanges(self._s[3224]!, self._r[3224]!, [_1]) } - public var Privacy_Calls_AlwaysAllow: String { return self._s[3215]! } - public var PollResults_Collapse: String { return self._s[3216]! } - public var Activity_UploadingVideo: String { return self._s[3217]! } - public var Conversation_WalletRequiredNotNow: String { return self._s[3218]! } - public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[3219]! } - public var NetworkUsageSettings_Wifi: String { return self._s[3220]! } - public var VoiceOver_Editing_ClearText: String { return self._s[3221]! } - public var PUSH_SENDER_YOU: String { return self._s[3222]! } - public var Channel_BanUser_PermissionReadMessages: String { return self._s[3223]! } - public var Checkout_PayWithTouchId: String { return self._s[3224]! } - public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[3225]! } + public var Privacy_Calls_AlwaysAllow: String { return self._s[3225]! } + public var PollResults_Collapse: String { return self._s[3226]! } + public var Activity_UploadingVideo: String { return self._s[3227]! } + public var Conversation_WalletRequiredNotNow: String { return self._s[3228]! } + public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[3229]! } + public var NetworkUsageSettings_Wifi: String { return self._s[3230]! } + public var VoiceOver_Editing_ClearText: String { return self._s[3231]! } + public var PUSH_SENDER_YOU: String { return self._s[3232]! } + public var Channel_BanUser_PermissionReadMessages: String { return self._s[3233]! } + public var Checkout_PayWithTouchId: String { return self._s[3234]! } + public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[3235]! } public func PUSH_LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3227]!, self._r[3227]!, [_1]) + return formatWithArgumentRanges(self._s[3237]!, self._r[3237]!, [_1]) } - public var Notifications_ExceptionsNone: String { return self._s[3228]! } + public var Notifications_ExceptionsNone: String { return self._s[3238]! } public func Message_ForwardedMessageShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3229]!, self._r[3229]!, [_0]) + return formatWithArgumentRanges(self._s[3239]!, self._r[3239]!, [_0]) } public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3230]!, self._r[3230]!, [_1]) + return formatWithArgumentRanges(self._s[3240]!, self._r[3240]!, [_1]) } - public var AuthSessions_IncompleteAttempts: String { return self._s[3232]! } - public var Passport_Address_Region: String { return self._s[3235]! } - public var ChatList_DeleteChat: String { return self._s[3236]! } - public var LogoutOptions_ClearCacheTitle: String { return self._s[3237]! } - public var PhotoEditor_TiltShift: String { return self._s[3238]! } - public var Settings_FAQ_URL: String { return self._s[3239]! } - public var TwoFactorSetup_EmailVerification_ChangeAction: String { return self._s[3240]! } - public var Passport_Language_sl: String { return self._s[3241]! } - public var Settings_PrivacySettings: String { return self._s[3243]! } - public var SharedMedia_TitleLink: String { return self._s[3244]! } - public var Passport_Identity_TypePassportUploadScan: String { return self._s[3245]! } - public var Settings_SetProfilePhoto: String { return self._s[3246]! } - public var Channel_About_Help: String { return self._s[3247]! } - public var Contacts_PermissionsEnable: String { return self._s[3248]! } - public var Wallet_Sending_Title: String { return self._s[3249]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[3250]! } - public var AttachmentMenu_SendAsFiles: String { return self._s[3251]! } - public var CallFeedback_ReasonInterruption: String { return self._s[3253]! } - public var Passport_Address_AddTemporaryRegistration: String { return self._s[3254]! } - public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[3255]! } - public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[3256]! } - public var OldChannels_Title: String { return self._s[3257]! } - public var PrivacySettings_DeleteAccountTitle: String { return self._s[3258]! } - public var AccessDenied_VideoMessageCamera: String { return self._s[3260]! } - public var Map_OpenInYandexMaps: String { return self._s[3262]! } - public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[3263]! } - public var VoiceOver_MessageContextReply: String { return self._s[3264]! } - public var PhotoEditor_SaturationTool: String { return self._s[3266]! } + public var AuthSessions_IncompleteAttempts: String { return self._s[3242]! } + public var Passport_Address_Region: String { return self._s[3245]! } + public var ChatList_DeleteChat: String { return self._s[3246]! } + public var LogoutOptions_ClearCacheTitle: String { return self._s[3247]! } + public var PhotoEditor_TiltShift: String { return self._s[3248]! } + public var Settings_FAQ_URL: String { return self._s[3249]! } + public var TwoFactorSetup_EmailVerification_ChangeAction: String { return self._s[3250]! } + public var Passport_Language_sl: String { return self._s[3251]! } + public var Settings_PrivacySettings: String { return self._s[3253]! } + public var SharedMedia_TitleLink: String { return self._s[3254]! } + public var Passport_Identity_TypePassportUploadScan: String { return self._s[3255]! } + public var Settings_SetProfilePhoto: String { return self._s[3256]! } + public var Channel_About_Help: String { return self._s[3257]! } + public var Contacts_PermissionsEnable: String { return self._s[3258]! } + public var Wallet_Sending_Title: String { return self._s[3259]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[3260]! } + public var AttachmentMenu_SendAsFiles: String { return self._s[3261]! } + public var CallFeedback_ReasonInterruption: String { return self._s[3263]! } + public var Passport_Address_AddTemporaryRegistration: String { return self._s[3264]! } + public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[3265]! } + public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[3266]! } + public var OldChannels_Title: String { return self._s[3267]! } + public var PrivacySettings_DeleteAccountTitle: String { return self._s[3268]! } + public var AccessDenied_VideoMessageCamera: String { return self._s[3270]! } + public var Map_OpenInYandexMaps: String { return self._s[3272]! } + public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[3273]! } + public var VoiceOver_MessageContextReply: String { return self._s[3274]! } + public var PhotoEditor_SaturationTool: String { return self._s[3276]! } public func PUSH_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3267]!, self._r[3267]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3277]!, self._r[3277]!, [_1, _2]) } - public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[3268]! } - public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[3269]! } - public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[3270]! } + public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[3278]! } + public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[3279]! } + public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[3280]! } public func LOCAL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3271]!, self._r[3271]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3281]!, self._r[3281]!, [_1, "\(_2)"]) } - public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[3272]! } - public var Channel_Username_InvalidTooShort: String { return self._s[3274]! } - public var SettingsSearch_Synonyms_Wallet: String { return self._s[3275]! } + public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[3282]! } + public var Channel_Username_InvalidTooShort: String { return self._s[3284]! } + public var SettingsSearch_Synonyms_Wallet: String { return self._s[3285]! } public func Group_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3276]!, self._r[3276]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3286]!, self._r[3286]!, [_1, _2]) } - public var Forward_ErrorPublicPollDisabledInChannels: String { return self._s[3277]! } + public var Forward_ErrorPublicPollDisabledInChannels: String { return self._s[3287]! } public func PUSH_CHAT_MESSAGE_GAME(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3278]!, self._r[3278]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3288]!, self._r[3288]!, [_1, _2, _3]) } - public var WallpaperPreview_PatternTitle: String { return self._s[3279]! } - public var GroupInfo_PublicLinkAdd: String { return self._s[3280]! } - public var Passport_PassportInformation: String { return self._s[3283]! } - public var Theme_Unsupported: String { return self._s[3284]! } - public var WatchRemote_AlertTitle: String { return self._s[3285]! } - public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[3286]! } - public var ConvertToSupergroup_HelpText: String { return self._s[3288]! } + public var WallpaperPreview_PatternTitle: String { return self._s[3289]! } + public var GroupInfo_PublicLinkAdd: String { return self._s[3290]! } + public var Passport_PassportInformation: String { return self._s[3293]! } + public var Theme_Unsupported: String { return self._s[3294]! } + public var WatchRemote_AlertTitle: String { return self._s[3295]! } + public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[3296]! } + public var ConvertToSupergroup_HelpText: String { return self._s[3298]! } public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3289]!, self._r[3289]!, [_0]) + return formatWithArgumentRanges(self._s[3299]!, self._r[3299]!, [_0]) } public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3290]!, self._r[3290]!, [_1]) + return formatWithArgumentRanges(self._s[3300]!, self._r[3300]!, [_1]) } - public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[3291]! } - public var Wallet_Navigation_Done: String { return self._s[3293]! } - public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[3294]! } - public var AccessDenied_CameraDisabled: String { return self._s[3295]! } + public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[3301]! } + public var Wallet_Navigation_Done: String { return self._s[3303]! } + public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[3304]! } + public var AccessDenied_CameraDisabled: String { return self._s[3305]! } public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3296]!, self._r[3296]!, [_0]) + return formatWithArgumentRanges(self._s[3306]!, self._r[3306]!, [_0]) } - public var ClearCache_Forever: String { return self._s[3297]! } - public var AuthSessions_AddDeviceIntro_Title: String { return self._s[3298]! } - public var CreatePoll_Quiz: String { return self._s[3299]! } - public var PhotoEditor_ContrastTool: String { return self._s[3302]! } + public var ClearCache_Forever: String { return self._s[3307]! } + public var AuthSessions_AddDeviceIntro_Title: String { return self._s[3308]! } + public var CreatePoll_Quiz: String { return self._s[3309]! } + public var PhotoEditor_ContrastTool: String { return self._s[3312]! } public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3303]!, self._r[3303]!, [_1]) + return formatWithArgumentRanges(self._s[3313]!, self._r[3313]!, [_1]) } - public var DialogList_Draft: String { return self._s[3304]! } - public var Wallet_Configuration_BlockchainIdInfo: String { return self._s[3305]! } - public var Privacy_TopPeersDelete: String { return self._s[3307]! } - public var LoginPassword_PasswordPlaceholder: String { return self._s[3308]! } - public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[3309]! } - public var WebSearch_RecentSectionClear: String { return self._s[3310]! } - public var EditTheme_ErrorInvalidCharacters: String { return self._s[3311]! } - public var Watch_ChatList_NoConversationsTitle: String { return self._s[3313]! } - public var Common_Done: String { return self._s[3315]! } - public var Shortcut_SwitchAccount: String { return self._s[3316]! } - public var AuthSessions_EmptyText: String { return self._s[3317]! } - public var Wallet_Configuration_BlockchainNameChangedTitle: String { return self._s[3318]! } - public var Conversation_ShareBotContactConfirmation: String { return self._s[3319]! } - public var Tour_Title5: String { return self._s[3320]! } - public var Wallet_Settings_Title: String { return self._s[3321]! } + public var DialogList_Draft: String { return self._s[3314]! } + public var Wallet_Configuration_BlockchainIdInfo: String { return self._s[3315]! } + public func PeopleNearby_VisibleUntil(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3316]!, self._r[3316]!, [_0]) + } + public var Privacy_TopPeersDelete: String { return self._s[3318]! } + public var LoginPassword_PasswordPlaceholder: String { return self._s[3319]! } + public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[3320]! } + public var WebSearch_RecentSectionClear: String { return self._s[3321]! } + public var EditTheme_ErrorInvalidCharacters: String { return self._s[3322]! } + public var Watch_ChatList_NoConversationsTitle: String { return self._s[3324]! } + public var Common_Done: String { return self._s[3326]! } + public var Shortcut_SwitchAccount: String { return self._s[3327]! } + public var AuthSessions_EmptyText: String { return self._s[3328]! } + public var Wallet_Configuration_BlockchainNameChangedTitle: String { return self._s[3329]! } + public var Conversation_ShareBotContactConfirmation: String { return self._s[3330]! } + public var Tour_Title5: String { return self._s[3331]! } + public var Wallet_Settings_Title: String { return self._s[3332]! } public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3322]!, self._r[3322]!, [_0]) + return formatWithArgumentRanges(self._s[3333]!, self._r[3333]!, [_0]) } - public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[3323]! } - public var Conversation_LinkDialogSave: String { return self._s[3324]! } - public var GroupInfo_ActionRestrict: String { return self._s[3325]! } - public var Checkout_Title: String { return self._s[3326]! } - public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[3328]! } - public var Channel_AdminLog_CanChangeInfo: String { return self._s[3330]! } - public var Notification_RenamedGroup: String { return self._s[3331]! } - public var PeopleNearby_Groups: String { return self._s[3332]! } - public var Checkout_PayWithFaceId: String { return self._s[3333]! } - public var Channel_BanList_BlockedTitle: String { return self._s[3334]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[3336]! } - public var Checkout_WebConfirmation_Title: String { return self._s[3337]! } - public var Notifications_MessageNotificationsAlert: String { return self._s[3338]! } + public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[3334]! } + public var Conversation_LinkDialogSave: String { return self._s[3335]! } + public var GroupInfo_ActionRestrict: String { return self._s[3336]! } + public var Checkout_Title: String { return self._s[3337]! } + public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[3339]! } + public var Channel_AdminLog_CanChangeInfo: String { return self._s[3341]! } + public var Notification_RenamedGroup: String { return self._s[3342]! } + public var PeopleNearby_Groups: String { return self._s[3343]! } + public var Checkout_PayWithFaceId: String { return self._s[3344]! } + public var Channel_BanList_BlockedTitle: String { return self._s[3345]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[3347]! } + public var Checkout_WebConfirmation_Title: String { return self._s[3348]! } + public var Notifications_MessageNotificationsAlert: String { return self._s[3349]! } public func Activity_RemindAboutGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3339]!, self._r[3339]!, [_0]) + return formatWithArgumentRanges(self._s[3350]!, self._r[3350]!, [_0]) } - public var Profile_AddToExisting: String { return self._s[3341]! } + public var Profile_AddToExisting: String { return self._s[3352]! } public func Profile_CreateEncryptedChatOutdatedError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3342]!, self._r[3342]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3353]!, self._r[3353]!, [_0, _1]) } - public var Cache_Files: String { return self._s[3344]! } - public var Permissions_PrivacyPolicy: String { return self._s[3345]! } - public var SocksProxySetup_ConnectAndSave: String { return self._s[3346]! } - public var UserInfo_NotificationsDefaultDisabled: String { return self._s[3347]! } - public var AutoDownloadSettings_TypeContacts: String { return self._s[3349]! } - public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[3351]! } - public var Calls_NoCallsPlaceholder: String { return self._s[3352]! } + public var Cache_Files: String { return self._s[3355]! } + public var Permissions_PrivacyPolicy: String { return self._s[3356]! } + public var SocksProxySetup_ConnectAndSave: String { return self._s[3357]! } + public var UserInfo_NotificationsDefaultDisabled: String { return self._s[3358]! } + public var AutoDownloadSettings_TypeContacts: String { return self._s[3360]! } + public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[3362]! } + public var Calls_NoCallsPlaceholder: String { return self._s[3363]! } public func Wallet_Receive_ShareInvoiceUrlInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3353]!, self._r[3353]!, [_0]) + return formatWithArgumentRanges(self._s[3364]!, self._r[3364]!, [_0]) } - public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[3354]! } - public var VoiceOver_AttachMedia: String { return self._s[3357]! } - public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[3358]! } + public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[3365]! } + public var VoiceOver_AttachMedia: String { return self._s[3368]! } + public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[3369]! } public func PUSH_CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3359]!, self._r[3359]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3370]!, self._r[3370]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[3360]! } - public var Conversation_SetReminder_Title: String { return self._s[3361]! } - public var Passport_FieldAddressHelp: String { return self._s[3362]! } - public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[3363]! } - public var PUSH_REMINDER_TITLE: String { return self._s[3364]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[3371]! } + public var Conversation_SetReminder_Title: String { return self._s[3372]! } + public var Passport_FieldAddressHelp: String { return self._s[3373]! } + public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[3374]! } + public var PUSH_REMINDER_TITLE: String { return self._s[3375]! } public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3365]!, self._r[3365]!, [_0]) + return formatWithArgumentRanges(self._s[3376]!, self._r[3376]!, [_0]) } - public var Channel_AdminLog_EmptyTitle: String { return self._s[3366]! } - public var Privacy_Calls_NeverAllow_Title: String { return self._s[3367]! } - public var Login_UnknownError: String { return self._s[3368]! } - public var Group_UpgradeNoticeText2: String { return self._s[3371]! } - public var Watch_Compose_AddContact: String { return self._s[3372]! } - public var ClearCache_StorageServiceFiles: String { return self._s[3373]! } - public var Web_Error: String { return self._s[3374]! } - public var Gif_Search: String { return self._s[3375]! } - public var Profile_MessageLifetime1h: String { return self._s[3376]! } - public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[3377]! } - public var Channel_Username_CheckingUsername: String { return self._s[3378]! } - public var CallFeedback_ReasonSilentRemote: String { return self._s[3379]! } - public var AutoDownloadSettings_TypeChannels: String { return self._s[3380]! } - public var Channel_AboutItem: String { return self._s[3381]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[3383]! } - public var VoiceOver_Chat_VoiceMessage: String { return self._s[3384]! } - public var GroupInfo_SharedMedia: String { return self._s[3385]! } + public var Channel_AdminLog_EmptyTitle: String { return self._s[3377]! } + public var Privacy_Calls_NeverAllow_Title: String { return self._s[3378]! } + public var Login_UnknownError: String { return self._s[3379]! } + public var Group_UpgradeNoticeText2: String { return self._s[3382]! } + public var Watch_Compose_AddContact: String { return self._s[3383]! } + public var ClearCache_StorageServiceFiles: String { return self._s[3384]! } + public var Web_Error: String { return self._s[3385]! } + public var Gif_Search: String { return self._s[3386]! } + public var Profile_MessageLifetime1h: String { return self._s[3387]! } + public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[3388]! } + public var Channel_Username_CheckingUsername: String { return self._s[3389]! } + public var CallFeedback_ReasonSilentRemote: String { return self._s[3390]! } + public var AutoDownloadSettings_TypeChannels: String { return self._s[3391]! } + public var Channel_AboutItem: String { return self._s[3392]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[3394]! } + public var VoiceOver_Chat_VoiceMessage: String { return self._s[3395]! } + public var GroupInfo_SharedMedia: String { return self._s[3396]! } public func Channel_AdminLog_MessagePromotedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3386]!, self._r[3386]!, [_1]) + return formatWithArgumentRanges(self._s[3397]!, self._r[3397]!, [_1]) } - public var Call_PhoneCallInProgressMessage: String { return self._s[3387]! } + public var Call_PhoneCallInProgressMessage: String { return self._s[3398]! } public func PUSH_CHANNEL_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3388]!, self._r[3388]!, [_1]) + return formatWithArgumentRanges(self._s[3399]!, self._r[3399]!, [_1]) } - public var ChatList_UndoArchiveRevealedText: String { return self._s[3389]! } - public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[3390]! } - public var Conversation_SearchByName_Placeholder: String { return self._s[3391]! } - public var CreatePoll_AddOption: String { return self._s[3392]! } - public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[3393]! } - public var Group_UpgradeNoticeHeader: String { return self._s[3394]! } - public var Channel_Management_AddModerator: String { return self._s[3395]! } - public var AutoDownloadSettings_MaxFileSize: String { return self._s[3396]! } - public var StickerPacksSettings_ShowStickersButton: String { return self._s[3397]! } - public var Wallet_Info_RefreshErrorNetworkText: String { return self._s[3398]! } - public var Theme_Colors_Background: String { return self._s[3399]! } - public var NotificationsSound_Hello: String { return self._s[3401]! } - public var SocksProxySetup_SavedProxies: String { return self._s[3402]! } - public var Channel_Stickers_Placeholder: String { return self._s[3404]! } + public var ChatList_UndoArchiveRevealedText: String { return self._s[3400]! } + public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[3401]! } + public var Conversation_SearchByName_Placeholder: String { return self._s[3402]! } + public var CreatePoll_AddOption: String { return self._s[3403]! } + public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[3404]! } + public var Group_UpgradeNoticeHeader: String { return self._s[3405]! } + public var Channel_Management_AddModerator: String { return self._s[3406]! } + public var AutoDownloadSettings_MaxFileSize: String { return self._s[3407]! } + public var StickerPacksSettings_ShowStickersButton: String { return self._s[3408]! } + public var Wallet_Info_RefreshErrorNetworkText: String { return self._s[3409]! } + public var Theme_Colors_Background: String { return self._s[3410]! } + public var NotificationsSound_Hello: String { return self._s[3412]! } + public var SocksProxySetup_SavedProxies: String { return self._s[3413]! } + public var Channel_Stickers_Placeholder: String { return self._s[3415]! } public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3405]!, self._r[3405]!, [_0]) + return formatWithArgumentRanges(self._s[3416]!, self._r[3416]!, [_0]) } - public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[3406]! } - public var Channel_Management_AddModeratorHelp: String { return self._s[3407]! } - public var ContactInfo_BirthdayLabel: String { return self._s[3408]! } - public var ChangePhoneNumberCode_RequestingACall: String { return self._s[3409]! } - public var AutoDownloadSettings_Channels: String { return self._s[3410]! } - public var Passport_Language_mn: String { return self._s[3411]! } - public var Notifications_ResetAllNotificationsHelp: String { return self._s[3414]! } - public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[3415]! } - public var Passport_Language_ja: String { return self._s[3417]! } - public var Settings_About_Title: String { return self._s[3418]! } - public var Settings_NotificationsAndSounds: String { return self._s[3419]! } - public var ChannelInfo_DeleteGroup: String { return self._s[3420]! } - public var Settings_BlockedUsers: String { return self._s[3421]! } + public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[3417]! } + public var Channel_Management_AddModeratorHelp: String { return self._s[3418]! } + public var ContactInfo_BirthdayLabel: String { return self._s[3419]! } + public var ChangePhoneNumberCode_RequestingACall: String { return self._s[3420]! } + public var AutoDownloadSettings_Channels: String { return self._s[3421]! } + public var Passport_Language_mn: String { return self._s[3422]! } + public var Notifications_ResetAllNotificationsHelp: String { return self._s[3425]! } + public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[3426]! } + public var Passport_Language_ja: String { return self._s[3428]! } + public var Settings_About_Title: String { return self._s[3429]! } + public var Settings_NotificationsAndSounds: String { return self._s[3430]! } + public var ChannelInfo_DeleteGroup: String { return self._s[3431]! } + public var Settings_BlockedUsers: String { return self._s[3432]! } public func Time_MonthOfYear_m4(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3422]!, self._r[3422]!, [_0]) + return formatWithArgumentRanges(self._s[3433]!, self._r[3433]!, [_0]) } - public var EditTheme_Create_Preview_OutgoingText: String { return self._s[3423]! } - public var Wallet_Weekday_Today: String { return self._s[3424]! } - public var AutoDownloadSettings_PreloadVideo: String { return self._s[3425]! } - public var Widget_ApplicationLocked: String { return self._s[3426]! } - public var Passport_Address_AddResidentialAddress: String { return self._s[3427]! } - public var Channel_Username_Title: String { return self._s[3428]! } + public var EditTheme_Create_Preview_OutgoingText: String { return self._s[3434]! } + public var Wallet_Weekday_Today: String { return self._s[3435]! } + public var AutoDownloadSettings_PreloadVideo: String { return self._s[3436]! } + public var Widget_ApplicationLocked: String { return self._s[3437]! } + public var Passport_Address_AddResidentialAddress: String { return self._s[3438]! } + public var Channel_Username_Title: String { return self._s[3439]! } public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3429]!, self._r[3429]!, [_0]) + return formatWithArgumentRanges(self._s[3440]!, self._r[3440]!, [_0]) } - public var AttachmentMenu_File: String { return self._s[3431]! } - public var AppleWatch_Title: String { return self._s[3432]! } - public var Activity_RecordingVideoMessage: String { return self._s[3433]! } + public var AttachmentMenu_File: String { return self._s[3442]! } + public var AppleWatch_Title: String { return self._s[3443]! } + public var Activity_RecordingVideoMessage: String { return self._s[3444]! } public func Channel_DiscussionGroup_PublicChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3434]!, self._r[3434]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3445]!, self._r[3445]!, [_1, _2]) } - public var Theme_Colors_Messages: String { return self._s[3435]! } - public var Weekday_Saturday: String { return self._s[3436]! } - public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3437]! } - public var Profile_CreateEncryptedChatError: String { return self._s[3438]! } - public var Common_Next: String { return self._s[3440]! } - public var Channel_Stickers_YourStickers: String { return self._s[3442]! } - public var Message_Theme: String { return self._s[3443]! } - public var Call_AudioRouteHeadphones: String { return self._s[3444]! } - public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3446]! } - public var Watch_Contacts_NoResults: String { return self._s[3448]! } - public var PhotoEditor_TintTool: String { return self._s[3451]! } - public var LoginPassword_ResetAccount: String { return self._s[3453]! } - public var Settings_SavedMessages: String { return self._s[3454]! } - public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3455]! } - public var Bot_GenericSupportStatus: String { return self._s[3456]! } - public var StickerPack_Add: String { return self._s[3457]! } - public var Checkout_TotalAmount: String { return self._s[3458]! } - public var Your_cards_number_is_invalid: String { return self._s[3459]! } - public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3460]! } - public var VoiceOver_Chat_VideoMessage: String { return self._s[3461]! } + public var Theme_Colors_Messages: String { return self._s[3446]! } + public var Weekday_Saturday: String { return self._s[3447]! } + public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3448]! } + public var Profile_CreateEncryptedChatError: String { return self._s[3449]! } + public var Common_Next: String { return self._s[3451]! } + public var Channel_Stickers_YourStickers: String { return self._s[3453]! } + public var Message_Theme: String { return self._s[3454]! } + public var Call_AudioRouteHeadphones: String { return self._s[3455]! } + public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3457]! } + public var Watch_Contacts_NoResults: String { return self._s[3459]! } + public var PhotoEditor_TintTool: String { return self._s[3462]! } + public var LoginPassword_ResetAccount: String { return self._s[3464]! } + public var Settings_SavedMessages: String { return self._s[3465]! } + public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3466]! } + public var Bot_GenericSupportStatus: String { return self._s[3467]! } + public var StickerPack_Add: String { return self._s[3468]! } + public var Checkout_TotalAmount: String { return self._s[3469]! } + public var Your_cards_number_is_invalid: String { return self._s[3470]! } + public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3471]! } + public var VoiceOver_Chat_VideoMessage: String { return self._s[3472]! } public func ChangePhoneNumberCode_CallTimer(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3462]!, self._r[3462]!, [_0]) + return formatWithArgumentRanges(self._s[3473]!, self._r[3473]!, [_0]) } public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3463]!, self._r[3463]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3474]!, self._r[3474]!, [_1, _2]) } - public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3464]! } + public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3475]! } public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3466]!, self._r[3466]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3477]!, self._r[3477]!, [_1, _2]) } public func Conversation_RestrictedTextTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3467]!, self._r[3467]!, [_0]) + return formatWithArgumentRanges(self._s[3478]!, self._r[3478]!, [_0]) } - public var GroupInfo_InviteLink_ShareLink: String { return self._s[3468]! } - public var StickerPack_Share: String { return self._s[3469]! } - public var Passport_DeleteAddress: String { return self._s[3470]! } - public var Settings_Passport: String { return self._s[3471]! } - public var SharedMedia_EmptyFilesText: String { return self._s[3472]! } - public var Conversation_DeleteMessagesForMe: String { return self._s[3473]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3474]! } - public var Contacts_PermissionsText: String { return self._s[3475]! } - public var Group_Setup_HistoryVisible: String { return self._s[3476]! } - public var Wallet_Month_ShortDecember: String { return self._s[3478]! } - public var Channel_EditAdmin_PermissionEnabledByDefault: String { return self._s[3479]! } - public var Passport_Address_AddRentalAgreement: String { return self._s[3480]! } - public var SocksProxySetup_Title: String { return self._s[3481]! } - public var Notification_Mute1h: String { return self._s[3482]! } + public var GroupInfo_InviteLink_ShareLink: String { return self._s[3479]! } + public var StickerPack_Share: String { return self._s[3480]! } + public var Passport_DeleteAddress: String { return self._s[3481]! } + public var Settings_Passport: String { return self._s[3482]! } + public var SharedMedia_EmptyFilesText: String { return self._s[3483]! } + public var Conversation_DeleteMessagesForMe: String { return self._s[3484]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3485]! } + public var Contacts_PermissionsText: String { return self._s[3486]! } + public var Group_Setup_HistoryVisible: String { return self._s[3487]! } + public var Wallet_Month_ShortDecember: String { return self._s[3489]! } + public var Channel_EditAdmin_PermissionEnabledByDefault: String { return self._s[3490]! } + public var Passport_Address_AddRentalAgreement: String { return self._s[3491]! } + public var SocksProxySetup_Title: String { return self._s[3492]! } + public var Notification_Mute1h: String { return self._s[3493]! } public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3483]!, self._r[3483]!, [_0]) + return formatWithArgumentRanges(self._s[3494]!, self._r[3494]!, [_0]) } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3484]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3495]! } public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3485]!, self._r[3485]!, [_1]) + return formatWithArgumentRanges(self._s[3496]!, self._r[3496]!, [_1]) } - public var FastTwoStepSetup_PasswordSection: String { return self._s[3486]! } - public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3489]! } - public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3491]! } - public var DialogList_NoMessagesText: String { return self._s[3492]! } - public var Privacy_ContactsResetConfirmation: String { return self._s[3493]! } - public var Privacy_Calls_P2PHelp: String { return self._s[3494]! } - public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3496]! } - public var Your_cards_expiration_year_is_invalid: String { return self._s[3497]! } - public var Common_TakePhotoOrVideo: String { return self._s[3498]! } - public var Wallet_Words_Text: String { return self._s[3499]! } - public var Call_StatusBusy: String { return self._s[3500]! } - public var Conversation_PinnedMessage: String { return self._s[3501]! } - public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3502]! } - public var Wallet_Configuration_BlockchainNameChangedProceed: String { return self._s[3503]! } - public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3504]! } - public var Undo_ChatCleared: String { return self._s[3505]! } - public var AppleWatch_ReplyPresets: String { return self._s[3506]! } - public var Passport_DiscardMessageDescription: String { return self._s[3508]! } - public var Login_NetworkError: String { return self._s[3509]! } + public var FastTwoStepSetup_PasswordSection: String { return self._s[3497]! } + public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3500]! } + public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3502]! } + public var DialogList_NoMessagesText: String { return self._s[3503]! } + public var Privacy_ContactsResetConfirmation: String { return self._s[3504]! } + public var Privacy_Calls_P2PHelp: String { return self._s[3505]! } + public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3507]! } + public var Your_cards_expiration_year_is_invalid: String { return self._s[3508]! } + public var Common_TakePhotoOrVideo: String { return self._s[3509]! } + public var Wallet_Words_Text: String { return self._s[3510]! } + public var Call_StatusBusy: String { return self._s[3511]! } + public var Conversation_PinnedMessage: String { return self._s[3512]! } + public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3513]! } + public var Wallet_Configuration_BlockchainNameChangedProceed: String { return self._s[3514]! } + public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3515]! } + public var Undo_ChatCleared: String { return self._s[3516]! } + public var AppleWatch_ReplyPresets: String { return self._s[3517]! } + public var Passport_DiscardMessageDescription: String { return self._s[3519]! } + public var Login_NetworkError: String { return self._s[3520]! } public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3510]!, self._r[3510]!, [_0]) + return formatWithArgumentRanges(self._s[3521]!, self._r[3521]!, [_0]) } public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3511]!, self._r[3511]!, [_0]) + return formatWithArgumentRanges(self._s[3522]!, self._r[3522]!, [_0]) } - public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3512]! } - public var Wallet_WordCheck_ViewWords: String { return self._s[3514]! } - public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3515]! } + public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3523]! } + public var Wallet_WordCheck_ViewWords: String { return self._s[3525]! } + public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3526]! } public func Watch_LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3517]!, self._r[3517]!, [_0]) + return formatWithArgumentRanges(self._s[3528]!, self._r[3528]!, [_0]) } - public var Call_ConnectionErrorMessage: String { return self._s[3518]! } - public var VoiceOver_Chat_Music: String { return self._s[3519]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3520]! } - public var Compose_GroupTokenListPlaceholder: String { return self._s[3522]! } - public var ConversationMedia_Title: String { return self._s[3523]! } - public var EncryptionKey_Title: String { return self._s[3525]! } - public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3526]! } - public var Notification_Exceptions_AddException: String { return self._s[3527]! } - public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3528]! } - public var Profile_MessageLifetime1m: String { return self._s[3529]! } + public var Call_ConnectionErrorMessage: String { return self._s[3529]! } + public var VoiceOver_Chat_Music: String { return self._s[3530]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3531]! } + public var Compose_GroupTokenListPlaceholder: String { return self._s[3533]! } + public var ConversationMedia_Title: String { return self._s[3534]! } + public var EncryptionKey_Title: String { return self._s[3536]! } + public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3537]! } + public var Notification_Exceptions_AddException: String { return self._s[3538]! } + public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3539]! } + public var Profile_MessageLifetime1m: String { return self._s[3540]! } public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3530]!, self._r[3530]!, [_1]) + return formatWithArgumentRanges(self._s[3541]!, self._r[3541]!, [_1]) } - public var Month_GenMay: String { return self._s[3531]! } + public var Month_GenMay: String { return self._s[3542]! } public func LiveLocationUpdated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3532]!, self._r[3532]!, [_0]) + return formatWithArgumentRanges(self._s[3543]!, self._r[3543]!, [_0]) } - public var PeopleNearby_Users: String { return self._s[3533]! } - public var Wallet_Send_AddressInfo: String { return self._s[3534]! } - public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3535]! } - public var AutoDownloadSettings_ResetSettings: String { return self._s[3536]! } + public var PeopleNearby_Users: String { return self._s[3544]! } + public var Wallet_Send_AddressInfo: String { return self._s[3545]! } + public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3546]! } + public var AutoDownloadSettings_ResetSettings: String { return self._s[3547]! } public func Wallet_Updated_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3538]!, self._r[3538]!, [_0]) + return formatWithArgumentRanges(self._s[3549]!, self._r[3549]!, [_0]) } - public var Conversation_EmptyPlaceholder: String { return self._s[3539]! } - public var Passport_Address_AddPassportRegistration: String { return self._s[3540]! } - public var Notifications_ChannelNotificationsAlert: String { return self._s[3541]! } - public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3542]! } - public var Camera_TapAndHoldForVideo: String { return self._s[3543]! } - public var Channel_JoinChannel: String { return self._s[3545]! } - public var Appearance_Animations: String { return self._s[3548]! } + public var Conversation_EmptyPlaceholder: String { return self._s[3550]! } + public var Passport_Address_AddPassportRegistration: String { return self._s[3551]! } + public var Notifications_ChannelNotificationsAlert: String { return self._s[3552]! } + public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3553]! } + public var Camera_TapAndHoldForVideo: String { return self._s[3554]! } + public var Channel_JoinChannel: String { return self._s[3556]! } + public var Appearance_Animations: String { return self._s[3559]! } public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3549]!, self._r[3549]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3560]!, self._r[3560]!, [_1, _2]) } - public var Stickers_GroupStickers: String { return self._s[3551]! } - public var Appearance_ShareTheme: String { return self._s[3552]! } - public var TwoFactorSetup_Hint_Placeholder: String { return self._s[3553]! } - public var ConvertToSupergroup_HelpTitle: String { return self._s[3555]! } - public var StickerPackActionInfo_RemovedTitle: String { return self._s[3556]! } - public var Passport_Address_Street: String { return self._s[3557]! } - public var Conversation_AddContact: String { return self._s[3558]! } - public var Login_PhonePlaceholder: String { return self._s[3559]! } - public var Channel_Members_InviteLink: String { return self._s[3561]! } - public var Bot_Stop: String { return self._s[3562]! } - public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3564]! } - public var Notification_PassportValueAddress: String { return self._s[3565]! } - public var Month_ShortJuly: String { return self._s[3566]! } - public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3567]! } - public var Channel_AdminLog_BanSendMedia: String { return self._s[3568]! } - public var Passport_Identity_ReverseSide: String { return self._s[3569]! } - public var Watch_Stickers_Recents: String { return self._s[3572]! } - public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3574]! } - public var Map_SendThisLocation: String { return self._s[3575]! } + public var Stickers_GroupStickers: String { return self._s[3562]! } + public var Appearance_ShareTheme: String { return self._s[3563]! } + public var TwoFactorSetup_Hint_Placeholder: String { return self._s[3564]! } + public var ConvertToSupergroup_HelpTitle: String { return self._s[3566]! } + public var StickerPackActionInfo_RemovedTitle: String { return self._s[3567]! } + public var Passport_Address_Street: String { return self._s[3568]! } + public var Conversation_AddContact: String { return self._s[3569]! } + public var Login_PhonePlaceholder: String { return self._s[3570]! } + public var Channel_Members_InviteLink: String { return self._s[3572]! } + public var Bot_Stop: String { return self._s[3573]! } + public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3575]! } + public var Notification_PassportValueAddress: String { return self._s[3576]! } + public var Month_ShortJuly: String { return self._s[3577]! } + public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3578]! } + public var Channel_AdminLog_BanSendMedia: String { return self._s[3579]! } + public var Passport_Identity_ReverseSide: String { return self._s[3580]! } + public var Watch_Stickers_Recents: String { return self._s[3583]! } + public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3585]! } + public var Map_SendThisLocation: String { return self._s[3586]! } public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3576]!, self._r[3576]!, [_0]) + return formatWithArgumentRanges(self._s[3587]!, self._r[3587]!, [_0]) } public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3577]!, self._r[3577]!, [_0]) + return formatWithArgumentRanges(self._s[3588]!, self._r[3588]!, [_0]) } - public var ConvertToSupergroup_Note: String { return self._s[3578]! } - public var Wallet_Intro_NotNow: String { return self._s[3579]! } + public var ConvertToSupergroup_Note: String { return self._s[3589]! } + public var Wallet_Intro_NotNow: String { return self._s[3590]! } public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3580]!, self._r[3580]!, [_0]) + return formatWithArgumentRanges(self._s[3591]!, self._r[3591]!, [_0]) } - public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3581]! } + public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3592]! } public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3582]!, self._r[3582]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3593]!, self._r[3593]!, [_0, _1]) } - public var Login_CallRequestState3: String { return self._s[3584]! } - public var Wallpaper_SearchShort: String { return self._s[3585]! } - public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3587]! } - public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3588]! } - public var Channel_BotDoesntSupportGroups: String { return self._s[3589]! } + public var Login_CallRequestState3: String { return self._s[3595]! } + public var Wallpaper_SearchShort: String { return self._s[3596]! } + public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3598]! } + public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3599]! } + public var Channel_BotDoesntSupportGroups: String { return self._s[3600]! } public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3590]!, self._r[3590]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3601]!, self._r[3601]!, [_1, _2]) } - public var Channel_AdminLogFilter_Title: String { return self._s[3591]! } - public var Appearance_ThemePreview_Chat_4_Text: String { return self._s[3593]! } - public var Notifications_GroupNotificationsExceptions: String { return self._s[3596]! } + public var Channel_AdminLogFilter_Title: String { return self._s[3602]! } + public var Appearance_ThemePreview_Chat_4_Text: String { return self._s[3604]! } + public var Notifications_GroupNotificationsExceptions: String { return self._s[3607]! } public func FileSize_B(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3597]!, self._r[3597]!, [_0]) + return formatWithArgumentRanges(self._s[3608]!, self._r[3608]!, [_0]) } - public var Passport_CorrectErrors: String { return self._s[3598]! } - public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3599]! } + public var Passport_CorrectErrors: String { return self._s[3609]! } + public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3610]! } public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3600]!, self._r[3600]!, [_0]) + return formatWithArgumentRanges(self._s[3611]!, self._r[3611]!, [_0]) } - public var Map_SendMyCurrentLocation: String { return self._s[3601]! } - public var Channel_DiscussionGroup: String { return self._s[3602]! } - public var TwoFactorSetup_Email_SkipConfirmationSkip: String { return self._s[3603]! } + public var Map_SendMyCurrentLocation: String { return self._s[3612]! } + public var Channel_DiscussionGroup: String { return self._s[3613]! } + public var TwoFactorSetup_Email_SkipConfirmationSkip: String { return self._s[3614]! } public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3604]!, self._r[3604]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3615]!, self._r[3615]!, [_1, _2]) } - public var SharedMedia_SearchNoResults: String { return self._s[3605]! } - public var Permissions_NotificationsText_v0: String { return self._s[3606]! } - public var Channel_EditAdmin_PermissionDeleteMessagesOfOthers: String { return self._s[3607]! } - public var Appearance_AppIcon: String { return self._s[3608]! } - public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3609]! } - public var LoginPassword_FloodError: String { return self._s[3610]! } - public var Wallet_Send_OwnAddressAlertProceed: String { return self._s[3612]! } - public var Group_Setup_HistoryHiddenHelp: String { return self._s[3613]! } + public var SharedMedia_SearchNoResults: String { return self._s[3616]! } + public var Permissions_NotificationsText_v0: String { return self._s[3617]! } + public var Channel_EditAdmin_PermissionDeleteMessagesOfOthers: String { return self._s[3618]! } + public var Appearance_AppIcon: String { return self._s[3619]! } + public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3620]! } + public var LoginPassword_FloodError: String { return self._s[3621]! } + public var Wallet_Send_OwnAddressAlertProceed: String { return self._s[3623]! } + public var Group_Setup_HistoryHiddenHelp: String { return self._s[3624]! } public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3614]!, self._r[3614]!, [_0]) + return formatWithArgumentRanges(self._s[3625]!, self._r[3625]!, [_0]) } - public var Passport_Language_bn: String { return self._s[3615]! } + public var Passport_Language_bn: String { return self._s[3626]! } public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3616]!, self._r[3616]!, [_0]) + return formatWithArgumentRanges(self._s[3627]!, self._r[3627]!, [_0]) } - public var ChatList_Context_Pin: String { return self._s[3617]! } + public var ChatList_Context_Pin: String { return self._s[3628]! } public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3618]!, self._r[3618]!, [_0]) + return formatWithArgumentRanges(self._s[3629]!, self._r[3629]!, [_0]) } public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3619]!, self._r[3619]!, [_0]) + return formatWithArgumentRanges(self._s[3630]!, self._r[3630]!, [_0]) } - public var Wallet_Navigation_Close: String { return self._s[3620]! } - public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3624]! } - public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3626]! } - public var Wallet_Month_GenDecember: String { return self._s[3627]! } - public var Contacts_PermissionsAllow: String { return self._s[3628]! } - public var ReportPeer_ReasonCopyright: String { return self._s[3629]! } - public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3630]! } - public var WallpaperPreview_Pattern: String { return self._s[3631]! } - public var Paint_Duplicate: String { return self._s[3632]! } - public var Passport_Address_Country: String { return self._s[3633]! } - public var Notification_RenamedChannel: String { return self._s[3635]! } - public var ChatList_Context_Unmute: String { return self._s[3636]! } - public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3637]! } - public var Group_MessagePhotoUpdated: String { return self._s[3638]! } - public var Channel_BanUser_PermissionSendMedia: String { return self._s[3639]! } - public var Conversation_ContextMenuBan: String { return self._s[3640]! } - public var TwoStepAuth_EmailSent: String { return self._s[3641]! } - public var MessagePoll_NoVotes: String { return self._s[3642]! } - public var Wallet_Send_ErrorNotEnoughFundsTitle: String { return self._s[3643]! } - public var Passport_Language_is: String { return self._s[3645]! } - public var PeopleNearby_UsersEmpty: String { return self._s[3647]! } - public var Tour_Text5: String { return self._s[3648]! } + public var Wallet_Navigation_Close: String { return self._s[3631]! } + public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3635]! } + public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3637]! } + public var Wallet_Month_GenDecember: String { return self._s[3638]! } + public var Contacts_PermissionsAllow: String { return self._s[3639]! } + public var ReportPeer_ReasonCopyright: String { return self._s[3640]! } + public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3641]! } + public var WallpaperPreview_Pattern: String { return self._s[3642]! } + public var Paint_Duplicate: String { return self._s[3643]! } + public var Passport_Address_Country: String { return self._s[3644]! } + public var Notification_RenamedChannel: String { return self._s[3646]! } + public var ChatList_Context_Unmute: String { return self._s[3647]! } + public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3648]! } + public var Group_MessagePhotoUpdated: String { return self._s[3649]! } + public var Channel_BanUser_PermissionSendMedia: String { return self._s[3650]! } + public var Conversation_ContextMenuBan: String { return self._s[3651]! } + public var TwoStepAuth_EmailSent: String { return self._s[3652]! } + public var MessagePoll_NoVotes: String { return self._s[3653]! } + public var Wallet_Send_ErrorNotEnoughFundsTitle: String { return self._s[3654]! } + public var Passport_Language_is: String { return self._s[3656]! } + public var PeopleNearby_UsersEmpty: String { return self._s[3658]! } + public var Tour_Text5: String { return self._s[3659]! } public func Call_GroupFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3651]!, self._r[3651]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3662]!, self._r[3662]!, [_1, _2]) } - public var Undo_SecretChatDeleted: String { return self._s[3652]! } - public var SocksProxySetup_ShareQRCode: String { return self._s[3653]! } + public var Undo_SecretChatDeleted: String { return self._s[3663]! } + public var SocksProxySetup_ShareQRCode: String { return self._s[3664]! } public func VoiceOver_Chat_Size(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3654]!, self._r[3654]!, [_0]) + return formatWithArgumentRanges(self._s[3665]!, self._r[3665]!, [_0]) } - public var Forward_ErrorDisabledForChat: String { return self._s[3655]! } - public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3656]! } - public var Paint_Edit: String { return self._s[3658]! } - public var ScheduledMessages_ReminderNotification: String { return self._s[3660]! } - public var Undo_DeletedGroup: String { return self._s[3662]! } - public var LoginPassword_ForgotPassword: String { return self._s[3663]! } - public var Wallet_WordImport_IncorrectTitle: String { return self._s[3664]! } - public var GroupInfo_GroupNamePlaceholder: String { return self._s[3665]! } + public var Forward_ErrorDisabledForChat: String { return self._s[3666]! } + public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3667]! } + public var Paint_Edit: String { return self._s[3669]! } + public var ScheduledMessages_ReminderNotification: String { return self._s[3671]! } + public var Undo_DeletedGroup: String { return self._s[3673]! } + public var LoginPassword_ForgotPassword: String { return self._s[3674]! } + public var Wallet_WordImport_IncorrectTitle: String { return self._s[3675]! } + public var GroupInfo_GroupNamePlaceholder: String { return self._s[3676]! } public func Notification_Kicked(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3666]!, self._r[3666]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3677]!, self._r[3677]!, [_0, _1]) } - public var AppWallet_TransactionInfo_FeeInfoURL: String { return self._s[3667]! } - public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3668]! } - public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3669]! } - public var Passport_Language_uz: String { return self._s[3670]! } - public var Conversation_PinMessageAlertGroup: String { return self._s[3671]! } - public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3672]! } - public var Map_StopLiveLocation: String { return self._s[3674]! } - public var VoiceOver_MessageContextSend: String { return self._s[3676]! } - public var PasscodeSettings_Help: String { return self._s[3677]! } - public var NotificationsSound_Input: String { return self._s[3678]! } - public var Share_Title: String { return self._s[3681]! } - public var LogoutOptions_Title: String { return self._s[3682]! } - public var Wallet_Send_AddressText: String { return self._s[3683]! } - public var Login_TermsOfServiceAgree: String { return self._s[3684]! } - public var Compose_NewEncryptedChatTitle: String { return self._s[3685]! } - public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3686]! } - public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3687]! } - public var EnterPasscode_EnterTitle: String { return self._s[3688]! } + public var AppWallet_TransactionInfo_FeeInfoURL: String { return self._s[3678]! } + public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3679]! } + public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3680]! } + public var Passport_Language_uz: String { return self._s[3681]! } + public var Conversation_PinMessageAlertGroup: String { return self._s[3682]! } + public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3683]! } + public var Map_StopLiveLocation: String { return self._s[3685]! } + public var VoiceOver_MessageContextSend: String { return self._s[3687]! } + public var PasscodeSettings_Help: String { return self._s[3688]! } + public var NotificationsSound_Input: String { return self._s[3689]! } + public var Share_Title: String { return self._s[3692]! } + public var LogoutOptions_Title: String { return self._s[3693]! } + public var Wallet_Send_AddressText: String { return self._s[3694]! } + public var Login_TermsOfServiceAgree: String { return self._s[3695]! } + public var Compose_NewEncryptedChatTitle: String { return self._s[3696]! } + public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3697]! } + public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3698]! } + public var EnterPasscode_EnterTitle: String { return self._s[3699]! } public func Call_PrivacyErrorMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3689]!, self._r[3689]!, [_0]) + return formatWithArgumentRanges(self._s[3700]!, self._r[3700]!, [_0]) } - public var Settings_CopyPhoneNumber: String { return self._s[3690]! } - public var Conversation_AddToContacts: String { return self._s[3691]! } + public var Settings_CopyPhoneNumber: String { return self._s[3701]! } + public var Conversation_AddToContacts: String { return self._s[3702]! } public func VoiceOver_Chat_ReplyFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3692]!, self._r[3692]!, [_0]) - } - public var NotificationsSound_Keys: String { return self._s[3693]! } - public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3694]!, self._r[3694]!, [_0]) - } - public var Notification_MessageLifetime1w: String { return self._s[3695]! } - public var Message_Video: String { return self._s[3696]! } - public var AutoDownloadSettings_CellularTitle: String { return self._s[3697]! } - public func PUSH_CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3698]!, self._r[3698]!, [_1]) - } - public var Wallet_Receive_AmountInfo: String { return self._s[3701]! } - public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3702]!, self._r[3702]!, [_0]) - } - public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3703]!, self._r[3703]!, [_0]) } - public var Passport_Language_mk: String { return self._s[3704]! } - public func Wallet_Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3705]!, self._r[3705]!, [_1, _2, _3]) + public var NotificationsSound_Keys: String { return self._s[3704]! } + public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3705]!, self._r[3705]!, [_0]) } - public var CreatePoll_CancelConfirmation: String { return self._s[3706]! } - public var MessagePoll_LabelAnonymousQuiz: String { return self._s[3707]! } - public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3709]! } - public var PrivacyPolicy_Decline: String { return self._s[3710]! } - public var Passport_Identity_DoesNotExpire: String { return self._s[3711]! } - public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3712]! } - public var AuthSessions_AddDeviceIntro_Action: String { return self._s[3713]! } - public var Permissions_SiriAllow_v0: String { return self._s[3715]! } - public var Wallet_Month_ShortAugust: String { return self._s[3716]! } - public var Appearance_ThemeCarouselNight: String { return self._s[3717]! } + public var Notification_MessageLifetime1w: String { return self._s[3706]! } + public var Message_Video: String { return self._s[3707]! } + public var AutoDownloadSettings_CellularTitle: String { return self._s[3708]! } + public func PUSH_CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3709]!, self._r[3709]!, [_1]) + } + public var Wallet_Receive_AmountInfo: String { return self._s[3712]! } + public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3713]!, self._r[3713]!, [_0]) + } + public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3714]!, self._r[3714]!, [_0]) + } + public var Passport_Language_mk: String { return self._s[3715]! } + public func Wallet_Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3716]!, self._r[3716]!, [_1, _2, _3]) + } + public var CreatePoll_CancelConfirmation: String { return self._s[3717]! } + public var MessagePoll_LabelAnonymousQuiz: String { return self._s[3718]! } + public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3720]! } + public var PrivacyPolicy_Decline: String { return self._s[3721]! } + public var Passport_Identity_DoesNotExpire: String { return self._s[3722]! } + public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3723]! } + public var AuthSessions_AddDeviceIntro_Action: String { return self._s[3724]! } + public var Permissions_SiriAllow_v0: String { return self._s[3726]! } + public var Wallet_Month_ShortAugust: String { return self._s[3727]! } + public var Appearance_ThemeCarouselNight: String { return self._s[3728]! } public func LOCAL_CHAT_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3718]!, self._r[3718]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3729]!, self._r[3729]!, [_1, "\(_2)"]) } public func Notification_RenamedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3719]!, self._r[3719]!, [_0]) + return formatWithArgumentRanges(self._s[3730]!, self._r[3730]!, [_0]) } - public var Paint_Regular: String { return self._s[3720]! } - public var ChatSettings_AutoDownloadReset: String { return self._s[3721]! } - public var SocksProxySetup_ShareLink: String { return self._s[3722]! } - public var Wallet_Qr_Title: String { return self._s[3723]! } - public var BlockedUsers_SelectUserTitle: String { return self._s[3724]! } - public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3726]! } - public var Wallet_Settings_Configuration: String { return self._s[3727]! } - public var GroupInfo_InviteByLink: String { return self._s[3728]! } - public var MessageTimer_Custom: String { return self._s[3729]! } - public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3730]! } - public var Conversation_StopQuizConfirmationTitle: String { return self._s[3731]! } - public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3733]! } - public var Conversation_SendMessage_SetReminder: String { return self._s[3734]! } - public var VoiceOver_Chat_Selected: String { return self._s[3735]! } - public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3736]! } - public var Channel_Username_InvalidTaken: String { return self._s[3737]! } - public var Conversation_ClousStorageInfo_Description3: String { return self._s[3738]! } - public var Wallet_WordCheck_TryAgain: String { return self._s[3739]! } - public var Wallet_Info_TransactionPendingHeader: String { return self._s[3740]! } - public var Settings_ChatBackground: String { return self._s[3741]! } - public var Channel_Subscribers_Title: String { return self._s[3742]! } - public var Wallet_Receive_InvoiceUrlHeader: String { return self._s[3743]! } - public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3744]! } - public var Watch_ConnectionDescription: String { return self._s[3745]! } - public var OldChannels_NoticeText: String { return self._s[3748]! } - public var Wallet_Configuration_ApplyErrorTitle: String { return self._s[3749]! } - public var IntentsSettings_SuggestBy: String { return self._s[3751]! } - public var Theme_ThemeChangedText: String { return self._s[3752]! } - public var ChatList_ArchivedChatsTitle: String { return self._s[3753]! } - public var Wallpaper_ResetWallpapers: String { return self._s[3754]! } - public var Wallet_Send_TransactionInProgress: String { return self._s[3755]! } - public var EditProfile_Title: String { return self._s[3756]! } - public var NotificationsSound_Bamboo: String { return self._s[3758]! } - public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3760]! } - public var Login_SmsRequestState2: String { return self._s[3761]! } - public var Passport_Language_ar: String { return self._s[3762]! } + public var Paint_Regular: String { return self._s[3731]! } + public var ChatSettings_AutoDownloadReset: String { return self._s[3732]! } + public var SocksProxySetup_ShareLink: String { return self._s[3733]! } + public var Wallet_Qr_Title: String { return self._s[3734]! } + public var BlockedUsers_SelectUserTitle: String { return self._s[3735]! } + public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3737]! } + public var Wallet_Settings_Configuration: String { return self._s[3738]! } + public var GroupInfo_InviteByLink: String { return self._s[3739]! } + public var MessageTimer_Custom: String { return self._s[3740]! } + public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3741]! } + public var Conversation_StopQuizConfirmationTitle: String { return self._s[3742]! } + public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3744]! } + public var Conversation_SendMessage_SetReminder: String { return self._s[3745]! } + public var VoiceOver_Chat_Selected: String { return self._s[3746]! } + public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3747]! } + public var Channel_Username_InvalidTaken: String { return self._s[3748]! } + public var Conversation_ClousStorageInfo_Description3: String { return self._s[3749]! } + public var Wallet_WordCheck_TryAgain: String { return self._s[3750]! } + public var Wallet_Info_TransactionPendingHeader: String { return self._s[3751]! } + public var Settings_ChatBackground: String { return self._s[3752]! } + public var Channel_Subscribers_Title: String { return self._s[3753]! } + public var Wallet_Receive_InvoiceUrlHeader: String { return self._s[3754]! } + public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3755]! } + public var Watch_ConnectionDescription: String { return self._s[3756]! } + public var OldChannels_NoticeText: String { return self._s[3759]! } + public var Wallet_Configuration_ApplyErrorTitle: String { return self._s[3760]! } + public var IntentsSettings_SuggestBy: String { return self._s[3762]! } + public var Theme_ThemeChangedText: String { return self._s[3763]! } + public var ChatList_ArchivedChatsTitle: String { return self._s[3764]! } + public var Wallpaper_ResetWallpapers: String { return self._s[3765]! } + public var Wallet_Send_TransactionInProgress: String { return self._s[3766]! } + public var EditProfile_Title: String { return self._s[3767]! } + public var NotificationsSound_Bamboo: String { return self._s[3769]! } + public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3771]! } + public var Login_SmsRequestState2: String { return self._s[3772]! } + public var Passport_Language_ar: String { return self._s[3773]! } public func Message_AuthorPinnedGame(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3763]!, self._r[3763]!, [_0]) + return formatWithArgumentRanges(self._s[3774]!, self._r[3774]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3764]! } - public var Wallet_Created_Text: String { return self._s[3765]! } - public var Conversation_MessageDialogEdit: String { return self._s[3767]! } - public var Wallet_Created_Proceed: String { return self._s[3768]! } - public var Wallet_Words_Done: String { return self._s[3769]! } - public var VoiceOver_Media_PlaybackPause: String { return self._s[3770]! } + public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3775]! } + public var Wallet_Created_Text: String { return self._s[3776]! } + public var Conversation_MessageDialogEdit: String { return self._s[3778]! } + public var Wallet_Created_Proceed: String { return self._s[3779]! } + public var Wallet_Words_Done: String { return self._s[3780]! } + public var VoiceOver_Media_PlaybackPause: String { return self._s[3781]! } public func PUSH_AUTH_UNKNOWN(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3771]!, self._r[3771]!, [_1]) + return formatWithArgumentRanges(self._s[3782]!, self._r[3782]!, [_1]) } - public var Common_Close: String { return self._s[3772]! } - public var GroupInfo_PublicLink: String { return self._s[3773]! } - public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3774]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3775]! } + public var Common_Close: String { return self._s[3783]! } + public var GroupInfo_PublicLink: String { return self._s[3784]! } + public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3785]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3786]! } public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3779]!, self._r[3779]!, [_0]) + return formatWithArgumentRanges(self._s[3790]!, self._r[3790]!, [_0]) } - public var UserInfo_About_Placeholder: String { return self._s[3780]! } + public var UserInfo_About_Placeholder: String { return self._s[3791]! } public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3781]!, self._r[3781]!, [_0]) + return formatWithArgumentRanges(self._s[3792]!, self._r[3792]!, [_0]) } - public var GroupInfo_Permissions_SectionTitle: String { return self._s[3782]! } - public var Channel_Info_Banned: String { return self._s[3784]! } + public var GroupInfo_Permissions_SectionTitle: String { return self._s[3793]! } + public var Channel_Info_Banned: String { return self._s[3795]! } public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3785]!, self._r[3785]!, [_0]) + return formatWithArgumentRanges(self._s[3796]!, self._r[3796]!, [_0]) } - public var Appearance_Other: String { return self._s[3786]! } - public var Passport_Language_my: String { return self._s[3787]! } - public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3788]! } + public var Appearance_Other: String { return self._s[3797]! } + public var Passport_Language_my: String { return self._s[3798]! } + public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3799]! } public func Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3789]!, self._r[3789]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3800]!, self._r[3800]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3790]! } - public var IntentsSettings_SuggestedAndSpotlightChatsInfo: String { return self._s[3791]! } - public var Preview_CopyAddress: String { return self._s[3792]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3801]! } + public var IntentsSettings_SuggestedAndSpotlightChatsInfo: String { return self._s[3802]! } + public var Preview_CopyAddress: String { return self._s[3803]! } public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3793]!, self._r[3793]!, [_0]) + return formatWithArgumentRanges(self._s[3804]!, self._r[3804]!, [_0]) } - public var KeyCommand_JumpToPreviousChat: String { return self._s[3794]! } - public var UserInfo_BotSettings: String { return self._s[3795]! } - public var LiveLocation_MenuStopAll: String { return self._s[3797]! } - public var Passport_PasswordCreate: String { return self._s[3798]! } - public var StickerSettings_MaskContextInfo: String { return self._s[3799]! } - public var Message_PinnedLocationMessage: String { return self._s[3800]! } - public var Map_Satellite: String { return self._s[3801]! } - public var Watch_Message_Unsupported: String { return self._s[3802]! } - public var Username_TooManyPublicUsernamesError: String { return self._s[3803]! } - public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3804]! } + public var KeyCommand_JumpToPreviousChat: String { return self._s[3805]! } + public var UserInfo_BotSettings: String { return self._s[3806]! } + public var LiveLocation_MenuStopAll: String { return self._s[3808]! } + public var Passport_PasswordCreate: String { return self._s[3809]! } + public var StickerSettings_MaskContextInfo: String { return self._s[3810]! } + public var Message_PinnedLocationMessage: String { return self._s[3811]! } + public var Map_Satellite: String { return self._s[3812]! } + public var Watch_Message_Unsupported: String { return self._s[3813]! } + public var Username_TooManyPublicUsernamesError: String { return self._s[3814]! } + public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3815]! } public func Notification_PinnedTextMessage(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3805]!, self._r[3805]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3816]!, self._r[3816]!, [_0, _1]) } public func Conversation_OpenBotLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3806]!, self._r[3806]!, [_0]) + return formatWithArgumentRanges(self._s[3817]!, self._r[3817]!, [_0]) } - public var Wallet_WordImport_Continue: String { return self._s[3807]! } + public var Wallet_WordImport_Continue: String { return self._s[3818]! } public func TwoFactorSetup_EmailVerification_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3808]!, self._r[3808]!, [_0]) + return formatWithArgumentRanges(self._s[3819]!, self._r[3819]!, [_0]) } - public var Notifications_ChannelNotificationsHelp: String { return self._s[3809]! } - public var Privacy_Calls_P2PContacts: String { return self._s[3810]! } - public var NotificationsSound_None: String { return self._s[3811]! } - public var Wallet_TransactionInfo_StorageFeeHeader: String { return self._s[3812]! } - public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3814]! } - public var AccessDenied_VoiceMicrophone: String { return self._s[3815]! } + public var Notifications_ChannelNotificationsHelp: String { return self._s[3820]! } + public var Privacy_Calls_P2PContacts: String { return self._s[3821]! } + public var NotificationsSound_None: String { return self._s[3822]! } + public var Wallet_TransactionInfo_StorageFeeHeader: String { return self._s[3823]! } + public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3825]! } + public var AccessDenied_VoiceMicrophone: String { return self._s[3826]! } public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3816]!, self._r[3816]!, [_1]) + return formatWithArgumentRanges(self._s[3827]!, self._r[3827]!, [_1]) } - public var Cache_Indexing: String { return self._s[3817]! } - public var DialogList_RecentTitlePeople: String { return self._s[3819]! } - public var DialogList_EncryptionRejected: String { return self._s[3820]! } - public var GroupInfo_Administrators: String { return self._s[3821]! } - public var Passport_ScanPassportHelp: String { return self._s[3822]! } - public var Application_Name: String { return self._s[3823]! } - public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3824]! } - public var Appearance_ThemeCarouselDay: String { return self._s[3826]! } - public var Passport_Identity_TranslationHelp: String { return self._s[3827]! } + public var Cache_Indexing: String { return self._s[3828]! } + public var DialogList_RecentTitlePeople: String { return self._s[3830]! } + public var DialogList_EncryptionRejected: String { return self._s[3831]! } + public var GroupInfo_Administrators: String { return self._s[3832]! } + public var Passport_ScanPassportHelp: String { return self._s[3833]! } + public var Application_Name: String { return self._s[3834]! } + public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3835]! } + public var PeopleNearby_MakeVisible: String { return self._s[3837]! } + public var Appearance_ThemeCarouselDay: String { return self._s[3838]! } + public var Passport_Identity_TranslationHelp: String { return self._s[3839]! } public func VoiceOver_Chat_VideoMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3828]!, self._r[3828]!, [_0]) + return formatWithArgumentRanges(self._s[3840]!, self._r[3840]!, [_0]) } public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3829]!, self._r[3829]!, [_0]) + return formatWithArgumentRanges(self._s[3841]!, self._r[3841]!, [_0]) } public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3830]!, self._r[3830]!, [_0]) + return formatWithArgumentRanges(self._s[3842]!, self._r[3842]!, [_0]) } - public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3831]! } - public var Privacy_ChatsTitle: String { return self._s[3832]! } - public var DialogList_ClearHistoryConfirmation: String { return self._s[3833]! } - public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3834]! } - public var Watch_Suggestion_HoldOn: String { return self._s[3835]! } - public var Group_EditAdmin_TransferOwnership: String { return self._s[3836]! } - public var WebBrowser_Title: String { return self._s[3837]! } - public var Group_LinkedChannel: String { return self._s[3838]! } - public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3839]! } - public var SocksProxySetup_RequiredCredentials: String { return self._s[3840]! } - public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3841]! } - public var Appearance_TextSize_UseSystem: String { return self._s[3842]! } - public var TwoStepAuth_EmailSkipAlert: String { return self._s[3843]! } - public var ScheduledMessages_RemindersTitle: String { return self._s[3845]! } - public var Channel_Setup_TypePublic: String { return self._s[3847]! } + public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3843]! } + public var Privacy_ChatsTitle: String { return self._s[3844]! } + public var DialogList_ClearHistoryConfirmation: String { return self._s[3845]! } + public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3846]! } + public var Watch_Suggestion_HoldOn: String { return self._s[3847]! } + public var Group_EditAdmin_TransferOwnership: String { return self._s[3848]! } + public var WebBrowser_Title: String { return self._s[3849]! } + public var Group_LinkedChannel: String { return self._s[3850]! } + public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3851]! } + public var SocksProxySetup_RequiredCredentials: String { return self._s[3852]! } + public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3853]! } + public var Appearance_TextSize_UseSystem: String { return self._s[3854]! } + public var TwoStepAuth_EmailSkipAlert: String { return self._s[3855]! } + public var ScheduledMessages_RemindersTitle: String { return self._s[3857]! } + public var Channel_Setup_TypePublic: String { return self._s[3859]! } public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3848]!, self._r[3848]!, [_0]) + return formatWithArgumentRanges(self._s[3860]!, self._r[3860]!, [_0]) } - public var Channel_TypeSetup_Title: String { return self._s[3850]! } - public var MessagePoll_ViewResults: String { return self._s[3851]! } - public var Map_OpenInMaps: String { return self._s[3853]! } + public var Channel_TypeSetup_Title: String { return self._s[3862]! } + public var MessagePoll_ViewResults: String { return self._s[3863]! } + public var Map_OpenInMaps: String { return self._s[3865]! } public func PUSH_PINNED_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3854]!, self._r[3854]!, [_1]) + return formatWithArgumentRanges(self._s[3866]!, self._r[3866]!, [_1]) } - public var NotificationsSound_Tremolo: String { return self._s[3856]! } + public var NotificationsSound_Tremolo: String { return self._s[3868]! } public func Date_ChatDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3857]!, self._r[3857]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3869]!, self._r[3869]!, [_1, _2, _3]) } - public var ConversationProfile_UnknownAddMemberError: String { return self._s[3858]! } - public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3859]! } - public var Passport_PasswordHelp: String { return self._s[3860]! } - public var Login_CodeExpiredError: String { return self._s[3861]! } - public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3862]! } - public var Conversation_TitleUnmute: String { return self._s[3863]! } - public var Passport_Identity_ScansHelp: String { return self._s[3864]! } - public var Passport_Language_lo: String { return self._s[3865]! } - public var Camera_FlashAuto: String { return self._s[3866]! } - public var Conversation_OpenBotLinkOpen: String { return self._s[3867]! } - public var Common_Cancel: String { return self._s[3868]! } - public var DialogList_SavedMessagesTooltip: String { return self._s[3869]! } - public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3870]! } - public var Appearance_TintAllColors: String { return self._s[3871]! } + public var ConversationProfile_UnknownAddMemberError: String { return self._s[3870]! } + public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3871]! } + public var Passport_PasswordHelp: String { return self._s[3872]! } + public var Login_CodeExpiredError: String { return self._s[3873]! } + public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3874]! } + public var Conversation_TitleUnmute: String { return self._s[3875]! } + public var Passport_Identity_ScansHelp: String { return self._s[3876]! } + public var Passport_Language_lo: String { return self._s[3877]! } + public var Camera_FlashAuto: String { return self._s[3878]! } + public var Conversation_OpenBotLinkOpen: String { return self._s[3879]! } + public var Common_Cancel: String { return self._s[3880]! } + public var DialogList_SavedMessagesTooltip: String { return self._s[3881]! } + public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3882]! } + public var Appearance_TintAllColors: String { return self._s[3883]! } public func PUSH_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3872]!, self._r[3872]!, [_1]) + return formatWithArgumentRanges(self._s[3884]!, self._r[3884]!, [_1]) } - public var Conversation_ReportSpamConfirmation: String { return self._s[3873]! } - public var ChatSettings_Title: String { return self._s[3875]! } - public var Passport_PasswordReset: String { return self._s[3876]! } - public var SocksProxySetup_TypeNone: String { return self._s[3877]! } - public var EditTheme_Title: String { return self._s[3880]! } - public var PhoneNumberHelp_Help: String { return self._s[3881]! } - public var Checkout_EnterPassword: String { return self._s[3882]! } - public var Share_AuthTitle: String { return self._s[3884]! } - public var Activity_UploadingDocument: String { return self._s[3885]! } - public var State_Connecting: String { return self._s[3886]! } - public var Profile_MessageLifetime1w: String { return self._s[3887]! } - public var Conversation_ContextMenuReport: String { return self._s[3888]! } - public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3889]! } - public var AutoNightTheme_ScheduledTo: String { return self._s[3890]! } + public var Conversation_ReportSpamConfirmation: String { return self._s[3885]! } + public var ChatSettings_Title: String { return self._s[3887]! } + public var Passport_PasswordReset: String { return self._s[3888]! } + public var SocksProxySetup_TypeNone: String { return self._s[3889]! } + public var EditTheme_Title: String { return self._s[3892]! } + public var PhoneNumberHelp_Help: String { return self._s[3893]! } + public var Checkout_EnterPassword: String { return self._s[3894]! } + public var Share_AuthTitle: String { return self._s[3896]! } + public var Activity_UploadingDocument: String { return self._s[3897]! } + public var State_Connecting: String { return self._s[3898]! } + public var Profile_MessageLifetime1w: String { return self._s[3899]! } + public var Conversation_ContextMenuReport: String { return self._s[3900]! } + public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3901]! } + public var AutoNightTheme_ScheduledTo: String { return self._s[3902]! } public func VoiceOver_Chat_AnonymousPollFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3891]!, self._r[3891]!, [_0]) + return formatWithArgumentRanges(self._s[3903]!, self._r[3903]!, [_0]) } - public var AuthSessions_Terminate: String { return self._s[3892]! } - public var Wallet_WordImport_CanNotRemember: String { return self._s[3893]! } - public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3895]! } - public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3896]! } - public var PhotoEditor_Set: String { return self._s[3897]! } - public var EmptyGroupInfo_Title: String { return self._s[3898]! } - public var Login_PadPhoneHelp: String { return self._s[3899]! } - public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3901]! } - public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3903]! } - public var NotificationsSound_Complete: String { return self._s[3904]! } - public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3905]! } - public var Group_Info_AdminLog: String { return self._s[3906]! } - public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3907]! } + public var AuthSessions_Terminate: String { return self._s[3904]! } + public var Wallet_WordImport_CanNotRemember: String { return self._s[3905]! } + public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3907]! } + public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3908]! } + public var PhotoEditor_Set: String { return self._s[3909]! } + public var EmptyGroupInfo_Title: String { return self._s[3910]! } + public var Login_PadPhoneHelp: String { return self._s[3911]! } + public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3913]! } + public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3915]! } + public var NotificationsSound_Complete: String { return self._s[3916]! } + public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3917]! } + public var Group_Info_AdminLog: String { return self._s[3918]! } + public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3919]! } public func Wallet_Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3908]!, self._r[3908]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3920]!, self._r[3920]!, [_1, _2, _3]) } - public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3909]! } - public var Group_Location_CreateInThisPlace: String { return self._s[3911]! } - public var Conversation_Admin: String { return self._s[3912]! } - public var Conversation_GifTooltip: String { return self._s[3913]! } - public var Passport_NotLoggedInMessage: String { return self._s[3914]! } + public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3921]! } + public var Group_Location_CreateInThisPlace: String { return self._s[3923]! } + public var Conversation_Admin: String { return self._s[3924]! } + public var Conversation_GifTooltip: String { return self._s[3925]! } + public var Passport_NotLoggedInMessage: String { return self._s[3926]! } public func AutoDownloadSettings_OnFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3916]!, self._r[3916]!, [_0]) + return formatWithArgumentRanges(self._s[3928]!, self._r[3928]!, [_0]) } - public var Profile_MessageLifetimeForever: String { return self._s[3917]! } - public var SharedMedia_EmptyTitle: String { return self._s[3919]! } - public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3921]! } - public var Username_Help: String { return self._s[3922]! } - public var DialogList_LanguageTooltip: String { return self._s[3924]! } - public var Map_LoadError: String { return self._s[3925]! } - public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3926]! } - public var Channel_AdminLog_AddMembers: String { return self._s[3927]! } - public var ArchivedChats_IntroTitle2: String { return self._s[3928]! } - public var Notification_Exceptions_NewException: String { return self._s[3929]! } - public var TwoStepAuth_EmailTitle: String { return self._s[3930]! } - public var WatchRemote_AlertText: String { return self._s[3931]! } + public var Profile_MessageLifetimeForever: String { return self._s[3929]! } + public var SharedMedia_EmptyTitle: String { return self._s[3931]! } + public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3933]! } + public var Username_Help: String { return self._s[3934]! } + public var DialogList_LanguageTooltip: String { return self._s[3936]! } + public var Map_LoadError: String { return self._s[3937]! } + public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3938]! } + public var Channel_AdminLog_AddMembers: String { return self._s[3939]! } + public var ArchivedChats_IntroTitle2: String { return self._s[3940]! } + public var Notification_Exceptions_NewException: String { return self._s[3941]! } + public var TwoStepAuth_EmailTitle: String { return self._s[3942]! } + public var WatchRemote_AlertText: String { return self._s[3943]! } public func Wallet_Send_ConfirmationText(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3932]!, self._r[3932]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3944]!, self._r[3944]!, [_1, _2, _3]) } - public var ChatSettings_ConnectionType_Title: String { return self._s[3936]! } - public var WebBrowser_DefaultBrowser: String { return self._s[3937]! } + public var ChatSettings_ConnectionType_Title: String { return self._s[3948]! } + public var WebBrowser_DefaultBrowser: String { return self._s[3949]! } public func Settings_CheckPhoneNumberTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3938]!, self._r[3938]!, [_0]) + return formatWithArgumentRanges(self._s[3950]!, self._r[3950]!, [_0]) } - public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3939]! } - public var Passport_Address_CountryPlaceholder: String { return self._s[3940]! } + public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3951]! } + public var Passport_Address_CountryPlaceholder: String { return self._s[3952]! } public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3941]!, self._r[3941]!, [_0]) + return formatWithArgumentRanges(self._s[3953]!, self._r[3953]!, [_0]) } public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3942]!, self._r[3942]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3954]!, self._r[3954]!, [_1, _2, _3]) } - public var Group_AdminLog_EmptyText: String { return self._s[3943]! } - public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3944]! } - public var Conversation_PrivateChannelTooltip: String { return self._s[3946]! } - public var Wallet_Created_ExportErrorText: String { return self._s[3947]! } - public var ChatList_UndoArchiveText1: String { return self._s[3948]! } - public var AccessDenied_VideoMicrophone: String { return self._s[3949]! } - public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3950]! } - public var Cache_ClearNone: String { return self._s[3951]! } - public var SocksProxySetup_FailedToConnect: String { return self._s[3952]! } - public var Permissions_NotificationsTitle_v0: String { return self._s[3953]! } + public var Group_AdminLog_EmptyText: String { return self._s[3955]! } + public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3956]! } + public var Conversation_PrivateChannelTooltip: String { return self._s[3958]! } + public var Wallet_Created_ExportErrorText: String { return self._s[3959]! } + public var ChatList_UndoArchiveText1: String { return self._s[3960]! } + public var AccessDenied_VideoMicrophone: String { return self._s[3961]! } + public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3962]! } + public var Cache_ClearNone: String { return self._s[3963]! } + public var SocksProxySetup_FailedToConnect: String { return self._s[3964]! } + public var Permissions_NotificationsTitle_v0: String { return self._s[3965]! } public func Channel_AdminLog_MessageEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3954]!, self._r[3954]!, [_0]) + return formatWithArgumentRanges(self._s[3966]!, self._r[3966]!, [_0]) } - public var Passport_Identity_Country: String { return self._s[3955]! } + public var Passport_Identity_Country: String { return self._s[3967]! } public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3956]!, self._r[3956]!, [_0]) + return formatWithArgumentRanges(self._s[3968]!, self._r[3968]!, [_0]) } public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3957]!, self._r[3957]!, [_0]) + return formatWithArgumentRanges(self._s[3969]!, self._r[3969]!, [_0]) } - public var Exceptions_AddToExceptions: String { return self._s[3958]! } - public var AccessDenied_Settings: String { return self._s[3959]! } - public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3960]! } - public var Month_ShortMay: String { return self._s[3961]! } - public var Compose_NewGroup: String { return self._s[3963]! } - public var Group_Setup_TypePrivate: String { return self._s[3965]! } - public var Login_PadPhoneHelpTitle: String { return self._s[3967]! } - public var Appearance_ThemeDayClassic: String { return self._s[3968]! } - public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3969]! } - public var AutoDownloadSettings_OffForAll: String { return self._s[3970]! } - public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3971]! } - public var Conversation_typing: String { return self._s[3973]! } - public var Undo_ScheduledMessagesCleared: String { return self._s[3974]! } - public var Paint_Masks: String { return self._s[3975]! } - public var Contacts_DeselectAll: String { return self._s[3976]! } + public var Exceptions_AddToExceptions: String { return self._s[3970]! } + public var AccessDenied_Settings: String { return self._s[3971]! } + public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3972]! } + public var Month_ShortMay: String { return self._s[3973]! } + public var Compose_NewGroup: String { return self._s[3975]! } + public var Group_Setup_TypePrivate: String { return self._s[3977]! } + public var Login_PadPhoneHelpTitle: String { return self._s[3979]! } + public var Appearance_ThemeDayClassic: String { return self._s[3980]! } + public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3981]! } + public var AutoDownloadSettings_OffForAll: String { return self._s[3982]! } + public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3983]! } + public var Conversation_typing: String { return self._s[3985]! } + public var Undo_ScheduledMessagesCleared: String { return self._s[3986]! } + public var Paint_Masks: String { return self._s[3987]! } + public var Contacts_DeselectAll: String { return self._s[3988]! } public func Wallet_Updated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3977]!, self._r[3977]!, [_0]) + return formatWithArgumentRanges(self._s[3989]!, self._r[3989]!, [_0]) } - public var CreatePoll_MultipleChoiceQuizAlert: String { return self._s[3978]! } - public var Username_InvalidTaken: String { return self._s[3979]! } - public var Call_StatusNoAnswer: String { return self._s[3980]! } - public var TwoStepAuth_EmailAddSuccess: String { return self._s[3981]! } - public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3982]! } - public var Passport_Identity_Selfie: String { return self._s[3983]! } - public var Login_InfoLastNamePlaceholder: String { return self._s[3984]! } - public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3985]! } - public var Conversation_ClearSecretHistory: String { return self._s[3986]! } - public var PeopleNearby_Description: String { return self._s[3988]! } - public var NetworkUsageSettings_Title: String { return self._s[3989]! } - public var Your_cards_security_code_is_invalid: String { return self._s[3991]! } + public var CreatePoll_MultipleChoiceQuizAlert: String { return self._s[3990]! } + public var Username_InvalidTaken: String { return self._s[3991]! } + public var Call_StatusNoAnswer: String { return self._s[3992]! } + public var TwoStepAuth_EmailAddSuccess: String { return self._s[3993]! } + public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3994]! } + public var Passport_Identity_Selfie: String { return self._s[3995]! } + public var Login_InfoLastNamePlaceholder: String { return self._s[3996]! } + public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3997]! } + public var Conversation_ClearSecretHistory: String { return self._s[3998]! } + public var PeopleNearby_Description: String { return self._s[4000]! } + public var NetworkUsageSettings_Title: String { return self._s[4001]! } + public var Your_cards_security_code_is_invalid: String { return self._s[4003]! } public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3993]!, self._r[3993]!, [_0]) - } - public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3994]!, self._r[3994]!, [_1, _2]) - } - public var SaveIncomingPhotosSettings_From: String { return self._s[3996]! } - public var VoiceOver_Navigation_Search: String { return self._s[3997]! } - public var Map_LiveLocationTitle: String { return self._s[3998]! } - public var Login_InfoAvatarAdd: String { return self._s[3999]! } - public var Passport_Identity_FilesView: String { return self._s[4000]! } - public var UserInfo_GenericPhoneLabel: String { return self._s[4001]! } - public var Privacy_Calls_NeverAllow: String { return self._s[4002]! } - public var VoiceOver_Chat_File: String { return self._s[4003]! } - public var Wallet_Settings_DeleteWalletInfo: String { return self._s[4004]! } - public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4005]!, self._r[4005]!, [_0]) } - public var ContactInfo_PhoneNumberHidden: String { return self._s[4006]! } - public var TwoStepAuth_ConfirmationText: String { return self._s[4007]! } - public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[4008]! } + public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4006]!, self._r[4006]!, [_1, _2]) + } + public var SaveIncomingPhotosSettings_From: String { return self._s[4008]! } + public var VoiceOver_Navigation_Search: String { return self._s[4009]! } + public var Map_LiveLocationTitle: String { return self._s[4010]! } + public var Login_InfoAvatarAdd: String { return self._s[4011]! } + public var Passport_Identity_FilesView: String { return self._s[4012]! } + public var UserInfo_GenericPhoneLabel: String { return self._s[4013]! } + public var Privacy_Calls_NeverAllow: String { return self._s[4014]! } + public var VoiceOver_Chat_File: String { return self._s[4015]! } + public var Wallet_Settings_DeleteWalletInfo: String { return self._s[4016]! } + public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4017]!, self._r[4017]!, [_0]) + } + public var ContactInfo_PhoneNumberHidden: String { return self._s[4018]! } + public var TwoStepAuth_ConfirmationText: String { return self._s[4019]! } + public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[4020]! } public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4009]!, self._r[4009]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4021]!, self._r[4021]!, [_1, _2, _3]) } - public var Channel_AdminLogFilter_AdminsAll: String { return self._s[4010]! } - public var Wallet_Intro_CreateErrorText: String { return self._s[4011]! } - public var Tour_Title2: String { return self._s[4012]! } - public var Wallet_Sent_ViewWallet: String { return self._s[4013]! } - public var Conversation_FileOpenIn: String { return self._s[4014]! } - public var Checkout_ErrorPrecheckoutFailed: String { return self._s[4015]! } - public var Wallet_Send_ErrorInvalidAddress: String { return self._s[4016]! } - public var Wallpaper_Set: String { return self._s[4017]! } - public var Passport_Identity_Translations: String { return self._s[4019]! } + public var Channel_AdminLogFilter_AdminsAll: String { return self._s[4022]! } + public var Wallet_Intro_CreateErrorText: String { return self._s[4023]! } + public var Tour_Title2: String { return self._s[4024]! } + public var Wallet_Sent_ViewWallet: String { return self._s[4025]! } + public var Conversation_FileOpenIn: String { return self._s[4026]! } + public var Checkout_ErrorPrecheckoutFailed: String { return self._s[4027]! } + public var Wallet_Send_ErrorInvalidAddress: String { return self._s[4028]! } + public var Wallpaper_Set: String { return self._s[4029]! } + public var Passport_Identity_Translations: String { return self._s[4031]! } public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4020]!, self._r[4020]!, [_0]) + return formatWithArgumentRanges(self._s[4032]!, self._r[4032]!, [_0]) } - public var Channel_LeaveChannel: String { return self._s[4021]! } + public var Channel_LeaveChannel: String { return self._s[4033]! } public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4022]!, self._r[4022]!, [_1]) + return formatWithArgumentRanges(self._s[4034]!, self._r[4034]!, [_1]) } - public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[4024]! } - public var PhotoEditor_HighlightsTint: String { return self._s[4025]! } - public var MessagePoll_LabelPoll: String { return self._s[4026]! } - public var Passport_Email_Delete: String { return self._s[4027]! } - public var Conversation_Mute: String { return self._s[4029]! } - public var Channel_AddBotAsAdmin: String { return self._s[4030]! } - public var Channel_AdminLog_CanSendMessages: String { return self._s[4032]! } - public var Wallet_Configuration_BlockchainNameChangedText: String { return self._s[4033]! } - public var ChatSettings_IntentsSettings: String { return self._s[4035]! } - public var Channel_Management_LabelOwner: String { return self._s[4036]! } + public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[4036]! } + public var PhotoEditor_HighlightsTint: String { return self._s[4037]! } + public var MessagePoll_LabelPoll: String { return self._s[4038]! } + public var Passport_Email_Delete: String { return self._s[4039]! } + public var Conversation_Mute: String { return self._s[4041]! } + public var Channel_AddBotAsAdmin: String { return self._s[4042]! } + public var Channel_AdminLog_CanSendMessages: String { return self._s[4044]! } + public var Wallet_Configuration_BlockchainNameChangedText: String { return self._s[4045]! } + public var ChatSettings_IntentsSettings: String { return self._s[4047]! } + public var Channel_Management_LabelOwner: String { return self._s[4048]! } public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4037]!, self._r[4037]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4049]!, self._r[4049]!, [_1, _2]) } - public var Calls_CallTabDescription: String { return self._s[4038]! } - public var Passport_Identity_NativeNameHelp: String { return self._s[4039]! } - public var Common_No: String { return self._s[4040]! } - public var Weekday_Sunday: String { return self._s[4041]! } - public var Notification_Reply: String { return self._s[4042]! } - public var Conversation_ViewMessage: String { return self._s[4043]! } + public var Calls_CallTabDescription: String { return self._s[4050]! } + public var Passport_Identity_NativeNameHelp: String { return self._s[4051]! } + public var Common_No: String { return self._s[4052]! } + public var Weekday_Sunday: String { return self._s[4053]! } + public var Notification_Reply: String { return self._s[4054]! } + public var Conversation_ViewMessage: String { return self._s[4055]! } public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4044]!, self._r[4044]!, [_0]) + return formatWithArgumentRanges(self._s[4056]!, self._r[4056]!, [_0]) } public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4045]!, self._r[4045]!, [_0]) + return formatWithArgumentRanges(self._s[4057]!, self._r[4057]!, [_0]) } public func Wallet_Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4046]!, self._r[4046]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4058]!, self._r[4058]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[4047]! } - public var Wallet_Send_Title: String { return self._s[4048]! } - public var Message_PinnedDocumentMessage: String { return self._s[4049]! } - public var Wallet_Info_RefreshErrorText: String { return self._s[4050]! } - public var DialogList_TabTitle: String { return self._s[4052]! } - public var ChatSettings_AutoPlayTitle: String { return self._s[4053]! } - public var Passport_FieldEmail: String { return self._s[4054]! } - public var Conversation_UnpinMessageAlert: String { return self._s[4055]! } - public var Passport_Address_TypeBankStatement: String { return self._s[4056]! } - public var Wallet_SecureStorageReset_Title: String { return self._s[4057]! } - public var Passport_Identity_ExpiryDate: String { return self._s[4058]! } - public var Privacy_Calls_P2P: String { return self._s[4059]! } + public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[4059]! } + public var Wallet_Send_Title: String { return self._s[4060]! } + public var Message_PinnedDocumentMessage: String { return self._s[4061]! } + public var Wallet_Info_RefreshErrorText: String { return self._s[4062]! } + public var DialogList_TabTitle: String { return self._s[4064]! } + public var ChatSettings_AutoPlayTitle: String { return self._s[4065]! } + public var Passport_FieldEmail: String { return self._s[4066]! } + public var Conversation_UnpinMessageAlert: String { return self._s[4067]! } + public var Passport_Address_TypeBankStatement: String { return self._s[4068]! } + public var Wallet_SecureStorageReset_Title: String { return self._s[4069]! } + public var Passport_Identity_ExpiryDate: String { return self._s[4070]! } + public var Privacy_Calls_P2P: String { return self._s[4071]! } public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4061]!, self._r[4061]!, [_0]) + return formatWithArgumentRanges(self._s[4073]!, self._r[4073]!, [_0]) } - public var SocksProxySetup_UseForCallsHelp: String { return self._s[4062]! } + public var SocksProxySetup_UseForCallsHelp: String { return self._s[4074]! } public func PUSH_CHAT_ALBUM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4063]!, self._r[4063]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4075]!, self._r[4075]!, [_1, _2]) } - public var Stickers_ClearRecent: String { return self._s[4064]! } - public var EnterPasscode_ChangeTitle: String { return self._s[4065]! } - public var TwoFactorSetup_Email_Title: String { return self._s[4066]! } - public var Passport_InfoText: String { return self._s[4067]! } - public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[4068]! } + public var Stickers_ClearRecent: String { return self._s[4076]! } + public var EnterPasscode_ChangeTitle: String { return self._s[4077]! } + public var TwoFactorSetup_Email_Title: String { return self._s[4078]! } + public var Passport_InfoText: String { return self._s[4079]! } + public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[4080]! } public func Login_InvalidPhoneEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4069]!, self._r[4069]!, [_0]) + return formatWithArgumentRanges(self._s[4081]!, self._r[4081]!, [_0]) } public func Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4070]!, self._r[4070]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4082]!, self._r[4082]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[4071]! } - public var ScheduledMessages_PollUnavailable: String { return self._s[4072]! } - public var VoiceOver_Navigation_Compose: String { return self._s[4073]! } - public var Passport_Identity_EditDriversLicense: String { return self._s[4074]! } - public var Conversation_TapAndHoldToRecord: String { return self._s[4076]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[4077]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[4083]! } + public var ScheduledMessages_PollUnavailable: String { return self._s[4084]! } + public var VoiceOver_Navigation_Compose: String { return self._s[4085]! } + public var Passport_Identity_EditDriversLicense: String { return self._s[4086]! } + public var Conversation_TapAndHoldToRecord: String { return self._s[4088]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[4089]! } public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4078]!, self._r[4078]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4090]!, self._r[4090]!, [_1, _2]) } - public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[4080]! } - public var ChatSettings_OpenLinksIn: String { return self._s[4081]! } - public var Map_HomeAndWorkTitle: String { return self._s[4082]! } + public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[4093]! } + public var ChatSettings_OpenLinksIn: String { return self._s[4094]! } + public var Map_HomeAndWorkTitle: String { return self._s[4095]! } public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4084]!, self._r[4084]!, [_0]) + return formatWithArgumentRanges(self._s[4097]!, self._r[4097]!, [_0]) } - public var DialogList_Unread: String { return self._s[4085]! } + public var DialogList_Unread: String { return self._s[4098]! } public func PUSH_CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4086]!, self._r[4086]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4099]!, self._r[4099]!, [_1, _2]) } - public var User_DeletedAccount: String { return self._s[4087]! } - public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[4088]! } + public var User_DeletedAccount: String { return self._s[4100]! } + public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[4101]! } public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4089]!, self._r[4089]!, [_0]) + return formatWithArgumentRanges(self._s[4102]!, self._r[4102]!, [_0]) } - public var UserInfo_NotificationsDefault: String { return self._s[4090]! } - public var SharedMedia_CategoryMedia: String { return self._s[4091]! } - public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[4092]! } - public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[4093]! } - public var Watch_ChatList_Compose: String { return self._s[4094]! } - public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[4095]! } - public var AutoDownloadSettings_Delimeter: String { return self._s[4096]! } - public var Watch_Microphone_Access: String { return self._s[4097]! } - public var Group_Setup_HistoryHeader: String { return self._s[4098]! } - public var Map_SetThisLocation: String { return self._s[4099]! } - public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[4100]! } - public var Activity_UploadingPhoto: String { return self._s[4101]! } - public var Conversation_Edit: String { return self._s[4103]! } - public var Group_ErrorSendRestrictedMedia: String { return self._s[4104]! } - public var Login_TermsOfServiceDecline: String { return self._s[4105]! } - public var Message_PinnedContactMessage: String { return self._s[4106]! } + public var UserInfo_NotificationsDefault: String { return self._s[4103]! } + public var SharedMedia_CategoryMedia: String { return self._s[4104]! } + public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[4105]! } + public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[4106]! } + public var Watch_ChatList_Compose: String { return self._s[4107]! } + public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[4108]! } + public var AutoDownloadSettings_Delimeter: String { return self._s[4109]! } + public var Watch_Microphone_Access: String { return self._s[4110]! } + public var Group_Setup_HistoryHeader: String { return self._s[4111]! } + public var Map_SetThisLocation: String { return self._s[4112]! } + public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[4113]! } + public var Activity_UploadingPhoto: String { return self._s[4114]! } + public var Conversation_Edit: String { return self._s[4116]! } + public var Group_ErrorSendRestrictedMedia: String { return self._s[4117]! } + public var Login_TermsOfServiceDecline: String { return self._s[4118]! } + public var Message_PinnedContactMessage: String { return self._s[4119]! } public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4107]!, self._r[4107]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4120]!, self._r[4120]!, [_1, _2]) } public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4108]!, self._r[4108]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[4121]!, self._r[4121]!, [_1, _2, _3, _4, _5]) } - public var Appearance_LargeEmoji: String { return self._s[4109]! } - public var TwoStepAuth_AdditionalPassword: String { return self._s[4111]! } - public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[4112]! } + public var Appearance_LargeEmoji: String { return self._s[4122]! } + public var TwoStepAuth_AdditionalPassword: String { return self._s[4124]! } + public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[4125]! } public func PUSH_CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4113]!, self._r[4113]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4126]!, self._r[4126]!, [_1, _2]) } - public var Passport_Phone_EnterOtherNumber: String { return self._s[4114]! } - public var Message_PinnedPhotoMessage: String { return self._s[4115]! } - public var Passport_FieldPhone: String { return self._s[4116]! } - public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[4117]! } - public var ChatSettings_AutoPlayGifs: String { return self._s[4118]! } - public var InfoPlist_NSCameraUsageDescription: String { return self._s[4120]! } - public var Conversation_Call: String { return self._s[4121]! } - public var Common_TakePhoto: String { return self._s[4123]! } - public var Group_EditAdmin_RankTitle: String { return self._s[4124]! } - public var Wallet_Receive_CommentHeader: String { return self._s[4125]! } - public var Channel_NotificationLoading: String { return self._s[4126]! } + public var Passport_Phone_EnterOtherNumber: String { return self._s[4127]! } + public var Message_PinnedPhotoMessage: String { return self._s[4128]! } + public var Passport_FieldPhone: String { return self._s[4129]! } + public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[4130]! } + public var ChatSettings_AutoPlayGifs: String { return self._s[4131]! } + public var InfoPlist_NSCameraUsageDescription: String { return self._s[4133]! } + public var Conversation_Call: String { return self._s[4134]! } + public var Common_TakePhoto: String { return self._s[4136]! } + public var Group_EditAdmin_RankTitle: String { return self._s[4137]! } + public var Wallet_Receive_CommentHeader: String { return self._s[4138]! } + public var Channel_NotificationLoading: String { return self._s[4139]! } public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4127]!, self._r[4127]!, [_0]) + return formatWithArgumentRanges(self._s[4140]!, self._r[4140]!, [_0]) } public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4128]!, self._r[4128]!, [_0]) + return formatWithArgumentRanges(self._s[4141]!, self._r[4141]!, [_0]) } public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4129]!, self._r[4129]!, [_1]) + return formatWithArgumentRanges(self._s[4142]!, self._r[4142]!, [_1]) } - public var Permissions_SiriTitle_v0: String { return self._s[4130]! } + public var Permissions_SiriTitle_v0: String { return self._s[4143]! } public func VoiceOver_Chat_VoiceMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4131]!, self._r[4131]!, [_0]) + return formatWithArgumentRanges(self._s[4144]!, self._r[4144]!, [_0]) } public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4132]!, self._r[4132]!, [_0]) + return formatWithArgumentRanges(self._s[4145]!, self._r[4145]!, [_0]) } - public var Channel_MessagePhotoRemoved: String { return self._s[4133]! } - public var Wallet_Info_ReceiveGrams: String { return self._s[4134]! } - public var ClearCache_FreeSpace: String { return self._s[4135]! } - public var Common_edit: String { return self._s[4136]! } - public var PrivacySettings_AuthSessions: String { return self._s[4137]! } - public var Month_ShortJune: String { return self._s[4138]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[4139]! } - public var Call_ReportSend: String { return self._s[4140]! } - public var Watch_LastSeen_JustNow: String { return self._s[4141]! } - public var Notifications_MessageNotifications: String { return self._s[4142]! } - public var WallpaperSearch_ColorGreen: String { return self._s[4143]! } - public var BroadcastListInfo_AddRecipient: String { return self._s[4145]! } - public var Group_Status: String { return self._s[4146]! } + public var Channel_MessagePhotoRemoved: String { return self._s[4146]! } + public var Wallet_Info_ReceiveGrams: String { return self._s[4147]! } + public var ClearCache_FreeSpace: String { return self._s[4148]! } + public var Common_edit: String { return self._s[4149]! } + public var PrivacySettings_AuthSessions: String { return self._s[4150]! } + public var Month_ShortJune: String { return self._s[4151]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[4152]! } + public var Call_ReportSend: String { return self._s[4153]! } + public var Watch_LastSeen_JustNow: String { return self._s[4154]! } + public var Notifications_MessageNotifications: String { return self._s[4155]! } + public var WallpaperSearch_ColorGreen: String { return self._s[4156]! } + public var BroadcastListInfo_AddRecipient: String { return self._s[4158]! } + public var Group_Status: String { return self._s[4159]! } public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4147]!, self._r[4147]!, [_0, _1]) + return formatWithArgumentRanges(self._s[4160]!, self._r[4160]!, [_0, _1]) } - public var TextFormat_AddLinkTitle: String { return self._s[4148]! } - public var ShareMenu_ShareTo: String { return self._s[4149]! } - public var Conversation_Moderate_Ban: String { return self._s[4150]! } + public var TextFormat_AddLinkTitle: String { return self._s[4161]! } + public var ShareMenu_ShareTo: String { return self._s[4162]! } + public var Conversation_Moderate_Ban: String { return self._s[4163]! } public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4151]!, self._r[4151]!, [_0]) + return formatWithArgumentRanges(self._s[4164]!, self._r[4164]!, [_0]) } - public var SharedMedia_ViewInChat: String { return self._s[4152]! } - public var Map_LiveLocationFor8Hours: String { return self._s[4153]! } + public var SharedMedia_ViewInChat: String { return self._s[4165]! } + public var Map_LiveLocationFor8Hours: String { return self._s[4166]! } public func PUSH_PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4154]!, self._r[4154]!, [_1]) + return formatWithArgumentRanges(self._s[4167]!, self._r[4167]!, [_1]) } public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4155]!, self._r[4155]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4168]!, self._r[4168]!, [_1, _2]) } public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4157]!, self._r[4157]!, [_0]) + return formatWithArgumentRanges(self._s[4170]!, self._r[4170]!, [_0]) } - public var Map_OpenInHereMaps: String { return self._s[4158]! } - public var Appearance_ReduceMotion: String { return self._s[4159]! } + public var Map_OpenInHereMaps: String { return self._s[4171]! } + public var Appearance_ReduceMotion: String { return self._s[4172]! } public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4160]!, self._r[4160]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4173]!, self._r[4173]!, [_1, _2]) } - public var Channel_Setup_TypePublicHelp: String { return self._s[4161]! } - public var Passport_Identity_EditInternalPassport: String { return self._s[4162]! } - public var PhotoEditor_Skip: String { return self._s[4163]! } - public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { + public var Channel_Setup_TypePublicHelp: String { return self._s[4174]! } + public var Passport_Identity_EditInternalPassport: String { return self._s[4175]! } + public var PhotoEditor_Skip: String { return self._s[4176]! } + public func Notification_GameScoreSimple(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue) } - public func GroupInfo_ShowMoreMembers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortWeeks(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedStickers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedPhotos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) - } - public func QuickSend_Photos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAMinutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_DeleteConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortHours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Generic(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) - } public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, _2, _1, _3) + return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, _2, _1, _3) } public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Contacts_InviteContacts(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) - } - public func GroupInfo_ParticipantCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) - } - public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PollResults_ShowMore(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MessageTimer_Months(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func InviteText_ContactsCountText(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_ShortMinutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareVideo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_SelectedMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Years(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Passport_Scans(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, _0, _1) - } - public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessagePoll_QuizCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func SharedMedia_Video(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) - } - public func OldChannels_InactiveYear(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) - } - public func OldChannels_InactiveWeek(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) - } - public func UserCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_ShortSeconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Weeks(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Theme_UsersCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendItem(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_Exceptions(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortDays(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedFiles(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Contacts_ImportersCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideoMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_SelectedChats(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_SharePhoto(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedGifs(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddStickerCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_DeletedChats(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendGif(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) } public func Media_ShareItem(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + public func Media_ShareVideo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Seconds(_ value: Int32) -> String { + public func GroupInfo_ParticipantCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteExpires_Days(_ value: Int32) -> String { + public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) } - public func OldChannels_InactiveMonth(_ value: Int32) -> String { + public func MuteExpires_Hours(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_AddMaskCount(_ value: Int32) -> String { + public func LastSeen_MinutesAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessagePoll_VotedCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_File(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_UserInfo_Mute(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, _1, _2) } - public func Notification_GameScoreExtended(_ value: Int32) -> String { + public func Notifications_Exceptions(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_StickerCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusOnline(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Seconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusMembers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedLocations(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) - } - public func OldChannels_GroupFormat(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func ForwardedAudios(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, _1, _2) } public func LastSeen_HoursAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Map_ETAHours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedPhotos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func SharedMedia_File(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Contacts_InviteContacts(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Seconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortWeeks(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Contacts_ImportersCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_AddMaskCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) + } + public func InviteText_ContactsCountText(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) } public func MessageTimer_ShortSeconds(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) } - public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { + public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, _1, _2) + public func AttachmentMenu_SendVideo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Passport_Scans(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) } public func SharedMedia_Photo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_ShortMinutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortMinutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Weeks(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) + } + public func UserCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendItem(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_DeletedChats(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Invitation_Members(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedStickers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_SelectedMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_StickerCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MessageTimer_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ForwardedContacts(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_UserInfo_Mute(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendGif(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_SelectedChats(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) + } + public func GroupInfo_ShowMoreMembers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusOnline(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Generic(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Video(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ForwardedFiles(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Seconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_ShortSeconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, _0, _1) + } + public func MessageTimer_ShortDays(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusMembers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) } public func OldChannels_Leave(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_AddStickerCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) + } + public func OldChannels_InactiveYear(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedLocations(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Years(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PollResults_ShowMore(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_SharePhoto(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusSubscribers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessagePoll_VotedCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) + } + public func OldChannels_GroupFormat(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) + } + public func OldChannels_InactiveWeek(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Theme_UsersCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func QuickSend_Photos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Map_ETAMinutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) + } + public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func ChatList_DeleteConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedPolls(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAudios(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessagePoll_QuizCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) } - public func AttachmentMenu_SendVideo(_ value: Int32) -> String { + public func SharedMedia_Link(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) @@ -5235,30 +5245,30 @@ public final class PresentationStrings: Equatable { let form = getPluralizationForm(self.lc, selector) return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func MessageTimer_ShortMinutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, _1, _2) } - public func Conversation_StatusSubscribers(_ value: Int32) -> String { + public func MuteFor_Days(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[113 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedPolls(_ value: Int32) -> String { + public func ForwardedVideoMessages(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[114 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[115 * 6 + Int(form.rawValue)]!, _2, _1, _3) + public func OldChannels_InactiveMonth(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[115 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[116 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[116 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func Map_ETAHours(_ value: Int32) -> String { + public func MessageTimer_Months(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[117 * 6 + Int(form.rawValue)]!, stringValue) @@ -5268,40 +5278,46 @@ public final class PresentationStrings: Equatable { let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[118 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notification_GameScoreSimple(_ value: Int32) -> String { + public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[119 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedContacts(_ value: Int32) -> String { + public func ForwardedGifs(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[120 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + public func MessageTimer_Minutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[121 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { + public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[122 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_Link(_ value: Int32) -> String { + public func MessageTimer_ShortHours(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[123 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[124 * 6 + Int(form.rawValue)]!, _1, _2) + public func PeopleNearby_ShowMorePeople(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[124 * 6 + Int(form.rawValue)]!, stringValue) } - public func Invitation_Members(_ value: Int32) -> String { + public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[125 * 6 + Int(form.rawValue)]!, stringValue) } + public func MuteExpires_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[126 * 6 + Int(form.rawValue)]!, stringValue) + } public init(primaryComponent: PresentationStringsComponent, secondaryComponent: PresentationStringsComponent?, groupingSeparator: String) { self.primaryComponent = primaryComponent diff --git a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourceKey.swift b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourceKey.swift index a1b0744fad..ff03ac0902 100644 --- a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourceKey.swift +++ b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourceKey.swift @@ -48,6 +48,8 @@ public enum PresentationResourceKey: Int32 { case itemListVerifiedPeerIcon case itemListCloudFetchIcon case itemListCloseIconImage + case itemListMakeVisibleIcon + case itemListMakeInvisibleIcon case itemListCornersTop case itemListCornersBottom case itemListCornersBoth diff --git a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesItemList.swift b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesItemList.swift index 53b0efb48f..8a3e6fc808 100644 --- a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesItemList.swift +++ b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesItemList.swift @@ -152,6 +152,18 @@ public struct PresentationResourcesItemList { }) } + public static func makeVisibleIcon(_ theme: PresentationTheme) -> UIImage? { + return theme.image(PresentationResourceKey.itemListMakeVisibleIcon.rawValue, { theme in + return generateTintedImage(image: UIImage(bundleImageName: "Contact List/MakeVisibleIcon"), color: theme.list.itemAccentColor) + }) + } + + public static func makeInvisibleIcon(_ theme: PresentationTheme) -> UIImage? { + return theme.image(PresentationResourceKey.itemListMakeInvisibleIcon.rawValue, { theme in + return generateTintedImage(image: UIImage(bundleImageName: "Contact List/MakeInvisibleIcon"), color: theme.list.itemDestructiveColor) + }) + } + public static func cornersImage(_ theme: PresentationTheme, top: Bool, bottom: Bool) -> UIImage? { if !top && !bottom { return nil diff --git a/submodules/TelegramStringFormatting/Sources/PresenceStrings.swift b/submodules/TelegramStringFormatting/Sources/PresenceStrings.swift index b7bdd08a48..31893c0e27 100644 --- a/submodules/TelegramStringFormatting/Sources/PresenceStrings.swift +++ b/submodules/TelegramStringFormatting/Sources/PresenceStrings.swift @@ -109,12 +109,13 @@ public func stringForMonth(strings: PresentationStrings, month: Int32, ofYear ye public enum RelativeTimestampFormatDay { case today case yesterday + case tomorrow } public func stringForUserPresence(strings: PresentationStrings, day: RelativeTimestampFormatDay, dateTimeFormat: PresentationDateTimeFormat, hours: Int32, minutes: Int32) -> String { let dayString: String switch day { - case .today: + case .today, .tomorrow: dayString = strings.LastSeen_TodayAt(stringForShortTimestamp(hours: hours, minutes: minutes, dateTimeFormat: dateTimeFormat)).0 case .yesterday: dayString = strings.LastSeen_YesterdayAt(stringForShortTimestamp(hours: hours, minutes: minutes, dateTimeFormat: dateTimeFormat)).0 @@ -125,10 +126,13 @@ public func stringForUserPresence(strings: PresentationStrings, day: RelativeTim private func humanReadableStringForTimestamp(strings: PresentationStrings, day: RelativeTimestampFormatDay, dateTimeFormat: PresentationDateTimeFormat, hours: Int32, minutes: Int32) -> String { let dayString: String switch day { - case .today: - dayString = strings.Time_TodayAt(stringForShortTimestamp(hours: hours, minutes: minutes, dateTimeFormat: dateTimeFormat)).0 - case .yesterday: - dayString = strings.Time_YesterdayAt(stringForShortTimestamp(hours: hours, minutes: minutes, dateTimeFormat: dateTimeFormat)).0 + case .today: + dayString = strings.Time_TodayAt(stringForShortTimestamp(hours: hours, minutes: minutes, dateTimeFormat: dateTimeFormat)).0 + case .yesterday: + dayString = strings.Time_YesterdayAt(stringForShortTimestamp(hours: hours, minutes: minutes, dateTimeFormat: dateTimeFormat)).0 + case .tomorrow: + dayString = strings.Time_TomorrowAt(stringForShortTimestamp(hours: hours, minutes: minutes, dateTimeFormat: dateTimeFormat)).0 + } return dayString } @@ -148,12 +152,14 @@ public func humanReadableStringForTimestamp(strings: PresentationStrings, dateTi } let dayDifference = timeinfo.tm_yday - timeinfoNow.tm_yday - if dayDifference == 0 || dayDifference == -1 { + if dayDifference == 0 || dayDifference == -1 || dayDifference == 1 { let day: RelativeTimestampFormatDay if dayDifference == 0 { day = .today - } else { + } else if dayDifference == -1 { day = .yesterday + } else { + day = .tomorrow } return humanReadableStringForTimestamp(strings: strings, day: day, dateTimeFormat: dateTimeFormat, hours: timeinfo.tm_hour, minutes: timeinfo.tm_min) } else { diff --git a/submodules/TelegramUI/Images.xcassets/Chart/Contents.json b/submodules/TelegramUI/Images.xcassets/Chart/Contents.json new file mode 100644 index 0000000000..38f0c81fc2 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chart/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "provides-namespace" : true + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chart/arrow_left.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chart/arrow_left.imageset/Contents.json new file mode 100644 index 0000000000..78b05b5e2a --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chart/arrow_left.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "arrow_left.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chart/arrow_left.imageset/arrow_left.pdf b/submodules/TelegramUI/Images.xcassets/Chart/arrow_left.imageset/arrow_left.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7b20434672a16424c35740a555a96dd0fa6ae0d7 GIT binary patch literal 4081 zcmai%c|25Y8^~DvoFP1BB3l{BwK?*_Uwux8nP!I zW0wkvv1DH!yS$_2eR`hf{e0f@IiGXxbKTdu&VBCR?~m^VHc;1;fJ(xE;6~~)btZS^ zNoQj-5DtQX+%S&73l~6AdU#hmf;|X93mJi=G##7?cz4>}8BM^eSBtU^BOi~x=BVmq zTC#T%lk7H>MhKG)+3-}o{JM54l?p4`QTAr@$Irj*ufnX1zcY0(y-ta?dGFQil zJO{qqwGy1F8kGB^?xk`ITJ+hQPd%Yq$|uhlav4u%t{nF{!}l=fCCVqSp*^^8x#<81 zHwcTqaJjJ@Kw7*SR*=z75bGd3c8%0B>Eyu1rT}%=R){9+fiKsvk!^Ebeu+Exi#0F~ zsXZh|r$b6b*-eG!=U#Nyk|~Ar5|6=)UYx-5*jIJ^_3OBGO=nie#lX2*t&&w$iqcd{ zhf!Qd-9=c6PP}437wn`DfZW|fk)QZ6seVn|%=o+P4ZCmY zK>6Y)C`qj^3x~{ZO;@UPyH)MbmuUrV0`ac6pW8|s?W?gb!Tucvlir`)A4>lw)a9Gk z@gOM!wB7fsJKmK5g8dN92=C$M>5j#FfMk9I)ZAPNw0RHEzR*Vd0{*PGKmSX319vy9 zF`fXjpcPfu1X+Qk)ZCoi+>NiJv3StFGt@kwAlaV84!sGj*0nj+3mDDZtrSCk?Toq^V?VCb9j}4&S-PP@EX*d z+#Fr?_I5UQ5(T%r&bc@C2I=reYlHaXv^Ts~-aoKy?(D{cT4Jx&n-nuE!shwdIa#iwW@Sm~ZgaY5zytXfjDe;Jw_Wd@w zb&Az8!gW+nMbLO+jV&7I4$ctg%Nz-Iu46dzfQj$~2oI8kFo<6}BoGL@&NvLB3l7xc zWPHddsm0)+40x`h_?`}^0)0>Kb=UDaU2l+YC*aZ@nd=8F0axD~y3WcLh*AcI*6Bj% zhl3oL?<{h1XQ<>q;K|}hQtjtFZq9sDO~pWti?K;9`~hdI@@A*-(_`oE=BKL}D6F0# z@K-Tg-Q9Y^)Cqzg+@<#qKAgzVgFf`0?q%R$sk{I)s=n>Bx)1kbCf+w6M|CQB6xl24 zc}I^g(us%I)WRX~on@t@=fKNYS~7Ip1Ss$<|kIAnCp|({dN4MP;oHQ3TdphD6SyJ zDPe}>2iA`tAbFE)B-2D}P6z0G%h{=9FsxIqGY-luy^^juT3)XZqOFmfk$|~}Nyda@ z?tVcu8G>KO2E|q!(a%$!F6{|+@D%M> z?Wop^#_xNFFJG&olvCK8ChUdb1&HdFjM7hLW`&ylPmm24-rmZ*`Djy&RUy(eGKFV| z$3}ck+*o2p{FIrf*#T3R@~@>^4Idhlovg6_EuoHM*s_kCp@|noc@iUDwR8UR$yTL9 zJk^(~DQoO&g4@E|P$q>ipD;4}`g?-c+3H~bzQZ$9qm>;?#4#ojKapoW+PNbsW*wp( zhdMG@*?1RudnJy!cikAR6mXA`#7Poue6FYWntV(cGoRUNzc>&z>DB1cIP_j&aJO<> zj6;_r1{K*7pBp#HPhqvbM=H4*bG4)*b{(_exR9%OUNKxTO7UooS51Mx)CPK&Vb^PG zXk}n=a%*5)A0P)PWSIhH0W<+um=sy1S&kg=1T@sq*Hzy+CDm;sWZBEZpt_^x6>@99}3qd$ZES=eCbGKmwzouGUzs75%pREh;jKN0-N2vlZ2((TBRI;io~; z&?T9Qo0W}g63vOA90i_J$GQE4yxjBFyN7hc#%8|&$L1wrmJiEjKe)f3=Cx6ZAK28H z-8gsh_^A^koO|I%>+`63#j7^2ys3bJxazR&*vV$G$*3i(4g5|FfE4^ZxJ#YXXcdmt zF4pGO9%Il~dGXovxy^FWcwYR2_)Jk)URT~94#DLcmMR}*cT0Rccj<^K$&_^*gF)5zp5_lc(cHO|K zNX4ZI{b{tYfijcvwW`)Gz$QR_PHQQKf(k)px70^__R04S$Uc>gm#L46ZGJX(qs49a z^Pg&dM+>G6V41Hr0CK01OJ7;h#S(vYWQ{veP`mJiY%@fB4HR83#W- zzme&{o|F?ECnS^}?cG`>t|cXxy|dG$#B^{!euPZ(zP+s49I_M{&Kq|ADnYTTe7rlQ zxU_h2dfD#7 zv7-Am2mB|uthS|w*Q)%f_xDncGe#cVnwPBc+q3?pFzr9Q+r^Z}VXf5eE4OREi=7?I z5CQ6+OU+j*+U?sIu+1Z{&ORBqMk%{z7adxuCbgHaS)$)?fRaZM(=6BgiYh`;h?~SA z-)E~$i)}@XGeT`FWp0zeBSO^uGYT z&#(J28suuLsi~qp@Ho&uz#4(9elhVrME_#qzZlyCBy|ywb3m)Q`G71Sv=k`ql=%+H zo;31?f~0gEa2_;x-bZv=wch}lmif<$YG?x5+0E_;zI*)S_P?+k3jO)U*^6i_NZ%M_ zO8cB76ecMHGW0~d6MR85LjMl+J_ONU>xTYn4$i8dmxe%*5GV`^g+q`~ggFEvLOcJ; z{B1on>c@FvX)WIOZ_+wGHCks!aBy=~-$(ZEHEF?%Zn)o{|5~Y!JKh#Z+X)yD^4|j_ zgFwI#AY0JS7z`mtlVbk>x∇BcB0e~-anGPJ$_dkg}Rrv27GVsL4iWdDdEr2j{~ z|CNWNwN-zA7Y2j;s~!vvr}awz$b%#Q9Yg&79|U)_gEQX!dmnA=;7i*-S_5R{=0@|! zz6WR1 XZXN`hHNFc1laYY~!C(!2P2hh33O4!5 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Chart/arrow_right.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chart/arrow_right.imageset/Contents.json new file mode 100644 index 0000000000..147027fa6d --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chart/arrow_right.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "arrow_right.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chart/arrow_right.imageset/arrow_right.pdf b/submodules/TelegramUI/Images.xcassets/Chart/arrow_right.imageset/arrow_right.pdf new file mode 100644 index 0000000000000000000000000000000000000000..baf05c2435b67cb6ed2e3c05f096faf0595e373c GIT binary patch literal 874 zcmY!laBDSrg$Nf-E~sEh zW`3SeW>QgNQKf=LaCT;*KF}0}Tr*2eJ3Fq_JfQL{E+d3VZkahHKy&onauQ2YT~d?t zQ&PF~eNyw%OEMG;Elup~6pBlVQWJBzD(2({81^w4^1S)Xb=^av`mx1H?iKy|Ygk0Q z8Nb(eZWQNySudwY_u$gnyA+GS+PQMma4t+JrS##fs zoM`R&EaQDNU~;M9RaH-$RXWcY(#5|^DaiSKeHNG#*wXxCB45(212H#M`TgJ6spU2N zF|=Cb7-#RC`!sG{`={W04U8_2LB5B21{w~=h;Rt0EJ#(*cTOxx%*js&hGk-UYO#U| zP(BC|Y#=T)0wBu4s<`x>^Gowe6b!lay)#pa6{1Z+x?&O9Kzs~sT>3$&#rdU0$v|r$ z5t)QS=Xea~E=Gn}BbGnDp><PQD8Ie)&bY zi8%=GR1~GAaTzF>a~Z&af|;qQv8h6u0$dDeFIZL~45S_H})!I@R5K-cL9<>!|ufMOWvUC+F> +endobj +2 0 obj +<> stream +xśŤ’MN1 …÷9…×HěŘůń ş.,8ŔĘbŠD{ 'ÓvBZ$&Ň(zvü9Î#@[ŮOĚG÷íŞ@$ŁÉmŕôîŢžŕËyć ž‹€—áer:¸çÂáěł×ú…kĘpti­­Ú©‹ >)ĺ Ô©SÝ JŚ˘) °zĆKşŹ´˘Hf7Ć.<ŁŚ± U lü5…(eĚz;níążŕ[µfsc×éwřNÜú5Â&oW\~É·™tÄm„ß`vźÖ{Ő *CK°ţŠ=N' Ő|ˇTŞžţ’[ŠRšü öbĐ35ĎLˇd‚Ővu™—ÖMłU ±˛ĎD-=°1‰X—¬ŮײÉTĽa«ß'Ű€˛°™zqŻnßcą¨M=Ä˙ŔŤ"Xîŕ+& đ-y€ďÝKSŞ˛ +endstream +endobj +3 0 obj +<> +endobj +4 0 obj +<> +endobj +5 0 obj +<>>> +/MediaBox [0 0 114 42] +/Contents 2 0 R +/Parent 4 0 R>> +endobj +6 0 obj +<> +endobj +7 0 obj +<> +endobj +xref +0 8 +0000000000 65535 f +0000000015 00000 n +0000000089 00000 n +0000000482 00000 n +0000000529 00000 n +0000000584 00000 n +0000000765 00000 n +0000000802 00000 n +trailer +<> +startxref +880 +%%EOF \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chart/selection_frame_light.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chart/selection_frame_light.imageset/Contents.json new file mode 100644 index 0000000000..8cc38ca79c --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chart/selection_frame_light.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "selection_frame_light.pdf", + "resizing" : { + "mode" : "3-part-horizontal", + "center" : { + "mode" : "stretch", + "width" : 1 + }, + "cap-insets" : { + "right" : 11, + "left" : 11 + } + } + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chart/selection_frame_light.imageset/selection_frame_light.pdf b/submodules/TelegramUI/Images.xcassets/Chart/selection_frame_light.imageset/selection_frame_light.pdf new file mode 100644 index 0000000000..c426c5d695 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chart/selection_frame_light.imageset/selection_frame_light.pdf @@ -0,0 +1,62 @@ +%PDF-1.4 +%Óëéá +1 0 obj +<> +endobj +2 0 obj +<> stream +xśŤ’ĎNĂ0 Ćď~ +ź‘ěÄůă'Řypŕ*‡‰ńţNş­Y6$5ŠľĎőĎuĚH¶&¶M<ÎGř†*0‹#˘@Ńävňxz‡·'ü—c@WĽ˝¶˝ěđV8ŕyGxř¦ě´>ţ’„3!­™U;uď’röÂť:Ő‘Ä(š’`P¨Ä’îť–”8â Łwć±eôÎT-¸ń×ć”)ëős+w0ćţofnĹć2z—Ţrčđť¸Ők„MŢ~qą‘Ż=é[ ŢÁ źV{Ő ©]]ő­ľb—ÓÉÂ5^8U ůŞ'ćżä–„Ł”&?Č˝ôĂĆ‹ŰÄ1NľdôBučë˛QZm„¸ŽPĐŕ2{Q ÷ÁůD¬Ę ŮŐ†“ą8-,l Ęl¤x…}Ź E­ë>ţnˇr_1i€oÁ|żBŞV +endstream +endobj +3 0 obj +<> +endobj +4 0 obj +<> +endobj +5 0 obj +<>>> +/MediaBox [0 0 114 42] +/Contents 2 0 R +/Parent 4 0 R>> +endobj +6 0 obj +<> +endobj +7 0 obj +<> +endobj +xref +0 8 +0000000000 65535 f +0000000015 00000 n +0000000089 00000 n +0000000482 00000 n +0000000529 00000 n +0000000584 00000 n +0000000765 00000 n +0000000802 00000 n +trailer +<> +startxref +880 +%%EOF \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/Contents.json new file mode 100644 index 0000000000..38f0c81fc2 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "provides-namespace" : true + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconCalls.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconCalls.imageset/Contents.json new file mode 100644 index 0000000000..9afc9c4e5d --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconCalls.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_calls.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconCalls.imageset/ic_calls.pdf b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconCalls.imageset/ic_calls.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f42e5fe81bb09773660cdedf91df9372a3f2c78e GIT binary patch literal 4945 zcmai&2T&ACyM_r1$byKHkpm+VCGE0H&MZ+-vI3G8STZa*2SI`)2@(VaB{^0NUIREGY>HsH2>$-E9CNoTLp1DA_u=qg-)s2c$bn0cC-$fms$xhNQtDtp_^YMVom%ds6+edp;Ko#}J zAUu26qI?Nd@)&|2dN?`u4NP={_WqycDk@|aLGg)Y3+%?Zi*Q7&?Kkb0`UAP2DB0gs zgYVHcEHIlK7mC-o$R$tM*$h{ai2#pz_C?FdI~!lt8BY2-wDmdqI1ySsGlUTpbR{|f z#5817G$A9-y5@Epx%mRf8+LWM$MqeYJgK{(Rus8!7a8>5P!XsNTZvJ}(Iib4mR0Ay z@a2G_XL_r$VnWq(utE%fXD@kisL1RS%~ZkmV%LBT9vAAeT_4Y2eVuB9d(vi3 zwO}J+g1X2^j!1ui+gcKD&w|5_v>{$$2;*F@PRpF>pfW-xqNF;Z?fRsyoh_<#uFtby zihaXAM3S`ru}@*|YkwbIkE&^_AC`CH_6e^}3-h!SJE41QRAmdw`bsw&88x^`J2zLH zH&rhMwUeO868M%2o`b~xdQypH%9KRgnJ#y6%Xr!nA?nB?o7i) zst)dmZBr#kh&K38JC<}l>MFhMca_znaFA_%cIUasc!0RZjATX7C&jqDH4Xh$h}W>3 z_@H*41gl11f5u9W0ja<7_6z4Bkk>288yI6x={res=3lszdNj7%uA!7|GeO4m?w~1# z&^bM?de7k4b_>r5vY2J;KikzEHd+EgK=!b>Z<*HlPx0=Cw zUZe$-bcxeWJt;2ry}f}y;*~`_xU%umhQ>2O&6=jJnLNa>it@=c{TW=A zGwllNMc!1TZC>B@YcA3XUs-U=~sI=#FQo}i;5Ie|#PUVJ zsy*1;<4wK_XLd@VIKfJsi1XY$$>jC9|2jW@N{rf^1GDB%tl@{P5xp6@)`CdN107zuBg)k24Ao&_r7Qe7d5X+yU5M7OIVMLwmSdpxglA zzXSx@$sO1423**#_Jy7P%6HNKw+(B$qAhe#?!W_FQUxWz7!W|99nh{i&PWRsaN*Mk zHz*+TE5UC$M1RZi%gV)mMhV=-O-MlQ!p@y=UJeK-pge6YP}<7!|J~&?QoM9^CTSzE zO(IQ0*H{7eeMVnW;Jt(j4M;0e^`Ry~cqoUb0+AB+RqlJ1x~=%i5v&%9)MSrB%*RQ0 zDK)#>v=kHYh?veK2jhU`Q9XzmR6+FjXC(r|Io7G6K{(qhuheBPy(w6f{hpt ztT-wx8OTAmNRXt1>0%H(2lekKa|?z;1!=QMbIMrfJ1ZRy3YT~q`ktk7EMzkp3^Fvr zGh-Swr_&oEP7+Z!3{slo}Xt$ z*+m-0y>%Co2oQ0l;UDRVS$>$zyLW#D%SGskn()KRm}F!z7F0O zS*>(CVJmuCD@mlGkv0uslEM1%{FdO*pwZbNdSOlyhQJJaY8wwzynrw<&01BGUbGY* z;wB-RlZ-Dx!1@D9D7d$|(WX41(k)KV_s8-H3z<=r)2zB2tIpB^d7Pyydk!x{?o6md z8^N`B68D#2crZVNfYMDmy92syd)U{;KXP60ijo)5qv;ip1^zi zaI#8*>5_8$yDtjfG%rZ#T0hO+uBDZxsA;F0y}pgd8)n-6^pb4vCBk7P{Y%$(6y)Re z+3>I4uuovkBPdo(kEh7HUKgv9;IcqS9FdKDMo-(#FdtzMGi!biIc9zvGWyKo**$f- zC1EQ{SnzR3zWL~@0)5Uh8BbE-tIuQkI`5gqnLVgVeMLBd+>l_R=xJq`V{#6xr8g3E z5~={zTp5pPc(~qid6r|xyYbdE^;XE0Hn(ka{~OKVAf_PZnK+j27S4E5Ly&#Ql^ZDl zn**CJCF7;#OJ|{1+u>TlMH=p`;gmj|M&{hFo=nI!sxooheM+qw&PJ!r#+_CjtgC9r zYRn?aM_@ zBl;!J>N5;AniK+V2M8!Xg{AJL&i9o+ElsdbUQhL7*GL*q^-4A6&*C(_5p?@U!S`AM ztv1;xvE)6FBzAI%AMX|XpZ1}D~B(=D1T`zwh-%;iOn#DpD%omSgWd!^sPOy`_{20wf2-Tow1pbfl-e!72YkxknWV; zm%f<34DYG7F(i8fGF&uVeq#bjPWw8bYsHR<7RxTL*ev85md=|hl`6L=!suJ)-o*@3 z87J~T5Rt1fs?qV1*H9DC7ci~V+RB#J$|}#wYf)}_5Y*o~1bj4$mV4e-lpU4bg3Ltb z&RX0oNhlq@m1~$Q(JgB6)+K63dj0`NRb+;0qH1j49i54hXb0tqj*p$` z_Qnhoq7MQ_;siimN#e6fKEt>%n>Bd!4v<-I~um=)r4(fgD3lyJJ8z;#AmLk zfaq*ciR*pes~jCmt48ak)Ti8~II4U{(N8f|Q7u)U*8sDi6k`|z6iCssT&MA4^K>mf zd_ScYF~2bfp8v`ZGfKg1d~|)YSo{uK5pUXN;Bt%kI?Eq3l;@FD?Zu1g75k=jUW=gd zrwtLOiObzQ%dtDgN2u=!pw!UUp~DKPoyL(CsuijuGCcR93&%z}2Pwh4cldcYpNl^_>O^SqXW0ST}qA2>;$D^wplCJZ!AO z=u_QYFXOiQ*>BD3agKna%H;MtrFXHY>oZPK(<53hwW^xUY%p6(-STzvTC+`jgAXVi zx*TX6Hm9sG<#wM^Sxtt&nZKKhn$uwaoVY$?5ODu^YTzJrvnl@||J3V?=OwStQ>*oR z`f26{CX+)IUyREa2X=FIYZ~rvG~Yu$a51}L8)q3;Em-ur>2{@^@@U~&-dZqYT>4Ve znqSRk#>bvd<1I6eK_BpA3A;$7nW>o?gL)4&?aSpHyO5t}%Q~>@IcxPT)+@bsDP4H&a4W-!#V6+(*9oJE zPrmXu`<Ck+zg9( zY#kR~ix4C$GIgW$95Q;Yqcgw+j=BaP&& zSQ#&W((k+89FA5?Gl!vjr~d}%3kv-S&B9Q@zk&CHUoSKq^Qz>zl;5KyzVbi={(1)}4!{RYU; zi|~JDL?GRf4ruGY@ZIefxBmyrp}!5lVY#J;1@1(I%Modzp#$7Qxw_e+od76=A1cHz z2pDn6d)PWy0#Gr8kcbgCpyh#db@v5u2>+A%z1_KSQ#amNi(z+pI;OF>)^A_&3V zB2XbXOb}uSfpFq(T-+VBf5UvRS)Zl_5xK;nBhMOR6DgUWKVX%LVg~I=>!3ANsqW+(;LJ-`J>Yo~1 z5c;n;I85lbIlH?eZ5>dqKhLRjY<*F((SKNlJv^C1eeUaXzY-=|I4wH>SgKmZcf1$_QIAa98GaPn~m5Hyn+Ag@Do^TB)3S~rXjUJH*SIpP6T zRj{{@7arpd4xq=UUW^q%vbAmag6$p7Z&#ji&Ej%IFfm7fYMC@AMP{V-PqGnR%6)V2G0>Z0qV@~P4zA*244$6zQ2t~rYO~=^R%wxF-Ljrox3N~~)dU(x_%5n5w zu|Ot#@2$Y(S@R{_*>Kdcd~vSPgjTD8UgUeW$R|9C*Sy{<6>nbh<7K`lo@Eh8u;3aW z5QULS5aYjNi+WN$hUPZN3gakWFE46KBwj*suy8Eg%G@e$R{*~57i{|7`UDT$TYlL# zBzCnvUZf>BRz}In=t`GM*SZBNO0}W>!4~$|mFi^`Bb6*tH?J04-|p~pgf{kuw0>J` zc}kJzoId5Xcap8XZGDNowWh&^$KuG0&mp%4QL&=e;^D4h{z(fx$#V1K&)$C2DIaJ% zO+3O|`B;NBPAaO|LUd1~uY`IpkEb#BDnBN!buTxJ!A|T-*)<$JOZC$w^X&6n_^0OiK0hh4bTxz(ik<}AqL^?iDFpA{LOaLh1$ zeaN~YZ5aeHR&{r8$}02b1RX;1#*RDRuQ2NCqAdLovw^r!ob1Z2^W&c}v8mML41K#3 zs`s(Y=o3$m4d^gETegoB=9z2;)7=imXAEeqmQ>#S%LIqVfeJ5uvVPp;3GemSj-+4H z&n_d0<=2|WY!Yu$kcqA=cXTX`=@<;=Z>2@~5XK2I)Cm}F;N30o$hxpwI?#$vZcvv4 zp$hYr?4HRYdxSQmr$;(9y8~;MIf&&BZo)K?HPb2ue=sI~Zx z+qI7X)T)TjsOp1PB729h4cSwbApB%CCX3Png3Mz(bEpDl(MEH)U_P`n6m3EZ=UOMO)*a6pT6J#d5G;0+~?_<8b zt}d1ulwFv(7~ks7WV98FEw5z1dG}exThiL$iAUtJN)VKJJXnTH2B)@5mwv5c>QQB0 z58KlZbp1MHJXzWbG3)^yJ&snUr>@WKvxvRx&bS21(|w$Mc4TkYY4=>sm0h8bkgX3t z5>9Sx0b;8$y+LavF^1@-gvjXm&c>#sxQ4yKwoEVt}4g^-u07eXZZ2-m@Q z5654pl-4^q+y^K6phd#q2ZIM)*x$~*#Z^x{Aa8-kap>g~NLT zihmeTBo80jxHoW+H_Q(5!7qOY;|G2Z@`#BS31^P?0c>bpEgirPkVlc+NM7ci7#tor z5TLxFfYL7qfAgXIHy^)p5%Q->-iWp!d5wd7vokBGyY>1zJ(G?jJ7-@<&9 zH=5F*)X;ZK6p&aG2xI}?oV&mSGL6v-HDQQ~ko40!q{Dqw=8~huOM2aCQJgk6>y2>i z2+KE4llEp)Ep6&J*_CCv46!%G|Hwvf*E=>iIzKE;A!^sog-N79MZ&z*$rl`8WsEcA3r%f+di0fv;d zYPMStzR(KN9c_9Ew0nkg;+Ha^FJI8ZGtOI0qm#nd&G%F~19vP}Bo`_7HOTkTlWvQT ztXe#8mq7)PV^(C|uF=ur27fmq$EV*+O;I!BNcy5c-KQB6IjxPM%zilH0ub92uI!oPyTO zS5X=!%G``?sF>TFN$OjDl10Z)-6+XHnW(IZ`3Tf9+uhiHz|;pQ9Nwc3jyRgmFn~Go zmhM^TXyrK}X5ClaAG88^?lJMb9GlXw;Z5ratO%%;%DAvxr&7Lp#BK|_+l~0U^qjNCn$9dcNr=!v2DeNW8FjgNjl#WZk zWXLz8NZ^ErZG}I?4m~cgl6s`($D(-jZoF*kC5HqDo65AujBhcE=Y-fhUh;nw^1NPi z+!p46Cq(l3WR>KQ+O<9L~|~{S|xdWFt64C`5QNL8QG&>Nblt$Tghf z!|B>9IbxYxLiCNu$SOSQZq@BmgF|p7t+=oHA3pYP`|2v74^{U zNRh{&RY`hnmbGz%RCI#boJR3i1XGjmh1H?f)680?LYh&EG+`lPU==f{kT)#obTNIX0# zpgHjH>YJMCi`8e};om_{=qly!3?$FBt%-bYSYyFU;BBbVR3WMWwd%Fm;a3ocO}H8V zLvk{?j-0TnF!O>kO&L?HAYR_Dmr30^<#Fm-s%R=9l|D70#L$v7#66T%;$C7r2yu~g z!MKdN>)EH5A*mTlJr)FssyJj$S^1Yj*?!gh@lusCTv3&kQ=U;( zFPB}CoQ;ykbKB?U{+h-H@>cTp6{gEMs;1dx+4)VnO*SE~U-kj-9O5+YHW%f@<}_jM zWAdhOVkL>C{ipJ*^Uk#^?0Ghfb_%PyP|LCc^IS-DrwS8lhw zYt3}E!v%LlxlH4#dJD#9o|YBMPWm-{2|kx;S2@mGXH-X7XI~fHk=%hYsYC}vH?VKK z_3@LgiwGV%y6}0brgw!r%_J2h^>{$9a54+sE7N~XLDD^oQ>UWsy! za%B4e&zwQavD9hnh3%e;Bk{9-t?sSkZ&gP3YIaU@7;q%&#&x6=CeI2`STEm9tN1PP zw~FUU8`x!+>c++M8u0q-bm_Kf59wai4$@B3Hb}ENgRc6dL$)RZ1uDEEf;>Uu zeqO~JZ^jLxrx!nhr&mFw~7O*0s4JpJJN#Qs~@r{a{` zDS0yR;{M{_i4oPC)dQLmnApnGc5oG`2Kg3+JP4}xHF0Rkk}FreKhaRy8%?N7zxBiL z`vtQ2U5OiL)+(1L6HdDL?AN9}M`zYPWq$JLKGC(>wR0UoK=}JQHTwOC+HFQGxw4l< z4wu`Gy)g2(Yp$L8-nfw94!B$Nz&Lv;X_? zx!P5$3@rNcXkYmUyE1Cex7=^f>wa5oyo9m2;=n;na7?I%6+LOtuW->FDxA-s4--hp zoN1U3dj2KrUB}o+)1-UI0DU}T8a~*rC9#+1-d$w2|MhR0?U5^SF?`WyfAdkTt^V{TtGu#&qB|_D;_}K1ui~+Won6bc zQm1mH-MQeb;D#?zd-21?-;bSdO5@_69mwYIO_kmUD2xxrjpXzPzI*@T_P?+k`nL%*EO+$9(Mo!0cMQ(h9Jqw{@+Oiz04PKb zijac=w$hruL^nqOibNrlY-IpbUyPSeAV5R-pVS}VBSRy1TJi5go1{gq$F0seo|{(S+82m~Af5P)Ac1&A`O zh&i|bk3Vft2%NUz|Fpr82wG+GPaAE4w5|N74GMwMg8F}KQ0Ra0_uq8Nv})&{bK%O! z|L~^(p}oPsbv|Agq8r}pXMto+48+sk7mzn2k!TS=h$`)ei=GF8L<|2PeJ$Dta2|qJ zf@2{#+D^dW2sliMfOo_wVc^P+1PB6)SHP-*|F`6i56Ihx7R#R-tpHO%f+Zxhjdj5P E0`ayBbN~PV literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconContacts.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconContacts.imageset/Contents.json new file mode 100644 index 0000000000..006f82fb71 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconContacts.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_contacts.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconContacts.imageset/ic_contacts.pdf b/submodules/TelegramUI/Images.xcassets/Chat List/Tabs/Holiday/IconContacts.imageset/ic_contacts.pdf new file mode 100644 index 0000000000000000000000000000000000000000..41f48e4e2d2d3aec55b300ee4f9c4c328540980a GIT binary patch literal 5894 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 ZpFfa~FD;fo7a9RopdH(YX`!`2{|6^f> literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Contact List/MakeInvisibleIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Contact List/MakeInvisibleIcon.imageset/Contents.json new file mode 100644 index 0000000000..7abcd976aa --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Contact List/MakeInvisibleIcon.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_stopshowme.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Contact List/MakeInvisibleIcon.imageset/ic_stopshowme.pdf b/submodules/TelegramUI/Images.xcassets/Contact List/MakeInvisibleIcon.imageset/ic_stopshowme.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9cc4c3d65a220b5662bd6ba52981ae5758b1a737 GIT binary patch literal 4829 zcmai&2T)T>+sElbEPzs^D3OjpNJ2u9-m6qadIzzB_yk~aK*?IQA&+OS}=Rdz$E*(W>K?q0~z}3F6v#?h1?bXNj zP5=xD2D%~~0FshGAx)%<9oilUCxrBXLdqy7G}4{$b+SSu6_M7iHb|hfG{6Jxj(?u^NHQvTb>y^qHNRC{2AD-v!JTd*43gcW4Fsedpi7;SyFWMY2bGPUJnRN3r z+>z;RNzIl5`C6vav8}Ip&ps@9iQwSlDtV_96(G+V#U1OAj17#K#W zxZQp9rH{y8{LTRdju=$cansK-u4IAEdmdTh(8fJapZ$zhc3!eytT*vtbt2W59CUOY-uxQ`RAGS9hx7zE^&<`*wCz+>eLhX( z+*~zjNg7;c%kvCdeEr_PM&;U5spkXlnB;QelznH!>lQaXY37!tshVbJ2d|b^t);Nv z;a`PQ470i&Wi||rnIEcT6l{^VCfyypKT|=uz|P^ZGCK6d0QweKlhiw%u?OxY&m@OV zq$n-@d3c9LsG2u@tH+*h0&5Yn7Llm8RYLQ8PS1JJ4L!mzYn{F6rkHe{p(izdo>f+U zgOS;_Bo(ArNB7le!)Zz)EW0vCu$9BFe$FFz;%;$iYFi}vW*DnQ_daM=V_Ybxxiq`T z57&=1V*6@5EwZwfQDi&TKG>HsQ64&oeI%D_SzHyBqiwoexsL-Q}nl zleI0^Id|+Cb!X-9<0TZectIy$lpJ-$=d;C zB^t+^jHm9-NAuZ7Q9a_A*LMvXXd{-{@ae=)bnuR2vaI~G1aFyaXVMSER(?WrP?~=D zA<42A{6YR?d&6^SZGC%ZXr^G_t{*R@ULFjc6{1UHo0D>`_KF^-@tSlGz#MlkjWdU$ zdyVD>#K^+onSH(u0U6khS?pN3#1^JnJ9Yz~(Qw9pnr`2?t9^vW&1im_DQe%^=QtH} zt!0yuiNi$eP3|2J{h*!kRo*)7vPCrHH4Wj;h)R^#JOM}-n_qrI=$+ftxi_7EArL71 zeDu5z{msJe`MM#2LONDO$~UppYWc3uTSeQ<4AQj+>F>eNTU!Aryxd#eTfX4&>TpenbTv zlu)H7(+yL5szVYI#Ou1rVEXJB)$nOG&1-CBw6;`3*SF{&LJoz50rMWuzQNJpxz zQuw#&w9_u5nenCSv2nXC|FJqEos(x|t!P8yr?6~8y3Mr~)2r8d+xJPX(-2=VByOIw zwIx$IP$U^X!Ahm37OHk)_BKIJZR#fknsm55M$ZCb*+msNDTn|{BO;PdxEU8n67(@0 zOwcp354(wc&=3feA)D&;8+Lqqxzk?3B7c2PN;3C+HnUMbQv)nBvR-F8jcYC^k}TUa zg=^L>=kWz3_MTcA(ZW9O(9pq4O(HN|szu)tceYa)REdshGi-;1h%%vFyutlS#G$x- zCXr9R-F!G%m>MFVb}R+8u-t8Xw2jd}L_qix+V0N%;iHM$t-SOC%=on2HA#t>%g8y^ zK6ay&bz{S5bkY8>X?*796a7=E?nlS>x4GAGnR1btMl(+9Z-lT6M0=dZ={GQqiT8;r zohf7&=H6&;0f~0Vi7KaGe!CgsWFFW4`}4^1KB`>DN~ z#|9Glj52{7YV^WLrG@;0d=16EzDrkG-vo`anzqZZ2~W|ni;o)m+$K?Cr|~2 z+1Ce41{%hIYyd$4BXa@QMR+bSJ;`vSv-h+h@(&i*sZqPo?J7m2z(LCCBJ+sEf6asj z0_bjRurG}*_lSl*`muDxcF{E4WlmF$U4L=!QnZab*J}Z$oS7h}7Luzm7tpT&us{%) zM8NVg>r-Jj(rF-3&{I_!(j-!lDhW!K?46wSCnA6x?;lZYq{bWhFt1Y`B54cV@h8IIUO-N(hh~N7@9cQ z!;jpB*Ka>B&Q{Qo+T}nq*HM~1KYDfHBM?S$O6(s*n?f>Vb@>y~`={d-60DRet-Z5~ zKJ+gyFg8!jsn;+_U#V_ooMZV)BoJ)T8c!+PO-VYSY)HwnttcO3$Vp6l%Q2Qcm!wE3 zE#^utOKp^D?8A9diqLGUl9sK z-;n2xj2D#%ZF-boyMbl2rAbBdThdQf>k_P2x|*53u(~~|xo!$|ftQh0Q;$W~KV56P zJjcE5({Ov5ZtEF!i^o^Q<6Dh@0M>w;Gtq3FO*}DF#$=AqsBa|!Ih{D~(J)gkQJx0T zw!(A+3$@YgAvC`2rU<^bFFwgNsIhWu#nY*Ua5Cy~@}*V=-cxg6H{+J##@>qWxnrZ^ ze%(mcT)T`j3uwVb9Vercz{^ditKdvRNUMuS>>#LBbce&7I*swUIF2h(GtLU%p zFQgJLoct{r-%}c266=__mh8u+oiLW{oooTh;<30Dp#CHOq=rPdMYcshFsH>Y0Xs zRVr9bDeZM4;txa`A`J2T3%o;@t068huKKEWk?cyvAXnZkX8EB!-@%&7yOno7BR_+0 zsEFns55=!^?6NImcd3wENRtKL1=a=T1 zEMRBzC!wnqbzzTcjvT(XtxB!NGp8{(GBYvXXHJH7!kN-s(t6Ss(w1OdmG;ILtH_KO zjF+m+!HKDxefMm+FcIR}rDYohf&MFS>Sz8NnOZ_u8 zp+O5y(_sb@`4a`NU`Z|V7{)Qc;Nv1l=Rc>5*`+l?8Tv#@KeMGKl`yB4+H3uI&Q^`XacOP%~nQQKw* z$dg#I7s#(u>7CV9SMF}wpIefxJ14VzLf+`Oxhvd1e z!YlaAgr#_}LT#`dutMDj)X3)jYp-PoVl{a^jBM*uUi{Gft{Tai&h^~rBF5p}w4Dkv z>w|6|?c(ly+Pq8ejh=5k$4}t4aBok$Mz0?sCoS+z$1A15qh+QOwOZb0Ep>C>8`q+p zfzGPqUwf5%qmV2!F5%O|y03IA8ZGTHTZ^6Yweq@iSiydiD^49w^iCU7wwO|fiDY*3 zf$xakFX3ObxhCV*W{mtF98UG^1#MvS_VSLsXT2!BC#P2Gz8R(>jLgSBmd%=#F7)lZ z-l?vCu-<53W%AIH8Wn95T?s9GhgC0kP#Gy$&0P&-j!s*|uKHDPWPI+L7;Bnw4j3Yi zBJH>!eUpy0A)tF-$FWq-xx;F5?oAtR?e%J1lU;yCfZ~Sgb}UXMSS7EkHQIATVt7on zP&7fLH7c(2E&gGb>*?%w1;1-0D>}kCwFhKkx5T%^qyjs6>gGU;cJcO&;w(=Z?GG;p!~^e@xJv%H_|$ae;B zM}#qk-g$tQuB)6M%qXiUo9+!vE;rwPX{g( zQJc&3JrX;$Keb-RzvcmG-_9(SDLoxI7_%+H?ykQYv&3Qku!|071PN6@cSp)+88+gz8^*ly^Tr~v+c`Fa34e%Ub^?+u7OU@zsZzldPV|xIF?jmha zR`RYsKoc-QB7EL{Lb4};ydgj#4U~-s0iMqhosjJ}K!%*l|Cv$23T@@&YWEkud;H?| z|6)1hw+RF+xAC+l+)nU1TUl%C0}YVw9w=8AAOsA8z(G);DX+XI%E<-@5m$hVn(_g4 zJ+0i)kAMV(|4IEmXg&hD6Yeq4gh`473y2bFc1O(fdB6SiooH*aG)*lR}2OfBW&*Z19bU227$r|zxU4=3<4(< z=ASXb0ts9B&lm&>{nuQG@V{d)g79B+g~bR5;-C3o5b(crFsSfvYeu_Up`4KJKktn6 zQIC*>{{;%^xw;Z6eqL3=-I1D$tt+AYfAtj!2S8E`g0vMDhaiQaVh9MrR#ePN3}Fq1 mi9&@TVj@TzTWP@mmi%>qJkW$%{@iF73=RcwaVcpl1O5XqzMP@} literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Contact List/MakeVisibleIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Contact List/MakeVisibleIcon.imageset/Contents.json new file mode 100644 index 0000000000..97cc9be019 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Contact List/MakeVisibleIcon.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_showme.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Contact List/MakeVisibleIcon.imageset/ic_showme.pdf b/submodules/TelegramUI/Images.xcassets/Contact List/MakeVisibleIcon.imageset/ic_showme.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0c5a6e2133974427e947de70a8c8215173804043 GIT binary patch literal 4748 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 Fe*hY-?{feE literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Media Gallery/SoundOn.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Media Gallery/SoundOn.imageset/Contents.json new file mode 100644 index 0000000000..1d93d33a26 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Media Gallery/SoundOn.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "soundon (2).pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Media Gallery/SoundOn.imageset/soundon (2).pdf b/submodules/TelegramUI/Images.xcassets/Media Gallery/SoundOn.imageset/soundon (2).pdf new file mode 100644 index 0000000000000000000000000000000000000000..20236a226bca22ffe396422910dea8eff031865f GIT binary patch literal 4774 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 rU?^*dm@QPo8isn|g9rD)? deliverOnMainQueue).start(next: { [weak self] info in + if let strongSelf = self, let info = info { + let actionSheet = ActionSheetController(presentationData: strongSelf.presentationData) + var items: [ActionSheetItem] = [] + items.append(ActionSheetTextItem(title: info.title)) + if let url = info.url, let actionTitle = info.actionTitle { + items.append(ActionSheetButtonItem(title: actionTitle, color: .accent, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + if let strongSelf = self { + strongSelf.controllerInteraction?.openUrl(url, false, false, message) + } + })) + } + actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ + ActionSheetButtonItem(title: strongSelf.presentationData.strings.Common_Cancel, color: .accent, font: .bold, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + }) + ])]) + strongSelf.present(actionSheet, in: .window(.root)) + } + }) + strongSelf.chatDisplayNode.dismissInput() } } }, openCheckoutOrReceipt: { [weak self] messageId in diff --git a/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift b/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift index fdae414c0a..e9b15f43af 100644 --- a/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift +++ b/submodules/TelegramUI/TelegramUI/ChatControllerInteraction.swift @@ -42,6 +42,7 @@ public enum ChatControllerInteractionLongTapAction { case command(String) case hashtag(String) case timecode(Double, String) + case bankCard(String) } struct ChatInterfacePollActionState: Equatable { @@ -119,6 +120,7 @@ public final class ChatControllerInteraction { var stickerSettings: ChatInterfaceStickerSettings var searchTextHighightState: (String, [MessageIndex])? var seenOneTimeAnimatedMedia = Set() + var seenDicePointsValue = [MessageId: Int]() init(openMessage: @escaping (Message, ChatControllerInteractionOpenMessageMode) -> Bool, openPeer: @escaping (PeerId?, ChatControllerInteractionNavigateToPeer, Message?) -> Void, openPeerMention: @escaping (String) -> Void, openMessageContextMenu: @escaping (Message, Bool, ASDisplayNode, CGRect, TapLongTapOrDoubleTapGestureRecognizer?) -> Void, openMessageContextActions: @escaping (Message, ASDisplayNode, CGRect, ContextGesture?) -> Void, navigateToMessage: @escaping (MessageId, MessageId) -> Void, tapMessage: ((Message) -> Void)?, clickThroughMessage: @escaping () -> Void, toggleMessagesSelection: @escaping ([MessageId], Bool) -> Void, sendCurrentMessage: @escaping (Bool) -> Void, sendMessage: @escaping (String) -> Void, sendSticker: @escaping (FileMediaReference, Bool, ASDisplayNode, CGRect) -> Bool, sendGif: @escaping (FileMediaReference, ASDisplayNode, CGRect) -> Bool, requestMessageActionCallback: @escaping (MessageId, MemoryBuffer?, Bool) -> Void, requestMessageActionUrlAuth: @escaping (String, MessageId, Int32) -> Void, activateSwitchInline: @escaping (PeerId?, String) -> Void, openUrl: @escaping (String, Bool, Bool?, Message?) -> Void, shareCurrentLocation: @escaping () -> Void, shareAccountContact: @escaping () -> Void, sendBotCommand: @escaping (MessageId?, String) -> Void, openInstantPage: @escaping (Message, ChatMessageItemAssociatedData?) -> Void, openWallpaper: @escaping (Message) -> Void, openTheme: @escaping (Message) -> Void, openHashtag: @escaping (String?, String) -> Void, updateInputState: @escaping ((ChatTextInputState) -> ChatTextInputState) -> Void, updateInputMode: @escaping ((ChatInputMode) -> ChatInputMode) -> Void, openMessageShareMenu: @escaping (MessageId) -> Void, presentController: @escaping (ViewController, Any?) -> Void, navigationController: @escaping () -> NavigationController?, chatControllerNode: @escaping () -> ASDisplayNode?, reactionContainerNode: @escaping () -> ReactionSelectionParentNode?, presentGlobalOverlayController: @escaping (ViewController, Any?) -> Void, callPeer: @escaping (PeerId) -> Void, longTap: @escaping (ChatControllerInteractionLongTapAction, Message?) -> Void, openCheckoutOrReceipt: @escaping (MessageId) -> Void, openSearch: @escaping () -> Void, setupReply: @escaping (MessageId) -> Void, canSetupReply: @escaping (Message) -> Bool, navigateToFirstDateMessage: @escaping(Int32) ->Void, requestRedeliveryOfFailedMessages: @escaping (MessageId) -> Void, addContact: @escaping (String) -> Void, rateCall: @escaping (Message, CallId) -> Void, requestSelectMessagePollOptions: @escaping (MessageId, [Data]) -> Void, requestOpenMessagePollResults: @escaping (MessageId, MediaId) -> Void, openAppStorePage: @escaping () -> Void, displayMessageTooltip: @escaping (MessageId, String, ASDisplayNode?, CGRect?) -> Void, seekToTimecode: @escaping (Message, Double, Bool) -> Void, scheduleCurrentMessage: @escaping () -> Void, sendScheduledMessagesNow: @escaping ([MessageId]) -> Void, editScheduledMessagesTime: @escaping ([MessageId]) -> Void, performTextSelectionAction: @escaping (UInt32, String, TextSelectionAction) -> Void, updateMessageReaction: @escaping (MessageId, String?) -> Void, openMessageReactions: @escaping (MessageId) -> Void, displaySwipeToReplyHint: @escaping () -> Void, dismissReplyMarkupMessage: @escaping (Message) -> Void, openMessagePollResults: @escaping (MessageId, Data) -> Void, openPollCreation: @escaping (Bool?) -> Void, requestMessageUpdate: @escaping (MessageId) -> Void, cancelInteractiveKeyboardGestures: @escaping () -> Void, automaticMediaDownloadSettings: MediaAutoDownloadSettings, pollActionState: ChatInterfacePollActionState, stickerSettings: ChatInterfaceStickerSettings) { self.openMessage = openMessage diff --git a/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift b/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift index ab032691e6..6fb53ab372 100644 --- a/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift @@ -13,6 +13,7 @@ import AccountContext import TemporaryCachedPeerDataManager import ChatListSearchItemNode import Emoji +import AppBundle private class ChatHistoryListSelectionRecognizer: UIPanGestureRecognizer { private let selectionGestureActivationThreshold: CGFloat = 5.0 @@ -308,7 +309,7 @@ private final class ChatHistoryTransactionOpaqueState { } } -private func extractAssociatedData(chatLocation: ChatLocation, view: MessageHistoryView, automaticDownloadNetworkType: MediaAutoDownloadNetworkType, animatedEmojiStickers: [String: StickerPackItem], isScheduledMessages: Bool) -> ChatMessageItemAssociatedData { +private func extractAssociatedData(chatLocation: ChatLocation, view: MessageHistoryView, automaticDownloadNetworkType: MediaAutoDownloadNetworkType, animatedEmojiStickers: [String: [StickerPackItem]], isScheduledMessages: Bool) -> ChatMessageItemAssociatedData { var automaticMediaDownloadPeerType: MediaAutoDownloadPeerType = .channel var contactsPeerIds: Set = Set() if case let .peer(peerId) = chatLocation { @@ -605,19 +606,31 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { |> distinctUntilChanged let animatedEmojiStickers = loadedStickerPack(postbox: context.account.postbox, network: context.account.network, reference: .animatedEmoji, forceActualized: false) - |> map { result -> [String: StickerPackItem] in + |> map { result -> [String: [StickerPackItem]] in switch result { case let .result(_, items, _): - var animatedEmojiStickers: [String: StickerPackItem] = [:] + var animatedEmojiStickers: [String: [StickerPackItem]] = [:] for case let item as StickerPackItem in items { if let emoji = item.getStringRepresentationsOfIndexKeys().first { - animatedEmojiStickers[emoji.basicEmoji.0] = item + animatedEmojiStickers[emoji.basicEmoji.0] = [item] let strippedEmoji = emoji.basicEmoji.0.strippedEmoji if animatedEmojiStickers[strippedEmoji] == nil { - animatedEmojiStickers[strippedEmoji] = item + animatedEmojiStickers[strippedEmoji] = [item] } } } + + if let path = getAppBundle().path(forResource: "Dice_1", ofType: "tgs") { + var dices: [StickerPackItem] = [] + for i in 1...6 { + let path = path.replacingOccurrences(of: "_1", with: "_\(i)") + let id = arc4random64() + let resource = LocalFileReferenceMediaResource(localFilePath: path, randomId: id) + dices.append(StickerPackItem(index: ItemCollectionItemIndex(index: Int32(i), id: Int64(i)), file: TelegramMediaFile(fileId: MediaId(namespace: 10, id: Int64(i)), partialReference: nil, resource: resource, previewRepresentations: [], immediateThumbnailData: nil, mimeType: "application/x-tgsticker", size: nil, attributes: []), indexKeys: [])) + } + animatedEmojiStickers["🎲".strippedEmoji] = dices + } + return animatedEmojiStickers default: return [:] diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift index 0cbef84d24..0098397abf 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift @@ -255,9 +255,24 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { let (emoji, fitz) = item.message.text.basicEmoji if self.telegramFile == nil { - var emojiFile = item.associatedData.animatedEmojiStickers[emoji]?.file - if emojiFile == nil { - emojiFile = item.associatedData.animatedEmojiStickers[emoji.strippedEmoji]?.file + var emojiFile: TelegramMediaFile? + + if emoji == "🎲" { + var pointsValue: Int + if let value = item.controllerInteraction.seenDicePointsValue[item.message.id] { + pointsValue = value + } else { + pointsValue = Int(arc4random_uniform(6)) + item.controllerInteraction.seenDicePointsValue[item.message.id] = pointsValue + } + if let diceEmojis = item.associatedData.animatedEmojiStickers[emoji] { + emojiFile = diceEmojis[pointsValue].file + } + } else { + emojiFile = item.associatedData.animatedEmojiStickers[emoji]?.first?.file + if emojiFile == nil { + emojiFile = item.associatedData.animatedEmojiStickers[emoji.strippedEmoji]?.first?.file + } } if self.emojiFile?.id != emojiFile?.id { @@ -293,8 +308,12 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { } self.animationNode.visibility = isPlaying && !alreadySeen + if self.didSetUpAnimationNode && alreadySeen { - self.animationNode.seekToStart() + if let emojiFile = self.emojiFile, emojiFile.resource is LocalFileReferenceMediaResource { + } else { + self.animationNode.seekTo(.start) + } } if self.isPlaying && !self.didSetUpAnimationNode { @@ -313,7 +332,11 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { } else if let emojiFile = self.emojiFile { isEmoji = true file = emojiFile - playbackMode = .once + if alreadySeen && emojiFile.resource is LocalFileReferenceMediaResource { + playbackMode = .still(.end) + } else { + playbackMode = .once + } let (_, fitz) = item.message.text.basicEmoji if let fitz = fitz { fitzModifier = EmojiFitzModifier(emoji: fitz) @@ -323,7 +346,13 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { if let file = file { let dimensions = file.dimensions ?? PixelDimensions(width: 512, height: 512) let fittedSize = isEmoji ? dimensions.cgSize.aspectFilled(CGSize(width: 384.0, height: 384.0)) : dimensions.cgSize.aspectFitted(CGSize(width: 384.0, height: 384.0)) - self.animationNode.setup(source: AnimatedStickerResourceSource(account: item.context.account, resource: file.resource, fitzModifier: fitzModifier), width: Int(fittedSize.width), height: Int(fittedSize.height), playbackMode: playbackMode, mode: .cached) + let mode: AnimatedStickerMode + if file.resource is LocalFileReferenceMediaResource { + mode = .direct + } else { + mode = .cached + } + self.animationNode.setup(source: AnimatedStickerResourceSource(account: item.context.account, resource: file.resource, fitzModifier: fitzModifier), width: Int(fittedSize.width), height: Int(fittedSize.height), playbackMode: playbackMode, mode: mode) } } } @@ -870,34 +899,59 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { if self.telegramFile != nil { let _ = item.controllerInteraction.openMessage(item.message, .default) } else if let _ = self.emojiFile { - var startTime: Signal - if self.animationNode.playIfNeeded() { - startTime = .single(0.0) + let (emoji, fitz) = item.message.text.basicEmoji + if emoji == "🎲" { + if !self.animationNode.isPlaying { + var pointsValue = Int(arc4random_uniform(6)) + item.controllerInteraction.seenDicePointsValue[item.message.id] = pointsValue + item.controllerInteraction.seenOneTimeAnimatedMedia.remove(item.message.id) + + var emojiFile: TelegramMediaFile? + if let diceEmojis = item.associatedData.animatedEmojiStickers[emoji] { + emojiFile = diceEmojis[pointsValue].file + } + + self.emojiFile = emojiFile + if let emojiFile = emojiFile { + let dimensions = emojiFile.dimensions ?? PixelDimensions(width: 512, height: 512) + self.imageNode.setSignal(chatMessageAnimatedSticker(postbox: item.context.account.postbox, file: emojiFile, small: false, size: dimensions.cgSize.aspectFilled(CGSize(width: 384.0, height: 384.0)), fitzModifier: nil, thumbnail: false)) + self.disposable.set(freeMediaFileInteractiveFetched(account: item.context.account, fileReference: .standalone(media: emojiFile)).start()) + } + self.isPlaying = false + self.didSetUpAnimationNode = false + self.updateVisibility() + self.animationNode.playIfNeeded() + } } else { - startTime = self.animationNode.status + var startTime: Signal + if self.animationNode.playIfNeeded() { + startTime = .single(0.0) + } else { + startTime = self.animationNode.status |> map { $0.timestamp } |> take(1) |> deliverOnMainQueue - } - - if let text = self.item?.message.text, let firstScalar = text.unicodeScalars.first, firstScalar.value == 0x2764 { - let _ = startTime.start(next: { [weak self] time in - guard let strongSelf = self else { - return - } - - let heartbeatHaptic: ChatMessageHeartbeatHaptic - if let current = strongSelf.heartbeatHaptic { - heartbeatHaptic = current - } else { - heartbeatHaptic = ChatMessageHeartbeatHaptic() - heartbeatHaptic.enabled = true - strongSelf.heartbeatHaptic = heartbeatHaptic - } - if !heartbeatHaptic.active { - heartbeatHaptic.start(time: time) - } - }) + } + + if let text = self.item?.message.text, let firstScalar = text.unicodeScalars.first, firstScalar.value == 0x2764 { + let _ = startTime.start(next: { [weak self] time in + guard let strongSelf = self else { + return + } + + let heartbeatHaptic: ChatMessageHeartbeatHaptic + if let current = strongSelf.heartbeatHaptic { + heartbeatHaptic = current + } else { + heartbeatHaptic = ChatMessageHeartbeatHaptic() + heartbeatHaptic.enabled = true + strongSelf.heartbeatHaptic = heartbeatHaptic + } + if !heartbeatHaptic.active { + heartbeatHaptic.start(time: time) + } + }) + } } } return true diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageAttachedContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageAttachedContentNode.swift index 0e565d40fb..bfb409db6b 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageAttachedContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageAttachedContentNode.swift @@ -1019,7 +1019,8 @@ final class ChatMessageAttachedContentNode: ASDisplayNode { TelegramTextAttributes.PeerMention, TelegramTextAttributes.PeerTextMention, TelegramTextAttributes.BotCommand, - TelegramTextAttributes.Hashtag + TelegramTextAttributes.Hashtag, + TelegramTextAttributes.BankCard ] for name in possibleNames { if let _ = attributes[NSAttributedString.Key(rawValue: name)] { diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleContentNode.swift index 4c10c8609a..0e2b2d8b2f 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleContentNode.swift @@ -80,6 +80,7 @@ enum ChatMessageBubbleContentTapAction { case openMessage case timecode(Double, String) case tooltip(String, ASDisplayNode?, CGRect?) + case bankCard(String) case ignore } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift index a507081fd5..93f968a020 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageBubbleItemNode.swift @@ -355,7 +355,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode break case .ignore: return .fail - case .url, .peerMention, .textMention, .botCommand, .hashtag, .instantPage, .wallpaper, .theme, .call, .openMessage, .timecode, .tooltip: + case .url, .peerMention, .textMention, .botCommand, .hashtag, .instantPage, .wallpaper, .theme, .call, .openMessage, .timecode, .bankCard, .tooltip: return .waitForSingleTap } } @@ -2381,6 +2381,11 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode item.controllerInteraction.seekToTimecode(mediaMessage, timecode, forceOpen) } break loop + case let .bankCard(number): + foundTapAction = true + if let item = self.item { + item.controllerInteraction.longTap(.bankCard(number), item.message) + } case let .tooltip(text, node, rect): foundTapAction = true if let item = self.item { @@ -2447,6 +2452,9 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode item.controllerInteraction.longTap(.timecode(timecode, text), mediaMessage) } break loop + case let .bankCard(number): + foundTapAction = true + item.controllerInteraction.longTap(.bankCard(number), message) case .tooltip: break } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageItem.swift b/submodules/TelegramUI/TelegramUI/ChatMessageItem.swift index 26af9b2098..fe50b15654 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageItem.swift @@ -226,10 +226,10 @@ public final class ChatMessageItemAssociatedData: Equatable { let isRecentActions: Bool let isScheduledMessages: Bool let contactsPeerIds: Set - let animatedEmojiStickers: [String: StickerPackItem] + let animatedEmojiStickers: [String: [StickerPackItem]] let forcedResourceStatus: FileMediaResourceStatus? - init(automaticDownloadPeerType: MediaAutoDownloadPeerType, automaticDownloadNetworkType: MediaAutoDownloadNetworkType, isRecentActions: Bool = false, isScheduledMessages: Bool = false, contactsPeerIds: Set = Set(), animatedEmojiStickers: [String: StickerPackItem] = [:], forcedResourceStatus: FileMediaResourceStatus? = nil) { + init(automaticDownloadPeerType: MediaAutoDownloadPeerType, automaticDownloadNetworkType: MediaAutoDownloadNetworkType, isRecentActions: Bool = false, isScheduledMessages: Bool = false, contactsPeerIds: Set = Set(), animatedEmojiStickers: [String: [StickerPackItem]] = [:], forcedResourceStatus: FileMediaResourceStatus? = nil) { self.automaticDownloadPeerType = automaticDownloadPeerType self.automaticDownloadNetworkType = automaticDownloadNetworkType self.isRecentActions = isRecentActions diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift index 31b1d33df8..5df3808ac2 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageTextBubbleContentNode.swift @@ -428,6 +428,8 @@ class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode { return .hashtag(hashtag.peerName, hashtag.hashtag) } else if let timecode = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.Timecode)] as? TelegramTimecode { return .timecode(timecode.time, timecode.text) + } else if let bankCard = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.BankCard)] as? String { + return .bankCard(bankCard) } else { return .none } @@ -451,7 +453,8 @@ class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode { TelegramTextAttributes.PeerTextMention, TelegramTextAttributes.BotCommand, TelegramTextAttributes.Hashtag, - TelegramTextAttributes.Timecode + TelegramTextAttributes.Timecode, + TelegramTextAttributes.BankCard ] for name in possibleNames { if let _ = attributes[NSAttributedString.Key(rawValue: name)] { diff --git a/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift index cf5344ad57..b4de87c21a 100644 --- a/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift @@ -392,6 +392,8 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode { }) ])]) strongSelf.presentController(actionSheet, nil) + case .bankCard: + break } } }, openCheckoutOrReceipt: { _ in diff --git a/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift index 4b77d486aa..e69a824772 100644 --- a/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatScheduleTimeControllerNode.swift @@ -352,7 +352,7 @@ class ChatScheduleTimeControllerNode: ViewControllerTracingNode, UIScrollViewDel transition.updateFrame(node: self.doneButton, frame: CGRect(x: buttonInset, y: contentHeight - buttonHeight - insets.bottom - 10.0 - buttonOffset, width: contentFrame.width, height: buttonHeight)) let onlineSize = self.onlineButton.measure(CGSize(width: width, height: titleHeight)) - let onlineFrame = CGRect(origin: CGPoint(x: ceil((layout.size.width - onlineSize.width) / 2.0), y: contentHeight - 45.0 - insets.bottom), size: onlineSize) + let onlineFrame = CGRect(origin: CGPoint(x: ceil((contentFrame.width - onlineSize.width) / 2.0), y: contentHeight - 45.0 - insets.bottom), size: onlineSize) transition.updateFrame(node: self.onlineButton, frame: onlineFrame) self.pickerView?.frame = CGRect(origin: CGPoint(x: 0.0, y: 54.0), size: CGSize(width: contentFrame.width, height: pickerHeight)) diff --git a/submodules/TelegramUI/TelegramUI/GifPaneSearchContentNode.swift b/submodules/TelegramUI/TelegramUI/GifPaneSearchContentNode.swift index 48c50b6f43..606f2431d9 100644 --- a/submodules/TelegramUI/TelegramUI/GifPaneSearchContentNode.swift +++ b/submodules/TelegramUI/TelegramUI/GifPaneSearchContentNode.swift @@ -28,7 +28,7 @@ func paneGifSearchForQuery(account: Account, query: String, updateActivity: ((Bo } |> mapToSignal { peer -> Signal<(ChatPresentationInputQueryResult?) -> ChatPresentationInputQueryResult?, NoError> in if let user = peer as? TelegramUser, let botInfo = user.botInfo, let _ = botInfo.inlinePlaceholder { - let results = requestContextResults(account: account, botId: user.id, query: query, peerId: account.peerId, limit: 64) + let results = requestContextResults(account: account, botId: user.id, query: query, peerId: account.peerId, limit: 15) |> map { results -> (ChatPresentationInputQueryResult?) -> ChatPresentationInputQueryResult? in return { _ in return .contextRequestResult(user, results) diff --git a/submodules/TelegramUI/TelegramUI/ListMessageDateHeader.swift b/submodules/TelegramUI/TelegramUI/ListMessageDateHeader.swift index 5a3d511455..0e6f49d611 100644 --- a/submodules/TelegramUI/TelegramUI/ListMessageDateHeader.swift +++ b/submodules/TelegramUI/TelegramUI/ListMessageDateHeader.swift @@ -105,4 +105,3 @@ final class ListMessageDateHeaderNode: ListViewItemHeaderNode { self.backgroundNode.frame = CGRect(origin: CGPoint(), size: size) } } - diff --git a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping index 0e740b4a155b225542e28dac2235e57e003820bf..97d55f8f57a492fb7368c27f9abfc86eca4f5ac6 100644 GIT binary patch delta 43152 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 delta 42239 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 HIqd%fUw-+g diff --git a/submodules/TextFormat/Sources/StringWithAppliedEntities.swift b/submodules/TextFormat/Sources/StringWithAppliedEntities.swift index 615d605e19..e3cad1726e 100644 --- a/submodules/TextFormat/Sources/StringWithAppliedEntities.swift +++ b/submodules/TextFormat/Sources/StringWithAppliedEntities.swift @@ -209,6 +209,15 @@ public func stringWithAppliedEntities(_ text: String, entities: [MessageTextEnti string.insert(NSAttributedString(string: paragraphBreak), at: paragraphRange.upperBound) rangeOffset += paragraphBreak.count + case .BankCard: + string.addAttribute(NSAttributedString.Key.foregroundColor, value: linkColor, range: range) + if underlineLinks && underlineAllLinks { + string.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue as NSNumber, range: range) + } + if nsString == nil { + nsString = text as NSString + } + string.addAttribute(NSAttributedString.Key(rawValue: TelegramTextAttributes.BankCard), value: nsString!.substring(with: range), range: range) case let .Custom(type): if type == ApplicationSpecificEntityType.Timecode { string.addAttribute(NSAttributedString.Key.foregroundColor, value: linkColor, range: range) diff --git a/submodules/TextFormat/Sources/TelegramAttributes.swift b/submodules/TextFormat/Sources/TelegramAttributes.swift index b05f982d82..ab276a41e3 100644 --- a/submodules/TextFormat/Sources/TelegramAttributes.swift +++ b/submodules/TextFormat/Sources/TelegramAttributes.swift @@ -37,6 +37,7 @@ public struct TelegramTextAttributes { public static let PeerTextMention = "TelegramPeerTextMention" public static let BotCommand = "TelegramBotCommand" public static let Hashtag = "TelegramHashtag" + public static let BankCard = "TelegramBankCard" public static let Timecode = "TelegramTimecode" public static let BlockQuote = "TelegramBlockQuote" } diff --git a/submodules/UrlHandling/Sources/UrlHandling.swift b/submodules/UrlHandling/Sources/UrlHandling.swift index bd53d7861c..051053b059 100644 --- a/submodules/UrlHandling/Sources/UrlHandling.swift +++ b/submodules/UrlHandling/Sources/UrlHandling.swift @@ -14,6 +14,8 @@ import TelegramUIPreferences import AccountContext import WalletUrl +private let baseTelegramMePaths = ["telegram.me", "t.me", "telegram.dog"] + public enum ParsedInternalPeerUrlParameter { case botStart(String) case groupBotStart(String) @@ -346,7 +348,6 @@ private func resolveInternalUrl(account: Account, url: ParsedInternalUrl) -> Sig public func isTelegramMeLink(_ url: String) -> Bool { let schemes = ["http://", "https://", ""] - let baseTelegramMePaths = ["telegram.me", "t.me"] for basePath in baseTelegramMePaths { for scheme in schemes { let basePrefix = scheme + basePath + "/" @@ -360,7 +361,6 @@ public func isTelegramMeLink(_ url: String) -> Bool { public func parseProxyUrl(_ url: String) -> (host: String, port: Int32, username: String?, password: String?, secret: Data?)? { let schemes = ["http://", "https://", ""] - let baseTelegramMePaths = ["telegram.me", "t.me"] for basePath in baseTelegramMePaths { for scheme in schemes { let basePrefix = scheme + basePath + "/" @@ -382,7 +382,6 @@ public func parseProxyUrl(_ url: String) -> (host: String, port: Int32, username public func parseStickerPackUrl(_ url: String) -> String? { let schemes = ["http://", "https://", ""] - let baseTelegramMePaths = ["telegram.me", "t.me"] for basePath in baseTelegramMePaths { for scheme in schemes { let basePrefix = scheme + basePath + "/" @@ -404,7 +403,6 @@ public func parseStickerPackUrl(_ url: String) -> String? { public func parseWallpaperUrl(_ url: String) -> WallpaperUrlParameter? { let schemes = ["http://", "https://", ""] - let baseTelegramMePaths = ["telegram.me", "t.me"] for basePath in baseTelegramMePaths { for scheme in schemes { let basePrefix = scheme + basePath + "/" @@ -431,7 +429,6 @@ public func resolveUrlImpl(account: Account, url: String) -> Signal() private let centralItemTitleView = Promise() private let centralItemNavigationStyle = Promise() - private let centralItemFooterContentNode = Promise() + private let centralItemFooterContentNode = Promise<(GalleryFooterContentNode?, GalleryOverlayContentNode?)>() private let centralItemAttributesDisposable = DisposableSet(); private let checkedDisposable = MetaDisposable() @@ -156,7 +156,7 @@ class WebSearchGalleryController: ViewController { self?.navigationItem.titleView = titleView })) - self.centralItemAttributesDisposable.add(self.centralItemFooterContentNode.get().start(next: { [weak self] footerContentNode in + self.centralItemAttributesDisposable.add(self.centralItemFooterContentNode.get().start(next: { [weak self] footerContentNode, _ in self?.galleryNode.updatePresentationState({ $0.withUpdatedFooterContentNode(footerContentNode) }, transition: .immediate) diff --git a/submodules/WebSearchUI/Sources/WebSearchVideoGalleryItem.swift b/submodules/WebSearchUI/Sources/WebSearchVideoGalleryItem.swift index 498a758306..1f69d4ec7a 100644 --- a/submodules/WebSearchUI/Sources/WebSearchVideoGalleryItem.swift +++ b/submodules/WebSearchUI/Sources/WebSearchVideoGalleryItem.swift @@ -534,7 +534,7 @@ final class WebSearchVideoGalleryItemNode: ZoomableContentGalleryItemNode { } } - override func footerContent() -> Signal { - return .single(self.footerContentNode) + override func footerContent() -> Signal<(GalleryFooterContentNode?, GalleryOverlayContentNode?), NoError> { + return .single((self.footerContentNode, nil)) } } diff --git a/submodules/ffmpeg/gas-preprocessor.pl b/submodules/ffmpeg/gas-preprocessor.pl new file mode 100755 index 0000000000..6da37c1f0d --- /dev/null +++ b/submodules/ffmpeg/gas-preprocessor.pl @@ -0,0 +1,1210 @@ +#!/usr/bin/env perl +# by David Conrad +# This code is licensed under GPLv2 or later; go to gnu.org to read it +# (not that it much matters for an asm preprocessor) +# usage: set your assembler to be something like "perl gas-preprocessor.pl gcc" +use strict; + +# Apple's gas is ancient and doesn't support modern preprocessing features like +# .rept and has ugly macro syntax, among other things. Thus, this script +# implements the subset of the gas preprocessor used by x264 and ffmpeg +# that isn't supported by Apple's gas. + +my %canonical_arch = ("aarch64" => "aarch64", "arm64" => "aarch64", + "arm" => "arm", + "powerpc" => "powerpc", "ppc" => "powerpc"); + +my %comments = ("aarch64" => '//', + "arm" => '@', + "powerpc" => '#'); + +my @gcc_cmd; +my @preprocess_c_cmd; + +my $comm; +my $arch; +my $as_type = "apple-gas"; + +my $fix_unreq = $^O eq "darwin"; +my $force_thumb = 0; +my $verbose = 0; + +my $arm_cond_codes = "eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo"; + +my $usage_str = " +$0\n +Gas-preprocessor.pl converts assembler files using modern GNU as syntax for +Apple's ancient gas version or clang's incompatible integrated assembler. The +conversion is regularly tested for Libav, x264 and vlc. Other projects might +use different features which are not correctly handled. + +Options for this program needs to be separated with ' -- ' from the assembler +command. Following options are currently supported: + + -help - this usage text + -arch - target architecture + -as-type - one value out of {{,apple-}{gas,clang},armasm} + -fix-unreq + -no-fix-unreq + -force-thumb - assemble as thumb regardless of the input source + (note, this is incomplete and only works for sources + it explicitly was tested with) + -verbose - print executed commands +"; + +sub usage() { + print $usage_str; +} + +while (@ARGV) { + my $opt = shift; + + if ($opt =~ /^-(no-)?fix-unreq$/) { + $fix_unreq = $1 ne "no-"; + } elsif ($opt eq "-force-thumb") { + $force_thumb = 1; + } elsif ($opt eq "-verbose") { + $verbose = 1; + } elsif ($opt eq "-arch") { + $arch = shift; + die "unknown arch: '$arch'\n" if not exists $canonical_arch{$arch}; + } elsif ($opt eq "-as-type") { + $as_type = shift; + die "unknown as type: '$as_type'\n" if $as_type !~ /^((apple-)?(gas|clang)|armasm)$/; + } elsif ($opt eq "-help") { + usage(); + exit 0; + } elsif ($opt eq "--" ) { + @gcc_cmd = @ARGV; + } elsif ($opt =~ /^-/) { + die "option '$opt' is not known. See '$0 -help' for usage information\n"; + } else { + push @gcc_cmd, $opt, @ARGV; + } + last if (@gcc_cmd); +} + +if (grep /\.c$/, @gcc_cmd) { + # C file (inline asm?) - compile + @preprocess_c_cmd = (@gcc_cmd, "-S"); +} elsif (grep /\.[sS]$/, @gcc_cmd) { + # asm file, just do C preprocessor + @preprocess_c_cmd = (@gcc_cmd, "-E"); +} elsif (grep /-(v|h|-version|dumpversion)/, @gcc_cmd) { + # pass -v/--version along, used during probing. Matching '-v' might have + # uninteded results but it doesn't matter much if gas-preprocessor or + # the compiler fails. + print STDERR join(" ", @gcc_cmd)."\n" if $verbose; + exec(@gcc_cmd); +} else { + die "Unrecognized input filetype"; +} +if ($as_type eq "armasm") { + + $preprocess_c_cmd[0] = "cpp"; + push(@preprocess_c_cmd, "-undef"); + # Normally a preprocessor for windows would predefine _WIN32, + # but we're using any generic system-agnostic preprocessor "cpp" + # with -undef (to avoid getting predefined variables from the host + # system in cross compilation cases), so manually define it here. + push(@preprocess_c_cmd, "-D_WIN32"); + + @preprocess_c_cmd = grep ! /^-nologo$/, @preprocess_c_cmd; + # Remove -ignore XX parameter pairs from preprocess_c_cmd + my $index = 1; + while ($index < $#preprocess_c_cmd) { + if ($preprocess_c_cmd[$index] eq "-ignore" and $index + 1 < $#preprocess_c_cmd) { + splice(@preprocess_c_cmd, $index, 2); + next; + } + $index++; + } + if (grep /^-MM$/, @preprocess_c_cmd) { + print STDERR join(" ", @preprocess_c_cmd)."\n" if $verbose; + system(@preprocess_c_cmd) == 0 or die "Error running preprocessor"; + exit 0; + } +} + +# if compiling, avoid creating an output file named '-.o' +if ((grep /^-c$/, @gcc_cmd) && !(grep /^-o/, @gcc_cmd)) { + foreach my $i (@gcc_cmd) { + if ($i =~ /\.[csS]$/) { + my $outputfile = $i; + $outputfile =~ s/\.[csS]$/.o/; + push(@gcc_cmd, "-o"); + push(@gcc_cmd, $outputfile); + last; + } + } +} +# replace only the '-o' argument with '-', avoids rewriting the make dependency +# target specified with -MT to '-' +my $index = 1; +while ($index < $#preprocess_c_cmd) { + if ($preprocess_c_cmd[$index] eq "-o") { + $index++; + $preprocess_c_cmd[$index] = "-"; + } + $index++; +} + +my $tempfile; +if ($as_type ne "armasm") { + @gcc_cmd = map { /\.[csS]$/ ? qw(-x assembler -) : $_ } @gcc_cmd; +} else { + @preprocess_c_cmd = grep ! /^-c$/, @preprocess_c_cmd; + @preprocess_c_cmd = grep ! /^-m/, @preprocess_c_cmd; + + @preprocess_c_cmd = grep ! /^-G/, @preprocess_c_cmd; + @preprocess_c_cmd = grep ! /^-W/, @preprocess_c_cmd; + @preprocess_c_cmd = grep ! /^-Z/, @preprocess_c_cmd; + @preprocess_c_cmd = grep ! /^-fp/, @preprocess_c_cmd; + @preprocess_c_cmd = grep ! /^-EHsc$/, @preprocess_c_cmd; + @preprocess_c_cmd = grep ! /^-O/, @preprocess_c_cmd; + + @gcc_cmd = grep ! /^-G/, @gcc_cmd; + @gcc_cmd = grep ! /^-W/, @gcc_cmd; + @gcc_cmd = grep ! /^-Z/, @gcc_cmd; + @gcc_cmd = grep ! /^-fp/, @gcc_cmd; + @gcc_cmd = grep ! /^-EHsc$/, @gcc_cmd; + @gcc_cmd = grep ! /^-O/, @gcc_cmd; + + my @outfiles = grep /\.(o|obj)$/, @gcc_cmd; + $tempfile = $outfiles[0].".asm"; + + # Remove most parameters from gcc_cmd, which actually is the armasm command, + # which doesn't support any of the common compiler/preprocessor options. + @gcc_cmd = grep ! /^-D/, @gcc_cmd; + @gcc_cmd = grep ! /^-U/, @gcc_cmd; + @gcc_cmd = grep ! /^-m/, @gcc_cmd; + @gcc_cmd = grep ! /^-M/, @gcc_cmd; + @gcc_cmd = grep ! /^-c$/, @gcc_cmd; + @gcc_cmd = grep ! /^-I/, @gcc_cmd; + @gcc_cmd = map { /\.S$/ ? $tempfile : $_ } @gcc_cmd; +} + +# detect architecture from gcc binary name +if (!$arch) { + if ($gcc_cmd[0] =~ /(arm64|aarch64|arm|powerpc|ppc)/) { + $arch = $1; + } else { + # look for -arch flag + foreach my $i (1 .. $#gcc_cmd-1) { + if ($gcc_cmd[$i] eq "-arch" and + $gcc_cmd[$i+1] =~ /(arm64|aarch64|arm|powerpc|ppc)/) { + $arch = $1; + } + } + } +} + +# assume we're not cross-compiling if no -arch or the binary doesn't have the arch name +$arch = qx/arch/ if (!$arch); + +die "Unknown target architecture '$arch'" if not exists $canonical_arch{$arch}; + +$arch = $canonical_arch{$arch}; +$comm = $comments{$arch}; +my $inputcomm = $comm; +$comm = ";" if $as_type =~ /armasm/; + +my %ppc_spr = (ctr => 9, + vrsave => 256); + +print STDERR join(" ", @preprocess_c_cmd)."\n" if $verbose; +open(INPUT, "-|", @preprocess_c_cmd) || die "Error running preprocessor"; + +if ($ENV{GASPP_DEBUG}) { + open(ASMFILE, ">&STDOUT"); +} else { + if ($as_type ne "armasm") { + print STDERR join(" ", @gcc_cmd)."\n" if $verbose; + open(ASMFILE, "|-", @gcc_cmd) or die "Error running assembler"; + } else { + open(ASMFILE, ">", $tempfile); + } +} + +my $current_macro = ''; +my $macro_level = 0; +my $rept_level = 0; +my %macro_lines; +my %macro_args; +my %macro_args_default; +my $macro_count = 0; +my $altmacro = 0; +my $in_irp = 0; + +my $num_repts; +my @rept_lines; + +my @irp_args; +my $irp_param; + +my @ifstack; + +my %symbols; + +my @sections; + +my %literal_labels; # for ldr , = +my $literal_num = 0; +my $literal_expr = ".word"; +$literal_expr = ".quad" if $arch eq "aarch64"; + +my $thumb = 0; + +my %thumb_labels; +my %call_targets; +my %import_symbols; + +my %neon_alias_reg; +my %neon_alias_type; + +my $temp_label_next = 0; +my %last_temp_labels; +my %next_temp_labels; + +my %labels_seen; + +my %aarch64_req_alias; + +if ($force_thumb) { + parse_line(".thumb\n"); +} + +# pass 1: parse .macro +# note that the handling of arguments is probably overly permissive vs. gas +# but it should be the same for valid cases +while () { + # remove lines starting with '#', preprocessing is done, '#' at start of + # the line indicates a comment for all supported archs (aarch64, arm, ppc + # and x86). Also strips line number comments but since they are off anyway + # it is no loss. + s/^\s*#.*$//; + # remove all comments (to avoid interfering with evaluating directives) + s/(? 0) { + $ifstack[-1] = -$ifstack[-1]; + } + return 1; + } elsif ($line =~ /\.else/) { + $ifstack[-1] = !$ifstack[-1]; + return 1; + } elsif (handle_if($line)) { + return 1; + } + } + + # discard lines in false .if blocks + foreach my $i (0 .. $#ifstack) { + if ($ifstack[$i] <= 0) { + return 1; + } + } + } + return 0; +} + +sub parse_line { + my $line = $_[0]; + + return if (parse_if_line($line)); + + if (scalar(@rept_lines) == 0) { + if ($line =~ /\.macro/) { + $macro_level++; + if ($macro_level > 1 && !$current_macro) { + die "nested macros but we don't have master macro"; + } + } elsif ($line =~ /\.endm/) { + $macro_level--; + if ($macro_level < 0) { + die "unmatched .endm"; + } elsif ($macro_level == 0) { + $current_macro = ''; + return; + } + } + } + + if ($macro_level == 0) { + if ($line =~ /\.(rept|irp)/) { + $rept_level++; + } elsif ($line =~ /.endr/) { + $rept_level--; + } + } + + if ($macro_level > 1) { + push(@{$macro_lines{$current_macro}}, $line); + } elsif (scalar(@rept_lines) and $rept_level >= 1) { + push(@rept_lines, $line); + } elsif ($macro_level == 0) { + expand_macros($line); + } else { + if ($line =~ /\.macro\s+([\d\w\.]+)\s*,?\s*(.*)/) { + $current_macro = $1; + + # commas in the argument list are optional, so only use whitespace as the separator + my $arglist = $2; + $arglist =~ s/,/ /g; + + my @args = split(/\s+/, $arglist); + foreach my $i (0 .. $#args) { + my @argpair = split(/=/, $args[$i]); + $macro_args{$current_macro}[$i] = $argpair[0]; + $argpair[0] =~ s/:vararg$//; + $macro_args_default{$current_macro}{$argpair[0]} = $argpair[1]; + } + # ensure %macro_lines has the macro name added as a key + $macro_lines{$current_macro} = []; + + } elsif ($current_macro) { + push(@{$macro_lines{$current_macro}}, $line); + } else { + die "macro level without a macro name"; + } + } +} + +sub handle_set { + my $line = $_[0]; + if ($line =~ /\.(?:set|equ)\s+(\S*)\s*,\s*(.*)/) { + $symbols{$1} = eval_expr($2); + return 1; + } + return 0; +} + +sub expand_macros { + my $line = $_[0]; + + # handle .if directives; apple's assembler doesn't support important non-basic ones + # evaluating them is also needed to handle recursive macros + if (handle_if($line)) { + return; + } + + if (/\.purgem\s+([\d\w\.]+)/) { + delete $macro_lines{$1}; + delete $macro_args{$1}; + delete $macro_args_default{$1}; + return; + } + + if ($line =~ /\.altmacro/) { + $altmacro = 1; + return; + } + + if ($line =~ /\.noaltmacro/) { + $altmacro = 0; + return; + } + + $line =~ s/\%([^,]*)/eval_expr($1)/eg if $altmacro; + + # Strip out the .set lines from the armasm output + return if (handle_set($line) and $as_type eq "armasm"); + + if ($line =~ /\.rept\s+(.*)/) { + $num_repts = $1; + @rept_lines = ("\n"); + + # handle the possibility of repeating another directive on the same line + # .endr on the same line is not valid, I don't know if a non-directive is + if ($num_repts =~ s/(\.\w+.*)//) { + push(@rept_lines, "$1\n"); + } + $num_repts = eval_expr($num_repts); + } elsif ($line =~ /\.irp\s+([\d\w\.]+)\s*(.*)/) { + $in_irp = 1; + $num_repts = 1; + @rept_lines = ("\n"); + $irp_param = $1; + + # only use whitespace as the separator + my $irp_arglist = $2; + $irp_arglist =~ s/,/ /g; + $irp_arglist =~ s/^\s+//; + @irp_args = split(/\s+/, $irp_arglist); + } elsif ($line =~ /\.irpc\s+([\d\w\.]+)\s*(.*)/) { + $in_irp = 1; + $num_repts = 1; + @rept_lines = ("\n"); + $irp_param = $1; + + my $irp_arglist = $2; + $irp_arglist =~ s/,/ /g; + $irp_arglist =~ s/^\s+//; + @irp_args = split(//, $irp_arglist); + } elsif ($line =~ /\.endr/) { + my @prev_rept_lines = @rept_lines; + my $prev_in_irp = $in_irp; + my @prev_irp_args = @irp_args; + my $prev_irp_param = $irp_param; + my $prev_num_repts = $num_repts; + @rept_lines = (); + $in_irp = 0; + @irp_args = ''; + + if ($prev_in_irp != 0) { + foreach my $i (@prev_irp_args) { + foreach my $origline (@prev_rept_lines) { + my $line = $origline; + $line =~ s/\\$prev_irp_param/$i/g; + $line =~ s/\\\(\)//g; # remove \() + parse_line($line); + } + } + } else { + for (1 .. $prev_num_repts) { + foreach my $origline (@prev_rept_lines) { + my $line = $origline; + parse_line($line); + } + } + } + } elsif ($line =~ /(\S+:|)\s*([\w\d\.]+)\s*(.*)/ && exists $macro_lines{$2}) { + handle_serialized_line($1); + my $macro = $2; + + # commas are optional here too, but are syntactically important because + # parameters can be blank + my @arglist = split(/,/, $3); + my @args; + my @args_seperator; + + my $comma_sep_required = 0; + foreach (@arglist) { + # allow arithmetic/shift operators in macro arguments + $_ =~ s/\s*(\+|-|\*|\/|<<|>>|<|>)\s*/$1/g; + + my @whitespace_split = split(/\s+/, $_); + if (!@whitespace_split) { + push(@args, ''); + push(@args_seperator, ''); + } else { + foreach (@whitespace_split) { + #print ("arglist = \"$_\"\n"); + if (length($_)) { + push(@args, $_); + my $sep = $comma_sep_required ? "," : " "; + push(@args_seperator, $sep); + #print ("sep = \"$sep\", arg = \"$_\"\n"); + $comma_sep_required = 0; + } + } + } + + $comma_sep_required = 1; + } + + my %replacements; + if ($macro_args_default{$macro}){ + %replacements = %{$macro_args_default{$macro}}; + } + + # construct hashtable of text to replace + foreach my $i (0 .. $#args) { + my $argname = $macro_args{$macro}[$i]; + my @macro_args = @{ $macro_args{$macro} }; + if ($args[$i] =~ m/=/) { + # arg=val references the argument name + # XXX: I'm not sure what the expected behaviour if a lot of + # these are mixed with unnamed args + my @named_arg = split(/=/, $args[$i]); + $replacements{$named_arg[0]} = $named_arg[1]; + } elsif ($i > $#{$macro_args{$macro}}) { + # more args given than the macro has named args + # XXX: is vararg allowed on arguments before the last? + $argname = $macro_args{$macro}[-1]; + if ($argname =~ s/:vararg$//) { + #print "macro = $macro, args[$i] = $args[$i], args_seperator=@args_seperator, argname = $argname, arglist[$i] = $arglist[$i], arglist = @arglist, args=@args, macro_args=@macro_args\n"; + #$replacements{$argname} .= ", $args[$i]"; + $replacements{$argname} .= "$args_seperator[$i] $args[$i]"; + } else { + die "Too many arguments to macro $macro"; + } + } else { + $argname =~ s/:vararg$//; + $replacements{$argname} = $args[$i]; + } + } + + my $count = $macro_count++; + + # apply replacements as regex + foreach (@{$macro_lines{$macro}}) { + my $macro_line = $_; + # do replacements by longest first, this avoids wrong replacement + # when argument names are subsets of each other + foreach (reverse sort {length $a <=> length $b} keys %replacements) { + $macro_line =~ s/\\$_/$replacements{$_}/g; + } + if ($altmacro) { + foreach (reverse sort {length $a <=> length $b} keys %replacements) { + $macro_line =~ s/\b$_\b/$replacements{$_}/g; + } + } + $macro_line =~ s/\\\@/$count/g; + $macro_line =~ s/\\\(\)//g; # remove \() + parse_line($macro_line); + } + } else { + handle_serialized_line($line); + } +} + +sub is_arm_register { + my $name = $_[0]; + if ($name eq "lr" or + $name eq "ip" or + $name =~ /^[rav]\d+$/) { + return 1; + } + return 0; +} + +sub is_aarch64_register { + my $name = $_[0]; + if ($name =~ /^[xw]\d+$/) { + return 1; + } + return 0; +} + +sub handle_local_label { + my $line = $_[0]; + my $num = $_[1]; + my $dir = $_[2]; + my $target = "$num$dir"; + if ($dir eq "b") { + $line =~ s/\b$target\b/$last_temp_labels{$num}/g; + } else { + my $name = "temp_label_$temp_label_next"; + $temp_label_next++; + push(@{$next_temp_labels{$num}}, $name); + $line =~ s/\b$target\b/$name/g; + } + return $line; +} + +sub handle_serialized_line { + my $line = $_[0]; + + # handle .previous (only with regard to .section not .subsection) + if ($line =~ /\.(section|text|const_data)/) { + push(@sections, $line); + } elsif ($line =~ /\.previous/) { + if (!$sections[-2]) { + die ".previous without a previous section"; + } + $line = $sections[-2]; + push(@sections, $line); + } + + $thumb = 1 if $line =~ /\.code\s+16|\.thumb/; + $thumb = 0 if $line =~ /\.code\s+32|\.arm/; + + # handle ldr , = + if ($line =~ /(.*)\s*ldr([\w\s\d]+)\s*,\s*=(.*)/ and $as_type ne "armasm") { + my $label = $literal_labels{$3}; + if (!$label) { + $label = "Literal_$literal_num"; + $literal_num++; + $literal_labels{$3} = $label; + } + $line = "$1 ldr$2, $label\n"; + } elsif ($line =~ /\.ltorg/ and $as_type ne "armasm") { + $line .= ".align 2\n"; + foreach my $literal (keys %literal_labels) { + $line .= "$literal_labels{$literal}:\n $literal_expr $literal\n"; + } + %literal_labels = (); + } + + # handle GNU as pc-relative relocations for adrp/add + if ($line =~ /(.*)\s*adrp([\w\s\d]+)\s*,\s*#?:pg_hi21:([^\s]+)/ and $as_type =~ /^apple-/) { + $line = "$1 adrp$2, ${3}\@PAGE\n"; + } elsif ($line =~ /(.*)\s*add([\w\s\d]+)\s*,([\w\s\d]+)\s*,\s*#?:lo12:([^\s]+)/ and $as_type =~ /^apple-/) { + $line = "$1 add$2, $3, ${4}\@PAGEOFF\n"; + } + + # thumb add with large immediate needs explicit add.w + if ($thumb and $line =~ /add\s+.*#([^@]+)/) { + $line =~ s/add/add.w/ if eval_expr($1) > 255; + } + + # mach-o local symbol names start with L (no dot) + $line =~ s/(? with ic as conditional code + if ($cond =~ /^(|$arm_cond_codes)$/) { + if (exists $thumb_labels{$label}) { + print ASMFILE ".thumb_func $label\n"; + } else { + $call_targets{$label}++; + } + } + } + + # @l -> lo16() @ha -> ha16() + $line =~ s/,\s+([^,]+)\@l\b/, lo16($1)/g; + $line =~ s/,\s+([^,]+)\@ha\b/, ha16($1)/g; + + # move to/from SPR + if ($line =~ /(\s+)(m[ft])([a-z]+)\s+(\w+)/ and exists $ppc_spr{$3}) { + if ($2 eq 'mt') { + $line = "$1${2}spr $ppc_spr{$3}, $4\n"; + } else { + $line = "$1${2}spr $4, $ppc_spr{$3}\n"; + } + } + + if ($line =~ /\.unreq\s+(.*)/) { + if (defined $neon_alias_reg{$1}) { + delete $neon_alias_reg{$1}; + delete $neon_alias_type{$1}; + return; + } elsif (defined $aarch64_req_alias{$1}) { + delete $aarch64_req_alias{$1}; + return; + } + } + # old gas versions store upper and lower case names on .req, + # but they remove only one on .unreq + if ($fix_unreq) { + if ($line =~ /\.unreq\s+(.*)/) { + $line = ".unreq " . lc($1) . "\n"; + $line .= ".unreq " . uc($1) . "\n"; + } + } + + if ($line =~ /(\w+)\s+\.(dn|qn)\s+(\w+)(?:\.(\w+))?(\[\d+\])?/) { + $neon_alias_reg{$1} = "$3$5"; + $neon_alias_type{$1} = $4; + return; + } + if (scalar keys %neon_alias_reg > 0 && $line =~ /^\s+v\w+/) { + # This line seems to possibly have a neon instruction + foreach (keys %neon_alias_reg) { + my $alias = $_; + # Require the register alias to match as an invididual word, not as a substring + # of a larger word-token. + if ($line =~ /\b$alias\b/) { + $line =~ s/\b$alias\b/$neon_alias_reg{$alias}/g; + # Add the type suffix. If multiple aliases match on the same line, + # only do this replacement the first time (a vfoo.bar string won't match v\w+). + $line =~ s/^(\s+)(v\w+)(\s+)/$1$2.$neon_alias_type{$alias}$3/; + } + } + } + + if ($arch eq "aarch64" or $as_type eq "armasm") { + # clang's integrated aarch64 assembler in Xcode 5 does not support .req/.unreq + if ($line =~ /\b(\w+)\s+\.req\s+(\w+)\b/) { + $aarch64_req_alias{$1} = $2; + return; + } + foreach (keys %aarch64_req_alias) { + my $alias = $_; + # recursively resolve aliases + my $resolved = $aarch64_req_alias{$alias}; + while (defined $aarch64_req_alias{$resolved}) { + $resolved = $aarch64_req_alias{$resolved}; + } + $line =~ s/\b$alias\b/$resolved/g; + } + } + if ($arch eq "aarch64") { + # fix missing aarch64 instructions in Xcode 5.1 (beta3) + # mov with vector arguments is not supported, use alias orr instead + if ($line =~ /^(\d+:)?\s*mov\s+(v\d[\.{}\[\]\w]+),\s*(v\d[\.{}\[\]\w]+)\b\s*$/) { + $line = "$1 orr $2, $3, $3\n"; + } + # movi 16, 32 bit shifted variant, shift is optional + if ($line =~ /^(\d+:)?\s*movi\s+(v[0-3]?\d\.(?:2|4|8)[hsHS])\s*,\s*(#\w+)\b\s*$/) { + $line = "$1 movi $2, $3, lsl #0\n"; + } + # Xcode 5 misses the alias uxtl. Replace it with the more general ushll. + # Clang 3.4 misses the alias sxtl too. Replace it with the more general sshll. + # armasm64 also misses these instructions. + if ($line =~ /^(\d+:)?\s*(s|u)xtl(2)?\s+(v[0-3]?\d\.[248][hsdHSD])\s*,\s*(v[0-3]?\d\.(?:2|4|8|16)[bhsBHS])\b\s*$/) { + $line = "$1 $2shll$3 $4, $5, #0\n"; + } + # clang 3.4 and armasm64 do not automatically use shifted immediates in add/sub + if (($as_type eq "clang" or $as_type eq "armasm") and + $line =~ /^(\d+:)?(\s*(?:add|sub)s?) ([^#l]+)#([\d\+\-\*\/ <>]+)\s*$/) { + my $imm = eval $4; + if ($imm > 4095 and not ($imm & 4095)) { + $line = "$1 $2 $3#" . ($imm >> 12) . ", lsl #12\n"; + } + } + if ($ENV{GASPP_FIX_XCODE5}) { + if ($line =~ /^\s*bsl\b/) { + $line =~ s/\b(bsl)(\s+v[0-3]?\d\.(\w+))\b/$1.$3$2/; + $line =~ s/\b(v[0-3]?\d)\.$3\b/$1/g; + } + if ($line =~ /^\s*saddl2?\b/) { + $line =~ s/\b(saddl2?)(\s+v[0-3]?\d\.(\w+))\b/$1.$3$2/; + $line =~ s/\b(v[0-3]?\d)\.\w+\b/$1/g; + } + if ($line =~ /^\s*dup\b.*\]$/) { + $line =~ s/\bdup(\s+v[0-3]?\d)\.(\w+)\b/dup.$2$1/g; + $line =~ s/\b(v[0-3]?\d)\.[bhsdBHSD](\[\d\])$/$1$2/g; + } + } + } + + if ($as_type eq "armasm") { + # Also replace variables set by .set + foreach (keys %symbols) { + my $sym = $_; + $line =~ s/\b$sym\b/$symbols{$sym}/g; + } + + # Handle function declarations and keep track of the declared labels + if ($line =~ s/^\s*\.func\s+(\w+)/$1 PROC/) { + $labels_seen{$1} = 1; + } + + if ($line =~ s/^\s*(\d+)://) { + # Convert local labels into unique labels. armasm (at least in + # RVCT) has something similar, but still different enough. + # By converting to unique labels we avoid any possible + # incompatibilities. + + my $num = $1; + foreach (@{$next_temp_labels{$num}}) { + $line = "$_\n" . $line; + } + @next_temp_labels{$num} = (); + my $name = "temp_label_$temp_label_next"; + $temp_label_next++; + # The matching regexp above removes the label from the start of + # the line (which might contain an instruction as well), readd + # it on a separate line above it. + $line = "$name:\n" . $line; + $last_temp_labels{$num} = $name; + } + + if ($line =~ s/^\s*(\w+):/$1/) { + # Skip labels that have already been declared with a PROC, + # labels must not be declared multiple times. + return if (defined $labels_seen{$1}); + $labels_seen{$1} = 1; + } elsif ($line !~ /(\w+) PROC/) { + # If not a label, make sure the line starts with whitespace, + # otherwise ms armasm interprets it incorrectly. + $line =~ s/^[\.\w]/\t$&/; + } + + + # Check branch instructions + if ($line =~ /(?:^|\n)\s*(\w+\s*:\s*)?(bl?x?\.?([^\s]{2})?(\.w)?)\s+(\w+)/) { + my $instr = $2; + my $cond = $3; + my $width = $4; + my $target = $5; + # Don't interpret e.g. bic as b with ic as conditional code + if ($cond !~ /^(|$arm_cond_codes)$/) { + # Not actually a branch + } elsif ($target =~ /^(\d+)([bf])$/) { + # The target is a local label + $line = handle_local_label($line, $1, $2); + $line =~ s/\b$instr\b/$&.w/ if $width eq "" and $arch eq "arm"; + } elsif (($arch eq "arm" and !is_arm_register($target)) or + ($arch eq "aarch64" and !is_aarch64_register($target))) { + $call_targets{$target}++; + } + } elsif ($line =~ /(?:^|\n)\s*(\w+\s*:\s*)?(cbn?z|adr|tbz)\s+(\w+)\s*,(\s*#\d+\s*,)?\s*(\w+)/) { + my $instr = $2; + my $reg = $3; + my $bit = $4; + my $target = $5; + if ($target =~ /^(\d+)([bf])$/) { + # The target is a local label + $line = handle_local_label($line, $1, $2); + } else { + $call_targets{$target}++; + } + # Convert tbz with a wX register into an xX register, + # due to armasm64 bugs/limitations. + if ($instr eq "tbz" and $reg =~ /w\d+/) { + my $xreg = $reg; + $xreg =~ s/w/x/; + $line =~ s/\b$reg\b/$xreg/; + } + } elsif ($line =~ /^\s*.h?word.*\b\d+[bf]\b/) { + while ($line =~ /\b(\d+)([bf])\b/g) { + $line = handle_local_label($line, $1, $2); + } + } + + # ALIGN in armasm syntax is the actual number of bytes + if ($line =~ /\.(?:p2)?align\s+(\d+)/) { + my $align = 1 << $1; + $line =~ s/\.(?:p2)?align\s+(\d+)/ALIGN $align/; + } + # Convert gas style [r0, :128] into armasm [r0@128] alignment specification + $line =~ s/\[([^\[,]+),?\s*:(\d+)\]/[$1\@$2]/g; + + # armasm treats logical values {TRUE} and {FALSE} separately from + # numeric values - logical operators and values can't be intermixed + # with numerical values. Evaluate ! and (a <> b) into numbers, + # let the assembler evaluate the rest of the expressions. This current + # only works for cases when ! and <> are used with actual constant numbers, + # we don't evaluate subexpressions here. + + # Evaluate ! + while ($line =~ /!\s*(\d+)/g) { + my $val = ($1 != 0) ? 0 : 1; + $line =~ s/!(\d+)/$val/; + } + # Evaluate (a > b) + while ($line =~ /\(\s*(\d+)\s*([<>])\s*(\d+)\s*\)/) { + my $val; + if ($2 eq "<") { + $val = ($1 < $3) ? 1 : 0; + } else { + $val = ($1 > $3) ? 1 : 0; + } + $line =~ s/\(\s*(\d+)\s*([<>])\s*(\d+)\s*\)/$val/; + } + + if ($arch eq "arm") { + # Change a movw... #:lower16: into a mov32 pseudoinstruction + $line =~ s/^(\s*)movw(\s+\w+\s*,\s*)\#:lower16:(.*)$/$1mov32$2$3/; + # and remove the following, matching movt completely + $line =~ s/^\s*movt\s+\w+\s*,\s*\#:upper16:.*$//; + + if ($line =~ /^\s*mov32\s+\w+,\s*([a-zA-Z]\w*)/) { + $import_symbols{$1}++; + } + + # Misc bugs/deficiencies: + # armasm seems unable to parse e.g. "vmov s0, s1" without a type + # qualifier, thus add .f32. + $line =~ s/^(\s+(?:vmov|vadd))(\s+s\d+\s*,\s*s\d+)/$1.f32$2/; + } elsif ($arch eq "aarch64") { + # Convert ext into ext8; armasm64 seems to require it named as ext8. + $line =~ s/^(\s+)ext(\s+)/$1ext8$2/; + + # Pick up targets from ldr x0, =sym+offset + if ($line =~ /^\s*ldr\s+(\w+)\s*,\s*=([a-zA-Z]\w*)(.*)$/) { + my $reg = $1; + my $sym = $2; + my $offset = eval_expr($3); + if ($offset < 0 and $ENV{GASPP_ARMASM64_SKIP_NEG_OFFSET}) { + # armasm64 in VS < 15.6 is buggy with ldr x0, =sym+offset where the + # offset is a negative value; it does write a negative + # offset into the literal pool as it should, but the + # negative offset only covers the lower 32 bit of the 64 + # bit literal/relocation. + # Thus remove the offset and apply it manually with a sub + # afterwards. + $offset = -$offset; + $line = "\tldr $reg, =$sym\n\tsub $reg, $reg, #$offset\n"; + } + $import_symbols{$sym}++; + } + + # armasm64 (currently) doesn't support offsets on adrp targets, + # even though the COFF format relocations (and the linker) + # supports it. Therefore strip out the offsets from adrp and + # add :lo12: (in case future armasm64 would start handling it) + # and add an extra explicit add instruction for the offset. + if ($line =~ s/(adrp\s+\w+\s*,\s*(\w+))([\d\+\-\*\/\(\) <>]+)?/\1/) { + $import_symbols{$2}++; + } + if ($line =~ s/(add\s+(\w+)\s*,\s*\w+\s*,\s*):lo12:(\w+)([\d\+\-\*\/\(\) <>]+)?/\1\3/) { + my $reg = $2; + my $sym = $3; + my $offset = eval_expr($4); + $line .= "\tadd $reg, $reg, #$offset\n" if $offset > 0; + $import_symbols{$sym}++; + } + + # Convert e.g. "add x0, x0, w0, uxtw" into "add x0, x0, w0, uxtw #0", + # or "ldr x0, [x0, w0, uxtw]" into "ldr x0, [x0, w0, uxtw #0]". + $line =~ s/(uxt[whb]|sxt[whb])(\s*\]?\s*)$/\1 #0\2/i; + + # Convert "mov x0, v0.d[0]" into "umov x0, v0.d[0]" + $line =~ s/\bmov\s+[xw]\d+\s*,\s*v\d+\.[ds]/u$&/i; + + # Convert "ccmp w0, #0, #0, ne" into "ccmpne w0, #0, #0", + # and "csel w0, w0, w0, ne" into "cselne w0, w0, w0". + $line =~ s/(ccmp|csel)\s+([xw]\w+)\s*,\s*([xw#]\w+)\s*,\s*([xw#]\w+)\s*,\s*($arm_cond_codes)/\1\5 \2, \3, \4/; + + # Convert "cinc w0, w0, ne" into "cincne w0, w0". + $line =~ s/(cinc)\s+([xw]\w+)\s*,\s*([xw]\w+)\s*,\s*($arm_cond_codes)/\1\4 \2, \3/; + + # Convert "cset w0, lo" into "csetlo w0" + $line =~ s/(cset)\s+([xw]\w+)\s*,\s*($arm_cond_codes)/\1\3 \2/; + + if ($ENV{GASPP_ARMASM64_SKIP_PRFUM}) { + # Strip out prfum; armasm64 (VS < 15.5) fails to assemble any + # variant/combination of prfum tested so far, but since it is + # a prefetch instruction it can be skipped without changing + # results. + $line =~ s/prfum.*\]//; + } + + # Convert "ldrb w0, [x0, #-1]" into "ldurb w0, [x0, #-1]". + # Don't do this for forms with writeback though. + if ($line =~ /(ld|st)(r[bh]?)\s+(\w+)\s*,\s*\[\s*(\w+)\s*,\s*#([^\]]+)\s*\][^!]/) { + my $instr = $1; + my $suffix = $2; + my $target = $3; + my $base = $4; + my $offset = eval_expr($5); + if ($offset < 0) { + $line =~ s/$instr$suffix/${instr}u$suffix/; + } + } + + if ($ENV{GASPP_ARMASM64_INVERT_SCALE}) { + # Instructions like fcvtzs and scvtf store the scale value + # inverted in the opcode (stored as 64 - scale), but armasm64 + # in VS < 15.5 stores it as-is. Thus convert from + # "fcvtzs w0, s0, #8" into "fcvtzs w0, s0, #56". + if ($line =~ /(?:fcvtzs|scvtf)\s+(\w+)\s*,\s*(\w+)\s*,\s*#(\d+)/) { + my $scale = $3; + my $inverted_scale = 64 - $3; + $line =~ s/#$scale/#$inverted_scale/; + } + } + + # Convert "ld1 {v0.4h-v3.4h}" into "ld1 {v0.4h,v1.4h,v2.4h,v3.4h}" + if ($line =~ /(?:ld|st)\d\s+({\s*v(\d+)\.(\d[bhsdBHSD])\s*-\s*v(\d+)\.(\d[bhsdBHSD])\s*})/) { + my $regspec = $1; + my $reg1 = $2; + my $layout1 = $3; + my $reg2 = $4; + my $layout2 = $5; + if ($layout1 eq $layout2) { + my $new_regspec = "{"; + foreach my $i ($reg1 .. $reg2) { + $new_regspec .= "," if ($i > $reg1); + $new_regspec .= "v$i.$layout1"; + } + $new_regspec .= "}"; + $line =~ s/$regspec/$new_regspec/; + } + } + } + # armasm is unable to parse &0x - add spacing + $line =~ s/&0x/& 0x/g; + } + + if ($force_thumb) { + # Convert register post indexing to a separate add instruction. + # This converts e.g. "ldr r0, [r1], r2" into "ldr r0, [r1]", + # "add r1, r1, r2". + $line =~ s/((?:ldr|str)[bh]?)\s+(\w+),\s*\[(\w+)\],\s*(\w+)/$1 $2, [$3]\n\tadd $3, $3, $4/g; + + # Convert "mov pc, lr" into "bx lr", since the former only works + # for switching from arm to thumb (and only in armv7), but not + # from thumb to arm. + $line =~ s/mov\s*pc\s*,\s*lr/bx lr/g; + + # Convert stmdb/ldmia/stmfd/ldmfd/ldm with only one register into a plain str/ldr with post-increment/decrement. + # Wide thumb2 encoding requires at least two registers in register list while all other encodings support one register too. + $line =~ s/stm(?:db|fd)\s+sp!\s*,\s*\{([^,-]+)\}/str $1, [sp, #-4]!/g; + $line =~ s/ldm(?:ia|fd)?\s+sp!\s*,\s*\{([^,-]+)\}/ldr $1, [sp], #4/g; + + # Convert muls into mul+cmp + $line =~ s/muls\s+(\w+),\s*(\w+)\,\s*(\w+)/mul $1, $2, $3\n\tcmp $1, #0/g; + + # Convert "and r0, sp, #xx" into "mov r0, sp", "and r0, r0, #xx" + $line =~ s/and\s+(\w+),\s*(sp|r13)\,\s*#(\w+)/mov $1, $2\n\tand $1, $1, #$3/g; + + # Convert "ldr r0, [r0, r1, lsl #6]" where the shift is >3 (which + # can't be handled in thumb) into "add r0, r0, r1, lsl #6", + # "ldr r0, [r0]", for the special case where the same address is + # used as base and target for the ldr. + if ($line =~ /(ldr[bh]?)\s+(\w+),\s*\[\2,\s*(\w+),\s*lsl\s*#(\w+)\]/ and $4 > 3) { + $line =~ s/(ldr[bh]?)\s+(\w+),\s*\[\2,\s*(\w+),\s*lsl\s*#(\w+)\]/add $2, $2, $3, lsl #$4\n\t$1 $2, [$2]/; + } + + $line =~ s/\.arm/.thumb/x; + } + + # comment out unsupported directives + $line =~ s/\.type/$comm$&/x if $as_type =~ /^(apple-|armasm)/; + $line =~ s/\.func/$comm$&/x if $as_type =~ /^(apple-|clang)/; + $line =~ s/\.endfunc/$comm$&/x if $as_type =~ /^(apple-|clang)/; + $line =~ s/\.endfunc/ENDP/x if $as_type =~ /armasm/; + $line =~ s/\.ltorg/$comm$&/x if $as_type =~ /^(apple-|clang)/; + $line =~ s/\.ltorg/LTORG/x if $as_type eq "armasm"; + $line =~ s/\.size/$comm$&/x if $as_type =~ /^(apple-|armasm)/; + $line =~ s/\.fpu/$comm$&/x if $as_type =~ /^(apple-|armasm)/; + $line =~ s/\.arch/$comm$&/x if $as_type =~ /^(apple-|clang|armasm)/; + $line =~ s/\.object_arch/$comm$&/x if $as_type =~ /^(apple-|armasm)/; + $line =~ s/.section\s+.note.GNU-stack.*/$comm$&/x if $as_type =~ /^(apple-|armasm)/; + + $line =~ s/\.syntax/$comm$&/x if $as_type =~ /armasm/; + + $line =~ s/\.hword/.short/x; + + if ($as_type =~ /^apple-/) { + # the syntax for these is a little different + $line =~ s/\.global/.globl/x; + # also catch .section .rodata since the equivalent to .const_data is .section __DATA,__const + $line =~ s/(.*)\.rodata/.const_data/x; + $line =~ s/\.int/.long/x; + $line =~ s/\.float/.single/x; + } + if ($as_type eq "apple-gas") { + $line =~ s/vmrs\s+APSR_nzcv/fmrx r15/x; + } + if ($as_type eq "armasm") { + $line =~ s/\.global/EXPORT/x; + $line =~ s/\.extern/IMPORT/x; + $line =~ s/\.int/dcd/x; + $line =~ s/\.long/dcd/x; + $line =~ s/\.float/dcfs/x; + $line =~ s/\.word/dcd/x; + $line =~ s/\.short/dcw/x; + $line =~ s/\.byte/dcb/x; + $line =~ s/\.quad/dcq/x; + $line =~ s/\.ascii/dcb/x; + $line =~ s/\.asciz(.*)$/dcb\1,0/x; + $line =~ s/\.thumb/THUMB/x; + $line =~ s/\.arm/ARM/x; + # The alignment in AREA is the power of two, just as .align in gas + $line =~ s/\.text/AREA |.text|, CODE, READONLY, ALIGN=4, CODEALIGN/; + $line =~ s/(\s*)(.*)\.ro?data/$1AREA |.rdata|, DATA, READONLY, ALIGN=5/; + $line =~ s/\.data/AREA |.data|, DATA, ALIGN=5/; + } + if ($as_type eq "armasm" and $arch eq "arm") { + $line =~ s/fmxr/vmsr/; + $line =~ s/fmrx/vmrs/; + $line =~ s/fadds/vadd.f32/; + } + if ($as_type eq "armasm" and $arch eq "aarch64") { + # Convert "b.eq" into "beq" + $line =~ s/\bb\.($arm_cond_codes)\b/b\1/; + } + + # catch unknown section names that aren't mach-o style (with a comma) + if ($as_type =~ /apple-/ and $line =~ /.section ([^,]*)$/) { + die ".section $1 unsupported; figure out the mach-o section name and add it"; + } + + print ASMFILE $line; +} + +if ($as_type ne "armasm") { + print ASMFILE ".text\n"; + print ASMFILE ".align 2\n"; + foreach my $literal (keys %literal_labels) { + print ASMFILE "$literal_labels{$literal}:\n $literal_expr $literal\n"; + } + + map print(ASMFILE ".thumb_func $_\n"), + grep exists $thumb_labels{$_}, keys %call_targets; +} else { + map print(ASMFILE "\tIMPORT $_\n"), + grep ! exists $labels_seen{$_}, (keys %call_targets, keys %import_symbols); + + print ASMFILE "\tEND\n"; +} + +close(INPUT) or exit 1; +close(ASMFILE) or exit 1; +if ($as_type eq "armasm" and ! defined $ENV{GASPP_DEBUG}) { + print STDERR join(" ", @gcc_cmd)."\n" if $verbose; + system(@gcc_cmd) == 0 or die "Error running assembler"; +} + +END { + unlink($tempfile) if defined $tempfile; +} +#exit 1 From c46d628dd682e168f6e200be9c9034f21b40ee01 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Tue, 11 Feb 2020 11:08:35 +0400 Subject: [PATCH 3/4] Fix build --- submodules/PeersNearbyUI/BUCK | 1 + 1 file changed, 1 insertion(+) diff --git a/submodules/PeersNearbyUI/BUCK b/submodules/PeersNearbyUI/BUCK index a6c565b2b6..b8e216e8a7 100644 --- a/submodules/PeersNearbyUI/BUCK +++ b/submodules/PeersNearbyUI/BUCK @@ -28,6 +28,7 @@ static_library( "//submodules/AppBundle:AppBundle", "//submodules/AnimatedStickerNode:AnimatedStickerNode", "//submodules/TelegramStringFormatting:TelegramStringFormatting", + "//submodules/TelegramNotices:TelegramNotices", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", From 97fd1d10f02d0972031500433becf4a6e1299833 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Tue, 11 Feb 2020 11:12:36 +0400 Subject: [PATCH 4/4] Fix build --- submodules/StatisticsUI/BUCK | 1 - submodules/StatisticsUI/Sources/StatsController.swift | 2 -- 2 files changed, 3 deletions(-) diff --git a/submodules/StatisticsUI/BUCK b/submodules/StatisticsUI/BUCK index 911a9fff4a..693dcc8cbc 100644 --- a/submodules/StatisticsUI/BUCK +++ b/submodules/StatisticsUI/BUCK @@ -20,7 +20,6 @@ static_library( "//submodules/TelegramStringFormatting:TelegramStringFormatting", "//submodules/AlertUI:AlertUI", "//submodules/PresentationDataUtils:PresentationDataUtils", - "//submodules/TelegramNotices:TelegramNotices", "//submodules/MergeLists:MergeLists", "//submodules/Charts:Charts", ], diff --git a/submodules/StatisticsUI/Sources/StatsController.swift b/submodules/StatisticsUI/Sources/StatsController.swift index 440d29cf02..e24f2dc32b 100644 --- a/submodules/StatisticsUI/Sources/StatsController.swift +++ b/submodules/StatisticsUI/Sources/StatsController.swift @@ -13,8 +13,6 @@ import PresentationDataUtils import AccountContext import PresentationDataUtils import AppBundle -import ContextUI -import TelegramNotices private final class StatsArguments { init() {