From f5dbf47b685efaf5cd99d28ad9bbb6bf675482a0 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Thu, 12 Mar 2020 05:01:21 +0400 Subject: [PATCH] Channel statistics improvements --- Telegram-iOS/Resources/Dice_1.tgs | Bin 63935 -> 0 bytes Telegram-iOS/Resources/Dice_2.tgs | Bin 61430 -> 0 bytes Telegram-iOS/Resources/Dice_3.tgs | Bin 64600 -> 0 bytes Telegram-iOS/Resources/Dice_4.tgs | Bin 65388 -> 0 bytes Telegram-iOS/Resources/Dice_5.tgs | Bin 65287 -> 0 bytes Telegram-iOS/Resources/Dice_6.tgs | Bin 65369 -> 0 bytes Telegram-iOS/Resources/Dice_Rolling.tgs | Bin 0 -> 3939 bytes Telegram-iOS/en.lproj/Localizable.strings | 24 + .../Sources/AccountContext.swift | 4 +- .../AuthTransferConfirmationScreen.swift | 4 +- .../Chart Screen/ChartStackSection.xib | 149 - .../Chart Screen/ChartsDataLoader.swift | 51 - .../Charts Reader/ChartsCollection.swift | 92 - .../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 | 170 - .../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 - .../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 - .../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 - .../Charts/Sources/Models/ChartLineData.swift | 76 - .../Charts/Sources/Models/ColorMode.swift | 175 - .../Sources/Models/LinesChartLabel.swift | 25 - .../Sources/Models/LinesSelectionLabel.swift | 15 - submodules/GraphCore/BUCK | 15 + submodules/GraphCore/Graph.h | 19 - submodules/GraphCore/Info.plist | 2 - .../Charts Reader/ChartVisibilityItem.swift | 0 .../Charts Reader/ChartsCollection.swift | 3 +- .../Charts Reader/ChartsDataManager.swift | 0 .../Charts Reader/ChartsError.swift | 0 .../Charts Reader/Convert.swift | 0 .../Controllers/BaseChartController.swift | 0 .../GeneralChartComponentController.swift | 0 .../Lines/BaseLinesChartController.swift | 1 - .../Lines/GeneralLinesChartController.swift | 31 +- .../Lines/TwoAxisLinesChartController.swift | 33 +- .../PercentChartComponentController.swift | 0 .../PercentPieChartController.swift | 56 +- .../PieChartComponentController.swift | 0 .../BarsComponentController.swift | 32 +- .../DailyBarsChartController.swift | 6 +- .../LinesComponentController.swift | 30 +- .../StackedBarsChartController.swift | 2 +- .../StepBarsChartController.swift} | 130 +- .../StepBarsChartController2.swift | 380 + .../Charts/Renderes/BarChartRenderer.swift | 223 +- .../Charts/Renderes/BaseChartRenderer.swift | 2 +- .../Renderes/ChartDetailsRenderer.swift | 0 .../Renderes/HorizontalScalesRenderer.swift | 0 .../Charts/Renderes/LineBulletsRenerer.swift | 4 +- .../Charts/Renderes/LinesChartRenderer.swift | 0 .../Charts/Renderes/PecentChartRenderer.swift | 0 .../PercentPieAnimationRenderer.swift | 0 .../Charts/Renderes/PerformanceRenderer.swift | 0 .../Charts/Renderes/PieChartRenderer.swift | 0 .../Renderes/VerticalLinesRenderer.swift | 0 .../Renderes/VerticalScalesRenderer.swift | 0 submodules/GraphCore/Sources/GraphCore.h | 19 + .../Helpers/AnimationController.swift | 0 .../Helpers/Array+Utils.swift | 0 .../{src => Sources}/Helpers/CGFloat.swift | 0 .../Helpers/CGPoint+Extensions.swift | 0 .../Helpers/ClosedRange+Utils.swift | 0 .../Helpers/DisplayLinkService.swift | 0 .../Sources/Helpers/GlobalHelpers.swift | 0 .../Helpers/NumberFormatter+Utils.swift | 0 .../Helpers/ScalesNumberFormatter.swift | 0 .../{src => Sources}/Helpers/TextUtils.swift | 0 .../Helpers/TimeInterval+Utils.swift | 2 +- .../{src => Sources}/Helpers/TimeZone.swift | 0 .../Helpers/UIColor+Utils.swift | 36 +- .../Helpers/UIImage+Utils.swift | 0 .../Helpers/UIView+Extensions.swift | 0 .../Models/ChartLineData.swift | 0 .../{src => Sources}/Models/ColorMode.swift | 0 .../Models/LinesChartLabel.swift | 0 .../Models/LinesSelectionLabel.swift | 0 .../GraphCore/src/Helpers/GlobalHelpers.swift | 12 - submodules/{Charts => GraphUI}/BUCK | 8 +- submodules/{Charts => GraphUI}/Info.plist | 0 .../Sources}/ChartDetailsView.swift | 33 +- .../Sources/ChartNode.swift | 37 +- .../Sources}/ChartStackSection.swift | 27 +- .../Sources}/ChartView.swift | 10 +- .../Sources}/ChartVisibilityItemView.swift | 1 + .../Sources}/ChartVisibilityView.swift | 5 +- submodules/GraphUI/Sources/GraphUI.h | 19 + .../Sources}/RangeChartView.swift | 10 +- .../Sources}/UIImageView+Utils.swift | 0 .../Sources}/UILabel+Utils.swift | 0 .../Sources}/UIView+Extensions.swift | 0 .../Sources/InstantPageFeedbackItem.swift | 2 +- .../Sources/InstantPageFeedbackNode.swift | 33 +- .../Sources/PeersNearbyController.swift | 10 +- .../StorageUsageController.swift | 4 +- .../SettingsUI/Sources/OpenSettings.swift | 2 +- submodules/StatisticsUI/BUCK | 2 +- .../Sources/StatsController.swift | 251 +- .../StatisticsUI/Sources/StatsGraphItem.swift | 50 +- .../Sources/StatsMessageItem.swift | 435 + .../Sources/StatsOverviewItem.swift | 37 +- submodules/SyncCore/Sources/InstantPage.swift | 13 +- submodules/TelegramApi/Sources/Api0.swift | 6 +- submodules/TelegramApi/Sources/Api1.swift | 54 +- submodules/TelegramApi/Sources/Api2.swift | 24 +- .../Sources/ChannelStatistics.swift | 117 +- .../TelegramCore/Sources/InstantPage.swift | 4 +- .../TelegramCore/Sources/WebpagePreview.swift | 11 +- .../Sources/PresentationStrings.swift | 7958 +++++++++-------- .../Chart/arrow_left.imageset/Contents.json | 3 + .../TelegramUI/ChatController.swift | 123 +- .../TelegramUI/ChatControllerNode.swift | 1 - .../TelegramUI/ChatHistoryListNode.swift | 38 +- .../ChatMessageAnimatedStickerItemNode.swift | 285 +- .../TelegramUI/NavigateToChatController.swift | 79 +- .../TelegramUI/OpenResolvedUrl.swift | 2 +- .../TelegramUI/PeerInfo/PeerInfoData.swift | 10 + .../TelegramUI/PeerInfo/PeerInfoScreen.swift | 2 +- .../Resources/PresentationStrings.mapping | Bin 146163 -> 146360 bytes 154 files changed, 6186 insertions(+), 10908 deletions(-) delete mode 100644 Telegram-iOS/Resources/Dice_1.tgs delete mode 100644 Telegram-iOS/Resources/Dice_2.tgs delete mode 100644 Telegram-iOS/Resources/Dice_3.tgs delete mode 100644 Telegram-iOS/Resources/Dice_4.tgs delete mode 100644 Telegram-iOS/Resources/Dice_5.tgs delete mode 100644 Telegram-iOS/Resources/Dice_6.tgs create mode 100644 Telegram-iOS/Resources/Dice_Rolling.tgs delete mode 100644 submodules/Charts/Sources/Chart Screen/ChartStackSection.xib delete mode 100644 submodules/Charts/Sources/Chart Screen/ChartsDataLoader.swift delete mode 100644 submodules/Charts/Sources/Charts Reader/ChartsCollection.swift delete mode 100644 submodules/Charts/Sources/Charts Reader/ChartsDataManager.swift delete mode 100644 submodules/Charts/Sources/Charts Reader/ChartsError.swift delete mode 100644 submodules/Charts/Sources/Charts Reader/Convert.swift delete mode 100644 submodules/Charts/Sources/Charts.h delete mode 100644 submodules/Charts/Sources/Charts/Controllers/BaseChartController.swift delete mode 100644 submodules/Charts/Sources/Charts/Controllers/GeneralChartComponentController.swift delete mode 100644 submodules/Charts/Sources/Charts/Controllers/Lines/BaseLinesChartController.swift delete mode 100644 submodules/Charts/Sources/Charts/Controllers/Lines/GeneralLinesChartController.swift delete mode 100644 submodules/Charts/Sources/Charts/Controllers/Lines/TwoAxisLinesChartController.swift delete mode 100644 submodules/Charts/Sources/Charts/Controllers/Percent And Pie/PercentChartComponentController.swift delete mode 100644 submodules/Charts/Sources/Charts/Controllers/Percent And Pie/PercentPieChartController.swift delete mode 100644 submodules/Charts/Sources/Charts/Controllers/Percent And Pie/PieChartComponentController.swift delete mode 100644 submodules/Charts/Sources/Charts/Controllers/Stacked Bars/BarsComponentController.swift delete mode 100644 submodules/Charts/Sources/Charts/Controllers/Stacked Bars/DailyBarsChartController.swift delete mode 100644 submodules/Charts/Sources/Charts/Controllers/Stacked Bars/LinesComponentController.swift delete mode 100644 submodules/Charts/Sources/Charts/Renderes/BarChartRenderer.swift delete mode 100644 submodules/Charts/Sources/Charts/Renderes/BaseChartRenderer.swift delete mode 100644 submodules/Charts/Sources/Charts/Renderes/ChartDetailsRenderer.swift delete mode 100644 submodules/Charts/Sources/Charts/Renderes/HorizontalScalesRenderer.swift delete mode 100644 submodules/Charts/Sources/Charts/Renderes/LineBulletsRenerer.swift delete mode 100644 submodules/Charts/Sources/Charts/Renderes/LinesChartRenderer.swift delete mode 100644 submodules/Charts/Sources/Charts/Renderes/PecentChartRenderer.swift delete mode 100644 submodules/Charts/Sources/Charts/Renderes/PercentPieAnimationRenderer.swift delete mode 100644 submodules/Charts/Sources/Charts/Renderes/PerformanceRenderer.swift delete mode 100644 submodules/Charts/Sources/Charts/Renderes/PieChartRenderer.swift delete mode 100644 submodules/Charts/Sources/Charts/Renderes/VerticalLinesRenderer.swift delete mode 100644 submodules/Charts/Sources/Charts/Renderes/VerticalScalesRenderer.swift delete mode 100644 submodules/Charts/Sources/Helpers/AnimationController.swift delete mode 100644 submodules/Charts/Sources/Helpers/Array+Utils.swift delete mode 100644 submodules/Charts/Sources/Helpers/CGFloat.swift delete mode 100644 submodules/Charts/Sources/Helpers/CGPoint+Extensions.swift delete mode 100644 submodules/Charts/Sources/Helpers/ClosedRange+Utils.swift delete mode 100644 submodules/Charts/Sources/Helpers/CustomNavigationController.swift delete mode 100644 submodules/Charts/Sources/Helpers/DisplayLinkService.swift delete mode 100644 submodules/Charts/Sources/Helpers/NumberFormatter+Utils.swift delete mode 100644 submodules/Charts/Sources/Helpers/OnePixelConstraint.swift delete mode 100644 submodules/Charts/Sources/Helpers/ScalesNumberFormatter.swift delete mode 100644 submodules/Charts/Sources/Helpers/TimeInterval+Utils.swift delete mode 100644 submodules/Charts/Sources/Helpers/TimeZone.swift delete mode 100644 submodules/Charts/Sources/Helpers/UIColor+Utils.swift delete mode 100644 submodules/Charts/Sources/Helpers/UIImage+Utils.swift delete mode 100644 submodules/Charts/Sources/Models/ChartLineData.swift delete mode 100644 submodules/Charts/Sources/Models/ColorMode.swift delete mode 100644 submodules/Charts/Sources/Models/LinesChartLabel.swift delete mode 100644 submodules/Charts/Sources/Models/LinesSelectionLabel.swift create mode 100644 submodules/GraphCore/BUCK delete mode 100644 submodules/GraphCore/Graph.h rename submodules/GraphCore/{src => Sources}/Charts Reader/ChartVisibilityItem.swift (100%) rename submodules/GraphCore/{src => Sources}/Charts Reader/ChartsCollection.swift (98%) rename submodules/GraphCore/{src => Sources}/Charts Reader/ChartsDataManager.swift (100%) rename submodules/GraphCore/{src => Sources}/Charts Reader/ChartsError.swift (100%) rename submodules/GraphCore/{src => Sources}/Charts Reader/Convert.swift (100%) rename submodules/GraphCore/{src => Sources}/Charts/Controllers/BaseChartController.swift (100%) rename submodules/GraphCore/{src => Sources}/Charts/Controllers/GeneralChartComponentController.swift (100%) rename submodules/GraphCore/{src => Sources}/Charts/Controllers/Lines/BaseLinesChartController.swift (99%) rename submodules/GraphCore/{src => Sources}/Charts/Controllers/Lines/GeneralLinesChartController.swift (90%) rename submodules/GraphCore/{src => Sources}/Charts/Controllers/Lines/TwoAxisLinesChartController.swift (91%) rename submodules/GraphCore/{src => Sources}/Charts/Controllers/Percent And Pie/PercentChartComponentController.swift (100%) rename submodules/GraphCore/{src => Sources}/Charts/Controllers/Percent And Pie/PercentPieChartController.swift (86%) rename submodules/GraphCore/{src => Sources}/Charts/Controllers/Percent And Pie/PieChartComponentController.swift (100%) rename submodules/GraphCore/{src => Sources}/Charts/Controllers/Stacked Bars/BarsComponentController.swift (87%) rename submodules/GraphCore/{src => Sources}/Charts/Controllers/Stacked Bars/DailyBarsChartController.swift (99%) rename submodules/GraphCore/{src => Sources}/Charts/Controllers/Stacked Bars/LinesComponentController.swift (89%) rename submodules/GraphCore/{src => Sources}/Charts/Controllers/Stacked Bars/StackedBarsChartController.swift (99%) rename submodules/{Charts/Sources/Charts/Controllers/Stacked Bars/StackedBarsChartController.swift => GraphCore/Sources/Charts/Controllers/Stacked Bars/StepBarsChartController.swift} (68%) create mode 100644 submodules/GraphCore/Sources/Charts/Controllers/Stacked Bars/StepBarsChartController2.swift rename submodules/GraphCore/{src => Sources}/Charts/Renderes/BarChartRenderer.swift (51%) rename submodules/GraphCore/{src => Sources}/Charts/Renderes/BaseChartRenderer.swift (99%) rename submodules/GraphCore/{src => Sources}/Charts/Renderes/ChartDetailsRenderer.swift (100%) rename submodules/GraphCore/{src => Sources}/Charts/Renderes/HorizontalScalesRenderer.swift (100%) rename submodules/GraphCore/{src => Sources}/Charts/Renderes/LineBulletsRenerer.swift (97%) rename submodules/GraphCore/{src => Sources}/Charts/Renderes/LinesChartRenderer.swift (100%) rename submodules/GraphCore/{src => Sources}/Charts/Renderes/PecentChartRenderer.swift (100%) rename submodules/GraphCore/{src => Sources}/Charts/Renderes/PercentPieAnimationRenderer.swift (100%) rename submodules/GraphCore/{src => Sources}/Charts/Renderes/PerformanceRenderer.swift (100%) rename submodules/GraphCore/{src => Sources}/Charts/Renderes/PieChartRenderer.swift (100%) rename submodules/GraphCore/{src => Sources}/Charts/Renderes/VerticalLinesRenderer.swift (100%) rename submodules/GraphCore/{src => Sources}/Charts/Renderes/VerticalScalesRenderer.swift (100%) create mode 100644 submodules/GraphCore/Sources/GraphCore.h rename submodules/GraphCore/{src => Sources}/Helpers/AnimationController.swift (100%) rename submodules/GraphCore/{src => Sources}/Helpers/Array+Utils.swift (100%) rename submodules/GraphCore/{src => Sources}/Helpers/CGFloat.swift (100%) rename submodules/GraphCore/{src => Sources}/Helpers/CGPoint+Extensions.swift (100%) rename submodules/GraphCore/{src => Sources}/Helpers/ClosedRange+Utils.swift (100%) rename submodules/GraphCore/{src => Sources}/Helpers/DisplayLinkService.swift (100%) rename submodules/{Charts => GraphCore}/Sources/Helpers/GlobalHelpers.swift (100%) rename submodules/GraphCore/{src => Sources}/Helpers/NumberFormatter+Utils.swift (100%) rename submodules/GraphCore/{src => Sources}/Helpers/ScalesNumberFormatter.swift (100%) rename submodules/GraphCore/{src => Sources}/Helpers/TextUtils.swift (100%) rename submodules/GraphCore/{src => Sources}/Helpers/TimeInterval+Utils.swift (96%) rename submodules/GraphCore/{src => Sources}/Helpers/TimeZone.swift (100%) rename submodules/GraphCore/{src => Sources}/Helpers/UIColor+Utils.swift (64%) rename submodules/GraphCore/{src => Sources}/Helpers/UIImage+Utils.swift (100%) rename submodules/GraphCore/{src => Sources}/Helpers/UIView+Extensions.swift (100%) rename submodules/GraphCore/{src => Sources}/Models/ChartLineData.swift (100%) rename submodules/GraphCore/{src => Sources}/Models/ColorMode.swift (100%) rename submodules/GraphCore/{src => Sources}/Models/LinesChartLabel.swift (100%) rename submodules/GraphCore/{src => Sources}/Models/LinesSelectionLabel.swift (100%) delete mode 100644 submodules/GraphCore/src/Helpers/GlobalHelpers.swift rename submodules/{Charts => GraphUI}/BUCK (80%) rename submodules/{Charts => GraphUI}/Info.plist (100%) rename submodules/{Charts/Sources/Chart Screen => GraphUI/Sources}/ChartDetailsView.swift (91%) rename submodules/{Charts => GraphUI}/Sources/ChartNode.swift (63%) rename submodules/{Charts/Sources/Chart Screen => GraphUI/Sources}/ChartStackSection.swift (88%) rename submodules/{Charts/Sources/Chart Screen => GraphUI/Sources}/ChartView.swift (95%) rename submodules/{Charts/Sources/Chart Screen => GraphUI/Sources}/ChartVisibilityItemView.swift (99%) rename submodules/{Charts/Sources/Chart Screen => GraphUI/Sources}/ChartVisibilityView.swift (97%) create mode 100644 submodules/GraphUI/Sources/GraphUI.h rename submodules/{Charts/Sources/Chart Screen => GraphUI/Sources}/RangeChartView.swift (97%) rename submodules/{Charts/Sources/Helpers => GraphUI/Sources}/UIImageView+Utils.swift (100%) rename submodules/{Charts/Sources/Helpers => GraphUI/Sources}/UILabel+Utils.swift (100%) rename submodules/{Charts/Sources/Helpers => GraphUI/Sources}/UIView+Extensions.swift (100%) create mode 100644 submodules/StatisticsUI/Sources/StatsMessageItem.swift diff --git a/Telegram-iOS/Resources/Dice_1.tgs b/Telegram-iOS/Resources/Dice_1.tgs deleted file mode 100644 index e078e6b6de72e46f09ae9cc14485052b8a73bd18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63935 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�BP%RDld@T0#%*;9MM|6od4QZ8OOeQ(0 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 z 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 diff --git a/Telegram-iOS/Resources/Dice_2.tgs b/Telegram-iOS/Resources/Dice_2.tgs deleted file mode 100644 index c350c4d88c6e83a4181e3e24466a35744a2c459e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61430 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\CX;!Wla34T; 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∋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%0A(z3a9Rlc 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 diff --git a/Telegram-iOS/Resources/Dice_4.tgs b/Telegram-iOS/Resources/Dice_4.tgs deleted file mode 100644 index 0cc05f7cea2686e3f1ec7bc61ff16552bb9b0969..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65388 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

$W>hNA?ZKI*E9GA7vQtwB4b3 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 diff --git a/Telegram-iOS/Resources/Dice_Rolling.tgs b/Telegram-iOS/Resources/Dice_Rolling.tgs new file mode 100644 index 0000000000000000000000000000000000000000..aad33bffe1c91c36b22ec59e80be5d9dafa23ab2 GIT binary patch literal 3939 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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 a0af4e214f..710bcd7c41 100644 --- a/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram-iOS/en.lproj/Localizable.strings @@ -5363,6 +5363,30 @@ Any member of this group will be able to see messages in the channel."; "Stats.FollowersTitle" = "FOLLOWERS"; "Stats.NotificationsTitle" = "NOTIFICATIONS"; "Stats.InteractionsTitle" = "INTERACTIONS"; +"Stats.InstantViewInteractionsTitle" = "INSTANT VIEW INTERACTIONS"; "Stats.ViewsBySourceTitle" = "VIEWS BY SOURCE"; "Stats.FollowersBySourceTitle" = "FOLLOWERS BY SOURCE"; "Stats.LanguagesTitle" = "LANGUAGES"; +"Stats.PostsTitle" = "RECENT POSTS"; + +"Stats.MessageViews_0" = "%@ views"; +"Stats.MessageViews_1" = "%@ view"; +"Stats.MessageViews_2" = "%@ views"; +"Stats.MessageViews_3_10" = "%@ views"; +"Stats.MessageViews_many" = "%@ views"; +"Stats.MessageViews_any" = "%@ views"; + +"Stats.MessageForwards_0" = "%@ forwards"; +"Stats.MessageForwards_1" = "%@ forward"; +"Stats.MessageForwards_2" = "%@ forwards"; +"Stats.MessageForwards_3_10" = "%@ forwardss"; +"Stats.MessageForwards_many" = "%@ forwards"; +"Stats.MessageForwards_any" = "%@ forwards"; + +"InstantPage.Views_0" = "%@ views"; +"InstantPage.Views_1" = "%@ view"; +"InstantPage.Views_2" = "%@ views"; +"InstantPage.Views_3_10" = "%@ views"; +"InstantPage.Views_many" = "%@ views"; +"InstantPage.Views_any" = "%@ views"; +"InstantPage.FeedbackButtonShort" = "Leave feedback"; diff --git a/submodules/AccountContext/Sources/AccountContext.swift b/submodules/AccountContext/Sources/AccountContext.swift index a589d54f23..cb51c254cc 100644 --- a/submodules/AccountContext/Sources/AccountContext.swift +++ b/submodules/AccountContext/Sources/AccountContext.swift @@ -200,6 +200,7 @@ public final class NavigateToChatControllerParams { public let updateTextInputState: ChatTextInputState? public let activateInput: Bool public let keepStack: NavigateToChatKeepStack + public let useExisting: Bool public let purposefulAction: (() -> Void)? public let scrollToEndIfExists: Bool public let activateMessageSearch: Bool @@ -208,7 +209,7 @@ public final class NavigateToChatControllerParams { public let parentGroupId: PeerGroupId? public let completion: () -> Void - public init(navigationController: NavigationController, chatController: ChatController? = nil, context: AccountContext, chatLocation: ChatLocation, subject: ChatControllerSubject? = nil, botStart: ChatControllerInitialBotStart? = nil, updateTextInputState: ChatTextInputState? = nil, activateInput: Bool = false, keepStack: NavigateToChatKeepStack = .default, purposefulAction: (() -> Void)? = nil, scrollToEndIfExists: Bool = false, activateMessageSearch: Bool = false, animated: Bool = true, options: NavigationAnimationOptions = [], parentGroupId: PeerGroupId? = nil, completion: @escaping () -> Void = {}) { + public init(navigationController: NavigationController, chatController: ChatController? = nil, context: AccountContext, chatLocation: ChatLocation, subject: ChatControllerSubject? = nil, botStart: ChatControllerInitialBotStart? = nil, updateTextInputState: ChatTextInputState? = nil, activateInput: Bool = false, keepStack: NavigateToChatKeepStack = .default, useExisting: Bool = true, purposefulAction: (() -> Void)? = nil, scrollToEndIfExists: Bool = false, activateMessageSearch: Bool = false, animated: Bool = true, options: NavigationAnimationOptions = [], parentGroupId: PeerGroupId? = nil, completion: @escaping () -> Void = {}) { self.navigationController = navigationController self.chatController = chatController self.context = context @@ -218,6 +219,7 @@ public final class NavigateToChatControllerParams { self.updateTextInputState = updateTextInputState self.activateInput = activateInput self.keepStack = keepStack + self.useExisting = useExisting self.purposefulAction = purposefulAction self.scrollToEndIfExists = scrollToEndIfExists self.activateMessageSearch = activateMessageSearch diff --git a/submodules/AuthTransferUI/Sources/AuthTransferConfirmationScreen.swift b/submodules/AuthTransferUI/Sources/AuthTransferConfirmationScreen.swift index 384ffae882..0d42f38bf3 100644 --- a/submodules/AuthTransferUI/Sources/AuthTransferConfirmationScreen.swift +++ b/submodules/AuthTransferUI/Sources/AuthTransferConfirmationScreen.swift @@ -194,7 +194,7 @@ private final class AuthDataTransferSplashScreenNode: ViewControllerTracingNode let badgeTextNode = ImmediateTextNode() badgeTextNode.displaysAsynchronously = false - badgeTextNode.attributedText = NSAttributedString(string: "\(i + 1)", font: badgeFont, textColor: self.presentationData.theme.list.itemCheckColors.foregroundColor) + badgeTextNode.attributedText = NSAttributedString(string: "\(i + 1)", font: badgeFont, textColor: self.presentationData.theme.list.itemCheckColors.foregroundColor, paragraphAlignment: .natural) badgeTextNode.maximumNumberOfLines = 0 badgeTextNode.lineSpacing = 0.1 badgeTextNodes.append(badgeTextNode) @@ -314,6 +314,8 @@ private final class AuthDataTransferSplashScreenNode: ViewControllerTracingNode let titleSize = self.titleNode.updateLayout(CGSize(width: layout.size.width - sideInset * 2.0, height: layout.size.height)) + let hasRTL = self.badgeTextNodes.first?.cachedLayout?.hasRTL ?? false + var badgeTextSizes: [CGSize] = [] var textSizes: [CGSize] = [] var textContentHeight: CGFloat = 0.0 diff --git a/submodules/Charts/Sources/Chart Screen/ChartStackSection.xib b/submodules/Charts/Sources/Chart Screen/ChartStackSection.xib deleted file mode 100644 index fc883dd96c..0000000000 --- a/submodules/Charts/Sources/Chart Screen/ChartStackSection.xib +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/submodules/Charts/Sources/Chart Screen/ChartsDataLoader.swift b/submodules/Charts/Sources/Chart Screen/ChartsDataLoader.swift deleted file mode 100644 index 085e4689bd..0000000000 --- a/submodules/Charts/Sources/Chart Screen/ChartsDataLoader.swift +++ /dev/null @@ -1,51 +0,0 @@ -// -// 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/Charts Reader/ChartsCollection.swift b/submodules/Charts/Sources/Charts Reader/ChartsCollection.swift deleted file mode 100644 index f0348f7ab6..0000000000 --- a/submodules/Charts/Sources/Charts Reader/ChartsCollection.swift +++ /dev/null @@ -1,92 +0,0 @@ -// -// 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, .step: - 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("Sanitazing: 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" - case step = "step" -} diff --git a/submodules/Charts/Sources/Charts Reader/ChartsDataManager.swift b/submodules/Charts/Sources/Charts Reader/ChartsDataManager.swift deleted file mode 100644 index 1a32f9bcee..0000000000 --- a/submodules/Charts/Sources/Charts Reader/ChartsDataManager.swift +++ /dev/null @@ -1,191 +0,0 @@ -// -// 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 deleted file mode 100644 index 89573b3f16..0000000000 --- a/submodules/Charts/Sources/Charts.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// 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 deleted file mode 100644 index 0fcaef599f..0000000000 --- a/submodules/Charts/Sources/Charts/Controllers/BaseChartController.swift +++ /dev/null @@ -1,170 +0,0 @@ -// -// 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 updateChartRangeTitle(animated: Bool) { - - } - - func updateChartRange(_ rangeFraction: ClosedRange, animated: Bool = true) { - 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 deleted file mode 100644 index 284be92d3b..0000000000 --- a/submodules/Charts/Sources/Charts/Controllers/GeneralChartComponentController.swift +++ /dev/null @@ -1,328 +0,0 @@ -// -// 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 deleted file mode 100644 index d7b67c4a21..0000000000 --- a/submodules/Charts/Sources/Charts/Controllers/Lines/BaseLinesChartController.swift +++ /dev/null @@ -1,236 +0,0 @@ -// -// 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.setDefaultDuration(.expandAnimationDuration) - DispatchQueue.main.asyncAfter(deadline: .now() + .expandAnimationDuration) { - TimeInterval.setDefaultDuration(.osXDuration) - } - } - - self.initialChartsCollection = chartsCollection - self.isZoomed = isZoomed - - self.setBackButtonVisibilityClosure?(isZoomed, animated) - - updateChartRangeTitle(animated: animated) - } - - override 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, animated: Bool) { - - } - - 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 deleted file mode 100644 index e122468207..0000000000 --- a/submodules/Charts/Sources/Charts/Controllers/Lines/GeneralLinesChartController.swift +++ /dev/null @@ -1,247 +0,0 @@ -// -// 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, animated: Bool) { - 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: animated) - updateVerticalLimitsAndRange(horizontalRange: horizontalRange, animated: animated) - } - - 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 deleted file mode 100644 index a07be6a703..0000000000 --- a/submodules/Charts/Sources/Charts/Controllers/Lines/TwoAxisLinesChartController.swift +++ /dev/null @@ -1,306 +0,0 @@ -// -// 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, animated: Bool) { - 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: animated) - updateVerticalLimitsAndRange(horizontalRange: horizontalRange, animated: animated) - } - - 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 deleted file mode 100644 index d75ba09d91..0000000000 --- a/submodules/Charts/Sources/Charts/Controllers/Percent And Pie/PercentChartComponentController.swift +++ /dev/null @@ -1,195 +0,0 @@ -// -// 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 deleted file mode 100644 index b5df648b11..0000000000 --- a/submodules/Charts/Sources/Charts/Controllers/Percent And Pie/PercentPieChartController.swift +++ /dev/null @@ -1,281 +0,0 @@ -// -// 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.setDefaultDuration(.expandAnimationDuration) - DispatchQueue.main.asyncAfter(deadline: .now() + .expandAnimationDuration) { - TimeInterval.setDefaultDuration(.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, animated: Bool) { - 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 deleted file mode 100644 index 68c3541912..0000000000 --- a/submodules/Charts/Sources/Charts/Controllers/Percent And Pie/PieChartComponentController.swift +++ /dev/null @@ -1,198 +0,0 @@ -// -// 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 deleted file mode 100644 index 2e1894465b..0000000000 --- a/submodules/Charts/Sources/Charts/Controllers/Stacked Bars/BarsComponentController.swift +++ /dev/null @@ -1,226 +0,0 @@ -// -// 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 deleted file mode 100644 index 008313d1cf..0000000000 --- a/submodules/Charts/Sources/Charts/Controllers/Stacked Bars/DailyBarsChartController.swift +++ /dev/null @@ -1,249 +0,0 @@ -// -// 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.setDefaultDuration(.expandAnimationDuration) - DispatchQueue.main.asyncAfter(deadline: .now() + .expandAnimationDuration) { - TimeInterval.setDefaultDuration(.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, animated: Bool) { - 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 deleted file mode 100644 index fc39a5f4c6..0000000000 --- a/submodules/Charts/Sources/Charts/Controllers/Stacked Bars/LinesComponentController.swift +++ /dev/null @@ -1,210 +0,0 @@ -// -// 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/Renderes/BarChartRenderer.swift b/submodules/Charts/Sources/Charts/Renderes/BarChartRenderer.swift deleted file mode 100644 index 73a6b52f42..0000000000 --- a/submodules/Charts/Sources/Charts/Renderes/BarChartRenderer.swift +++ /dev/null @@ -1,293 +0,0 @@ -// -// 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 deleted file mode 100644 index 63627566e7..0000000000 --- a/submodules/Charts/Sources/Charts/Renderes/BaseChartRenderer.swift +++ /dev/null @@ -1,116 +0,0 @@ -// -// 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 deleted file mode 100644 index ad61ff5dd9..0000000000 --- a/submodules/Charts/Sources/Charts/Renderes/ChartDetailsRenderer.swift +++ /dev/null @@ -1,147 +0,0 @@ -// -// 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 deleted file mode 100644 index 3ab90ef546..0000000000 --- a/submodules/Charts/Sources/Charts/Renderes/HorizontalScalesRenderer.swift +++ /dev/null @@ -1,99 +0,0 @@ -// -// 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 deleted file mode 100644 index e0417719d7..0000000000 --- a/submodules/Charts/Sources/Charts/Renderes/LineBulletsRenerer.swift +++ /dev/null @@ -1,67 +0,0 @@ -// -// 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 deleted file mode 100644 index fe3cdd47ab..0000000000 --- a/submodules/Charts/Sources/Charts/Renderes/LinesChartRenderer.swift +++ /dev/null @@ -1,538 +0,0 @@ -// -// 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 deleted file mode 100644 index 07ff3daaaa..0000000000 --- a/submodules/Charts/Sources/Charts/Renderes/PecentChartRenderer.swift +++ /dev/null @@ -1,132 +0,0 @@ -// -// 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 deleted file mode 100644 index e36fdaf913..0000000000 --- a/submodules/Charts/Sources/Charts/Renderes/PercentPieAnimationRenderer.swift +++ /dev/null @@ -1,202 +0,0 @@ -// -// 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 deleted file mode 100644 index c17663ce5f..0000000000 --- a/submodules/Charts/Sources/Charts/Renderes/PerformanceRenderer.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// 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 deleted file mode 100644 index ed4e6bdd49..0000000000 --- a/submodules/Charts/Sources/Charts/Renderes/PieChartRenderer.swift +++ /dev/null @@ -1,191 +0,0 @@ -// -// 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 deleted file mode 100644 index 39d1f26a46..0000000000 --- a/submodules/Charts/Sources/Charts/Renderes/VerticalLinesRenderer.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// 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 deleted file mode 100644 index 79d9dcec22..0000000000 --- a/submodules/Charts/Sources/Charts/Renderes/VerticalScalesRenderer.swift +++ /dev/null @@ -1,162 +0,0 @@ -// -// 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 deleted file mode 100644 index 6df8d17f76..0000000000 --- a/submodules/Charts/Sources/Helpers/AnimationController.swift +++ /dev/null @@ -1,178 +0,0 @@ -// -// 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 deleted file mode 100644 index 539a559756..0000000000 --- a/submodules/Charts/Sources/Helpers/Array+Utils.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// 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 deleted file mode 100644 index 7bde39b84f..0000000000 --- a/submodules/Charts/Sources/Helpers/CGFloat.swift +++ /dev/null @@ -1,17 +0,0 @@ -// -// 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 deleted file mode 100644 index b5bbd06da4..0000000000 --- a/submodules/Charts/Sources/Helpers/CGPoint+Extensions.swift +++ /dev/null @@ -1,219 +0,0 @@ -// -// 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 deleted file mode 100644 index 236d6c8a38..0000000000 --- a/submodules/Charts/Sources/Helpers/ClosedRange+Utils.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// 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 deleted file mode 100644 index 977244dfcc..0000000000 --- a/submodules/Charts/Sources/Helpers/CustomNavigationController.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// 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 deleted file mode 100644 index 2c91471c39..0000000000 --- a/submodules/Charts/Sources/Helpers/DisplayLinkService.swift +++ /dev/null @@ -1,114 +0,0 @@ -// -// 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/NumberFormatter+Utils.swift b/submodules/Charts/Sources/Helpers/NumberFormatter+Utils.swift deleted file mode 100644 index 1254d44249..0000000000 --- a/submodules/Charts/Sources/Helpers/NumberFormatter+Utils.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// 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 deleted file mode 100644 index 03e33e6524..0000000000 --- a/submodules/Charts/Sources/Helpers/OnePixelConstraint.swift +++ /dev/null @@ -1,17 +0,0 @@ -// -// 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 deleted file mode 100644 index db067f8a95..0000000000 --- a/submodules/Charts/Sources/Helpers/ScalesNumberFormatter.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// 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 deleted file mode 100644 index d093d2fc0c..0000000000 --- a/submodules/Charts/Sources/Helpers/TimeInterval+Utils.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// 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 setDefaultDuration(_ duration: TimeInterval) { - innerDefaultDuration = duration - } -} diff --git a/submodules/Charts/Sources/Helpers/TimeZone.swift b/submodules/Charts/Sources/Helpers/TimeZone.swift deleted file mode 100644 index 40ba9ab8f5..0000000000 --- a/submodules/Charts/Sources/Helpers/TimeZone.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// 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 deleted file mode 100644 index 0a70421d5e..0000000000 --- a/submodules/Charts/Sources/Helpers/UIColor+Utils.swift +++ /dev/null @@ -1,64 +0,0 @@ -// -// 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 deleted file mode 100644 index 50964025c2..0000000000 --- a/submodules/Charts/Sources/Helpers/UIImage+Utils.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// 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/Models/ChartLineData.swift b/submodules/Charts/Sources/Models/ChartLineData.swift deleted file mode 100644 index 79813a2a35..0000000000 --- a/submodules/Charts/Sources/Models/ChartLineData.swift +++ /dev/null @@ -1,76 +0,0 @@ -// -// 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 deleted file mode 100644 index f0de7b52ae..0000000000 --- a/submodules/Charts/Sources/Models/ColorMode.swift +++ /dev/null @@ -1,175 +0,0 @@ -// -// 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 deleted file mode 100644 index 6ace8c2c65..0000000000 --- a/submodules/Charts/Sources/Models/LinesChartLabel.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// 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 deleted file mode 100644 index 0fd7142eda..0000000000 --- a/submodules/Charts/Sources/Models/LinesSelectionLabel.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// 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/GraphCore/BUCK b/submodules/GraphCore/BUCK new file mode 100644 index 0000000000..a43e82f354 --- /dev/null +++ b/submodules/GraphCore/BUCK @@ -0,0 +1,15 @@ +load("//Config:buck_rule_macros.bzl", "static_library") + +static_library( + name = "GraphCore", + srcs = glob([ + "Sources/**/*.swift", + ]), + deps = [ + "//submodules/Display:Display#shared", + ], + frameworks = [ + "$SDKROOT/System/Library/Frameworks/Foundation.framework", + "$SDKROOT/System/Library/Frameworks/UIKit.framework", + ], +) diff --git a/submodules/GraphCore/Graph.h b/submodules/GraphCore/Graph.h deleted file mode 100644 index e4b99a3ca3..0000000000 --- a/submodules/GraphCore/Graph.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// Graph.h -// Graph -// -// Created by Mikhail Filimonov on 03.02.2020. -// Copyright © 2020 Telegram. All rights reserved. -// - -#import - -//! Project version number for Graph. -FOUNDATION_EXPORT double GraphVersionNumber; - -//! Project version string for Graph. -FOUNDATION_EXPORT const unsigned char GraphVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - - diff --git a/submodules/GraphCore/Info.plist b/submodules/GraphCore/Info.plist index 861c829fcb..e1fe4cfb7b 100644 --- a/submodules/GraphCore/Info.plist +++ b/submodules/GraphCore/Info.plist @@ -18,7 +18,5 @@ 1.0 CFBundleVersion $(CURRENT_PROJECT_VERSION) - NSHumanReadableCopyright - Copyright © 2020 Telegram. All rights reserved. diff --git a/submodules/GraphCore/src/Charts Reader/ChartVisibilityItem.swift b/submodules/GraphCore/Sources/Charts Reader/ChartVisibilityItem.swift similarity index 100% rename from submodules/GraphCore/src/Charts Reader/ChartVisibilityItem.swift rename to submodules/GraphCore/Sources/Charts Reader/ChartVisibilityItem.swift diff --git a/submodules/GraphCore/src/Charts Reader/ChartsCollection.swift b/submodules/GraphCore/Sources/Charts Reader/ChartsCollection.swift similarity index 98% rename from submodules/GraphCore/src/Charts Reader/ChartsCollection.swift rename to submodules/GraphCore/Sources/Charts Reader/ChartsCollection.swift index 8b3d9f8a20..4f42d69e56 100644 --- a/submodules/GraphCore/src/Charts Reader/ChartsCollection.swift +++ b/submodules/GraphCore/Sources/Charts Reader/ChartsCollection.swift @@ -68,7 +68,7 @@ public extension ChartsCollection { switch type { case .axix: axixValuesToSetup = try column.dropFirst().map { Date(timeIntervalSince1970: try Convert.doubleFrom($0) / 1000) } - case .chart, .bar, .area: + case .chart, .bar, .area, .step: guard let colorString = colors[columnId], let color = GColor(hexString: colorString) else { throw ChartsError.generalConversion("Unable to get color name from: \(colors) - \(columnId)") @@ -99,4 +99,5 @@ private enum ColumnType: String { case chart = "line" case area = "area" case bar = "bar" + case step = "step" } diff --git a/submodules/GraphCore/src/Charts Reader/ChartsDataManager.swift b/submodules/GraphCore/Sources/Charts Reader/ChartsDataManager.swift similarity index 100% rename from submodules/GraphCore/src/Charts Reader/ChartsDataManager.swift rename to submodules/GraphCore/Sources/Charts Reader/ChartsDataManager.swift diff --git a/submodules/GraphCore/src/Charts Reader/ChartsError.swift b/submodules/GraphCore/Sources/Charts Reader/ChartsError.swift similarity index 100% rename from submodules/GraphCore/src/Charts Reader/ChartsError.swift rename to submodules/GraphCore/Sources/Charts Reader/ChartsError.swift diff --git a/submodules/GraphCore/src/Charts Reader/Convert.swift b/submodules/GraphCore/Sources/Charts Reader/Convert.swift similarity index 100% rename from submodules/GraphCore/src/Charts Reader/Convert.swift rename to submodules/GraphCore/Sources/Charts Reader/Convert.swift diff --git a/submodules/GraphCore/src/Charts/Controllers/BaseChartController.swift b/submodules/GraphCore/Sources/Charts/Controllers/BaseChartController.swift similarity index 100% rename from submodules/GraphCore/src/Charts/Controllers/BaseChartController.swift rename to submodules/GraphCore/Sources/Charts/Controllers/BaseChartController.swift diff --git a/submodules/GraphCore/src/Charts/Controllers/GeneralChartComponentController.swift b/submodules/GraphCore/Sources/Charts/Controllers/GeneralChartComponentController.swift similarity index 100% rename from submodules/GraphCore/src/Charts/Controllers/GeneralChartComponentController.swift rename to submodules/GraphCore/Sources/Charts/Controllers/GeneralChartComponentController.swift diff --git a/submodules/GraphCore/src/Charts/Controllers/Lines/BaseLinesChartController.swift b/submodules/GraphCore/Sources/Charts/Controllers/Lines/BaseLinesChartController.swift similarity index 99% rename from submodules/GraphCore/src/Charts/Controllers/Lines/BaseLinesChartController.swift rename to submodules/GraphCore/Sources/Charts/Controllers/Lines/BaseLinesChartController.swift index ab43ff0b8f..56494c20dc 100644 --- a/submodules/GraphCore/src/Charts/Controllers/Lines/BaseLinesChartController.swift +++ b/submodules/GraphCore/Sources/Charts/Controllers/Lines/BaseLinesChartController.swift @@ -45,7 +45,6 @@ public class BaseLinesChartController: BaseChartController { } func updateChartRangeTitle(animated: Bool) { - let range: ClosedRange if zoomedChartRange == BaseConstants.defaultRange { range = initialChartRange diff --git a/submodules/GraphCore/src/Charts/Controllers/Lines/GeneralLinesChartController.swift b/submodules/GraphCore/Sources/Charts/Controllers/Lines/GeneralLinesChartController.swift similarity index 90% rename from submodules/GraphCore/src/Charts/Controllers/Lines/GeneralLinesChartController.swift rename to submodules/GraphCore/Sources/Charts/Controllers/Lines/GeneralLinesChartController.swift index 89e8ae6e57..79b3875ce6 100644 --- a/submodules/GraphCore/src/Charts/Controllers/Lines/GeneralLinesChartController.swift +++ b/submodules/GraphCore/Sources/Charts/Controllers/Lines/GeneralLinesChartController.swift @@ -24,7 +24,7 @@ public class GeneralLinesChartController: BaseLinesChartController { private let horizontalScalesRenderer = HorizontalScalesRenderer() private let verticalScalesRenderer = VerticalScalesRenderer() private let verticalLineRenderer = VerticalLinesRenderer() - private let lineBulletsRenerer = LineBulletsRenerer() + private let lineBulletsRenderer = LineBulletsRenderer() private let previewLinesRenderer = LinesChartRenderer() @@ -41,7 +41,7 @@ public class GeneralLinesChartController: BaseLinesChartController { self.mainLinesRenderer.optimizationLevel = BaseConstants.linesChartOptimizationLevel self.previewLinesRenderer.optimizationLevel = BaseConstants.previewLinesChartOptimizationLevel - self.lineBulletsRenerer.isEnabled = false + self.lineBulletsRenderer.isEnabled = false super.init(chartsCollection: chartsCollection) self.zoomChartVisibility = chartVisibility @@ -61,7 +61,7 @@ public class GeneralLinesChartController: BaseLinesChartController { 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, + self.lineBulletsRenderer.bullets = self.chartLines.map { LineBulletsRenderer.Bullet(coordinate: $0.points.first ?? .zero, color: $0.color)} let chartRange: ClosedRange @@ -77,7 +77,7 @@ public class GeneralLinesChartController: BaseLinesChartController { self.mainLinesRenderer.setLines(lines: chartLines, animated: animated) self.previewLinesRenderer.setLines(lines: chartLines, animated: animated) - updateHorizontalLimists(horizontalRange: chartRange, animated: animated) + updateHorizontalLimits(horizontalRange: chartRange, animated: animated) updateMainChartHorizontalRange(range: chartRange, animated: animated) updateVerticalLimitsAndRange(horizontalRange: chartRange, animated: animated) self.chartRangeUpdatedClosure?(currentChartHorizontalRangeFraction, animated) @@ -97,7 +97,7 @@ public class GeneralLinesChartController: BaseLinesChartController { horizontalScalesRenderer, verticalScalesRenderer, verticalLineRenderer, - lineBulletsRenerer + lineBulletsRenderer ] } @@ -111,7 +111,7 @@ public class GeneralLinesChartController: BaseLinesChartController { 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) + lineBulletsRenderer.setLineVisible(isVisible, at: index, animated: animated) } updateVerticalLimitsAndRange(horizontalRange: currentHorizontalRange, animated: true) @@ -132,10 +132,10 @@ public class GeneralLinesChartController: BaseLinesChartController { super.chartInteractionDidBegin(point: point) - self.lineBulletsRenerer.bullets = chartLines.compactMap { chart in - return LineBulletsRenerer.Bullet(coordinate: chart.points[minIndex], color: chart.color) + self.lineBulletsRenderer.bullets = chartLines.compactMap { chart in + return LineBulletsRenderer.Bullet(coordinate: chart.points[minIndex], color: chart.color) } - self.lineBulletsRenerer.isEnabled = true + self.lineBulletsRenderer.isEnabled = true let chartValue: CGFloat = CGFloat(closestDate.timeIntervalSince1970) let detailsViewPosition = (chartValue - horizontalRange.lowerBound) / horizontalRange.distance * chartFrame.width + chartFrame.minX @@ -158,7 +158,7 @@ public class GeneralLinesChartController: BaseLinesChartController { public override func cancelChartInteraction() { super.cancelChartInteraction() - self.lineBulletsRenerer.isEnabled = false + self.lineBulletsRenderer.isEnabled = false self.setDetailsChartVisibleClosure?(false, true) self.verticalLineRenderer.values = [] @@ -187,7 +187,7 @@ public class GeneralLinesChartController: BaseLinesChartController { updateChartRangeTitle(animated: true) updateMainChartHorizontalRange(range: horizontalRange, animated: false) - updateHorizontalLimists(horizontalRange: horizontalRange, animated: true) + updateHorizontalLimits(horizontalRange: horizontalRange, animated: true) updateVerticalLimitsAndRange(horizontalRange: horizontalRange, animated: true) } @@ -196,7 +196,7 @@ public class GeneralLinesChartController: BaseLinesChartController { horizontalScalesRenderer.setup(horizontalRange: range, animated: animated) verticalScalesRenderer.setup(horizontalRange: range, animated: animated) verticalLineRenderer.setup(horizontalRange: range, animated: animated) - lineBulletsRenerer.setup(horizontalRange: range, animated: animated) + lineBulletsRenderer.setup(horizontalRange: range, animated: animated) } func updateMainChartVerticalRange(range: ClosedRange, animated: Bool) { @@ -204,10 +204,10 @@ public class GeneralLinesChartController: BaseLinesChartController { horizontalScalesRenderer.setup(verticalRange: range, animated: animated) verticalScalesRenderer.setup(verticalRange: range, animated: animated) verticalLineRenderer.setup(verticalRange: range, animated: animated) - lineBulletsRenerer.setup(verticalRange: range, animated: animated) + lineBulletsRenderer.setup(verticalRange: range, animated: animated) } - func updateHorizontalLimists(horizontalRange: ClosedRange, animated: Bool) { + func updateHorizontalLimits(horizontalRange: ClosedRange, animated: Bool) { if let (stride, labels) = horizontalLimitsLabels(horizontalRange: horizontalRange, scaleType: isZoomed ? .hour : .day, prevoiusHorizontalStrideInterval: prevoiusHorizontalStrideInterval) { @@ -221,7 +221,6 @@ public class GeneralLinesChartController: BaseLinesChartController { calculatingRange: horizontalRange, addBounds: true) { - let (range, labels) = verticalLimitsLabels(verticalRange: verticalRange) if verticalScalesRenderer.verticalRange.end != range { @@ -245,7 +244,7 @@ public class GeneralLinesChartController: BaseLinesChartController { verticalScalesRenderer.labelsColor = colorMode.chartLabelsColor verticalScalesRenderer.axisXColor = colorMode.chartStrongLinesColor verticalScalesRenderer.horizontalLinesColor = colorMode.chartHelperLinesColor - lineBulletsRenerer.setInnerColor(colorMode.chartBackgroundColor, animated: animated) + lineBulletsRenderer.setInnerColor(colorMode.chartBackgroundColor, animated: animated) verticalLineRenderer.linesColor = colorMode.chartStrongLinesColor } } diff --git a/submodules/GraphCore/src/Charts/Controllers/Lines/TwoAxisLinesChartController.swift b/submodules/GraphCore/Sources/Charts/Controllers/Lines/TwoAxisLinesChartController.swift similarity index 91% rename from submodules/GraphCore/src/Charts/Controllers/Lines/TwoAxisLinesChartController.swift rename to submodules/GraphCore/Sources/Charts/Controllers/Lines/TwoAxisLinesChartController.swift index f921c1f4f4..f78870d86f 100644 --- a/submodules/GraphCore/src/Charts/Controllers/Lines/TwoAxisLinesChartController.swift +++ b/submodules/GraphCore/Sources/Charts/Controllers/Lines/TwoAxisLinesChartController.swift @@ -22,7 +22,7 @@ public class TwoAxisLinesChartController: BaseLinesChartController { class GraphController { let mainLinesRenderer = LinesChartRenderer() let verticalScalesRenderer = VerticalScalesRenderer() - let lineBulletsRenerer = LineBulletsRenerer() + let lineBulletsRenderer = LineBulletsRenderer() let previewLinesRenderer = LinesChartRenderer() var chartLines: [LinesChartRenderer.LineData] = [] @@ -32,7 +32,7 @@ public class TwoAxisLinesChartController: BaseLinesChartController { init() { self.mainLinesRenderer.lineWidth = 2 self.previewLinesRenderer.lineWidth = 1 - self.lineBulletsRenerer.isEnabled = false + self.lineBulletsRenderer.isEnabled = false self.mainLinesRenderer.optimizationLevel = BaseConstants.linesChartOptimizationLevel self.previewLinesRenderer.optimizationLevel = BaseConstants.previewLinesChartOptimizationLevel @@ -41,7 +41,7 @@ public class TwoAxisLinesChartController: BaseLinesChartController { func updateMainChartVerticalRange(range: ClosedRange, animated: Bool) { mainLinesRenderer.setup(verticalRange: range, animated: animated) verticalScalesRenderer.setup(verticalRange: range, animated: animated) - lineBulletsRenerer.setup(verticalRange: range, animated: animated) + lineBulletsRenderer.setup(verticalRange: range, animated: animated) } } @@ -77,7 +77,7 @@ public class TwoAxisLinesChartController: BaseLinesChartController { 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, + controller.lineBulletsRenderer.bullets = chartLines.map { LineBulletsRenderer.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) @@ -97,14 +97,14 @@ public class TwoAxisLinesChartController: BaseLinesChartController { chartRange = initialChartRange } - updateHorizontalLimists(horizontalRange: chartRange, animated: animated) + updateHorizontalLimits(horizontalRange: chartRange, animated: animated) updateMainChartHorizontalRange(range: chartRange, animated: animated) updateVerticalLimitsAndRange(horizontalRange: chartRange, animated: animated) self.chartRangeUpdatedClosure?(currentChartHorizontalRangeFraction, animated) } - public override func initializeChart() { + public 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) @@ -114,7 +114,7 @@ public class TwoAxisLinesChartController: BaseLinesChartController { public override var mainChartRenderers: [ChartViewRenderer] { return graphControllers.map { $0.mainLinesRenderer } + - graphControllers.flatMap { [$0.verticalScalesRenderer, $0.lineBulletsRenerer] } + + graphControllers.flatMap { [$0.verticalScalesRenderer, $0.lineBulletsRenderer] } + [horizontalScalesRenderer, verticalLineRenderer, // performanceRenderer ] @@ -133,7 +133,7 @@ public class TwoAxisLinesChartController: BaseLinesChartController { 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.lineBulletsRenderer.setLineVisible(isVisible, at: graphIndex, animated: animated) } graph.verticalScalesRenderer.setVisible(isVisible, animated: animated) if let firstIndex = firstIndex { @@ -160,10 +160,10 @@ public class TwoAxisLinesChartController: BaseLinesChartController { 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.lineBulletsRenderer.bullets = graphController.chartLines.map { chart in + LineBulletsRenderer.Bullet(coordinate: chart.points[minIndex], color: chart.color) } - graphController.lineBulletsRenerer.isEnabled = true + graphController.lineBulletsRenderer.isEnabled = true } let chartValue: CGFloat = CGFloat(closestDate.timeIntervalSince1970) @@ -187,7 +187,7 @@ public class TwoAxisLinesChartController: BaseLinesChartController { public override func cancelChartInteraction() { super.cancelChartInteraction() for graphController in graphControllers { - graphController.lineBulletsRenerer.isEnabled = false + graphController.lineBulletsRenderer.isEnabled = false } self.setDetailsChartVisibleClosure?(false, true) @@ -210,7 +210,7 @@ public class TwoAxisLinesChartController: BaseLinesChartController { updateChartRangeTitle(animated: true) updateMainChartHorizontalRange(range: horizontalRange, animated: false) - updateHorizontalLimists(horizontalRange: horizontalRange, animated: true) + updateHorizontalLimits(horizontalRange: horizontalRange, animated: true) updateVerticalLimitsAndRange(horizontalRange: horizontalRange, animated: true) } @@ -218,13 +218,13 @@ public class TwoAxisLinesChartController: BaseLinesChartController { 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) + controller.lineBulletsRenderer.setup(horizontalRange: range, animated: animated) } horizontalScalesRenderer.setup(horizontalRange: range, animated: animated) verticalLineRenderer.setup(horizontalRange: range, animated: animated) } - func updateHorizontalLimists(horizontalRange: ClosedRange, animated: Bool) { + func updateHorizontalLimits(horizontalRange: ClosedRange, animated: Bool) { if let (stride, labels) = horizontalLimitsLabels(horizontalRange: horizontalRange, scaleType: isZoomed ? .hour : .day, prevoiusHorizontalStrideInterval: prevoiusHorizontalStrideInterval) { @@ -278,7 +278,6 @@ public class TwoAxisLinesChartController: BaseLinesChartController { let numberFormatter = BaseConstants.chartNumberFormatter for (index, controller) in graphControllers.enumerated() { - let (startValue, base, _, maximumNumberOfDecimals) = dividorsAndMultiplers[index] let updatedRange = startValue...(startValue + base * CGFloat(totalCount)) @@ -304,7 +303,7 @@ public class TwoAxisLinesChartController: BaseLinesChartController { for controller in graphControllers { controller.verticalScalesRenderer.horizontalLinesColor = colorMode.chartHelperLinesColor - controller.lineBulletsRenerer.setInnerColor(colorMode.chartBackgroundColor, animated: animated) + controller.lineBulletsRenderer.setInnerColor(colorMode.chartBackgroundColor, animated: animated) controller.verticalScalesRenderer.axisXColor = colorMode.chartStrongLinesColor } } diff --git a/submodules/GraphCore/src/Charts/Controllers/Percent And Pie/PercentChartComponentController.swift b/submodules/GraphCore/Sources/Charts/Controllers/Percent And Pie/PercentChartComponentController.swift similarity index 100% rename from submodules/GraphCore/src/Charts/Controllers/Percent And Pie/PercentChartComponentController.swift rename to submodules/GraphCore/Sources/Charts/Controllers/Percent And Pie/PercentChartComponentController.swift diff --git a/submodules/GraphCore/src/Charts/Controllers/Percent And Pie/PercentPieChartController.swift b/submodules/GraphCore/Sources/Charts/Controllers/Percent And Pie/PercentPieChartController.swift similarity index 86% rename from submodules/GraphCore/src/Charts/Controllers/Percent And Pie/PercentPieChartController.swift rename to submodules/GraphCore/Sources/Charts/Controllers/Percent And Pie/PercentPieChartController.swift index 3a8fc82be4..fda8ed0f6a 100644 --- a/submodules/GraphCore/src/Charts/Controllers/Percent And Pie/PercentPieChartController.swift +++ b/submodules/GraphCore/Sources/Charts/Controllers/Percent And Pie/PercentPieChartController.swift @@ -94,6 +94,10 @@ public class PercentPieChartController: BaseChartController { totalHorizontalRange: BaseConstants.defaultRange, totalVerticalRange: BaseConstants.defaultRange) switchToChart(chartsCollection: percentController.chartsCollection, isZoomed: false, animated: false) + + TimeInterval.animationDurationMultipler = 0.00001 + self.didTapZoomIn(date: Date(timeIntervalSinceReferenceDate: 603849600.0), animated: false) + TimeInterval.animationDurationMultipler = 1 } func switchToChart(chartsCollection: ChartsCollection, isZoomed: Bool, animated: Bool) { @@ -238,32 +242,36 @@ public class PercentPieChartController: BaseChartController { } } - public override func didTapZoomIn(date: Date) { + func didTapZoomIn(date: Date, animated: Bool) { 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 + 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) + switchToChart(chartsCollection: newCollection, isZoomed: true, animated: true) + } + + public override func didTapZoomIn(date: Date) { + self.didTapZoomIn(date: date, animated: true) } public override func didTapZoomOut() { diff --git a/submodules/GraphCore/src/Charts/Controllers/Percent And Pie/PieChartComponentController.swift b/submodules/GraphCore/Sources/Charts/Controllers/Percent And Pie/PieChartComponentController.swift similarity index 100% rename from submodules/GraphCore/src/Charts/Controllers/Percent And Pie/PieChartComponentController.swift rename to submodules/GraphCore/Sources/Charts/Controllers/Percent And Pie/PieChartComponentController.swift diff --git a/submodules/GraphCore/src/Charts/Controllers/Stacked Bars/BarsComponentController.swift b/submodules/GraphCore/Sources/Charts/Controllers/Stacked Bars/BarsComponentController.swift similarity index 87% rename from submodules/GraphCore/src/Charts/Controllers/Stacked Bars/BarsComponentController.swift rename to submodules/GraphCore/Sources/Charts/Controllers/Stacked Bars/BarsComponentController.swift index c0193ecbdf..e77461ffe1 100644 --- a/submodules/GraphCore/src/Charts/Controllers/Stacked Bars/BarsComponentController.swift +++ b/submodules/GraphCore/Sources/Charts/Controllers/Stacked Bars/BarsComponentController.swift @@ -17,6 +17,7 @@ class BarsComponentController: GeneralChartComponentController { let mainBarsRenderer: BarChartRenderer let horizontalScalesRenderer: HorizontalScalesRenderer let verticalScalesRenderer: VerticalScalesRenderer + let secondVerticalScalesRenderer: VerticalScalesRenderer? let previewBarsChartRenderer: BarChartRenderer private(set) var barsWidth: CGFloat = 1 @@ -33,6 +34,9 @@ class BarsComponentController: GeneralChartComponentController { self.verticalScalesRenderer = verticalScalesRenderer self.previewBarsChartRenderer = previewBarsChartRenderer + self.secondVerticalScalesRenderer = VerticalScalesRenderer() + self.secondVerticalScalesRenderer?.isRightAligned = true + self.mainBarsRenderer.optimizationLevel = BaseConstants.barsChartOptimizationLevel self.previewBarsChartRenderer.optimizationLevel = BaseConstants.barsChartOptimizationLevel @@ -71,11 +75,11 @@ class BarsComponentController: GeneralChartComponentController { override func willAppear(animated: Bool) { mainBarsRenderer.bars = self.chartBars previewBarsChartRenderer.bars = self.chartBars - - previewBarsChartRenderer.setup(verticalRange: totalVerticalRange, animated: animated) + + previewBarsChartRenderer.setup(verticalRange: 0...117278, animated: animated) previewBarsChartRenderer.setup(horizontalRange: totalHorizontalRange, animated: animated) - setupMainChart(verticalRange: initialVerticalRange, animated: animated) + setupMainChart(verticalRange: 0...117278, animated: animated) setupMainChart(horizontalRange: initialHorizontalRange, animated: animated) updateChartVerticalRanges(horizontalRange: initialHorizontalRange, animated: animated) @@ -115,12 +119,16 @@ class BarsComponentController: GeneralChartComponentController { horizontalScalesRenderer.setVisible(visible, animated: animated) verticalScalesRenderer.setVisible(visible, animated: animated) previewBarsChartRenderer.setVisible(visible, animated: animated) + + secondVerticalScalesRenderer?.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) + + secondVerticalScalesRenderer?.setup(horizontalRange: horizontalRange, animated: animated) } var visibleBars: BarChartRenderer.BarsData { @@ -143,8 +151,15 @@ class BarsComponentController: GeneralChartComponentController { verticalScalesRenderer.setVisible(true, animated: animated) setupMainChart(verticalRange: range, animated: animated) + + let (secondRange, secondLabels) = verticalLimitsLabels(verticalRange: range) + if secondVerticalScalesRenderer?.verticalRange.end != secondRange { + secondVerticalScalesRenderer?.setup(verticalLimitsLabels: secondLabels, animated: animated) + } + secondVerticalScalesRenderer?.setVisible(true, animated: animated) } else { verticalScalesRenderer.setVisible(false, animated: animated) + secondVerticalScalesRenderer?.setVisible(false, animated: animated) } if let range = BarChartRenderer.BarsData.verticalRange(bars: visibleBars) { @@ -153,9 +168,14 @@ class BarsComponentController: GeneralChartComponentController { } func setupMainChart(verticalRange: ClosedRange, animated: Bool) { + var verticalRange = verticalRange + if verticalRange.upperBound > 2000 && verticalRange.upperBound < 10000 { + verticalRange = 0...117278 + } mainBarsRenderer.setup(verticalRange: verticalRange, animated: animated) horizontalScalesRenderer.setup(verticalRange: verticalRange, animated: animated) verticalScalesRenderer.setup(verticalRange: verticalRange, animated: animated) + secondVerticalScalesRenderer?.setup(verticalRange: verticalRange, animated: animated) } public override func updateChartsVisibility(visibility: [Bool], animated: Bool) { @@ -181,7 +201,7 @@ class BarsComponentController: GeneralChartComponentController { viewModel.totalValue = ChartDetailsViewModel.Value(prefix: nil, title: "Total", - value: BaseConstants.detailsNumberFormatter.string(from: totalSumm), + value: BaseConstants.detailsNumberFormatter.string(from: totalSumm), color: .white, visible: visibleChartValues.count > 1) return viewModel @@ -215,6 +235,10 @@ class BarsComponentController: GeneralChartComponentController { verticalScalesRenderer.horizontalLinesColor = colorMode.barChartStrongLinesColor mainBarsRenderer.update(backgroundColor: colorMode.chartBackgroundColor, animated: false) previewBarsChartRenderer.update(backgroundColor: colorMode.chartBackgroundColor, animated: false) + + secondVerticalScalesRenderer?.labelsColor = colorMode.chartLabelsColor + secondVerticalScalesRenderer?.axisXColor = colorMode.barChartStrongLinesColor + secondVerticalScalesRenderer?.horizontalLinesColor = colorMode.barChartStrongLinesColor } override func updateChartRangeTitle(animated: Bool) { diff --git a/submodules/GraphCore/src/Charts/Controllers/Stacked Bars/DailyBarsChartController.swift b/submodules/GraphCore/Sources/Charts/Controllers/Stacked Bars/DailyBarsChartController.swift similarity index 99% rename from submodules/GraphCore/src/Charts/Controllers/Stacked Bars/DailyBarsChartController.swift rename to submodules/GraphCore/Sources/Charts/Controllers/Stacked Bars/DailyBarsChartController.swift index 50da946780..c70460af3c 100644 --- a/submodules/GraphCore/src/Charts/Controllers/Stacked Bars/DailyBarsChartController.swift +++ b/submodules/GraphCore/Sources/Charts/Controllers/Stacked Bars/DailyBarsChartController.swift @@ -31,7 +31,7 @@ public class DailyBarsChartController: BaseChartController { horizontalScalesRenderer: horizontalScalesRenderer, verticalScalesRenderer: verticalScalesRenderer, verticalLineRenderer: VerticalLinesRenderer(), - lineBulletsRenerer: LineBulletsRenerer(), + lineBulletsRenderer: LineBulletsRenderer(), previewLinesChartRenderer: LinesChartRenderer()) super.init(chartsCollection: chartsCollection) @@ -69,7 +69,7 @@ public class DailyBarsChartController: BaseChartController { barsController.horizontalScalesRenderer, barsController.verticalScalesRenderer, linesController.verticalLineRenderer, - linesController.lineBulletsRenerer, + linesController.lineBulletsRenderer, // performanceRenderer ] } @@ -79,7 +79,7 @@ public class DailyBarsChartController: BaseChartController { linesController.previewLinesChartRenderer] } - public override func initializeChart() { + public override func initializeChart() { barsController.initialize(chartsCollection: initialChartsCollection, initialDate: Date(), totalHorizontalRange: BaseConstants.defaultRange, diff --git a/submodules/GraphCore/src/Charts/Controllers/Stacked Bars/LinesComponentController.swift b/submodules/GraphCore/Sources/Charts/Controllers/Stacked Bars/LinesComponentController.swift similarity index 89% rename from submodules/GraphCore/src/Charts/Controllers/Stacked Bars/LinesComponentController.swift rename to submodules/GraphCore/Sources/Charts/Controllers/Stacked Bars/LinesComponentController.swift index 42abe3494c..626e6953a4 100644 --- a/submodules/GraphCore/src/Charts/Controllers/Stacked Bars/LinesComponentController.swift +++ b/submodules/GraphCore/Sources/Charts/Controllers/Stacked Bars/LinesComponentController.swift @@ -18,7 +18,7 @@ class LinesComponentController: GeneralChartComponentController { let horizontalScalesRenderer: HorizontalScalesRenderer let verticalScalesRenderer: VerticalScalesRenderer let verticalLineRenderer: VerticalLinesRenderer - let lineBulletsRenerer: LineBulletsRenerer + let lineBulletsRenderer: LineBulletsRenderer let previewLinesChartRenderer: LinesChartRenderer @@ -35,13 +35,13 @@ class LinesComponentController: GeneralChartComponentController { horizontalScalesRenderer: HorizontalScalesRenderer, verticalScalesRenderer: VerticalScalesRenderer, verticalLineRenderer: VerticalLinesRenderer, - lineBulletsRenerer: LineBulletsRenerer, + lineBulletsRenderer: LineBulletsRenderer, previewLinesChartRenderer: LinesChartRenderer) { self.mainLinesRenderer = mainLinesRenderer self.horizontalScalesRenderer = horizontalScalesRenderer self.verticalScalesRenderer = verticalScalesRenderer self.verticalLineRenderer = verticalLineRenderer - self.lineBulletsRenerer = lineBulletsRenerer + self.lineBulletsRenderer = lineBulletsRenderer self.previewLinesChartRenderer = previewLinesChartRenderer self.userLinesTransitionAnimation = userLinesTransitionAnimation @@ -52,7 +52,7 @@ class LinesComponentController: GeneralChartComponentController { self.previewLinesChartRenderer.lineWidth = BaseConstants.previewChartLineWidth self.previewLinesChartRenderer.optimizationLevel = BaseConstants.previewLinesChartOptimizationLevel - self.lineBulletsRenerer.isEnabled = false + self.lineBulletsRenderer.isEnabled = false } override func initialize(chartsCollection: ChartsCollection, @@ -62,7 +62,7 @@ class LinesComponentController: GeneralChartComponentController { 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, + self.lineBulletsRenderer.bullets = self.chartLines.map { LineBulletsRenderer.Bullet(coordinate: $0.points.first ?? .zero, color: $0.color)} super.initialize(chartsCollection: chartsCollection, @@ -121,7 +121,7 @@ class LinesComponentController: GeneralChartComponentController { verticalScalesRenderer.setVisible(visible, animated: animated) verticalLineRenderer.setVisible(visible, animated: animated) previewLinesChartRenderer.setVisible(visible, animated: animated) - lineBulletsRenerer.setVisible(visible, animated: animated) + lineBulletsRenderer.setVisible(visible, animated: animated) } func setupMainChart(horizontalRange: ClosedRange, animated: Bool) { @@ -129,7 +129,7 @@ class LinesComponentController: GeneralChartComponentController { horizontalScalesRenderer.setup(horizontalRange: horizontalRange, animated: animated) verticalScalesRenderer.setup(horizontalRange: horizontalRange, animated: animated) verticalLineRenderer.setup(horizontalRange: horizontalRange, animated: animated) - lineBulletsRenerer.setup(horizontalRange: horizontalRange, animated: animated) + lineBulletsRenderer.setup(horizontalRange: horizontalRange, animated: animated) } var visibleLines: [LinesChartRenderer.LineData] { @@ -161,7 +161,7 @@ class LinesComponentController: GeneralChartComponentController { horizontalScalesRenderer.setup(verticalRange: verticalRange, animated: animated) verticalScalesRenderer.setup(verticalRange: verticalRange, animated: animated) verticalLineRenderer.setup(verticalRange: verticalRange, animated: animated) - lineBulletsRenerer.setup(verticalRange: verticalRange, animated: animated) + lineBulletsRenderer.setup(verticalRange: verticalRange, animated: animated) } public override func updateChartsVisibility(visibility: [Bool], animated: Bool) { @@ -169,7 +169,7 @@ class LinesComponentController: GeneralChartComponentController { 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) + lineBulletsRenderer.setLineVisible(isVisible, at: index, animated: animated) } updateChartVerticalRanges(horizontalRange: currentHorizontalMainChartRange, animated: true) } @@ -187,10 +187,10 @@ class LinesComponentController: GeneralChartComponentController { 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) + lineBulletsRenderer.isEnabled = true + lineBulletsRenderer.setVisible(true, animated: animted) + lineBulletsRenderer.bullets = chartLines.compactMap { chart in + return LineBulletsRenderer.Bullet(coordinate: chart.points[dataIndex], color: chart.color) } } @@ -199,7 +199,7 @@ class LinesComponentController: GeneralChartComponentController { verticalLineRenderer.values = [] verticalLineRenderer.isEnabled = false - lineBulletsRenerer.isEnabled = false + lineBulletsRenderer.isEnabled = false } override func apply(colorMode: GColorMode, animated: Bool) { @@ -209,7 +209,7 @@ class LinesComponentController: GeneralChartComponentController { verticalScalesRenderer.labelsColor = colorMode.chartLabelsColor verticalScalesRenderer.axisXColor = colorMode.chartStrongLinesColor verticalScalesRenderer.horizontalLinesColor = colorMode.chartHelperLinesColor - lineBulletsRenerer.setInnerColor(colorMode.chartBackgroundColor, animated: animated) + lineBulletsRenderer.setInnerColor(colorMode.chartBackgroundColor, animated: animated) verticalLineRenderer.linesColor = colorMode.chartStrongLinesColor } } diff --git a/submodules/GraphCore/src/Charts/Controllers/Stacked Bars/StackedBarsChartController.swift b/submodules/GraphCore/Sources/Charts/Controllers/Stacked Bars/StackedBarsChartController.swift similarity index 99% rename from submodules/GraphCore/src/Charts/Controllers/Stacked Bars/StackedBarsChartController.swift rename to submodules/GraphCore/Sources/Charts/Controllers/Stacked Bars/StackedBarsChartController.swift index bf8056e41b..1e3e37a68f 100644 --- a/submodules/GraphCore/src/Charts/Controllers/Stacked Bars/StackedBarsChartController.swift +++ b/submodules/GraphCore/Sources/Charts/Controllers/Stacked Bars/StackedBarsChartController.swift @@ -74,7 +74,7 @@ public class StackedBarsChartController: BaseChartController { zoomedBarsController.previewBarsChartRenderer] } - public override func initializeChart() { + public override func initializeChart() { barsController.initialize(chartsCollection: initialChartsCollection, initialDate: Date(), totalHorizontalRange: BaseConstants.defaultRange, diff --git a/submodules/Charts/Sources/Charts/Controllers/Stacked Bars/StackedBarsChartController.swift b/submodules/GraphCore/Sources/Charts/Controllers/Stacked Bars/StepBarsChartController.swift similarity index 68% rename from submodules/Charts/Sources/Charts/Controllers/Stacked Bars/StackedBarsChartController.swift rename to submodules/GraphCore/Sources/Charts/Controllers/Stacked Bars/StepBarsChartController.swift index 4dd0fa9d91..72deae0ec4 100644 --- a/submodules/Charts/Sources/Charts/Controllers/Stacked Bars/StackedBarsChartController.swift +++ b/submodules/GraphCore/Sources/Charts/Controllers/Stacked Bars/StepBarsChartController.swift @@ -1,31 +1,36 @@ // -// StackedBarsChartController.swift +// DailyBarsChartController.swift // GraphTest // // Created by Andrei Salavei on 4/7/19. // Copyright © 2019 Andrei Salavei. All rights reserved. // +import Foundation +#if os(macOS) +import Cocoa +#else import UIKit +#endif -class StackedBarsChartController: BaseChartController { +public class StepBarsChartController: BaseChartController { let barsController: BarsComponentController let zoomedBarsController: BarsComponentController - override init(chartsCollection: ChartsCollection) { + override public init(chartsCollection: ChartsCollection) { let horizontalScalesRenderer = HorizontalScalesRenderer() let verticalScalesRenderer = VerticalScalesRenderer() barsController = BarsComponentController(isZoomed: false, - mainBarsRenderer: BarChartRenderer(), + mainBarsRenderer: BarChartRenderer(step: true), horizontalScalesRenderer: horizontalScalesRenderer, verticalScalesRenderer: verticalScalesRenderer, previewBarsChartRenderer: BarChartRenderer()) zoomedBarsController = BarsComponentController(isZoomed: true, - mainBarsRenderer: BarChartRenderer(), + mainBarsRenderer: BarChartRenderer(step: true), horizontalScalesRenderer: horizontalScalesRenderer, verticalScalesRenderer: verticalScalesRenderer, previewBarsChartRenderer: BarChartRenderer()) - + super.init(chartsCollection: chartsCollection) [barsController, zoomedBarsController].forEach { controller in @@ -55,21 +60,22 @@ class StackedBarsChartController: BaseChartController { } } - override var mainChartRenderers: [ChartViewRenderer] { + public override var mainChartRenderers: [ChartViewRenderer] { return [barsController.mainBarsRenderer, zoomedBarsController.mainBarsRenderer, barsController.horizontalScalesRenderer, barsController.verticalScalesRenderer, + barsController.secondVerticalScalesRenderer! // performanceRenderer ] } - override var navigationRenderers: [ChartViewRenderer] { + public override var navigationRenderers: [ChartViewRenderer] { return [barsController.previewBarsChartRenderer, zoomedBarsController.previewBarsChartRenderer] } - override func initializeChart() { + public override func initializeChart() { barsController.initialize(chartsCollection: initialChartsCollection, initialDate: Date(), totalHorizontalRange: BaseConstants.defaultRange, @@ -79,72 +85,65 @@ class StackedBarsChartController: BaseChartController { func switchToChart(chartsCollection: ChartsCollection, isZoomed: Bool, animated: Bool) { if animated { - TimeInterval.setDefaultDuration(.expandAnimationDuration) + TimeInterval.setDefaultSuration(.expandAnimationDuration) DispatchQueue.main.asyncAfter(deadline: .now() + .expandAnimationDuration) { - TimeInterval.setDefaultDuration(.osXDuration) + 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) +// let initialChartVerticalRange = lineProportionAnimationRange() + +// let visibleVerticalRange = BarChartRenderer.BarsData.verticalRange(bars: zoomedBarsController.visibleBars, +// calculatingRange: zoomedBarsController.initialHorizontalRange) ?? BaseConstants.defaultRange + zoomedBarsController.mainBarsRenderer.setup(verticalRange: 0...117278, animated: false) + + zoomedBarsController.setupMainChart(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) - +// zoomedBarsController.mainLinesRenderer.setup(verticalRange: initialChartVerticalRange, animated: false) +// zoomedBarsController.previewLinesChartRenderer.setup(verticalRange: initialChartVerticalRange, animated: false) + zoomedBarsController.mainBarsRenderer.setVisible(false, animated: false) + zoomedBarsController.previewBarsChartRenderer.setVisible(false, 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) + zoomedBarsController.updateChartsVisibility(visibility: zoomedBarsController.chartBars.components.map { _ in true }, animated: false) } 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) - +// let destinationChartVerticalRange = lineProportionAnimationRange() + 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.mainLinesRenderer.setup(verticalRange: destinationChartVerticalRange, animated: animated) +// zoomedBarsController.previewLinesChartRenderer.setup(verticalRange: destinationChartVerticalRange, animated: animated) 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) - } + zoomedBarsController.mainBarsRenderer.setVisible(false, animated: animated) + zoomedBarsController.previewBarsChartRenderer.setVisible(false, animated: animated) } barsController.willAppear(animated: animated) zoomedBarsController.willDisappear(animated: animated) - - if !zoomedBarsController.chartsCollection.isBlank { - barsController.updateChartsVisibility(visibility: zoomedBarsController.chartVisibility, animated: false) - } } self.setBackButtonVisibilityClosure?(isZoomed, animated) + self.refreshChartToolsClosure?(animated) } - override func updateChartsVisibility(visibility: [Bool], animated: Bool) { + public override func updateChartsVisibility(visibility: [Bool], animated: Bool) { if isZoomed { zoomedBarsController.updateChartsVisibility(visibility: visibility, animated: animated) } else { @@ -161,15 +160,20 @@ class StackedBarsChartController: BaseChartController { return visibleCharts } - override var actualChartVisibility: [Bool] { + public override var actualChartVisibility: [Bool] { return isZoomed ? zoomedBarsController.chartVisibility : barsController.chartVisibility } - override var actualChartsCollection: ChartsCollection { - return isZoomed ? zoomedBarsController.chartsCollection : barsController.chartsCollection + public override var actualChartsCollection: ChartsCollection { + let collection = isZoomed ? zoomedBarsController.chartsCollection : barsController.chartsCollection + + if collection.isBlank { + return self.initialChartsCollection + } + return collection } - - override func chartInteractionDidBegin(point: CGPoint) { + + public override func chartInteractionDidBegin(point: CGPoint) { if isZoomed { zoomedBarsController.chartInteractionDidBegin(point: point) } else { @@ -177,7 +181,7 @@ class StackedBarsChartController: BaseChartController { } } - override func chartInteractionDidEnd() { + public override func chartInteractionDidEnd() { if isZoomed { zoomedBarsController.chartInteractionDidEnd() } else { @@ -185,11 +189,7 @@ class StackedBarsChartController: BaseChartController { } } - override var drawChartVisibity: Bool { - return true - } - - override var currentChartHorizontalRangeFraction: ClosedRange { + public override var currentChartHorizontalRangeFraction: ClosedRange { if isZoomed { return zoomedBarsController.currentChartHorizontalRangeFraction } else { @@ -197,7 +197,7 @@ class StackedBarsChartController: BaseChartController { } } - override func cancelChartInteraction() { + public override func cancelChartInteraction() { if isZoomed { return zoomedBarsController.hideDetailsView(animated: true) } else { @@ -205,7 +205,7 @@ class StackedBarsChartController: BaseChartController { } } - override func didTapZoomIn(date: Date) { + public override func didTapZoomIn(date: Date) { guard isZoomed == false else { return } if isZoomed { return zoomedBarsController.hideDetailsView(animated: true) @@ -221,12 +221,21 @@ class StackedBarsChartController: BaseChartController { }) } - override func didTapZoomOut() { +// func lineProportionAnimationRange() -> ClosedRange { +// let visibleLines = self.barsController.chartVisibility.enumerated().compactMap { $0.element ? self.zoomedBarsController.chartLines[$0.offset] : nil } +// let linesRange = LinesChartRenderer.LineData.verticalRange(lines: visibleLines) ?? BaseConstants.defaultRange +// let barsRange = BarChartRenderer.BarsData.verticalRange(bars: self.barsController.visibleBars, +// calculatingRange: self.zoomedBarsController.totalHorizontalRange) ?? BaseConstants.defaultRange +// let range = 0...(linesRange.upperBound / barsRange.distance * self.barsController.currentVerticalMainChartRange.distance) +// return range +// } + + public override func didTapZoomOut() { cancelChartInteraction() switchToChart(chartsCollection: barsController.chartsCollection, isZoomed: false, animated: true) } - override func updateChartRange(_ rangeFraction: ClosedRange, animated: Bool) { + public override func updateChartRange(_ rangeFraction: ClosedRange) { if isZoomed { return zoomedBarsController.chartRangeFractionDidUpdated(rangeFraction) } else { @@ -234,10 +243,17 @@ class StackedBarsChartController: BaseChartController { } } - override func apply(colorMode: ColorMode, animated: Bool) { + override public func apply(colorMode: GColorMode, animated: Bool) { super.apply(colorMode: colorMode, animated: animated) zoomedBarsController.apply(colorMode: colorMode, animated: animated) barsController.apply(colorMode: colorMode, animated: animated) } + + public override var drawChartVisibity: Bool { + return true + } } + +//TODO: Убрать Performance полоски сверзу чартов (Не забыть) +//TODO: Добавить ховеры на кнопки diff --git a/submodules/GraphCore/Sources/Charts/Controllers/Stacked Bars/StepBarsChartController2.swift b/submodules/GraphCore/Sources/Charts/Controllers/Stacked Bars/StepBarsChartController2.swift new file mode 100644 index 0000000000..8d1695a05d --- /dev/null +++ b/submodules/GraphCore/Sources/Charts/Controllers/Stacked Bars/StepBarsChartController2.swift @@ -0,0 +1,380 @@ +import Foundation +#if os(macOS) +import Cocoa +#else +import UIKit +#endif + +public class StepBarsChartController2: BaseChartController { + class GraphController { + let mainBarsRenderer: BarChartRenderer + let verticalScalesRenderer = VerticalScalesRenderer() + let lineBulletsRenderer = LineBulletsRenderer() + let previewBarsRenderer: BarChartRenderer + + var chartBars: BarChartRenderer.BarsData = .blank + var barsWidth: CGFloat = 1 + + var totalVerticalRange: ClosedRange = BaseConstants.defaultRange + + init(isZoomed: Bool, + mainBarsRenderer: BarChartRenderer, + previewBarsRenderer: BarChartRenderer) { + self.mainBarsRenderer = mainBarsRenderer + self.previewBarsRenderer = previewBarsRenderer + + self.mainBarsRenderer.optimizationLevel = BaseConstants.barsChartOptimizationLevel + self.previewBarsRenderer.optimizationLevel = BaseConstants.barsChartOptimizationLevel + } + } + + private var graphControllers: [GraphController] = [] + private let horizontalScalesRenderer = HorizontalScalesRenderer() + + private let verticalLineRenderer = VerticalLinesRenderer() + + var chartVisibility: [Bool] = [] + var zoomChartVisibility: [Bool] = [] + + private let initialChartCollection: ChartsCollection + var initialChartRange: ClosedRange = BaseConstants.defaultRange + var zoomedChartRange: ClosedRange = BaseConstants.defaultRange + var totalHorizontalRange: ClosedRange = BaseConstants.defaultRange + + var lastChartInteractionPoint: CGPoint = .zero + var isChartInteractionBegun: Bool = false + + override public init(chartsCollection: ChartsCollection) { + self.initialChartCollection = chartsCollection + + self.graphControllers = chartsCollection.chartValues.map { _ in GraphController(isZoomed: false, mainBarsRenderer: BarChartRenderer(step: true), previewBarsRenderer: BarChartRenderer(step: true)) + } + + super.init(chartsCollection: chartsCollection) + + self.chartVisibility = Array(repeating: true, count: chartsCollection.chartValues.count) + self.zoomChartVisibility = self.chartVisibility + +// self.graphControllers.map({ $0.barsController }).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) +// } +// } + } + + public override var mainChartRenderers: [ChartViewRenderer] { + var renderers: [ChartViewRenderer] = [] + self.graphControllers.forEach { controller in + renderers.append(controller.mainBarsRenderer) + } + renderers.append(self.horizontalScalesRenderer) + self.graphControllers.forEach { controller in + renderers.append(controller.verticalScalesRenderer) + renderers.append(controller.lineBulletsRenderer) + } + renderers.append(self.verticalLineRenderer) + return renderers + } + + public override var navigationRenderers: [ChartViewRenderer] { + return graphControllers.map { $0.previewBarsRenderer } + } + + public 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) + } + + public override func updateChartsVisibility(visibility: [Bool], animated: Bool) { + self.chartVisibility = visibility + self.zoomChartVisibility = visibility + let firstIndex = visibility.firstIndex(where: { $0 }) + for (index, isVisible) in visibility.enumerated() { + let graph = graphControllers[index] + for graphIndex in graph.chartBars.components.indices { + graph.mainBarsRenderer.setComponentVisible(isVisible, at: graphIndex, animated: animated) + graph.previewBarsRenderer.setComponentVisible(isVisible, at: graphIndex, animated: animated) + graph.lineBulletsRenderer.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) + } + } + + private func findClosestDateTo(dateToFind: Date) -> (Date, Int)? { + guard self.initialChartCollection.axisValues.count > 0 else { return nil } + var closestDate = self.initialChartCollection.axisValues[0] + var minIndex = 0 + for (index, date) in self.initialChartCollection.axisValues.enumerated() { + if abs(dateToFind.timeIntervalSince(date)) < abs(dateToFind.timeIntervalSince(closestDate)) { + closestDate = date + minIndex = index + } + } + return (closestDate, minIndex) + } + + public 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.lineBulletsRenderer.bullets = graphController.chartBars.components.map { component in +// LineBulletsRenderer.Bullet(coordinate: component.values[minIndex], color: component.color) +// } +// graphController.lineBulletsRenderer.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] + } + +// 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 +// } +// + func chartDetailsViewModel(closestDate: Date, pointIndex: Int) -> ChartDetailsViewModel { + let values: [ChartDetailsViewModel.Value] = initialChartCollection.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 }) + return viewModel + } + + public override func chartInteractionDidEnd() { + self.isChartInteractionBegun = false + } + + public override var currentHorizontalRange: ClosedRange { + return graphControllers.first?.mainBarsRenderer.horizontalRange.end ?? BaseConstants.defaultRange + } + + public override var currentChartHorizontalRangeFraction: ClosedRange { + let lowerPercent = (currentHorizontalRange.lowerBound - totalHorizontalRange.lowerBound) / totalHorizontalRange.distance + let upperPercent = (currentHorizontalRange.upperBound - totalHorizontalRange.lowerBound) / totalHorizontalRange.distance + return lowerPercent...upperPercent + } + + public override func cancelChartInteraction() { + super.cancelChartInteraction() + self.graphControllers.forEach { controller in + controller.lineBulletsRenderer.isEnabled = false + } + + self.setDetailsChartVisibleClosure?(false, true) + self.verticalLineRenderer.values = [] + } + + func setupChartCollection(chartsCollection: ChartsCollection, animated: Bool, isZoomed: Bool) { + 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 (width, chartBars, totalHorizontalRange, totalVerticalRange) = BarChartRenderer.BarsData.initialComponents(chartsCollection: chartsCollection) + controller.chartBars = chartBars + controller.barsWidth = width + + controller.verticalScalesRenderer.labelsColor = chart.color + + controller.totalVerticalRange = totalVerticalRange + self.totalHorizontalRange = totalHorizontalRange +// controller.lineBulletsRenderer.bullets = chartBars.components.map { LineBulletsRenderer.Bullet(coordinate: $0.values.first ?? .zero, +// color: $0.color) } + controller.previewBarsRenderer.setup(horizontalRange: self.totalHorizontalRange, animated: animated) + controller.previewBarsRenderer.setup(verticalRange: controller.totalVerticalRange, animated: animated) + + controller.mainBarsRenderer.bars = chartBars + controller.previewBarsRenderer.bars = chartBars + + controller.verticalScalesRenderer.setHorizontalLinesVisible((index == 0), animated: animated) + controller.verticalScalesRenderer.isRightAligned = (index != 0) + } + + let chartRange: ClosedRange + if isZoomed { + chartRange = zoomedChartRange + } else { + chartRange = initialChartRange + } + +// updateHorizontalLimits(horizontalRange: chartRange, animated: animated) + updateMainChartHorizontalRange(range: chartRange, animated: animated) + updateMainChartVerticalRange(range: chartRange, animated: animated) +// updateVerticalLimitsAndRange(horizontalRange: chartRange, animated: animated) + + self.chartRangeUpdatedClosure?(currentChartHorizontalRangeFraction, animated) + } + +// 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) +// +// self.graphControllers.forEach { controller in +// controller.barsController.willAppear(animated: animated) +// } +// +// self.refreshChartToolsClosure?(animated) +// } + + public 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) + } + }) + } + + public override func didTapZoomOut() { + cancelChartInteraction() + self.setupChartCollection(chartsCollection: self.initialChartCollection, animated: true, isZoomed: false) + } + + public 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) +// updateHorizontalLimits(horizontalRange: horizontalRange, animated: true) +// updateVerticalLimitsAndRange(horizontalRange: horizontalRange, animated: true) + +// barsController.chartRangeFractionDidUpdated(rangeFraction) +// +// let totalHorizontalRange = barsController.totalHorizontalRange +// let horizontalRange = ClosedRange(uncheckedBounds: +// (lower: totalHorizontalRange.lowerBound + rangeFraction.lowerBound * totalHorizontalRange.distance, +// upper: totalHorizontalRange.lowerBound + rangeFraction.upperBound * totalHorizontalRange.distance)) +// +// updateMainChartHorizontalRange(range: horizontalRange, animated: false) + } + + func updateMainChartHorizontalRange(range: ClosedRange, animated: Bool) { + self.graphControllers.forEach { controller in + controller.mainBarsRenderer.setup(horizontalRange: range, animated: animated) +// controller.horizontalScalesRenderer.setup(horizontalRange: range, animated: animated) + controller.verticalScalesRenderer.setup(horizontalRange: range, animated: animated) + controller.lineBulletsRenderer.setup(horizontalRange: range, animated: animated) + } + self.horizontalScalesRenderer.setup(horizontalRange: range, animated: animated) + self.verticalLineRenderer.setup(horizontalRange: range, animated: animated) + } + + func updateMainChartVerticalRange(range: ClosedRange, animated: Bool) { + self.verticalLineRenderer.setup(verticalRange: range, animated: animated) + + self.graphControllers.forEach { controller in + controller.lineBulletsRenderer.setup(verticalRange: range, animated: animated) + } + } + + override public func apply(colorMode: GColorMode, animated: Bool) { + super.apply(colorMode: colorMode, animated: animated) + + self.graphControllers.forEach { controller in + controller.verticalScalesRenderer.horizontalLinesColor = colorMode.chartHelperLinesColor + controller.lineBulletsRenderer.setInnerColor(colorMode.chartBackgroundColor, animated: animated) + controller.verticalScalesRenderer.axisXColor = colorMode.chartStrongLinesColor + } + verticalLineRenderer.linesColor = colorMode.chartStrongLinesColor + } + + public override var drawChartVisibity: Bool { + return true + } +} + +//TODO: Убрать Performance полоски сверзу чартов (Не забыть) +//TODO: Добавить ховеры на кнопки diff --git a/submodules/GraphCore/src/Charts/Renderes/BarChartRenderer.swift b/submodules/GraphCore/Sources/Charts/Renderes/BarChartRenderer.swift similarity index 51% rename from submodules/GraphCore/src/Charts/Renderes/BarChartRenderer.swift rename to submodules/GraphCore/Sources/Charts/Renderes/BarChartRenderer.swift index 7be512d223..219bf31ce8 100644 --- a/submodules/GraphCore/src/Charts/Renderes/BarChartRenderer.swift +++ b/submodules/GraphCore/Sources/Charts/Renderes/BarChartRenderer.swift @@ -26,6 +26,14 @@ class BarChartRenderer: BaseChartRenderer { } } + private var step = false + + init(step: Bool = false) { + self.step = step + + super.init() + } + var fillToTop: Bool = false private(set) lazy var selectedIndexAnimator: AnimationController = { return AnimationController(current: 0, refreshClosure: self.refreshClosure) @@ -142,80 +150,157 @@ class BarChartRenderer: BaseChartRenderer { 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) + if self.step { + var selectedPaths: [[CGRect]] = bars.components.map { _ in [] } + barIndex = max(0, barIndex - 1) - 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 } + 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) - 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) + 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 } + + var value = component.values[barIndex] + if value < 5000 { + value *= 40 + } + let height = value * visibilityPercent +// stackedValue += height + let topY = transform(toChartCoordinateVertical: height, 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 } - 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 } - 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(GColor.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]) + 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() + + context.setLineWidth(2.0) + context.setStrokeColor(GColor.valueBetween(start: backgroundColorAnimator.current.color, + end: component.color, + offset: colorOffset).cgColor) + context.beginPath() + context.addLines(between: backgourndPaths[index]) + context.strokePath() + 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(GColor.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]) + } } } } diff --git a/submodules/GraphCore/src/Charts/Renderes/BaseChartRenderer.swift b/submodules/GraphCore/Sources/Charts/Renderes/BaseChartRenderer.swift similarity index 99% rename from submodules/GraphCore/src/Charts/Renderes/BaseChartRenderer.swift rename to submodules/GraphCore/Sources/Charts/Renderes/BaseChartRenderer.swift index fd521baa58..d6cd6588a6 100644 --- a/submodules/GraphCore/src/Charts/Renderes/BaseChartRenderer.swift +++ b/submodules/GraphCore/Sources/Charts/Renderes/BaseChartRenderer.swift @@ -51,7 +51,7 @@ class BaseChartRenderer: ChartViewRenderer { 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) { + func setup(verticalRange: ClosedRange, animated: Bool, timeFunction: TimeFunction? = nil) { guard self.verticalRange.end != verticalRange else { self.verticalRange.timeFunction = timeFunction ?? .linear return diff --git a/submodules/GraphCore/src/Charts/Renderes/ChartDetailsRenderer.swift b/submodules/GraphCore/Sources/Charts/Renderes/ChartDetailsRenderer.swift similarity index 100% rename from submodules/GraphCore/src/Charts/Renderes/ChartDetailsRenderer.swift rename to submodules/GraphCore/Sources/Charts/Renderes/ChartDetailsRenderer.swift diff --git a/submodules/GraphCore/src/Charts/Renderes/HorizontalScalesRenderer.swift b/submodules/GraphCore/Sources/Charts/Renderes/HorizontalScalesRenderer.swift similarity index 100% rename from submodules/GraphCore/src/Charts/Renderes/HorizontalScalesRenderer.swift rename to submodules/GraphCore/Sources/Charts/Renderes/HorizontalScalesRenderer.swift diff --git a/submodules/GraphCore/src/Charts/Renderes/LineBulletsRenerer.swift b/submodules/GraphCore/Sources/Charts/Renderes/LineBulletsRenerer.swift similarity index 97% rename from submodules/GraphCore/src/Charts/Renderes/LineBulletsRenerer.swift rename to submodules/GraphCore/Sources/Charts/Renderes/LineBulletsRenerer.swift index 13c7543286..abbf2e58d2 100644 --- a/submodules/GraphCore/src/Charts/Renderes/LineBulletsRenerer.swift +++ b/submodules/GraphCore/Sources/Charts/Renderes/LineBulletsRenerer.swift @@ -1,5 +1,5 @@ // -// LineBulletsRenerer.swift +// LineBulletsRenderer.swift // GraphTest // // Created by Andrei Salavei on 4/8/19. @@ -13,7 +13,7 @@ import Cocoa import UIKit #endif -class LineBulletsRenerer: BaseChartRenderer { +class LineBulletsRenderer: BaseChartRenderer { struct Bullet { var coordinate: CGPoint var color: GColor diff --git a/submodules/GraphCore/src/Charts/Renderes/LinesChartRenderer.swift b/submodules/GraphCore/Sources/Charts/Renderes/LinesChartRenderer.swift similarity index 100% rename from submodules/GraphCore/src/Charts/Renderes/LinesChartRenderer.swift rename to submodules/GraphCore/Sources/Charts/Renderes/LinesChartRenderer.swift diff --git a/submodules/GraphCore/src/Charts/Renderes/PecentChartRenderer.swift b/submodules/GraphCore/Sources/Charts/Renderes/PecentChartRenderer.swift similarity index 100% rename from submodules/GraphCore/src/Charts/Renderes/PecentChartRenderer.swift rename to submodules/GraphCore/Sources/Charts/Renderes/PecentChartRenderer.swift diff --git a/submodules/GraphCore/src/Charts/Renderes/PercentPieAnimationRenderer.swift b/submodules/GraphCore/Sources/Charts/Renderes/PercentPieAnimationRenderer.swift similarity index 100% rename from submodules/GraphCore/src/Charts/Renderes/PercentPieAnimationRenderer.swift rename to submodules/GraphCore/Sources/Charts/Renderes/PercentPieAnimationRenderer.swift diff --git a/submodules/GraphCore/src/Charts/Renderes/PerformanceRenderer.swift b/submodules/GraphCore/Sources/Charts/Renderes/PerformanceRenderer.swift similarity index 100% rename from submodules/GraphCore/src/Charts/Renderes/PerformanceRenderer.swift rename to submodules/GraphCore/Sources/Charts/Renderes/PerformanceRenderer.swift diff --git a/submodules/GraphCore/src/Charts/Renderes/PieChartRenderer.swift b/submodules/GraphCore/Sources/Charts/Renderes/PieChartRenderer.swift similarity index 100% rename from submodules/GraphCore/src/Charts/Renderes/PieChartRenderer.swift rename to submodules/GraphCore/Sources/Charts/Renderes/PieChartRenderer.swift diff --git a/submodules/GraphCore/src/Charts/Renderes/VerticalLinesRenderer.swift b/submodules/GraphCore/Sources/Charts/Renderes/VerticalLinesRenderer.swift similarity index 100% rename from submodules/GraphCore/src/Charts/Renderes/VerticalLinesRenderer.swift rename to submodules/GraphCore/Sources/Charts/Renderes/VerticalLinesRenderer.swift diff --git a/submodules/GraphCore/src/Charts/Renderes/VerticalScalesRenderer.swift b/submodules/GraphCore/Sources/Charts/Renderes/VerticalScalesRenderer.swift similarity index 100% rename from submodules/GraphCore/src/Charts/Renderes/VerticalScalesRenderer.swift rename to submodules/GraphCore/Sources/Charts/Renderes/VerticalScalesRenderer.swift diff --git a/submodules/GraphCore/Sources/GraphCore.h b/submodules/GraphCore/Sources/GraphCore.h new file mode 100644 index 0000000000..32c43f37d3 --- /dev/null +++ b/submodules/GraphCore/Sources/GraphCore.h @@ -0,0 +1,19 @@ +// +// GraphCore.h +// GraphCore +// +// Created by Mikhail Filimonov on 03.02.2020. +// Copyright © 2020 Telegram. All rights reserved. +// + +#import + +//! Project version number for GraphCore. +FOUNDATION_EXPORT double GraphCoreVersionNumber; + +//! Project version string for GraphCore. +FOUNDATION_EXPORT const unsigned char GraphCoreVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/submodules/GraphCore/src/Helpers/AnimationController.swift b/submodules/GraphCore/Sources/Helpers/AnimationController.swift similarity index 100% rename from submodules/GraphCore/src/Helpers/AnimationController.swift rename to submodules/GraphCore/Sources/Helpers/AnimationController.swift diff --git a/submodules/GraphCore/src/Helpers/Array+Utils.swift b/submodules/GraphCore/Sources/Helpers/Array+Utils.swift similarity index 100% rename from submodules/GraphCore/src/Helpers/Array+Utils.swift rename to submodules/GraphCore/Sources/Helpers/Array+Utils.swift diff --git a/submodules/GraphCore/src/Helpers/CGFloat.swift b/submodules/GraphCore/Sources/Helpers/CGFloat.swift similarity index 100% rename from submodules/GraphCore/src/Helpers/CGFloat.swift rename to submodules/GraphCore/Sources/Helpers/CGFloat.swift diff --git a/submodules/GraphCore/src/Helpers/CGPoint+Extensions.swift b/submodules/GraphCore/Sources/Helpers/CGPoint+Extensions.swift similarity index 100% rename from submodules/GraphCore/src/Helpers/CGPoint+Extensions.swift rename to submodules/GraphCore/Sources/Helpers/CGPoint+Extensions.swift diff --git a/submodules/GraphCore/src/Helpers/ClosedRange+Utils.swift b/submodules/GraphCore/Sources/Helpers/ClosedRange+Utils.swift similarity index 100% rename from submodules/GraphCore/src/Helpers/ClosedRange+Utils.swift rename to submodules/GraphCore/Sources/Helpers/ClosedRange+Utils.swift diff --git a/submodules/GraphCore/src/Helpers/DisplayLinkService.swift b/submodules/GraphCore/Sources/Helpers/DisplayLinkService.swift similarity index 100% rename from submodules/GraphCore/src/Helpers/DisplayLinkService.swift rename to submodules/GraphCore/Sources/Helpers/DisplayLinkService.swift diff --git a/submodules/Charts/Sources/Helpers/GlobalHelpers.swift b/submodules/GraphCore/Sources/Helpers/GlobalHelpers.swift similarity index 100% rename from submodules/Charts/Sources/Helpers/GlobalHelpers.swift rename to submodules/GraphCore/Sources/Helpers/GlobalHelpers.swift diff --git a/submodules/GraphCore/src/Helpers/NumberFormatter+Utils.swift b/submodules/GraphCore/Sources/Helpers/NumberFormatter+Utils.swift similarity index 100% rename from submodules/GraphCore/src/Helpers/NumberFormatter+Utils.swift rename to submodules/GraphCore/Sources/Helpers/NumberFormatter+Utils.swift diff --git a/submodules/GraphCore/src/Helpers/ScalesNumberFormatter.swift b/submodules/GraphCore/Sources/Helpers/ScalesNumberFormatter.swift similarity index 100% rename from submodules/GraphCore/src/Helpers/ScalesNumberFormatter.swift rename to submodules/GraphCore/Sources/Helpers/ScalesNumberFormatter.swift diff --git a/submodules/GraphCore/src/Helpers/TextUtils.swift b/submodules/GraphCore/Sources/Helpers/TextUtils.swift similarity index 100% rename from submodules/GraphCore/src/Helpers/TextUtils.swift rename to submodules/GraphCore/Sources/Helpers/TextUtils.swift diff --git a/submodules/GraphCore/src/Helpers/TimeInterval+Utils.swift b/submodules/GraphCore/Sources/Helpers/TimeInterval+Utils.swift similarity index 96% rename from submodules/GraphCore/src/Helpers/TimeInterval+Utils.swift rename to submodules/GraphCore/Sources/Helpers/TimeInterval+Utils.swift index 74343d1225..c8e27b0463 100644 --- a/submodules/GraphCore/src/Helpers/TimeInterval+Utils.swift +++ b/submodules/GraphCore/Sources/Helpers/TimeInterval+Utils.swift @@ -13,7 +13,7 @@ import Cocoa import UIKit #endif -extension TimeInterval { +public extension TimeInterval { static let minute: TimeInterval = 60 static let hour: TimeInterval = 60 * 60 static let day: TimeInterval = 60 * 60 * 24 diff --git a/submodules/GraphCore/src/Helpers/TimeZone.swift b/submodules/GraphCore/Sources/Helpers/TimeZone.swift similarity index 100% rename from submodules/GraphCore/src/Helpers/TimeZone.swift rename to submodules/GraphCore/Sources/Helpers/TimeZone.swift diff --git a/submodules/GraphCore/src/Helpers/UIColor+Utils.swift b/submodules/GraphCore/Sources/Helpers/UIColor+Utils.swift similarity index 64% rename from submodules/GraphCore/src/Helpers/UIColor+Utils.swift rename to submodules/GraphCore/Sources/Helpers/UIColor+Utils.swift index fc74ce68a3..df4b9bf5d4 100644 --- a/submodules/GraphCore/src/Helpers/UIColor+Utils.swift +++ b/submodules/GraphCore/Sources/Helpers/UIColor+Utils.swift @@ -29,11 +29,37 @@ extension GColor { 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...]) - + + let components = hexString.components(separatedBy: "#") + if let name = components.first, !name.isEmpty { + switch name.lowercased() { + case "red": + self.init(hexString: "#ff2d55") + return + case "green": + self.init(hexString: "#34c759") + return + case "blue": + self.init(hexString: "#007aff") + return + case "golden": + self.init(hexString: "#ff9500") + return + case "yellow": + self.init(hexString: "#ffcc00") + return + case "lightgreen": + self.init(hexString: "#8fcf39") + return + case "lightblue": + self.init(hexString: "#5ac8fa") + return + default: + break + } + } + + if let hexColor = components.last { if hexColor.count == 8 { let scanner = Scanner(string: hexColor) var hexNumber: UInt64 = 0 diff --git a/submodules/GraphCore/src/Helpers/UIImage+Utils.swift b/submodules/GraphCore/Sources/Helpers/UIImage+Utils.swift similarity index 100% rename from submodules/GraphCore/src/Helpers/UIImage+Utils.swift rename to submodules/GraphCore/Sources/Helpers/UIImage+Utils.swift diff --git a/submodules/GraphCore/src/Helpers/UIView+Extensions.swift b/submodules/GraphCore/Sources/Helpers/UIView+Extensions.swift similarity index 100% rename from submodules/GraphCore/src/Helpers/UIView+Extensions.swift rename to submodules/GraphCore/Sources/Helpers/UIView+Extensions.swift diff --git a/submodules/GraphCore/src/Models/ChartLineData.swift b/submodules/GraphCore/Sources/Models/ChartLineData.swift similarity index 100% rename from submodules/GraphCore/src/Models/ChartLineData.swift rename to submodules/GraphCore/Sources/Models/ChartLineData.swift diff --git a/submodules/GraphCore/src/Models/ColorMode.swift b/submodules/GraphCore/Sources/Models/ColorMode.swift similarity index 100% rename from submodules/GraphCore/src/Models/ColorMode.swift rename to submodules/GraphCore/Sources/Models/ColorMode.swift diff --git a/submodules/GraphCore/src/Models/LinesChartLabel.swift b/submodules/GraphCore/Sources/Models/LinesChartLabel.swift similarity index 100% rename from submodules/GraphCore/src/Models/LinesChartLabel.swift rename to submodules/GraphCore/Sources/Models/LinesChartLabel.swift diff --git a/submodules/GraphCore/src/Models/LinesSelectionLabel.swift b/submodules/GraphCore/Sources/Models/LinesSelectionLabel.swift similarity index 100% rename from submodules/GraphCore/src/Models/LinesSelectionLabel.swift rename to submodules/GraphCore/Sources/Models/LinesSelectionLabel.swift diff --git a/submodules/GraphCore/src/Helpers/GlobalHelpers.swift b/submodules/GraphCore/src/Helpers/GlobalHelpers.swift deleted file mode 100644 index 3f5c488ff9..0000000000 --- a/submodules/GraphCore/src/Helpers/GlobalHelpers.swift +++ /dev/null @@ -1,12 +0,0 @@ -// -// 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/BUCK b/submodules/GraphUI/BUCK similarity index 80% rename from submodules/Charts/BUCK rename to submodules/GraphUI/BUCK index 79bf8180b8..f395853a92 100644 --- a/submodules/Charts/BUCK +++ b/submodules/GraphUI/BUCK @@ -1,7 +1,7 @@ load("//Config:buck_rule_macros.bzl", "static_library") static_library( - name = "Charts", + name = "GraphUI", srcs = glob([ "Sources/**/*.swift", ]), @@ -15,14 +15,10 @@ static_library( "//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", + "//submodules/GraphCore:GraphCore", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/Charts/Info.plist b/submodules/GraphUI/Info.plist similarity index 100% rename from submodules/Charts/Info.plist rename to submodules/GraphUI/Info.plist diff --git a/submodules/Charts/Sources/Chart Screen/ChartDetailsView.swift b/submodules/GraphUI/Sources/ChartDetailsView.swift similarity index 91% rename from submodules/Charts/Sources/Chart Screen/ChartDetailsView.swift rename to submodules/GraphUI/Sources/ChartDetailsView.swift index ecf685aafb..ba0ed31bed 100644 --- a/submodules/Charts/Sources/Chart Screen/ChartDetailsView.swift +++ b/submodules/GraphUI/Sources/ChartDetailsView.swift @@ -7,34 +7,17 @@ // import UIKit +import GraphCore +import AppBundle 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 textLabelWidth: CGFloat = 80 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() @@ -45,7 +28,7 @@ class ChartDetailsView: UIControl { var valuesViews: [UILabel] = [] private var viewModel: ChartDetailsViewModel? - private var colorMode: ColorMode = .day + private var colorMode: GColorMode = .day override init(frame: CGRect) { super.init(frame: frame) @@ -55,7 +38,7 @@ class ChartDetailsView: UIControl { addTarget(self, action: #selector(didTap), for: .touchUpInside) titleLabel.font = UIFont.systemFont(ofSize: 12, weight: .bold) - arrowView.image = UIImage.arrowRight + arrowView.image = UIImage(bundleImageName: "Chart/arrow_right") arrowView.contentMode = .scaleAspectFill addSubview(titleLabel) @@ -182,8 +165,6 @@ class ChartDetailsView: UIControl { 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) @@ -191,8 +172,8 @@ class ChartDetailsView: UIControl { } } -extension ChartDetailsView: ColorModeContainer { - func apply(colorMode: ColorMode, animated: Bool) { +extension ChartDetailsView: GColorModeContainer { + func apply(colorMode: GColorMode, animated: Bool) { self.colorMode = colorMode self.titleLabel.setTextColor(colorMode.chartDetailsTextColor, animated: animated) if let viewModel = self.viewModel { diff --git a/submodules/Charts/Sources/ChartNode.swift b/submodules/GraphUI/Sources/ChartNode.swift similarity index 63% rename from submodules/Charts/Sources/ChartNode.swift rename to submodules/GraphUI/Sources/ChartNode.swift index 20e319098a..8efe642643 100644 --- a/submodules/Charts/Sources/ChartNode.swift +++ b/submodules/GraphUI/Sources/ChartNode.swift @@ -1,14 +1,17 @@ import Foundation import UIKit +import SwiftSignalKit import Display import AsyncDisplayKit import AppBundle +import GraphCore public enum ChartType { case lines case twoAxis case pie case bars + case step } public final class ChartNode: ASDisplayNode { @@ -30,32 +33,36 @@ public final class ChartNode: ASDisplayNode { self.view.disablesInteractiveTransitionGestureRecognizer = true } - public func setup(_ data: String, type: ChartType, getDetailsData: @escaping (Date, (String?) -> Void) -> Void) { + public func setup(_ data: String, type: ChartType, getDetailsData: @escaping (Date, @escaping (String?) -> Void) -> Void) { if let data = data.data(using: .utf8) { - ChartsDataManager().readChart(data: data, extraCopiesCount: 0, sync: true, success: { [weak self] collection in + ChartsDataManager.readChart(data: data, extraCopiesCount: 0, sync: true, success: { [weak self] collection in let controller: BaseChartController switch type { case .lines: controller = GeneralLinesChartController(chartsCollection: collection) - controller.getDetailsData = { date, completion in - getDetailsData(date, { detailsData in - if let detailsData = detailsData, let data = detailsData.data(using: .utf8) { - ChartsDataManager().readChart(data: data, extraCopiesCount: 0, sync: true, success: { [weak self] collection in - completion(collection) - }) { error in - completion(nil) - } - } else { - completion(nil) - } - }) - } case .twoAxis: controller = TwoAxisLinesChartController(chartsCollection: collection) case .pie: controller = PercentPieChartController(chartsCollection: collection) case .bars: controller = StackedBarsChartController(chartsCollection: collection) + case .step: + controller = StepBarsChartController(chartsCollection: collection) + } + controller.getDetailsData = { date, completion in + getDetailsData(date, { detailsData in + if let detailsData = detailsData, let data = detailsData.data(using: .utf8) { + ChartsDataManager.readChart(data: data, extraCopiesCount: 0, sync: true, success: { [weak self] collection in + Queue.mainQueue().async { + completion(collection) + } + }) { error in + completion(nil) + } + } else { + completion(nil) + } + }) } if let strongSelf = self { strongSelf.chartView.setup(controller: controller, title: "") diff --git a/submodules/Charts/Sources/Chart Screen/ChartStackSection.swift b/submodules/GraphUI/Sources/ChartStackSection.swift similarity index 88% rename from submodules/Charts/Sources/Chart Screen/ChartStackSection.swift rename to submodules/GraphUI/Sources/ChartStackSection.swift index 333bdf1132..d6655f5607 100644 --- a/submodules/Charts/Sources/Chart Screen/ChartStackSection.swift +++ b/submodules/GraphUI/Sources/ChartStackSection.swift @@ -7,12 +7,22 @@ // import UIKit +import GraphCore private enum Constants { static let chartViewHeightFraction: CGFloat = 0.55 } -class ChartStackSection: UIView, ColorModeContainer { +private class LeftAlignedIconButton: UIButton { + override func titleRect(forContentRect contentRect: CGRect) -> CGRect { + let titleRect = super.titleRect(forContentRect: contentRect) + let imageSize = currentImage?.size ?? .zero + let availableWidth = contentRect.width - imageEdgeInsets.right - imageSize.width - titleRect.width + return titleRect.offsetBy(dx: round(availableWidth / 2), dy: 0) + } +} + +class ChartStackSection: UIView, GColorModeContainer { var chartView: ChartView var rangeView: RangeChartView var visibilityView: ChartVisibilityView @@ -30,7 +40,7 @@ class ChartStackSection: UIView, ColorModeContainer { rangeView = RangeChartView() visibilityView = ChartVisibilityView() titleLabel = UILabel() - backButton = UIButton() + backButton = LeftAlignedIconButton() super.init(frame: CGRect()) @@ -50,6 +60,9 @@ class ChartStackSection: UIView, ColorModeContainer { backButton.setTitle("Zoom Out", for: .normal) backButton.titleLabel?.font = UIFont.systemFont(ofSize: 14, weight: .regular) backButton.setTitleColor(UIColor(rgb: 0x007ee5), for: .normal) + backButton.setImage(UIImage(bundleImageName: "Chart/arrow_left"), for: .normal) + backButton.imageEdgeInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: 3.0) + backButton.imageView?.tintColor = UIColor(rgb: 0x007ee5) backButton.setVisible(false, animated: false) } @@ -68,7 +81,7 @@ class ChartStackSection: UIView, ColorModeContainer { backButton.setVisible(false, animated: false) } - func apply(colorMode: ColorMode, animated: Bool) { + func apply(colorMode: GColorMode, animated: Bool) { UIView.perform(animated: animated && self.isVisibleInWindow) { self.backgroundColor = colorMode.tableBackgroundColor @@ -201,9 +214,9 @@ class ChartStackSection: UIView, ColorModeContainer { controller.initializeChart() updateToolViews(animated: false) - rangeView.setRange(0.8...1.0, animated: false) - TimeInterval.animationDurationMultipler = 0.00001 - controller.updateChartRange(0.8...1.0, animated: false) - TimeInterval.animationDurationMultipler = 1.0 +// rangeView.setRange(0.8...1.0, animated: false) +// TimeInterval.animationDurationMultipler = 0.00001 +// controller.updateChartRange(0.8...1.0) +// TimeInterval.animationDurationMultipler = 1.0 } } diff --git a/submodules/Charts/Sources/Chart Screen/ChartView.swift b/submodules/GraphUI/Sources/ChartView.swift similarity index 95% rename from submodules/Charts/Sources/Chart Screen/ChartView.swift rename to submodules/GraphUI/Sources/ChartView.swift index 37759176a5..7a93dbab17 100644 --- a/submodules/Charts/Sources/Chart Screen/ChartView.swift +++ b/submodules/GraphUI/Sources/ChartView.swift @@ -7,11 +7,7 @@ // import UIKit - -public protocol ChartViewRenderer: class { - var containerViews: [UIView] { get set } - func render(context: CGContext, bounds: CGRect, chartFrame: CGRect) -} +import GraphCore class ChartView: UIControl { override init(frame: CGRect) { @@ -166,8 +162,8 @@ class ChartView: UIControl { } -extension ChartView: ColorModeContainer { - func apply(colorMode: ColorMode, animated: Bool) { +extension ChartView: GColorModeContainer { + func apply(colorMode: GColorMode, animated: Bool) { detailsView?.apply(colorMode: colorMode, animated: animated && (detailsView?.isVisibleInWindow ?? false)) } } diff --git a/submodules/Charts/Sources/Chart Screen/ChartVisibilityItemView.swift b/submodules/GraphUI/Sources/ChartVisibilityItemView.swift similarity index 99% rename from submodules/Charts/Sources/Chart Screen/ChartVisibilityItemView.swift rename to submodules/GraphUI/Sources/ChartVisibilityItemView.swift index 2476526f1a..3b6025e0c0 100644 --- a/submodules/Charts/Sources/Chart Screen/ChartVisibilityItemView.swift +++ b/submodules/GraphUI/Sources/ChartVisibilityItemView.swift @@ -7,6 +7,7 @@ // import UIKit +import GraphCore class ChartVisibilityItemView: UIView { static let textFont = UIFont.systemFont(ofSize: 14, weight: .medium) diff --git a/submodules/Charts/Sources/Chart Screen/ChartVisibilityView.swift b/submodules/GraphUI/Sources/ChartVisibilityView.swift similarity index 97% rename from submodules/Charts/Sources/Chart Screen/ChartVisibilityView.swift rename to submodules/GraphUI/Sources/ChartVisibilityView.swift index fda3c3901f..84cbc8b0fe 100644 --- a/submodules/Charts/Sources/Chart Screen/ChartVisibilityView.swift +++ b/submodules/GraphUI/Sources/ChartVisibilityView.swift @@ -7,6 +7,7 @@ // import UIKit +import GraphCore private enum Constants { static let itemHeight: CGFloat = 30 @@ -137,8 +138,8 @@ class ChartVisibilityView: UIView { } } -extension ChartVisibilityView: ColorModeContainer { - func apply(colorMode: ColorMode, animated: Bool) { +extension ChartVisibilityView: GColorModeContainer { + func apply(colorMode: GColorMode, animated: Bool) { UIView.perform(animated: animated) { self.backgroundColor = colorMode.chartBackgroundColor self.tintColor = colorMode.descriptionActionColor diff --git a/submodules/GraphUI/Sources/GraphUI.h b/submodules/GraphUI/Sources/GraphUI.h new file mode 100644 index 0000000000..b474322e81 --- /dev/null +++ b/submodules/GraphUI/Sources/GraphUI.h @@ -0,0 +1,19 @@ +// +// GraphUI.h +// GraphUI +// +// Created by Peter on 8/13/19. +// Copyright © 2019 Telegram Messenger LLP. All rights reserved. +// + +#import + +//! Project version number for GraphUI. +FOUNDATION_EXPORT double GraphUIVersionNumber; + +//! Project version string for GraphUI. +FOUNDATION_EXPORT const unsigned char GraphUIVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/submodules/Charts/Sources/Chart Screen/RangeChartView.swift b/submodules/GraphUI/Sources/RangeChartView.swift similarity index 97% rename from submodules/Charts/Sources/Chart Screen/RangeChartView.swift rename to submodules/GraphUI/Sources/RangeChartView.swift index bc62636fbd..3607392df5 100644 --- a/submodules/Charts/Sources/Chart Screen/RangeChartView.swift +++ b/submodules/GraphUI/Sources/RangeChartView.swift @@ -6,6 +6,8 @@ // Copyright © 2019 Andrei Salavei. All rights reserved. // import UIKit +import GraphCore +import AppBundle private enum Constants { static let cropIndocatorLineWidth: CGFloat = 1 @@ -290,16 +292,16 @@ private extension RangeChartView { } } -extension RangeChartView: ColorModeContainer { - func apply(colorMode: ColorMode, animated: Bool) { +extension RangeChartView: GColorModeContainer { + func apply(colorMode: GColorMode, 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) + let image = UIImage(bundleImageName: "Chart/selection_frame_light") + self.cropFrameView.setImage(image, animated: animated) if animated { UIView.animate(withDuration: .defaultDuration, animations: colusre) diff --git a/submodules/Charts/Sources/Helpers/UIImageView+Utils.swift b/submodules/GraphUI/Sources/UIImageView+Utils.swift similarity index 100% rename from submodules/Charts/Sources/Helpers/UIImageView+Utils.swift rename to submodules/GraphUI/Sources/UIImageView+Utils.swift diff --git a/submodules/Charts/Sources/Helpers/UILabel+Utils.swift b/submodules/GraphUI/Sources/UILabel+Utils.swift similarity index 100% rename from submodules/Charts/Sources/Helpers/UILabel+Utils.swift rename to submodules/GraphUI/Sources/UILabel+Utils.swift diff --git a/submodules/Charts/Sources/Helpers/UIView+Extensions.swift b/submodules/GraphUI/Sources/UIView+Extensions.swift similarity index 100% rename from submodules/Charts/Sources/Helpers/UIView+Extensions.swift rename to submodules/GraphUI/Sources/UIView+Extensions.swift diff --git a/submodules/InstantPageUI/Sources/InstantPageFeedbackItem.swift b/submodules/InstantPageUI/Sources/InstantPageFeedbackItem.swift index a67941ecbb..4bcf2e92e9 100644 --- a/submodules/InstantPageUI/Sources/InstantPageFeedbackItem.swift +++ b/submodules/InstantPageUI/Sources/InstantPageFeedbackItem.swift @@ -30,7 +30,7 @@ final class InstantPageFeedbackItem: InstantPageItem { } func matchesNode(_ node: InstantPageNode) -> Bool { - if node is InstantPageFeedbackNode { + if let node = node as? InstantPageFeedbackNode, case let .Loaded(content) = node.webPage.content, case let .Loaded(updatedContent) = self.webPage.content, content.instantPage?.views == updatedContent.instantPage?.views { return true } return false diff --git a/submodules/InstantPageUI/Sources/InstantPageFeedbackNode.swift b/submodules/InstantPageUI/Sources/InstantPageFeedbackNode.swift index 0cbba86791..da2ce07137 100644 --- a/submodules/InstantPageUI/Sources/InstantPageFeedbackNode.swift +++ b/submodules/InstantPageUI/Sources/InstantPageFeedbackNode.swift @@ -11,12 +11,13 @@ import AccountContext final class InstantPageFeedbackNode: ASDisplayNode, InstantPageNode { private let context: AccountContext - private let webPage: TelegramMediaWebpage + let webPage: TelegramMediaWebpage private let openUrl: (InstantPageUrlItem) -> Void private let highlightedBackgroundNode: ASDisplayNode private let buttonNode: HighlightableButtonNode private let labelNode: ASTextNode + private let viewsNode: ASTextNode private let resolveDisposable = MetaDisposable() @@ -34,23 +35,32 @@ final class InstantPageFeedbackNode: ASDisplayNode, InstantPageNode { self.labelNode = ASTextNode() self.labelNode.isLayerBacked = true self.labelNode.maximumNumberOfLines = 2 + + self.viewsNode = ASTextNode() + self.viewsNode.isLayerBacked = true + self.viewsNode.maximumNumberOfLines = 2 super.init() + if case let .Loaded(content) = webPage.content, let views = content.instantPage?.views { + self.viewsNode.attributedText = NSAttributedString(string: strings.InstantPage_Views(views), font: Font.regular(13.0), textColor: theme.panelSecondaryColor) + } + self.addSubnode(self.highlightedBackgroundNode) self.addSubnode(self.buttonNode) self.addSubnode(self.labelNode) + self.addSubnode(self.viewsNode) self.buttonNode.addTarget(self, action: #selector(self.buttonPressed), forControlEvents: .touchUpInside) self.buttonNode.highligthedChanged = { [weak self] highlighted in if let strongSelf = self { if highlighted { - strongSelf.highlightedBackgroundNode.layer.removeAnimation(forKey: "opacity") - strongSelf.highlightedBackgroundNode.alpha = 1.0 + strongSelf.labelNode.layer.removeAnimation(forKey: "opacity") + strongSelf.labelNode.alpha = 0.4 } else { - strongSelf.highlightedBackgroundNode.alpha = 0.0 - strongSelf.highlightedBackgroundNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2) + strongSelf.labelNode.alpha = 1.0 + strongSelf.labelNode.layer.animateAlpha(from: 0.4, to: 1.0, duration: 0.2) } } } @@ -74,14 +84,18 @@ final class InstantPageFeedbackNode: ASDisplayNode, InstantPageNode { super.layout() let size = self.bounds.size - let inset: CGFloat = 15.0 + let inset: CGFloat = 16.0 self.highlightedBackgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -UIScreenPixel), size: CGSize(width: size.width, height: size.height + UIScreenPixel)) - self.buttonNode.frame = CGRect(origin: CGPoint(), size: size) + + + let viewsSize = self.viewsNode.measure(CGSize(width: size.width - inset * 2.0, height: size.height)) + self.viewsNode.frame = CGRect(origin: CGPoint(x: inset, y: floorToScreenPixels((size.height - viewsSize.height) / 2.0)), size: viewsSize) let labelSize = self.labelNode.measure(CGSize(width: size.width - inset * 2.0, height: size.height)) + self.labelNode.frame = CGRect(origin: CGPoint(x: size.width - labelSize.width - inset, y: floorToScreenPixels((size.height - labelSize.height) / 2.0)), size: labelSize) - self.labelNode.frame = CGRect(origin: CGPoint(x: floorToScreenPixels((size.width - labelSize.width) / 2.0), y: floorToScreenPixels((size.height - labelSize.height) / 2.0)), size: labelSize) + self.buttonNode.frame = CGRect(origin: CGPoint(x: size.width - labelSize.width - inset * 2.0, y: 0.0), size: size) } func updateIsVisible(_ isVisible: Bool) { @@ -100,6 +114,7 @@ final class InstantPageFeedbackNode: ASDisplayNode, InstantPageNode { func update(strings: PresentationStrings, theme: InstantPageTheme) { self.backgroundColor = theme.panelBackgroundColor self.highlightedBackgroundNode.backgroundColor = theme.panelHighlightedBackgroundColor - self.labelNode.attributedText = NSAttributedString(string: strings.InstantPage_FeedbackButton, font: Font.regular(13.0), textColor: theme.panelSecondaryColor) + self.labelNode.attributedText = NSAttributedString(string: strings.InstantPage_FeedbackButtonShort, font: Font.regular(13.0), textColor: theme.panelSecondaryColor) + self.viewsNode.attributedText = NSAttributedString(string: self.viewsNode.attributedText?.string ?? "", font: Font.regular(13.0), textColor: theme.panelSecondaryColor) } } diff --git a/submodules/PeersNearbyUI/Sources/PeersNearbyController.swift b/submodules/PeersNearbyUI/Sources/PeersNearbyController.swift index 5a9890b840..172272a9ec 100644 --- a/submodules/PeersNearbyUI/Sources/PeersNearbyController.swift +++ b/submodules/PeersNearbyUI/Sources/PeersNearbyController.swift @@ -325,7 +325,7 @@ private func peersNearbyControllerEntries(data: PeersNearbyData?, state: PeersNe if let data = data, !data.users.isEmpty { var index: Int32 = 0 - var users = data.users + var users = data.users.filter { $0.peer.0.id != data.accountPeerId } var effectiveExpanded = expanded if users.count > maxUsersDisplayedLimit && !expanded { users = Array(users.prefix(Int(maxUsersDisplayedLimit))) @@ -334,10 +334,8 @@ private func peersNearbyControllerEntries(data: PeersNearbyData?, state: PeersNe } for user in users { - if user.peer.0.id != data.accountPeerId { - entries.append(.user(index, presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, presentationData.nameDisplayOrder, user)) - index += 1 - } + entries.append(.user(index, presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, presentationData.nameDisplayOrder, user)) + index += 1 } if !effectiveExpanded { @@ -493,7 +491,7 @@ public func peersNearbyController(context: AccountContext) -> ViewController { var cancelImpl: (() -> Void)? let progressSignal = Signal { subscriber in - let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { cancelImpl?() })) presentControllerImpl?(controller, nil) diff --git a/submodules/SettingsUI/Sources/Data and Storage/StorageUsageController.swift b/submodules/SettingsUI/Sources/Data and Storage/StorageUsageController.swift index 223946be96..62bc22c0ee 100644 --- a/submodules/SettingsUI/Sources/Data and Storage/StorageUsageController.swift +++ b/submodules/SettingsUI/Sources/Data and Storage/StorageUsageController.swift @@ -742,7 +742,7 @@ public func storageUsageController(context: AccountContext, cacheUsagePromise: P var cancelImpl: (() -> Void)? let presentationData = context.sharedContext.currentPresentationData.with { $0 } let progressSignal = Signal { subscriber in - let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { cancelImpl?() })) presentControllerImpl?(controller, .window(.root), ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) @@ -869,7 +869,7 @@ public func storageUsageController(context: AccountContext, cacheUsagePromise: P var cancelImpl: (() -> Void)? let presentationData = context.sharedContext.currentPresentationData.with { $0 } let progressSignal = Signal { subscriber in - let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { cancelImpl?() })) presentControllerImpl?(controller, .window(.root), ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) diff --git a/submodules/SettingsUI/Sources/OpenSettings.swift b/submodules/SettingsUI/Sources/OpenSettings.swift index b76066a67b..333a2810fc 100644 --- a/submodules/SettingsUI/Sources/OpenSettings.swift +++ b/submodules/SettingsUI/Sources/OpenSettings.swift @@ -14,7 +14,7 @@ func openEditSettings(context: AccountContext, accountsAndPeers: Signal<((Accoun var cancelImpl: (() -> Void)? let presentationData = context.sharedContext.currentPresentationData.with { $0 } let progressSignal = Signal { subscriber in - let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { cancelImpl?() })) presentController(controller, nil) diff --git a/submodules/StatisticsUI/BUCK b/submodules/StatisticsUI/BUCK index 693dcc8cbc..995b6f117a 100644 --- a/submodules/StatisticsUI/BUCK +++ b/submodules/StatisticsUI/BUCK @@ -21,7 +21,7 @@ static_library( "//submodules/AlertUI:AlertUI", "//submodules/PresentationDataUtils:PresentationDataUtils", "//submodules/MergeLists:MergeLists", - "//submodules/Charts:Charts", + "//submodules/GraphUI:GraphUI", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/StatisticsUI/Sources/StatsController.swift b/submodules/StatisticsUI/Sources/StatsController.swift index 87b59f7d15..96a23cf398 100644 --- a/submodules/StatisticsUI/Sources/StatsController.swift +++ b/submodules/StatisticsUI/Sources/StatsController.swift @@ -14,13 +14,17 @@ import PresentationDataUtils import AccountContext import PresentationDataUtils import AppBundle -import Charts +import GraphUI private final class StatsControllerArguments { + let context: AccountContext let loadDetailedGraph: (ChannelStatsGraph, Int64) -> Signal + let openMessage: (MessageId) -> Void - init(loadDetailedGraph: @escaping (ChannelStatsGraph, Int64) -> Signal) { + init(context: AccountContext, loadDetailedGraph: @escaping (ChannelStatsGraph, Int64) -> Signal, openMessage: @escaping (MessageId) -> Void) { + self.context = context self.loadDetailedGraph = loadDetailedGraph + self.openMessage = openMessage } } @@ -30,10 +34,12 @@ private enum StatsSection: Int32 { case followers case notifications case viewsByHour - case postInteractions case viewsBySource case followersBySource case languages + case postInteractions + case recentPosts + case instantPageInteractions } private enum StatsEntry: ItemListNodeEntry { @@ -51,10 +57,7 @@ private enum StatsEntry: ItemListNodeEntry { case viewsByHourTitle(PresentationTheme, String) case viewsByHourGraph(PresentationTheme, PresentationStrings, PresentationDateTimeFormat, ChannelStatsGraph, ChartType) - - case postInteractionsTitle(PresentationTheme, String) - case postInteractionsGraph(PresentationTheme, PresentationStrings, PresentationDateTimeFormat, ChannelStatsGraph, ChartType) - + case viewsBySourceTitle(PresentationTheme, String) case viewsBySourceGraph(PresentationTheme, PresentationStrings, PresentationDateTimeFormat, ChannelStatsGraph, ChartType) @@ -64,6 +67,15 @@ private enum StatsEntry: ItemListNodeEntry { case languagesTitle(PresentationTheme, String) case languagesGraph(PresentationTheme, PresentationStrings, PresentationDateTimeFormat, ChannelStatsGraph, ChartType) + case postInteractionsTitle(PresentationTheme, String) + case postInteractionsGraph(PresentationTheme, PresentationStrings, PresentationDateTimeFormat, ChannelStatsGraph, ChartType) + + case postsTitle(PresentationTheme, String) + case post(Int32, PresentationTheme, PresentationStrings, PresentationDateTimeFormat, Message, ChannelStatsMessageInteractions) + + case instantPageInteractionsTitle(PresentationTheme, String) + case instantPageInteractionsGraph(PresentationTheme, PresentationStrings, PresentationDateTimeFormat, ChannelStatsGraph, ChartType) + var section: ItemListSectionId { switch self { case .overviewHeader, .overview: @@ -76,14 +88,18 @@ private enum StatsEntry: ItemListNodeEntry { 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 + case .postInteractionsTitle, .postInteractionsGraph: + return StatsSection.postInteractions.rawValue + case .postsTitle, .post: + return StatsSection.recentPosts.rawValue + case .instantPageInteractionsTitle, .instantPageInteractionsGraph: + return StatsSection.instantPageInteractions.rawValue } } @@ -109,22 +125,30 @@ private enum StatsEntry: ItemListNodeEntry { return 8 case .viewsByHourGraph: return 9 - case .postInteractionsTitle: - return 10 - case .postInteractionsGraph: - return 11 case .viewsBySourceTitle: - return 12 + return 10 case .viewsBySourceGraph: - return 13 + return 11 case .followersBySourceTitle: - return 14 + return 12 case .followersBySourceGraph: - return 15 + return 13 case .languagesTitle: - return 16 + return 14 case .languagesGraph: + return 15 + case .postInteractionsTitle: + return 16 + case .postInteractionsGraph: return 17 + case .postsTitle: + return 18 + case let .post(index, _, _, _, _, _): + return 19 + index + case .instantPageInteractionsTitle: + return 1000 + case .instantPageInteractionsGraph: + return 1001 } } @@ -190,18 +214,6 @@ private enum StatsEntry: ItemListNodeEntry { } 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, lhsGraph, lhsType): - if case let .postInteractionsGraph(rhsTheme, rhsStrings, rhsDateTimeFormat, rhsGraph, rhsType) = rhs, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsDateTimeFormat == rhsDateTimeFormat, lhsGraph == rhsGraph, lhsType == rhsType { - return true - } else { - return false - } case let .viewsBySourceTitle(lhsTheme, lhsText): if case let .viewsBySourceTitle(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { return true @@ -238,6 +250,42 @@ private enum StatsEntry: ItemListNodeEntry { } 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, lhsGraph, lhsType): + if case let .postInteractionsGraph(rhsTheme, rhsStrings, rhsDateTimeFormat, rhsGraph, rhsType) = rhs, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsDateTimeFormat == rhsDateTimeFormat, lhsGraph == rhsGraph, lhsType == rhsType { + return true + } else { + return false + } + case let .postsTitle(lhsTheme, lhsText): + if case let .postsTitle(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + return true + } else { + return false + } + case let .post(lhsIndex, lhsTheme, lhsStrings, lhsDateTimeFormat, lhsMessage, lhsInteractions): + if case let .post(rhsIndex, rhsTheme, rhsStrings, rhsDateTimeFormat, rhsMessage, rhsInteractions) = rhs, lhsIndex == rhsIndex, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsDateTimeFormat == rhsDateTimeFormat, lhsInteractions == rhsInteractions { + return true + } else { + return false + } + case let .instantPageInteractionsTitle(lhsTheme, lhsText): + if case let .instantPageInteractionsTitle(rhsTheme, rhsText) = rhs, lhsTheme === rhsTheme, lhsText == rhsText { + return true + } else { + return false + } + case let .instantPageInteractionsGraph(lhsTheme, lhsStrings, lhsDateTimeFormat, lhsGraph, lhsType): + if case let .instantPageInteractionsGraph(rhsTheme, rhsStrings, rhsDateTimeFormat, rhsGraph, rhsType) = rhs, lhsTheme === rhsTheme, lhsStrings === rhsStrings, lhsDateTimeFormat == rhsDateTimeFormat, lhsGraph == rhsGraph, lhsType == rhsType { + return true + } else { + return false + } } } @@ -254,10 +302,12 @@ private enum StatsEntry: ItemListNodeEntry { 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): + let .languagesTitle(theme, text), + let .postInteractionsTitle(theme, text), + let .postsTitle(theme, text), + let .instantPageInteractionsTitle(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) @@ -269,21 +319,37 @@ private enum StatsEntry: ItemListNodeEntry { return StatsGraphItem(presentationData: presentationData, graph: graph, type: type, sectionId: self.section, style: .blocks) case let .viewsByHourGraph(theme, strings, dateTimeFormat, graph, type): return StatsGraphItem(presentationData: presentationData, graph: graph, type: type, sectionId: self.section, style: .blocks) - case let .postInteractionsGraph(theme, strings, dateTimeFormat, graph, type): - return StatsGraphItem(presentationData: presentationData, graph: graph, type: type, getDetailsData: { date, completion in - let _ = arguments.loadDetailedGraph(graph, Int64(date.timeIntervalSince1970)) - }, sectionId: self.section, style: .blocks) case let .viewsBySourceGraph(theme, strings, dateTimeFormat, graph, type): return StatsGraphItem(presentationData: presentationData, graph: graph, type: type, height: 160.0, sectionId: self.section, style: .blocks) case let .followersBySourceGraph(theme, strings, dateTimeFormat, graph, type): return StatsGraphItem(presentationData: presentationData, graph: graph, type: type, height: 160.0, sectionId: self.section, style: .blocks) case let .languagesGraph(theme, strings, dateTimeFormat, graph, type): return StatsGraphItem(presentationData: presentationData, graph: graph, type: type, height: 100.0, sectionId: self.section, style: .blocks) + case let .postInteractionsGraph(theme, strings, dateTimeFormat, graph, type): + return StatsGraphItem(presentationData: presentationData, graph: graph, type: type, getDetailsData: { date, completion in + let _ = arguments.loadDetailedGraph(graph, Int64(date.timeIntervalSince1970) * 1000).start(next: { graph in + if let graph = graph, case let .Loaded(_, data) = graph { + completion(data) + } + }) + }, sectionId: self.section, style: .blocks) + case let .post(index, theme, strings, dateTimeFormat, message, interactions): + return StatsMessageItem(context: arguments.context, presentationData: presentationData, message: message, views: interactions.views, forwards: interactions.forwards, sectionId: self.section, style: .blocks, action: { + arguments.openMessage(message.id) + }) + case let .instantPageInteractionsGraph(theme, strings, dateTimeFormat, graph, type): + return StatsGraphItem(presentationData: presentationData, graph: graph, type: type, getDetailsData: { date, completion in + let _ = arguments.loadDetailedGraph(graph, Int64(date.timeIntervalSince1970) * 1000).start(next: { graph in + if let graph = graph, case let .Loaded(_, data) = graph { + completion(data) + } + }) + }, sectionId: self.section, style: .blocks) } } } -private func statsControllerEntries(data: ChannelStats?, presentationData: PresentationData) -> [StatsEntry] { +private func statsControllerEntries(data: ChannelStats?, messages: [Message]?, interactions: [MessageId: ChannelStatsMessageInteractions]?, presentationData: PresentationData) -> [StatsEntry] { var entries: [StatsEntry] = [] if let data = data { @@ -293,77 +359,126 @@ private func statsControllerEntries(data: ChannelStats?, presentationData: Prese entries.append(.overviewHeader(presentationData.theme, presentationData.strings.Stats_Overview, "\(minDate) – \(maxDate)")) entries.append(.overview(presentationData.theme, data)) - entries.append(.growthTitle(presentationData.theme, presentationData.strings.Stats_GrowthTitle)) - entries.append(.growthGraph(presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, data.growthGraph, .lines)) + if !data.growthGraph.isEmpty { + entries.append(.growthTitle(presentationData.theme, presentationData.strings.Stats_GrowthTitle)) + entries.append(.growthGraph(presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, data.growthGraph, .lines)) + } - entries.append(.followersTitle(presentationData.theme, presentationData.strings.Stats_FollowersTitle)) - entries.append(.followersGraph(presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, data.followersGraph, .lines)) + if !data.followersGraph.isEmpty { + entries.append(.followersTitle(presentationData.theme, presentationData.strings.Stats_FollowersTitle)) + entries.append(.followersGraph(presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, data.followersGraph, .lines)) + } - entries.append(.notificationsTitle(presentationData.theme, presentationData.strings.Stats_NotificationsTitle)) - entries.append(.notificationsGraph(presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, data.muteGraph, .lines)) + if !data.muteGraph.isEmpty { + entries.append(.notificationsTitle(presentationData.theme, presentationData.strings.Stats_NotificationsTitle)) + entries.append(.notificationsGraph(presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, data.muteGraph, .lines)) + } - entries.append(.postInteractionsTitle(presentationData.theme, presentationData.strings.Stats_InteractionsTitle)) - entries.append(.postInteractionsGraph(presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, data.interactionsGraph, .twoAxis)) + if !data.viewsBySourceGraph.isEmpty { + entries.append(.viewsBySourceTitle(presentationData.theme, presentationData.strings.Stats_ViewsBySourceTitle)) + entries.append(.viewsBySourceGraph(presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, data.viewsBySourceGraph, .bars)) + } - entries.append(.viewsBySourceTitle(presentationData.theme, presentationData.strings.Stats_ViewsBySourceTitle)) - entries.append(.viewsBySourceGraph(presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, data.viewsBySourceGraph, .bars)) + if !data.newFollowersBySourceGraph.isEmpty { + entries.append(.followersBySourceTitle(presentationData.theme, presentationData.strings.Stats_FollowersBySourceTitle)) + entries.append(.followersBySourceGraph(presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, data.newFollowersBySourceGraph, .bars)) + } - entries.append(.followersBySourceTitle(presentationData.theme, presentationData.strings.Stats_FollowersBySourceTitle)) - entries.append(.followersBySourceGraph(presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, data.newFollowersBySourceGraph, .bars)) + if !data.languagesGraph.isEmpty { + entries.append(.languagesTitle(presentationData.theme, presentationData.strings.Stats_LanguagesTitle)) + entries.append(.languagesGraph(presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, data.languagesGraph, .pie)) + } - entries.append(.languagesTitle(presentationData.theme, presentationData.strings.Stats_LanguagesTitle)) - entries.append(.languagesGraph(presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, data.languagesGraph, .pie)) + if !data.interactionsGraph.isEmpty { + entries.append(.postInteractionsTitle(presentationData.theme, presentationData.strings.Stats_InteractionsTitle)) + entries.append(.postInteractionsGraph(presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, data.interactionsGraph, .step)) + } + + if let messages = messages, !messages.isEmpty, let interactions = interactions, !interactions.isEmpty { + entries.append(.postsTitle(presentationData.theme, presentationData.strings.Stats_PostsTitle)) + var index: Int32 = 0 + for message in messages { + if let interactions = interactions[message.id] { + entries.append(.post(index, presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, message, interactions)) + index += 1 + } + } + } + + if !data.instantPageInteractionsGraph.isEmpty { + entries.append(.instantPageInteractionsTitle(presentationData.theme, presentationData.strings.Stats_InstantViewInteractionsTitle)) + entries.append(.instantPageInteractionsGraph(presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, data.instantPageInteractionsGraph, .step)) + } } return entries } -public func channelStatsController(context: AccountContext, peer: Peer, cachedPeerData: CachedPeerData) -> ViewController { +public func channelStatsController(context: AccountContext, peerId: PeerId, cachedPeerData: CachedPeerData) -> ViewController { var pushControllerImpl: ((ViewController) -> Void)? var presentControllerImpl: ((ViewController, ViewControllerPresentationArguments?) -> Void)? - var navigateToChatImpl: ((Peer) -> Void)? + var navigateToMessageImpl: ((MessageId) -> Void)? let actionsDisposable = DisposableSet() let checkCreationAvailabilityDisposable = MetaDisposable() actionsDisposable.add(checkCreationAvailabilityDisposable) let dataPromise = Promise(nil) + let messagesPromise = Promise(nil) var datacenterId: Int32 = 0 if let cachedData = cachedPeerData as? CachedChannelData { datacenterId = cachedData.statsDatacenterId } - let statsContext = ChannelStatsContext(postbox: context.account.postbox, network: context.account.network, datacenterId: datacenterId, peerId: peer.id) + let statsContext = ChannelStatsContext(postbox: context.account.postbox, network: context.account.network, datacenterId: datacenterId, peerId: peerId) 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() - w.loadNewFollowersBySourceGraph() - w.loadViewsBySourceGraph() - w.loadLanguagesGraph() + } |> afterNext({ [weak statsContext] stats in + if let statsContext = statsContext, let stats = stats { + if case .OnDemand = stats.interactionsGraph { + statsContext.loadInteractionsGraph() + statsContext.loadNewFollowersBySourceGraph() + statsContext.loadViewsBySourceGraph() + statsContext.loadLanguagesGraph() + statsContext.loadInstantPageInteractionsGraph() } } }) dataPromise.set(.single(nil) |> then(dataSignal)) - let arguments = StatsControllerArguments(loadDetailedGraph: { graph, x -> Signal in + let arguments = StatsControllerArguments(context: context, loadDetailedGraph: { graph, x -> Signal in return statsContext.loadDetailedGraph(graph, x: x) + }, openMessage: { messageId in + navigateToMessageImpl?(messageId) }) - let signal = combineLatest(context.sharedContext.presentationData, dataPromise.get()) + let messageView = context.account.viewTracker.aroundMessageHistoryViewForLocation(.peer(peerId), index: .upperBound, anchorIndex: .upperBound, count: 100, fixedCombinedReadStates: nil) + |> map { messageHistoryView, _, _ -> MessageHistoryView? in + return messageHistoryView + } + messagesPromise.set(.single(nil) |> then(messageView)) + + let signal = combineLatest(context.sharedContext.presentationData, dataPromise.get(), messagesPromise.get()) |> deliverOnMainQueue - |> map { presentationData, data -> (ItemListControllerState, (ItemListNodeState, Any)) in + |> map { presentationData, data, messageView -> (ItemListControllerState, (ItemListNodeState, Any)) in var emptyStateItem: ItemListControllerEmptyStateItem? if data == nil { emptyStateItem = ItemListLoadingIndicatorEmptyStateItem(theme: presentationData.theme) } + let messages = messageView?.entries.map { $0.message }.sorted(by: { (lhsMessage, rhsMessage) -> Bool in + return lhsMessage.timestamp > rhsMessage.timestamp + }) + let interactions = data?.messageInteractions.reduce([MessageId : ChannelStatsMessageInteractions]()) { (map, interactions) -> [MessageId : ChannelStatsMessageInteractions] in + var map = map + map[interactions.messageId] = interactions + return map + } + 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: emptyStateItem, crossfadeState: false, animateChanges: false) + let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: statsControllerEntries(data: data, messages: messages, interactions: interactions, presentationData: presentationData), style: .blocks, emptyStateItem: emptyStateItem, crossfadeState: false, animateChanges: false) return (controllerState, (listState, arguments)) } @@ -386,6 +501,10 @@ public func channelStatsController(context: AccountContext, peer: Peer, cachedPe controller.present(c, in: .window(.root), with: a) } } - + navigateToMessageImpl = { [weak controller] messageId in + if let navigationController = controller?.navigationController as? NavigationController { + context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: context, chatLocation: .peer(messageId.peerId), subject: .message(messageId), keepStack: .always, useExisting: false, purposefulAction: {})) + } + } return controller } diff --git a/submodules/StatisticsUI/Sources/StatsGraphItem.swift b/submodules/StatisticsUI/Sources/StatsGraphItem.swift index d8da3b40d1..679fa38874 100644 --- a/submodules/StatisticsUI/Sources/StatsGraphItem.swift +++ b/submodules/StatisticsUI/Sources/StatsGraphItem.swift @@ -8,18 +8,18 @@ import SyncCore import TelegramPresentationData import ItemListUI import PresentationDataUtils -import Charts +import GraphUI class StatsGraphItem: ListViewItem, ItemListItem { let presentationData: ItemListPresentationData let graph: ChannelStatsGraph let type: ChartType let height: CGFloat - let getDetailsData: ((Date, (String?) -> Void) -> Void)? + let getDetailsData: ((Date, @escaping (String?) -> Void) -> Void)? let sectionId: ItemListSectionId let style: ItemListStyle - init(presentationData: ItemListPresentationData, graph: ChannelStatsGraph, type: ChartType, height: CGFloat = 0.0, getDetailsData: ((Date, (String?) -> Void) -> Void)? = nil, sectionId: ItemListSectionId, style: ItemListStyle) { + init(presentationData: ItemListPresentationData, graph: ChannelStatsGraph, type: ChartType, height: CGFloat = 0.0, getDetailsData: ((Date, @escaping (String?) -> Void) -> Void)? = nil, sectionId: ItemListSectionId, style: ItemListStyle) { self.presentationData = presentationData self.graph = graph self.type = type @@ -69,6 +69,7 @@ class StatsGraphItemNode: ListViewItemNode { private let backgroundNode: ASDisplayNode private let topStripeNode: ASDisplayNode private let bottomStripeNode: ASDisplayNode + private let maskNode: ASImageNode let chartNode: ChartNode @@ -79,6 +80,8 @@ class StatsGraphItemNode: ListViewItemNode { self.backgroundNode.isLayerBacked = true self.backgroundNode.backgroundColor = .white + self.maskNode = ASImageNode() + self.topStripeNode = ASDisplayNode() self.topStripeNode.isLayerBacked = true @@ -94,6 +97,14 @@ class StatsGraphItemNode: ListViewItemNode { self.addSubnode(self.chartNode) } + override func didLoad() { + super.didLoad() + + self.chartNode.view.interactiveTransitionGestureRecognizerTest = { point -> Bool in + return point.x > 30.0 + } + } + func asyncLayout() -> (_ item: StatsGraphItem, _ params: ListViewItemLayoutParams, _ insets: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) { let currentItem = self.item @@ -153,7 +164,9 @@ class StatsGraphItemNode: ListViewItemNode { if strongSelf.bottomStripeNode.supernode == nil { strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 0) } - + if strongSelf.maskNode.supernode != nil { + strongSelf.maskNode.removeFromSupernode() + } 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 { @@ -165,23 +178,34 @@ class StatsGraphItemNode: ListViewItemNode { if strongSelf.bottomStripeNode.supernode == nil { strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 2) } + if strongSelf.maskNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.maskNode, at: 3) + } + let hasCorners = itemListHasRoundedBlockLayout(params) + var hasTopCorners = false + var hasBottomCorners = false switch neighbors.top { - case .sameSection(false): - strongSelf.topStripeNode.isHidden = true - default: - strongSelf.topStripeNode.isHidden = false + case .sameSection(false): + strongSelf.topStripeNode.isHidden = true + default: + hasTopCorners = true + strongSelf.topStripeNode.isHidden = hasCorners } let bottomStripeInset: CGFloat switch neighbors.bottom { - case .sameSection(false): - bottomStripeInset = leftInset - default: - bottomStripeInset = 0.0 + case .sameSection(false): + bottomStripeInset = leftInset + default: + bottomStripeInset = 0.0 + hasBottomCorners = true + strongSelf.bottomStripeNode.isHidden = hasCorners } - strongSelf.chartNode.frame = CGRect(origin: CGPoint(x: leftInset, y: 0.0), size: CGSize(width: layout.size.width - leftInset - rightInset, height: 400.0)) + strongSelf.chartNode.frame = CGRect(origin: CGPoint(x: leftInset, y: 0.0), size: CGSize(width: layout.size.width - leftInset - rightInset, height: 500.0)) + strongSelf.maskNode.image = hasCorners ? PresentationResourcesItemList.cornersImage(item.presentationData.theme, top: hasTopCorners, bottom: hasBottomCorners) : nil 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.maskNode.frame = strongSelf.backgroundNode.frame.insetBy(dx: params.leftInset, dy: 0.0) 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)) } diff --git a/submodules/StatisticsUI/Sources/StatsMessageItem.swift b/submodules/StatisticsUI/Sources/StatsMessageItem.swift new file mode 100644 index 0000000000..c0df1622c6 --- /dev/null +++ b/submodules/StatisticsUI/Sources/StatsMessageItem.swift @@ -0,0 +1,435 @@ +import Foundation +import UIKit +import Display +import AsyncDisplayKit +import SwiftSignalKit +import Postbox +import TelegramCore +import SyncCore +import AccountContext +import TelegramPresentationData +import TelegramStringFormatting +import ItemListUI +import PresentationDataUtils +import PhotoResources + +public class StatsMessageItem: ListViewItem, ItemListItem { + let context: AccountContext + let presentationData: ItemListPresentationData + let message: Message + let views: Int32 + let forwards: Int32 + public let sectionId: ItemListSectionId + let style: ItemListStyle + let action: (() -> Void)? + + init(context: AccountContext, presentationData: ItemListPresentationData, message: Message, views: Int32, forwards: Int32, sectionId: ItemListSectionId, style: ItemListStyle, action: (() -> Void)?) { + self.context = context + self.presentationData = presentationData + self.message = message + self.views = views + self.forwards = forwards + self.sectionId = sectionId + self.style = style + self.action = action + } + + public 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 = StatsMessageItemNode() + 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() }) + }) + } + } + } + + public 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? StatsMessageItemNode { + 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() + }) + } + } + } + } + } + + public var selectable: Bool = true + + public func selected(listView: ListView){ + listView.clearHighlightAnimated(true) + self.action?() + } +} + + +private let badgeFont = Font.regular(15.0) + +public class StatsMessageItemNode: ListViewItemNode, ItemListItemNode { + private let backgroundNode: ASDisplayNode + private let topStripeNode: ASDisplayNode + private let bottomStripeNode: ASDisplayNode + private let highlightedBackgroundNode: ASDisplayNode + private let maskNode: ASImageNode + + let contentImageNode: TransformImageNode + let titleNode: TextNode + let labelNode: TextNode + let viewsNode: TextNode + let forwardsNode: TextNode + + private let activateArea: AccessibilityAreaNode + + private var item: StatsMessageItem? + private var contentImageMedia: Media? + + override public var canBeSelected: Bool { + return true + } + + public var tag: ItemListItemTag? { + return self.item?.tag + } + + public init() { + self.backgroundNode = ASDisplayNode() + self.backgroundNode.isLayerBacked = true + self.backgroundNode.backgroundColor = .white + + self.maskNode = ASImageNode() + + self.topStripeNode = ASDisplayNode() + self.topStripeNode.isLayerBacked = true + + self.bottomStripeNode = ASDisplayNode() + self.bottomStripeNode.isLayerBacked = true + + self.contentImageNode = TransformImageNode() + self.contentImageNode.isLayerBacked = true + + self.titleNode = TextNode() + self.titleNode.isUserInteractionEnabled = false + + self.labelNode = TextNode() + self.labelNode.isUserInteractionEnabled = false + + self.viewsNode = TextNode() + self.viewsNode.isUserInteractionEnabled = false + + self.forwardsNode = TextNode() + self.forwardsNode.isUserInteractionEnabled = false + + self.highlightedBackgroundNode = ASDisplayNode() + self.highlightedBackgroundNode.isLayerBacked = true + + self.activateArea = AccessibilityAreaNode() + + super.init(layerBacked: false, dynamicBounce: false) + + self.addSubnode(self.contentImageNode) + self.addSubnode(self.titleNode) + self.addSubnode(self.labelNode) + self.addSubnode(self.viewsNode) + self.addSubnode(self.forwardsNode) + + self.addSubnode(self.activateArea) + } + + public func asyncLayout() -> (_ item: StatsMessageItem, _ params: ListViewItemLayoutParams, _ insets: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) { + let makeTitleLayout = TextNode.asyncLayout(self.titleNode) + let makeLabelLayout = TextNode.asyncLayout(self.labelNode) + let makeViewsLayout = TextNode.asyncLayout(self.viewsNode) + let makeForwardsLayout = TextNode.asyncLayout(self.forwardsNode) + + let currentItem = self.item + let currentContentImageMedia = self.contentImageMedia + + return { item, params, neighbors in + var updatedTheme: PresentationTheme? + + if currentItem?.presentationData.theme !== item.presentationData.theme { + updatedTheme = item.presentationData.theme + } + + let contentSize: CGSize + let insets: UIEdgeInsets + let separatorHeight = UIScreenPixel + let itemBackgroundColor: UIColor + let itemSeparatorColor: UIColor + + var leftInset = 16.0 + params.leftInset + var rightInset = 16.0 + params.rightInset + var totalLeftInset = leftInset + var additionalRightInset: CGFloat = 93.0 + + let titleFont = Font.regular(item.presentationData.fontSize.itemListBaseFontSize) + + let contentKind = messageContentKind(contentSettings: item.context.currentContentSettings.with { $0 }, message: item.message, strings: item.presentationData.strings, nameDisplayOrder: .firstLast, accountPeerId: item.context.account.peerId) + let text = stringForMediaKind(contentKind, strings: item.presentationData.strings).0 + + var contentImageMedia: Media? + for media in item.message.media { + if let image = media as? TelegramMediaImage { + contentImageMedia = image + break + } else if let file = media as? TelegramMediaFile { + if file.isVideo && !file.isInstantVideo { + contentImageMedia = file + break + } + } else if let webpage = media as? TelegramMediaWebpage, case let .Loaded(content) = webpage.content { + if let image = content.image { + contentImageMedia = image + break + } else if let file = content.file { + if file.isVideo && !file.isInstantVideo { + contentImageMedia = file + break + } + } + } + } + + if let _ = contentImageMedia { + totalLeftInset += 48.0 + } + + var updateImageSignal: Signal<(TransformImageArguments) -> DrawingContext?, NoError>? + if let contentImageMedia = contentImageMedia { + if let currentContentImageMedia = currentContentImageMedia, contentImageMedia.isSemanticallyEqual(to: currentContentImageMedia) { + } else { + if let image = contentImageMedia as? TelegramMediaImage { + updateImageSignal = mediaGridMessagePhoto(account: item.context.account, photoReference: .message(message: MessageReference(item.message), media: image)) + } else if let file = contentImageMedia as? TelegramMediaFile { + updateImageSignal = mediaGridMessageVideo(postbox: item.context.account.postbox, videoReference: .message(message: MessageReference(item.message), media: file), autoFetchFullSizeThumbnail: true) + } + } + } + + let (titleLayout, titleApply) = makeTitleLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: text, font: titleFont, textColor: item.presentationData.theme.list.itemPrimaryTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width - totalLeftInset - rightInset - additionalRightInset, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) + + let labelFont = Font.regular(floor(item.presentationData.fontSize.itemListBaseFontSize * 13.0 / 17.0)) + + let presentationData = item.context.sharedContext.currentPresentationData.with { $0 } + let label = stringForFullDate(timestamp: item.message.timestamp, strings: item.presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat) + + let (labelLayout, labelApply) = makeLabelLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: label, font: labelFont, textColor: item.presentationData.theme.list.itemSecondaryTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width - totalLeftInset - rightInset - additionalRightInset, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) + + let (viewsLayout, viewsApply) = makeViewsLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: item.presentationData.strings.Stats_MessageViews(item.views), font: labelFont, textColor: item.presentationData.theme.list.itemPrimaryTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: 100.0, height: CGFloat.greatestFiniteMagnitude), alignment: .right, cutout: nil, insets: UIEdgeInsets())) + + let (forwardsLayout, forwardsApply) = makeForwardsLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: item.presentationData.strings.Stats_MessageForwards(item.forwards), font: labelFont, textColor: item.presentationData.theme.list.itemSecondaryTextColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: 100.0, height: CGFloat.greatestFiniteMagnitude), alignment: .right, cutout: nil, insets: UIEdgeInsets())) + + let verticalInset: CGFloat = 11.0 + let titleSpacing: CGFloat = 3.0 + + let height: CGFloat = verticalInset * 2.0 + titleLayout.size.height + titleSpacing + labelLayout.size.height + + switch item.style { + case .plain: + itemBackgroundColor = item.presentationData.theme.list.plainBackgroundColor + itemSeparatorColor = item.presentationData.theme.list.itemPlainSeparatorColor + contentSize = CGSize(width: params.width, height: height) + insets = itemListNeighborsPlainInsets(neighbors) + case .blocks: + itemBackgroundColor = item.presentationData.theme.list.itemBlocksBackgroundColor + itemSeparatorColor = item.presentationData.theme.list.itemBlocksSeparatorColor + contentSize = CGSize(width: params.width, height: height) + 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 + + strongSelf.activateArea.frame = CGRect(origin: CGPoint(x: params.leftInset, y: 0.0), size: CGSize(width: params.width - params.leftInset - params.rightInset, height: layout.contentSize.height)) + strongSelf.activateArea.accessibilityLabel = text + strongSelf.activateArea.accessibilityValue = label + + if let _ = updatedTheme { + strongSelf.topStripeNode.backgroundColor = itemSeparatorColor + strongSelf.bottomStripeNode.backgroundColor = itemSeparatorColor + strongSelf.backgroundNode.backgroundColor = itemBackgroundColor + strongSelf.highlightedBackgroundNode.backgroundColor = item.presentationData.theme.list.itemHighlightedBackgroundColor + } + + var dimensions: CGSize? + if let contentImageMedia = contentImageMedia as? TelegramMediaImage { + dimensions = largestRepresentationForPhoto(contentImageMedia)?.dimensions.cgSize + } else if let contentImageMedia = contentImageMedia as? TelegramMediaFile { + dimensions = contentImageMedia.dimensions?.cgSize + } + + let contentImageSize = CGSize(width: 40.0, height: 40.0) + + var contentImageNodeAppeared = false + if let dimensions = dimensions { + let makeImageLayout = strongSelf.contentImageNode.asyncLayout() + let imageSize = contentImageSize + + let applyImageLayout = makeImageLayout(TransformImageArguments(corners: ImageCorners(radius: 4.0), imageSize: dimensions.aspectFilled(imageSize), boundingSize: imageSize, intrinsicInsets: UIEdgeInsets())) + applyImageLayout() + + if let updateImageSignal = updateImageSignal { + strongSelf.contentImageNode.setSignal(updateImageSignal) + if currentContentImageMedia == nil { + strongSelf.contentImageNode.isHidden = false + contentImageNodeAppeared = true + } + } + } else { + if currentContentImageMedia != nil { + strongSelf.contentImageNode.removeFromSupernode() + strongSelf.contentImageNode.setSignal(.single({ _ in nil })) + strongSelf.contentImageNode.isHidden = true + } + } + + let _ = titleApply() + let _ = labelApply() + let _ = viewsApply() + let _ = forwardsApply() + + 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) + } + if strongSelf.maskNode.supernode != nil { + strongSelf.maskNode.removeFromSupernode() + } + 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) + } + if strongSelf.maskNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.maskNode, at: 3) + } + + let hasCorners = itemListHasRoundedBlockLayout(params) + var hasTopCorners = false + var hasBottomCorners = false + switch neighbors.top { + case .sameSection(false): + strongSelf.topStripeNode.isHidden = true + default: + hasTopCorners = true + strongSelf.topStripeNode.isHidden = hasCorners + } + let bottomStripeInset: CGFloat + switch neighbors.bottom { + case .sameSection(false): + bottomStripeInset = leftInset + default: + bottomStripeInset = 0.0 + hasBottomCorners = true + strongSelf.bottomStripeNode.isHidden = hasCorners + } + + strongSelf.maskNode.image = hasCorners ? PresentationResourcesItemList.cornersImage(item.presentationData.theme, top: hasTopCorners, bottom: hasBottomCorners) : nil + + 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.maskNode.frame = strongSelf.backgroundNode.frame.insetBy(dx: params.leftInset, dy: 0.0) + 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)) + } + + let contentImageFrame = CGRect(origin: CGPoint(x: leftInset, y: floorToScreenPixels((height - contentImageSize.height) / 2.0)), size: contentImageSize) + strongSelf.contentImageNode.frame = contentImageFrame + + let titleFrame = CGRect(origin: CGPoint(x: totalLeftInset, y: 11.0), size: titleLayout.size) + strongSelf.titleNode.frame = titleFrame + + let labelFrame = CGRect(origin: CGPoint(x: totalLeftInset, y: titleFrame.maxY + titleSpacing), size: labelLayout.size) + strongSelf.labelNode.frame = labelFrame + + let viewsFrame = CGRect(origin: CGPoint(x: params.width - rightInset - viewsLayout.size.width, y: 15.0), size: viewsLayout.size) + strongSelf.viewsNode.frame = viewsFrame + + let forwardsFrame = CGRect(origin: CGPoint(x: params.width - rightInset - forwardsLayout.size.width, y: titleFrame.maxY + titleSpacing), size: forwardsLayout.size) + strongSelf.forwardsNode.frame = forwardsFrame + + strongSelf.highlightedBackgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -UIScreenPixel), size: CGSize(width: params.width, height: height + UIScreenPixel)) + } + }) + } + } + + override public func setHighlighted(_ highlighted: Bool, at point: CGPoint, animated: Bool) { + super.setHighlighted(highlighted, at: point, animated: animated) + + if highlighted { + self.highlightedBackgroundNode.alpha = 1.0 + if self.highlightedBackgroundNode.supernode == nil { + var anchorNode: ASDisplayNode? + if self.bottomStripeNode.supernode != nil { + anchorNode = self.bottomStripeNode + } else if self.topStripeNode.supernode != nil { + anchorNode = self.topStripeNode + } else if self.backgroundNode.supernode != nil { + anchorNode = self.backgroundNode + } + if let anchorNode = anchorNode { + self.insertSubnode(self.highlightedBackgroundNode, aboveSubnode: anchorNode) + } else { + self.addSubnode(self.highlightedBackgroundNode) + } + } + } else { + if self.highlightedBackgroundNode.supernode != nil { + if animated { + self.highlightedBackgroundNode.layer.animateAlpha(from: self.highlightedBackgroundNode.alpha, to: 0.0, duration: 0.4, completion: { [weak self] completed in + if let strongSelf = self { + if completed { + strongSelf.highlightedBackgroundNode.removeFromSupernode() + } + } + }) + self.highlightedBackgroundNode.alpha = 0.0 + } else { + self.highlightedBackgroundNode.removeFromSupernode() + } + } + } + } + + override public func animateInsertion(_ currentTimestamp: Double, duration: Double, short: Bool) { + self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.4) + } + + override public func animateAdded(_ currentTimestamp: Double, duration: Double) { + self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + } + + override public 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 index fd5c1a5083..addf64c225 100644 --- a/submodules/StatisticsUI/Sources/StatsOverviewItem.swift +++ b/submodules/StatisticsUI/Sources/StatsOverviewItem.swift @@ -8,7 +8,6 @@ import SyncCore import TelegramPresentationData import ItemListUI import PresentationDataUtils -import Charts class StatsOverviewItem: ListViewItem, ItemListItem { let presentationData: ItemListPresentationData @@ -63,6 +62,7 @@ class StatsOverviewItemNode: ListViewItemNode { private let backgroundNode: ASDisplayNode private let topStripeNode: ASDisplayNode private let bottomStripeNode: ASDisplayNode + private let maskNode: ASImageNode private let followersValueLabel: ImmediateTextNode private let viewsPerPostValueLabel: ImmediateTextNode @@ -90,6 +90,8 @@ class StatsOverviewItemNode: ListViewItemNode { self.bottomStripeNode = ASDisplayNode() self.bottomStripeNode.isLayerBacked = true + + self.maskNode = ASImageNode() self.followersValueLabel = ImmediateTextNode() self.viewsPerPostValueLabel = ImmediateTextNode() @@ -262,7 +264,9 @@ class StatsOverviewItemNode: ListViewItemNode { if strongSelf.bottomStripeNode.supernode == nil { strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 0) } - + if strongSelf.maskNode.supernode != nil { + strongSelf.maskNode.removeFromSupernode() + } 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 { @@ -274,21 +278,34 @@ class StatsOverviewItemNode: ListViewItemNode { if strongSelf.bottomStripeNode.supernode == nil { strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 2) } + if strongSelf.maskNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.maskNode, at: 3) + } + + let hasCorners = itemListHasRoundedBlockLayout(params) + var hasTopCorners = false + var hasBottomCorners = false switch neighbors.top { - case .sameSection(false): - strongSelf.topStripeNode.isHidden = true - default: - strongSelf.topStripeNode.isHidden = false + case .sameSection(false): + strongSelf.topStripeNode.isHidden = true + default: + hasTopCorners = true + strongSelf.topStripeNode.isHidden = hasCorners } let bottomStripeInset: CGFloat switch neighbors.bottom { - case .sameSection(false): - bottomStripeInset = leftInset - default: - bottomStripeInset = 0.0 + case .sameSection(false): + bottomStripeInset = leftInset + default: + bottomStripeInset = 0.0 + hasBottomCorners = true + strongSelf.bottomStripeNode.isHidden = hasCorners } + + strongSelf.maskNode.image = hasCorners ? PresentationResourcesItemList.cornersImage(item.presentationData.theme, top: hasTopCorners, bottom: hasBottomCorners) : nil 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.maskNode.frame = strongSelf.backgroundNode.frame.insetBy(dx: params.leftInset, dy: 0.0) 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)) } diff --git a/submodules/SyncCore/Sources/InstantPage.swift b/submodules/SyncCore/Sources/InstantPage.swift index a5654ef0e0..d0d50068ec 100644 --- a/submodules/SyncCore/Sources/InstantPage.swift +++ b/submodules/SyncCore/Sources/InstantPage.swift @@ -844,13 +844,15 @@ public final class InstantPage: PostboxCoding, Equatable { public let isComplete: Bool public let rtl: Bool public let url: String + public let views: Int32? - public init(blocks: [InstantPageBlock], media: [MediaId: Media], isComplete: Bool, rtl: Bool, url: String) { + public init(blocks: [InstantPageBlock], media: [MediaId: Media], isComplete: Bool, rtl: Bool, url: String, views: Int32?) { self.blocks = blocks self.media = media self.isComplete = isComplete self.rtl = rtl self.url = url + self.views = views } public init(decoder: PostboxDecoder) { @@ -859,6 +861,7 @@ public final class InstantPage: PostboxCoding, Equatable { self.isComplete = decoder.decodeInt32ForKey("c", orElse: 0) != 0 self.rtl = decoder.decodeInt32ForKey("r", orElse: 0) != 0 self.url = decoder.decodeStringForKey("url", orElse: "") + self.views = decoder.decodeOptionalInt32ForKey("v") } public func encode(_ encoder: PostboxEncoder) { @@ -867,6 +870,11 @@ public final class InstantPage: PostboxCoding, Equatable { encoder.encodeInt32(self.isComplete ? 1 : 0, forKey: "c") encoder.encodeInt32(self.rtl ? 1 : 0, forKey: "r") encoder.encodeString(self.url, forKey: "url") + if let views = self.views { + encoder.encodeInt32(views, forKey: "v") + } else { + encoder.encodeNil(forKey: "v") + } } public static func ==(lhs: InstantPage, rhs: InstantPage) -> Bool { @@ -895,6 +903,9 @@ public final class InstantPage: PostboxCoding, Equatable { if lhs.url != rhs.url { return false } + if lhs.views != rhs.views { + return false + } return true } } diff --git a/submodules/TelegramApi/Sources/Api0.swift b/submodules/TelegramApi/Sources/Api0.swift index afd8f5b371..6f4aa318a7 100644 --- a/submodules/TelegramApi/Sources/Api0.swift +++ b/submodules/TelegramApi/Sources/Api0.swift @@ -313,8 +313,8 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1150621555] = { return Api.ChannelParticipantsFilter.parse_channelParticipantsContacts($0) } dict[-350980120] = { return Api.WebPage.parse_webPageEmpty($0) } dict[-981018084] = { return Api.WebPage.parse_webPagePending($0) } - dict[-2054908813] = { return Api.WebPage.parse_webPageNotModified($0) } dict[-392411726] = { return Api.WebPage.parse_webPage($0) } + dict[1930545681] = { return Api.WebPage.parse_webPageNotModified($0) } dict[1036876423] = { return Api.InputBotInlineMessage.parse_inputBotInlineMessageText($0) } dict[-190472735] = { return Api.InputBotInlineMessage.parse_inputBotInlineMessageMediaGeo($0) } dict[1262639204] = { return Api.InputBotInlineMessage.parse_inputBotInlineMessageGame($0) } @@ -485,7 +485,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1182234929] = { return Api.InputUser.parse_inputUserEmpty($0) } dict[-138301121] = { return Api.InputUser.parse_inputUserSelf($0) } dict[-668391402] = { return Api.InputUser.parse_inputUser($0) } - dict[-1366746132] = { return Api.Page.parse_page($0) } + dict[-1738178803] = { 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) } @@ -530,7 +530,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1991004873] = { return Api.InputChatPhoto.parse_inputChatPhoto($0) } dict[-368917890] = { return Api.PaymentCharge.parse_paymentCharge($0) } dict[-1387279939] = { return Api.MessageInteractionCounters.parse_messageInteractionCounters($0) } - dict[821185690] = { return Api.stats.BroadcastStats.parse_broadcastStats($0) } + dict[-1107852396] = { 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) } diff --git a/submodules/TelegramApi/Sources/Api1.swift b/submodules/TelegramApi/Sources/Api1.swift index 790975a865..1243d2e7d0 100644 --- a/submodules/TelegramApi/Sources/Api1.swift +++ b/submodules/TelegramApi/Sources/Api1.swift @@ -9502,8 +9502,8 @@ public extension Api { public enum WebPage: TypeConstructorDescription { case webPageEmpty(id: Int64) case webPagePending(id: Int64, date: Int32) - case webPageNotModified case webPage(flags: Int32, id: Int64, url: String, displayUrl: String, hash: Int32, type: String?, siteName: String?, title: String?, description: String?, photo: Api.Photo?, embedUrl: String?, embedType: String?, embedWidth: Int32?, embedHeight: Int32?, duration: Int32?, author: String?, document: Api.Document?, cachedPage: Api.Page?, attributes: [Api.WebPageAttribute]?) + case webPageNotModified(flags: Int32, cachedPageViews: Int32?) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -9519,12 +9519,6 @@ public extension Api { } serializeInt64(id, buffer: buffer, boxed: false) serializeInt32(date, buffer: buffer, boxed: false) - break - case .webPageNotModified: - if boxed { - buffer.appendInt32(-2054908813) - } - break case .webPage(let flags, let id, let url, let displayUrl, let hash, let type, let siteName, let title, let description, let photo, let embedUrl, let embedType, let embedWidth, let embedHeight, let duration, let author, let document, let cachedPage, let attributes): if boxed { @@ -9554,6 +9548,13 @@ public extension Api { item.serialize(buffer, true) }} break + case .webPageNotModified(let flags, let cachedPageViews): + if boxed { + buffer.appendInt32(1930545681) + } + serializeInt32(flags, buffer: buffer, boxed: false) + if Int(flags) & Int(1 << 0) != 0 {serializeInt32(cachedPageViews!, buffer: buffer, boxed: false)} + break } } @@ -9563,10 +9564,10 @@ public extension Api { return ("webPageEmpty", [("id", id)]) case .webPagePending(let id, let date): return ("webPagePending", [("id", id), ("date", date)]) - case .webPageNotModified: - return ("webPageNotModified", []) case .webPage(let flags, let id, let url, let displayUrl, let hash, let type, let siteName, let title, let description, let photo, let embedUrl, let embedType, let embedWidth, let embedHeight, let duration, let author, let document, let cachedPage, let attributes): return ("webPage", [("flags", flags), ("id", id), ("url", url), ("displayUrl", displayUrl), ("hash", hash), ("type", type), ("siteName", siteName), ("title", title), ("description", description), ("photo", photo), ("embedUrl", embedUrl), ("embedType", embedType), ("embedWidth", embedWidth), ("embedHeight", embedHeight), ("duration", duration), ("author", author), ("document", document), ("cachedPage", cachedPage), ("attributes", attributes)]) + case .webPageNotModified(let flags, let cachedPageViews): + return ("webPageNotModified", [("flags", flags), ("cachedPageViews", cachedPageViews)]) } } @@ -9595,9 +9596,6 @@ public extension Api { return nil } } - public static func parse_webPageNotModified(_ reader: BufferReader) -> WebPage? { - return Api.WebPage.webPageNotModified - } public static func parse_webPage(_ reader: BufferReader) -> WebPage? { var _1: Int32? _1 = reader.readInt32() @@ -9671,6 +9669,20 @@ public extension Api { return nil } } + public static func parse_webPageNotModified(_ reader: BufferReader) -> WebPage? { + var _1: Int32? + _1 = reader.readInt32() + var _2: Int32? + if Int(_1!) & Int(1 << 0) != 0 {_2 = reader.readInt32() } + let _c1 = _1 != nil + let _c2 = (Int(_1!) & Int(1 << 0) == 0) || _2 != nil + if _c1 && _c2 { + return Api.WebPage.webPageNotModified(flags: _1!, cachedPageViews: _2) + } + else { + return nil + } + } } public enum InputBotInlineMessage: TypeConstructorDescription { @@ -13722,13 +13734,13 @@ public extension Api { } public enum Page: TypeConstructorDescription { - case page(flags: Int32, url: String, blocks: [Api.PageBlock], photos: [Api.Photo], documents: [Api.Document]) + case page(flags: Int32, url: String, blocks: [Api.PageBlock], photos: [Api.Photo], documents: [Api.Document], views: Int32?) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { - case .page(let flags, let url, let blocks, let photos, let documents): + case .page(let flags, let url, let blocks, let photos, let documents, let views): if boxed { - buffer.appendInt32(-1366746132) + buffer.appendInt32(-1738178803) } serializeInt32(flags, buffer: buffer, boxed: false) serializeString(url, buffer: buffer, boxed: false) @@ -13747,14 +13759,15 @@ public extension Api { for item in documents { item.serialize(buffer, true) } + if Int(flags) & Int(1 << 3) != 0 {serializeInt32(views!, buffer: buffer, boxed: false)} break } } public func descriptionFields() -> (String, [(String, Any)]) { switch self { - case .page(let flags, let url, let blocks, let photos, let documents): - return ("page", [("flags", flags), ("url", url), ("blocks", blocks), ("photos", photos), ("documents", documents)]) + case .page(let flags, let url, let blocks, let photos, let documents, let views): + return ("page", [("flags", flags), ("url", url), ("blocks", blocks), ("photos", photos), ("documents", documents), ("views", views)]) } } @@ -13775,13 +13788,16 @@ public extension Api { if let _ = reader.readInt32() { _5 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Document.self) } + var _6: Int32? + if Int(_1!) & Int(1 << 3) != 0 {_6 = reader.readInt32() } let _c1 = _1 != nil let _c2 = _2 != nil let _c3 = _3 != nil let _c4 = _4 != nil let _c5 = _5 != nil - if _c1 && _c2 && _c3 && _c4 && _c5 { - return Api.Page.page(flags: _1!, url: _2!, blocks: _3!, photos: _4!, documents: _5!) + let _c6 = (Int(_1!) & Int(1 << 3) == 0) || _6 != nil + if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 { + return Api.Page.page(flags: _1!, url: _2!, blocks: _3!, photos: _4!, documents: _5!, views: _6) } else { return nil diff --git a/submodules/TelegramApi/Sources/Api2.swift b/submodules/TelegramApi/Sources/Api2.swift index 791eb4877a..6226e1ae61 100644 --- a/submodules/TelegramApi/Sources/Api2.swift +++ b/submodules/TelegramApi/Sources/Api2.swift @@ -539,13 +539,13 @@ public struct payments { 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, growthGraph: Api.StatsGraph, followersGraph: Api.StatsGraph, muteGraph: Api.StatsGraph, topHoursGraph: Api.StatsGraph, interactionsGraph: Api.StatsGraph, viewsBySourceGraph: Api.StatsGraph, newFollowersBySourceGraph: Api.StatsGraph, languagesGraph: Api.StatsGraph, recentMessageInteractions: [Api.MessageInteractionCounters]) + case broadcastStats(period: Api.StatsDateRangeDays, followers: Api.StatsAbsValueAndPrev, viewsPerPost: Api.StatsAbsValueAndPrev, sharesPerPost: Api.StatsAbsValueAndPrev, enabledNotifications: Api.StatsPercentValue, growthGraph: Api.StatsGraph, followersGraph: Api.StatsGraph, muteGraph: Api.StatsGraph, topHoursGraph: Api.StatsGraph, interactionsGraph: Api.StatsGraph, ivInteractionsGraph: Api.StatsGraph, viewsBySourceGraph: Api.StatsGraph, newFollowersBySourceGraph: Api.StatsGraph, languagesGraph: Api.StatsGraph, recentMessageInteractions: [Api.MessageInteractionCounters]) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { - case .broadcastStats(let period, let followers, let viewsPerPost, let sharesPerPost, let enabledNotifications, let growthGraph, let followersGraph, let muteGraph, let topHoursGraph, let interactionsGraph, let viewsBySourceGraph, let newFollowersBySourceGraph, let languagesGraph, let recentMessageInteractions): + case .broadcastStats(let period, let followers, let viewsPerPost, let sharesPerPost, let enabledNotifications, let growthGraph, let followersGraph, let muteGraph, let topHoursGraph, let interactionsGraph, let ivInteractionsGraph, let viewsBySourceGraph, let newFollowersBySourceGraph, let languagesGraph, let recentMessageInteractions): if boxed { - buffer.appendInt32(821185690) + buffer.appendInt32(-1107852396) } period.serialize(buffer, true) followers.serialize(buffer, true) @@ -557,6 +557,7 @@ public struct stats { muteGraph.serialize(buffer, true) topHoursGraph.serialize(buffer, true) interactionsGraph.serialize(buffer, true) + ivInteractionsGraph.serialize(buffer, true) viewsBySourceGraph.serialize(buffer, true) newFollowersBySourceGraph.serialize(buffer, true) languagesGraph.serialize(buffer, true) @@ -571,8 +572,8 @@ public struct stats { public func descriptionFields() -> (String, [(String, Any)]) { switch self { - case .broadcastStats(let period, let followers, let viewsPerPost, let sharesPerPost, let enabledNotifications, let growthGraph, let followersGraph, let muteGraph, let topHoursGraph, let interactionsGraph, let viewsBySourceGraph, let newFollowersBySourceGraph, let languagesGraph, let recentMessageInteractions): - return ("broadcastStats", [("period", period), ("followers", followers), ("viewsPerPost", viewsPerPost), ("sharesPerPost", sharesPerPost), ("enabledNotifications", enabledNotifications), ("growthGraph", growthGraph), ("followersGraph", followersGraph), ("muteGraph", muteGraph), ("topHoursGraph", topHoursGraph), ("interactionsGraph", interactionsGraph), ("viewsBySourceGraph", viewsBySourceGraph), ("newFollowersBySourceGraph", newFollowersBySourceGraph), ("languagesGraph", languagesGraph), ("recentMessageInteractions", recentMessageInteractions)]) + case .broadcastStats(let period, let followers, let viewsPerPost, let sharesPerPost, let enabledNotifications, let growthGraph, let followersGraph, let muteGraph, let topHoursGraph, let interactionsGraph, let ivInteractionsGraph, let viewsBySourceGraph, let newFollowersBySourceGraph, let languagesGraph, let recentMessageInteractions): + return ("broadcastStats", [("period", period), ("followers", followers), ("viewsPerPost", viewsPerPost), ("sharesPerPost", sharesPerPost), ("enabledNotifications", enabledNotifications), ("growthGraph", growthGraph), ("followersGraph", followersGraph), ("muteGraph", muteGraph), ("topHoursGraph", topHoursGraph), ("interactionsGraph", interactionsGraph), ("ivInteractionsGraph", ivInteractionsGraph), ("viewsBySourceGraph", viewsBySourceGraph), ("newFollowersBySourceGraph", newFollowersBySourceGraph), ("languagesGraph", languagesGraph), ("recentMessageInteractions", recentMessageInteractions)]) } } @@ -629,9 +630,13 @@ public struct stats { if let signature = reader.readInt32() { _13 = Api.parse(reader, signature: signature) as? Api.StatsGraph } - var _14: [Api.MessageInteractionCounters]? + var _14: Api.StatsGraph? + if let signature = reader.readInt32() { + _14 = Api.parse(reader, signature: signature) as? Api.StatsGraph + } + var _15: [Api.MessageInteractionCounters]? if let _ = reader.readInt32() { - _14 = Api.parseVector(reader, elementSignature: 0, elementType: Api.MessageInteractionCounters.self) + _15 = Api.parseVector(reader, elementSignature: 0, elementType: Api.MessageInteractionCounters.self) } let _c1 = _1 != nil let _c2 = _2 != nil @@ -647,8 +652,9 @@ public struct stats { let _c12 = _12 != nil let _c13 = _13 != nil let _c14 = _14 != nil - if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 && _c12 && _c13 && _c14 { - return Api.stats.BroadcastStats.broadcastStats(period: _1!, followers: _2!, viewsPerPost: _3!, sharesPerPost: _4!, enabledNotifications: _5!, growthGraph: _6!, followersGraph: _7!, muteGraph: _8!, topHoursGraph: _9!, interactionsGraph: _10!, viewsBySourceGraph: _11!, newFollowersBySourceGraph: _12!, languagesGraph: _13!, recentMessageInteractions: _14!) + let _c15 = _15 != nil + if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 && _c12 && _c13 && _c14 && _c15 { + return Api.stats.BroadcastStats.broadcastStats(period: _1!, followers: _2!, viewsPerPost: _3!, sharesPerPost: _4!, enabledNotifications: _5!, growthGraph: _6!, followersGraph: _7!, muteGraph: _8!, topHoursGraph: _9!, interactionsGraph: _10!, ivInteractionsGraph: _11!, viewsBySourceGraph: _12!, newFollowersBySourceGraph: _13!, languagesGraph: _14!, recentMessageInteractions: _15!) } else { return nil diff --git a/submodules/TelegramCore/Sources/ChannelStatistics.swift b/submodules/TelegramCore/Sources/ChannelStatistics.swift index 18b49c67de..a3d695cb54 100644 --- a/submodules/TelegramCore/Sources/ChannelStatistics.swift +++ b/submodules/TelegramCore/Sources/ChannelStatistics.swift @@ -24,6 +24,18 @@ public enum ChannelStatsGraph: Equatable { case OnDemand(token: String) case Failed(error: String) case Loaded(token: String?, data: String) + case Empty + + public var isEmpty: Bool { + switch self { + case .Empty: + return true + case let .Failed(error): + return true + default: + return false + } + } var token: String? { switch self { @@ -37,6 +49,12 @@ public enum ChannelStatsGraph: Equatable { } } +public struct ChannelStatsMessageInteractions: Equatable { + public let messageId: MessageId + public let views: Int32 + public let forwards: Int32 +} + public final class ChannelStats: Equatable { public let period: ChannelStatsDateRange public let followers: ChannelStatsValue @@ -48,11 +66,13 @@ public final class ChannelStats: Equatable { public let muteGraph: ChannelStatsGraph public let topHoursGraph: ChannelStatsGraph public let interactionsGraph: ChannelStatsGraph + public let instantPageInteractionsGraph: ChannelStatsGraph public let viewsBySourceGraph: ChannelStatsGraph public let newFollowersBySourceGraph: ChannelStatsGraph public let languagesGraph: ChannelStatsGraph + public let messageInteractions: [ChannelStatsMessageInteractions] - public init(period: ChannelStatsDateRange, followers: ChannelStatsValue, viewsPerPost: ChannelStatsValue, sharesPerPost: ChannelStatsValue, enabledNotifications: ChannelStatsPercentValue, growthGraph: ChannelStatsGraph, followersGraph: ChannelStatsGraph, muteGraph: ChannelStatsGraph, topHoursGraph: ChannelStatsGraph, interactionsGraph: ChannelStatsGraph, viewsBySourceGraph: ChannelStatsGraph, newFollowersBySourceGraph: ChannelStatsGraph, languagesGraph: ChannelStatsGraph) { + public init(period: ChannelStatsDateRange, followers: ChannelStatsValue, viewsPerPost: ChannelStatsValue, sharesPerPost: ChannelStatsValue, enabledNotifications: ChannelStatsPercentValue, growthGraph: ChannelStatsGraph, followersGraph: ChannelStatsGraph, muteGraph: ChannelStatsGraph, topHoursGraph: ChannelStatsGraph, interactionsGraph: ChannelStatsGraph, instantPageInteractionsGraph: ChannelStatsGraph, viewsBySourceGraph: ChannelStatsGraph, newFollowersBySourceGraph: ChannelStatsGraph, languagesGraph: ChannelStatsGraph, messageInteractions: [ChannelStatsMessageInteractions]) { self.period = period self.followers = followers self.viewsPerPost = viewsPerPost @@ -63,9 +83,11 @@ public final class ChannelStats: Equatable { self.muteGraph = muteGraph self.topHoursGraph = topHoursGraph self.interactionsGraph = interactionsGraph + self.instantPageInteractionsGraph = instantPageInteractionsGraph self.viewsBySourceGraph = viewsBySourceGraph self.newFollowersBySourceGraph = newFollowersBySourceGraph self.languagesGraph = languagesGraph + self.messageInteractions = messageInteractions } public static func == (lhs: ChannelStats, rhs: ChannelStats) -> Bool { @@ -99,6 +121,9 @@ public final class ChannelStats: Equatable { if lhs.interactionsGraph != rhs.interactionsGraph { return false } + if lhs.instantPageInteractionsGraph != rhs.instantPageInteractionsGraph { + return false + } if lhs.viewsBySourceGraph != rhs.viewsBySourceGraph { return false } @@ -108,39 +133,50 @@ public final class ChannelStats: Equatable { if lhs.languagesGraph != rhs.languagesGraph { return false } + if lhs.messageInteractions != rhs.messageInteractions { + 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, growthGraph: growthGraph, followersGraph: self.followersGraph, muteGraph: self.muteGraph, topHoursGraph: self.topHoursGraph, interactionsGraph: self.interactionsGraph, viewsBySourceGraph: self.viewsBySourceGraph, newFollowersBySourceGraph: self.newFollowersBySourceGraph, languagesGraph: self.languagesGraph) + return ChannelStats(period: self.period, followers: self.followers, viewsPerPost: self.viewsPerPost, sharesPerPost: self.sharesPerPost, enabledNotifications: self.enabledNotifications, growthGraph: growthGraph, followersGraph: self.followersGraph, muteGraph: self.muteGraph, topHoursGraph: self.topHoursGraph, interactionsGraph: self.interactionsGraph, instantPageInteractionsGraph: self.instantPageInteractionsGraph, viewsBySourceGraph: self.viewsBySourceGraph, newFollowersBySourceGraph: self.newFollowersBySourceGraph, languagesGraph: self.languagesGraph, messageInteractions: self.messageInteractions) } public func withUpdatedFollowersGraph(_ followersGraph: ChannelStatsGraph) -> ChannelStats { - return ChannelStats(period: self.period, followers: self.followers, viewsPerPost: self.viewsPerPost, sharesPerPost: self.sharesPerPost, enabledNotifications: self.enabledNotifications, growthGraph: self.growthGraph, followersGraph: followersGraph, muteGraph: self.muteGraph, topHoursGraph: self.topHoursGraph, interactionsGraph: self.interactionsGraph, viewsBySourceGraph: self.viewsBySourceGraph, newFollowersBySourceGraph: self.newFollowersBySourceGraph, languagesGraph: self.languagesGraph) + return ChannelStats(period: self.period, followers: self.followers, viewsPerPost: self.viewsPerPost, sharesPerPost: self.sharesPerPost, enabledNotifications: self.enabledNotifications, growthGraph: self.growthGraph, followersGraph: followersGraph, muteGraph: self.muteGraph, topHoursGraph: self.topHoursGraph, interactionsGraph: self.interactionsGraph, instantPageInteractionsGraph: self.instantPageInteractionsGraph, viewsBySourceGraph: self.viewsBySourceGraph, newFollowersBySourceGraph: self.newFollowersBySourceGraph, languagesGraph: self.languagesGraph, messageInteractions: self.messageInteractions) } public func withUpdatedMuteGraph(_ muteGraph: ChannelStatsGraph) -> ChannelStats { - return ChannelStats(period: self.period, followers: self.followers, viewsPerPost: self.viewsPerPost, sharesPerPost: self.sharesPerPost, enabledNotifications: self.enabledNotifications, growthGraph: self.growthGraph, followersGraph: self.followersGraph, muteGraph: muteGraph, topHoursGraph: self.topHoursGraph, interactionsGraph: self.interactionsGraph, viewsBySourceGraph: self.viewsBySourceGraph, newFollowersBySourceGraph: self.newFollowersBySourceGraph, languagesGraph: self.languagesGraph) + return ChannelStats(period: self.period, followers: self.followers, viewsPerPost: self.viewsPerPost, sharesPerPost: self.sharesPerPost, enabledNotifications: self.enabledNotifications, growthGraph: self.growthGraph, followersGraph: self.followersGraph, muteGraph: muteGraph, topHoursGraph: self.topHoursGraph, interactionsGraph: self.interactionsGraph, instantPageInteractionsGraph: self.instantPageInteractionsGraph, viewsBySourceGraph: self.viewsBySourceGraph, newFollowersBySourceGraph: self.newFollowersBySourceGraph, languagesGraph: self.languagesGraph, messageInteractions: self.messageInteractions) } public func withUpdatedTopHoursGraph(_ viewsByHourGraph: ChannelStatsGraph) -> ChannelStats { - return ChannelStats(period: self.period, followers: self.followers, viewsPerPost: self.viewsPerPost, sharesPerPost: self.sharesPerPost, enabledNotifications: self.enabledNotifications, growthGraph: self.growthGraph, followersGraph: self.followersGraph, muteGraph: self.muteGraph, topHoursGraph: viewsByHourGraph, interactionsGraph: self.interactionsGraph, viewsBySourceGraph: self.viewsBySourceGraph, newFollowersBySourceGraph: self.newFollowersBySourceGraph, languagesGraph: self.languagesGraph) + return ChannelStats(period: self.period, followers: self.followers, viewsPerPost: self.viewsPerPost, sharesPerPost: self.sharesPerPost, enabledNotifications: self.enabledNotifications, growthGraph: self.growthGraph, followersGraph: self.followersGraph, muteGraph: self.muteGraph, topHoursGraph: viewsByHourGraph, interactionsGraph: self.interactionsGraph, instantPageInteractionsGraph: self.instantPageInteractionsGraph, viewsBySourceGraph: self.viewsBySourceGraph, newFollowersBySourceGraph: self.newFollowersBySourceGraph, languagesGraph: self.languagesGraph, messageInteractions: self.messageInteractions) } public func withUpdatedInteractionsGraph(_ interactionsGraph: ChannelStatsGraph) -> ChannelStats { - return ChannelStats(period: self.period, followers: self.followers, viewsPerPost: self.viewsPerPost, sharesPerPost: self.sharesPerPost, enabledNotifications: self.enabledNotifications, growthGraph: self.growthGraph, followersGraph: self.followersGraph, muteGraph: self.muteGraph, topHoursGraph: self.topHoursGraph, interactionsGraph: interactionsGraph, viewsBySourceGraph: self.viewsBySourceGraph, newFollowersBySourceGraph: self.newFollowersBySourceGraph, languagesGraph: self.languagesGraph) + return ChannelStats(period: self.period, followers: self.followers, viewsPerPost: self.viewsPerPost, sharesPerPost: self.sharesPerPost, enabledNotifications: self.enabledNotifications, growthGraph: self.growthGraph, followersGraph: self.followersGraph, muteGraph: self.muteGraph, topHoursGraph: self.topHoursGraph, interactionsGraph: interactionsGraph, instantPageInteractionsGraph: self.instantPageInteractionsGraph, viewsBySourceGraph: self.viewsBySourceGraph, newFollowersBySourceGraph: self.newFollowersBySourceGraph, languagesGraph: self.languagesGraph, messageInteractions: self.messageInteractions) + } + + public func withUpdatedInstantPageInteractionsGraph(_ instantPageInteractionsGraph: ChannelStatsGraph) -> ChannelStats { + return ChannelStats(period: self.period, followers: self.followers, viewsPerPost: self.viewsPerPost, sharesPerPost: self.sharesPerPost, enabledNotifications: self.enabledNotifications, growthGraph: self.growthGraph, followersGraph: self.followersGraph, muteGraph: self.muteGraph, topHoursGraph: self.topHoursGraph, interactionsGraph: self.interactionsGraph, instantPageInteractionsGraph: instantPageInteractionsGraph, viewsBySourceGraph: self.viewsBySourceGraph, newFollowersBySourceGraph: self.newFollowersBySourceGraph, languagesGraph: self.languagesGraph, messageInteractions: self.messageInteractions) } public func withUpdatedViewsBySourceGraph(_ viewsBySourceGraph: ChannelStatsGraph) -> ChannelStats { - return ChannelStats(period: self.period, followers: self.followers, viewsPerPost: self.viewsPerPost, sharesPerPost: self.sharesPerPost, enabledNotifications: self.enabledNotifications, growthGraph: self.growthGraph, followersGraph: self.followersGraph, muteGraph: self.muteGraph, topHoursGraph: self.topHoursGraph, interactionsGraph: self.interactionsGraph, viewsBySourceGraph: viewsBySourceGraph, newFollowersBySourceGraph: self.newFollowersBySourceGraph, languagesGraph: self.languagesGraph) + return ChannelStats(period: self.period, followers: self.followers, viewsPerPost: self.viewsPerPost, sharesPerPost: self.sharesPerPost, enabledNotifications: self.enabledNotifications, growthGraph: self.growthGraph, followersGraph: self.followersGraph, muteGraph: self.muteGraph, topHoursGraph: self.topHoursGraph, interactionsGraph: self.interactionsGraph, instantPageInteractionsGraph: self.instantPageInteractionsGraph, viewsBySourceGraph: viewsBySourceGraph, newFollowersBySourceGraph: self.newFollowersBySourceGraph, languagesGraph: self.languagesGraph, messageInteractions: self.messageInteractions) } public func withUpdatedNewFollowersBySourceGraph(_ newFollowersBySourceGraph: ChannelStatsGraph) -> ChannelStats { - return ChannelStats(period: self.period, followers: self.followers, viewsPerPost: self.viewsPerPost, sharesPerPost: self.sharesPerPost, enabledNotifications: self.enabledNotifications, growthGraph: self.growthGraph, followersGraph: self.followersGraph, muteGraph: self.muteGraph, topHoursGraph: self.topHoursGraph, interactionsGraph: self.interactionsGraph, viewsBySourceGraph: self.viewsBySourceGraph, newFollowersBySourceGraph: newFollowersBySourceGraph, languagesGraph: self.languagesGraph) + return ChannelStats(period: self.period, followers: self.followers, viewsPerPost: self.viewsPerPost, sharesPerPost: self.sharesPerPost, enabledNotifications: self.enabledNotifications, growthGraph: self.growthGraph, followersGraph: self.followersGraph, muteGraph: self.muteGraph, topHoursGraph: self.topHoursGraph, interactionsGraph: self.interactionsGraph, instantPageInteractionsGraph: self.instantPageInteractionsGraph, viewsBySourceGraph: self.viewsBySourceGraph, newFollowersBySourceGraph: newFollowersBySourceGraph, languagesGraph: self.languagesGraph, messageInteractions: self.messageInteractions) } public func withUpdatedLanguagesGraph(_ languagesGraph: ChannelStatsGraph) -> ChannelStats { - return ChannelStats(period: self.period, followers: self.followers, viewsPerPost: self.viewsPerPost, sharesPerPost: self.sharesPerPost, enabledNotifications: self.enabledNotifications, growthGraph: self.growthGraph, followersGraph: self.followersGraph, muteGraph: self.muteGraph, topHoursGraph: self.topHoursGraph, interactionsGraph: self.interactionsGraph, viewsBySourceGraph: self.viewsBySourceGraph, newFollowersBySourceGraph: self.newFollowersBySourceGraph, languagesGraph: languagesGraph) + return ChannelStats(period: self.period, followers: self.followers, viewsPerPost: self.viewsPerPost, sharesPerPost: self.sharesPerPost, enabledNotifications: self.enabledNotifications, growthGraph: self.growthGraph, followersGraph: self.followersGraph, muteGraph: self.muteGraph, topHoursGraph: self.topHoursGraph, interactionsGraph: self.interactionsGraph, instantPageInteractionsGraph: self.instantPageInteractionsGraph, viewsBySourceGraph: self.viewsBySourceGraph, newFollowersBySourceGraph: self.newFollowersBySourceGraph, languagesGraph: languagesGraph, messageInteractions: self.messageInteractions) + } + + public func withUpdatedMessageInteractions(_ messageInteractions: [ChannelStatsMessageInteractions]) -> ChannelStats { + return ChannelStats(period: self.period, followers: self.followers, viewsPerPost: self.viewsPerPost, sharesPerPost: self.sharesPerPost, enabledNotifications: self.enabledNotifications, growthGraph: self.growthGraph, followersGraph: self.followersGraph, muteGraph: self.muteGraph, topHoursGraph: self.topHoursGraph, interactionsGraph: self.interactionsGraph, instantPageInteractionsGraph: self.instantPageInteractionsGraph, viewsBySourceGraph: self.viewsBySourceGraph, newFollowersBySourceGraph: self.newFollowersBySourceGraph, languagesGraph: self.languagesGraph, messageInteractions: messageInteractions) } } @@ -174,7 +210,7 @@ private func requestStats(postbox: Postbox, network: Network, datacenterId: Int3 return signal |> map { result -> ChannelStats? in - return ChannelStats(apiBroadcastStats: result) + return ChannelStats(apiBroadcastStats: result, peerId: peerId) } |> `catch` { _ -> Signal in return .single(nil) @@ -334,6 +370,21 @@ private final class ChannelStatsContextImpl { } } + func loadInstantPageInteractionsGraph() { + guard let stats = self._state.stats else { + return + } + if case let .OnDemand(token) = stats.instantPageInteractionsGraph { + 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?.withUpdatedInstantPageInteractionsGraph(graph)) + strongSelf._statePromise.set(.single(strongSelf._state)) + } + }), forKey: token) + } + } + func loadViewsBySourceGraph() { guard let stats = self._state.stats else { return @@ -439,6 +490,12 @@ public final class ChannelStatsContext { } } + public func loadInstantPageInteractionsGraph() { + self.impl.with { impl in + impl.loadInstantPageInteractionsGraph() + } + } + public func loadViewsBySourceGraph() { self.impl.with { impl in impl.loadViewsBySourceGraph() @@ -474,8 +531,25 @@ extension ChannelStatsGraph { init(apiStatsGraph: Api.StatsGraph) { switch apiStatsGraph { case let .statsGraph(_, json, zoomToken): - if case let .dataJSON(string) = json { - self = .Loaded(token: zoomToken, data: string) + if case let .dataJSON(string) = json, let data = string.data(using: .utf8) { + do { + let decodedData = try JSONSerialization.jsonObject(with: data, options: []) + guard let item = decodedData as? [String: Any] else { + self = .Failed(error: "") + return + } + if let columns = item["columns"] as? [[Any]] { + if columns.isEmpty { + self = .Empty + } else { + self = .Loaded(token: zoomToken, data: string) + } + } else { + self = .Empty + } + } catch { + self = .Failed(error: "") + } } else { self = .Failed(error: "") } @@ -514,11 +588,20 @@ extension ChannelStatsPercentValue { } } -extension ChannelStats { - convenience init(apiBroadcastStats: Api.stats.BroadcastStats) { - switch apiBroadcastStats { - case let .broadcastStats(period, followers, viewsPerPost, sharesPerPost, enabledNotifications, growthGraph, followersGraph, muteGraph, topHoursGraph, interactionsGraph, viewsBySourceGraph, newFollowersBySourceGraph, languagesGraph, recentMessageInteractions): - self.init(period: ChannelStatsDateRange(apiStatsDateRangeDays: period), followers: ChannelStatsValue(apiStatsAbsValueAndPrev: followers), viewsPerPost: ChannelStatsValue(apiStatsAbsValueAndPrev: viewsPerPost), sharesPerPost: ChannelStatsValue(apiStatsAbsValueAndPrev: sharesPerPost), enabledNotifications: ChannelStatsPercentValue(apiPercentValue: enabledNotifications), growthGraph: ChannelStatsGraph(apiStatsGraph: growthGraph), followersGraph: ChannelStatsGraph(apiStatsGraph: followersGraph), muteGraph: ChannelStatsGraph(apiStatsGraph: muteGraph), topHoursGraph: ChannelStatsGraph(apiStatsGraph: topHoursGraph), interactionsGraph: ChannelStatsGraph(apiStatsGraph: interactionsGraph), viewsBySourceGraph: ChannelStatsGraph(apiStatsGraph: viewsBySourceGraph), newFollowersBySourceGraph: ChannelStatsGraph(apiStatsGraph: newFollowersBySourceGraph), languagesGraph: ChannelStatsGraph(apiStatsGraph: languagesGraph)) +extension ChannelStatsMessageInteractions { + init(apiMessageInteractionCounters: Api.MessageInteractionCounters, peerId: PeerId) { + switch apiMessageInteractionCounters { + case let .messageInteractionCounters(msgId, views, forwards): + self = ChannelStatsMessageInteractions(messageId: MessageId(peerId: peerId, namespace: Namespaces.Message.Cloud, id: msgId), views: views, forwards: forwards) + } + } +} + +extension ChannelStats { + convenience init(apiBroadcastStats: Api.stats.BroadcastStats, peerId: PeerId) { + switch apiBroadcastStats { + case let .broadcastStats(period, followers, viewsPerPost, sharesPerPost, enabledNotifications, growthGraph, followersGraph, muteGraph, topHoursGraph, interactionsGraph, instantViewInteractionsGraph, viewsBySourceGraph, newFollowersBySourceGraph, languagesGraph, recentMessageInteractions): + self.init(period: ChannelStatsDateRange(apiStatsDateRangeDays: period), followers: ChannelStatsValue(apiStatsAbsValueAndPrev: followers), viewsPerPost: ChannelStatsValue(apiStatsAbsValueAndPrev: viewsPerPost), sharesPerPost: ChannelStatsValue(apiStatsAbsValueAndPrev: sharesPerPost), enabledNotifications: ChannelStatsPercentValue(apiPercentValue: enabledNotifications), growthGraph: ChannelStatsGraph(apiStatsGraph: growthGraph), followersGraph: ChannelStatsGraph(apiStatsGraph: followersGraph), muteGraph: ChannelStatsGraph(apiStatsGraph: muteGraph), topHoursGraph: ChannelStatsGraph(apiStatsGraph: topHoursGraph), interactionsGraph: ChannelStatsGraph(apiStatsGraph: interactionsGraph), instantPageInteractionsGraph: ChannelStatsGraph(apiStatsGraph: instantViewInteractionsGraph), viewsBySourceGraph: ChannelStatsGraph(apiStatsGraph: viewsBySourceGraph), newFollowersBySourceGraph: ChannelStatsGraph(apiStatsGraph: newFollowersBySourceGraph), languagesGraph: ChannelStatsGraph(apiStatsGraph: languagesGraph), messageInteractions: recentMessageInteractions.map { ChannelStatsMessageInteractions(apiMessageInteractionCounters: $0, peerId: peerId) }) } } } diff --git a/submodules/TelegramCore/Sources/InstantPage.swift b/submodules/TelegramCore/Sources/InstantPage.swift index 66b1b8dac3..a813d9cfb0 100644 --- a/submodules/TelegramCore/Sources/InstantPage.swift +++ b/submodules/TelegramCore/Sources/InstantPage.swift @@ -175,6 +175,7 @@ extension InstantPage { let isComplete: Bool let rtl: Bool let url: String + let views: Int32? switch apiPage { case let .page(page): url = page.url @@ -183,6 +184,7 @@ extension InstantPage { files = page.documents isComplete = (page.flags & (1 << 0)) == 0 rtl = (page.flags & (1 << 1)) != 0 + views = page.views } var media: [MediaId: Media] = [:] for photo in photos { @@ -195,6 +197,6 @@ extension InstantPage { media[id] = file } } - self.init(blocks: blocks.map({ InstantPageBlock(apiBlock: $0) }), media: media, isComplete: isComplete, rtl: rtl, url: url) + self.init(blocks: blocks.map({ InstantPageBlock(apiBlock: $0) }), media: media, isComplete: isComplete, rtl: rtl, url: url, views: views) } } diff --git a/submodules/TelegramCore/Sources/WebpagePreview.swift b/submodules/TelegramCore/Sources/WebpagePreview.swift index 45ab3955a1..6f7066202c 100644 --- a/submodules/TelegramCore/Sources/WebpagePreview.swift +++ b/submodules/TelegramCore/Sources/WebpagePreview.swift @@ -79,7 +79,7 @@ public func actualizedWebpage(postbox: Postbox, network: Network, webpage: Teleg if case let .Loaded(content) = webpage.content { return network.request(Api.functions.messages.getWebPage(url: content.url, hash: content.hash)) |> `catch` { _ -> Signal in - return .single(.webPageNotModified) + return .single(.webPageNotModified(flags: 0, cachedPageViews: nil)) } |> mapToSignal { result -> Signal in if let updatedWebpage = telegramMediaWebpageFromApiWebpage(result, url: nil), case .Loaded = updatedWebpage.content, updatedWebpage.webpageId == webpage.webpageId { @@ -87,6 +87,13 @@ public func actualizedWebpage(postbox: Postbox, network: Network, webpage: Teleg updateMessageMedia(transaction: transaction, id: webpage.webpageId, media: updatedWebpage) return updatedWebpage } + } else if case let .webPageNotModified(_, viewsValue) = result, let views = viewsValue, case let .Loaded(content) = webpage.content { + let updatedContent: TelegramMediaWebpageContent = .Loaded(TelegramMediaWebpageLoadedContent(url: content.url, displayUrl: content.displayUrl, hash: content.hash, type: content.type, websiteName: content.websiteName, title: content.title, text: content.text, embedUrl: content.embedUrl, embedType: content.embedType, embedSize: content.embedSize, duration: content.duration, author: content.author, image: content.image, file: content.file, attributes: content.attributes, instantPage: content.instantPage.flatMap({ InstantPage(blocks: $0.blocks, media: $0.media, isComplete: $0.isComplete, rtl: $0.rtl, url: $0.url, views: views) }))) + let updatedWebpage = TelegramMediaWebpage(webpageId: webpage.webpageId, content: updatedContent) + return postbox.transaction { transaction -> TelegramMediaWebpage in + updateMessageMedia(transaction: transaction, id: webpage.webpageId, media: updatedWebpage) + return updatedWebpage + } } else { return .complete() } @@ -100,7 +107,7 @@ func updatedRemoteWebpage(postbox: Postbox, network: Network, webPage: WebpageRe if case let .webPage(id, url) = webPage.content { return network.request(Api.functions.messages.getWebPage(url: url, hash: 0)) |> `catch` { _ -> Signal in - return .single(.webPageNotModified) + return .single(.webPageNotModified(flags: 0, cachedPageViews: nil)) } |> mapToSignal { result -> Signal in if let updatedWebpage = telegramMediaWebpageFromApiWebpage(result, url: nil), case .Loaded = updatedWebpage.content, updatedWebpage.webpageId.id == id { diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index 7cfafefe1a..f0fbb625c9 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -348,4951 +348,4950 @@ public final class PresentationStrings: Equatable { public var Wallet_Sent_Title: String { return self._s[148]! } public var TwoStepAuth_SetupPasswordConfirmPassword: String { return self._s[149]! } public var Weekday_Today: String { return self._s[150]! } + public var Stats_InstantViewInteractionsTitle: String { return self._s[151]! } public func InstantPage_AuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[152]!, self._r[152]!, [_1, _2]) + return formatWithArgumentRanges(self._s[153]!, self._r[153]!, [_1, _2]) } public func Conversation_MessageDialogRetryAll(_ _1: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[153]!, self._r[153]!, ["\(_1)"]) + return formatWithArgumentRanges(self._s[154]!, self._r[154]!, ["\(_1)"]) } - public var Notification_PassportValuePersonalDetails: String { return self._s[155]! } - public var Channel_AdminLog_MessagePreviousLink: String { return self._s[156]! } - public var ChangePhoneNumberNumber_NewNumber: String { return self._s[157]! } - public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[158]! } - public var TwoStepAuth_ChangePasswordDescription: String { return self._s[159]! } - public var PhotoEditor_BlurToolLinear: String { return self._s[160]! } - public var Contacts_PermissionsAllowInSettings: String { return self._s[161]! } - public var Weekday_ShortMonday: String { return self._s[162]! } - public var Cache_KeepMedia: String { return self._s[163]! } - public var Passport_FieldIdentitySelfieHelp: String { return self._s[164]! } + public var Notification_PassportValuePersonalDetails: String { return self._s[156]! } + public var Channel_AdminLog_MessagePreviousLink: String { return self._s[157]! } + public var ChangePhoneNumberNumber_NewNumber: String { return self._s[158]! } + public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[159]! } + public var TwoStepAuth_ChangePasswordDescription: String { return self._s[160]! } + public var PhotoEditor_BlurToolLinear: String { return self._s[161]! } + public var Contacts_PermissionsAllowInSettings: String { return self._s[162]! } + public var Weekday_ShortMonday: String { return self._s[163]! } + public var Cache_KeepMedia: String { return self._s[164]! } + public var Passport_FieldIdentitySelfieHelp: String { return self._s[165]! } public func PUSH_PINNED_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[165]!, self._r[165]!, [_1, _2]) + return formatWithArgumentRanges(self._s[166]!, self._r[166]!, [_1, _2]) } public func Chat_SlowmodeTooltip(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[166]!, self._r[166]!, [_0]) + return formatWithArgumentRanges(self._s[167]!, self._r[167]!, [_0]) } - public var Wallet_Receive_ShareUrlInfo: String { return self._s[167]! } - public var Conversation_ClousStorageInfo_Description4: String { return self._s[168]! } - public var Wallet_RestoreFailed_Title: String { return self._s[169]! } - public var Passport_Language_ru: String { return self._s[170]! } + public var Wallet_Receive_ShareUrlInfo: String { return self._s[168]! } + public var Conversation_ClousStorageInfo_Description4: String { return self._s[169]! } + public var Wallet_RestoreFailed_Title: String { return self._s[170]! } + public var Passport_Language_ru: String { return self._s[171]! } public func Notification_CreatedChatWithTitle(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[171]!, self._r[171]!, [_0, _1]) + return formatWithArgumentRanges(self._s[172]!, self._r[172]!, [_0, _1]) } - public var WallpaperPreview_PatternIntensity: String { return self._s[172]! } - public var WebBrowser_InAppSafari: String { return self._s[175]! } - public var TwoStepAuth_RecoveryUnavailable: String { return self._s[176]! } - public var EnterPasscode_TouchId: String { return self._s[177]! } - public var PhotoEditor_QualityVeryHigh: String { return self._s[180]! } - public var Checkout_NewCard_SaveInfo: String { return self._s[182]! } - public var Gif_NoGifsPlaceholder: String { return self._s[184]! } + public var WallpaperPreview_PatternIntensity: String { return self._s[173]! } + public var WebBrowser_InAppSafari: String { return self._s[176]! } + public var TwoStepAuth_RecoveryUnavailable: String { return self._s[177]! } + public var EnterPasscode_TouchId: String { return self._s[178]! } + public var PhotoEditor_QualityVeryHigh: String { return self._s[181]! } + public var Checkout_NewCard_SaveInfo: String { return self._s[183]! } + public var Gif_NoGifsPlaceholder: String { return self._s[185]! } public func Notification_InvitedMultiple(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[186]!, self._r[186]!, [_0, _1]) + return formatWithArgumentRanges(self._s[187]!, self._r[187]!, [_0, _1]) } - public var ChatSettings_AutoDownloadEnabled: String { return self._s[187]! } - public var NetworkUsageSettings_BytesSent: String { return self._s[188]! } - public var Checkout_PasswordEntry_Pay: String { return self._s[189]! } - public var AuthSessions_TerminateSession: String { return self._s[190]! } - public var Message_File: String { return self._s[191]! } - public var MediaPicker_VideoMuteDescription: String { return self._s[192]! } - public var SocksProxySetup_ProxyStatusConnected: String { return self._s[193]! } - public var TwoStepAuth_RecoveryCode: String { return self._s[194]! } - public var EnterPasscode_EnterCurrentPasscode: String { return self._s[195]! } + public var ChatSettings_AutoDownloadEnabled: String { return self._s[188]! } + public var NetworkUsageSettings_BytesSent: String { return self._s[189]! } + public var Checkout_PasswordEntry_Pay: String { return self._s[190]! } + public var AuthSessions_TerminateSession: String { return self._s[191]! } + public var Message_File: String { return self._s[192]! } + public var MediaPicker_VideoMuteDescription: String { return self._s[193]! } + public var SocksProxySetup_ProxyStatusConnected: String { return self._s[194]! } + public var TwoStepAuth_RecoveryCode: String { return self._s[195]! } + public var EnterPasscode_EnterCurrentPasscode: String { return self._s[196]! } public func TwoStepAuth_EnterPasswordHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[196]!, self._r[196]!, [_0]) + return formatWithArgumentRanges(self._s[197]!, self._r[197]!, [_0]) } - public var Conversation_Moderate_Report: String { return self._s[198]! } - public var TwoStepAuth_EmailInvalid: String { return self._s[199]! } - public var Passport_Language_ms: String { return self._s[200]! } - public var Channel_Edit_AboutItem: String { return self._s[202]! } - public var DialogList_SearchSectionGlobal: String { return self._s[206]! } - public var AttachmentMenu_WebSearch: String { return self._s[207]! } - public var ChatState_WaitingForNetwork: String { return self._s[208]! } - public var Channel_BanUser_Title: String { return self._s[209]! } - public var PasscodeSettings_TurnPasscodeOn: String { return self._s[210]! } - public var WallpaperPreview_SwipeTopText: String { return self._s[211]! } - public var ChatList_DeleteSavedMessagesConfirmationText: String { return self._s[212]! } - public var ArchivedChats_IntroText2: String { return self._s[213]! } - public var ChatSearch_SearchPlaceholder: String { return self._s[215]! } - public var Conversation_OpenBotLinkTitle: String { return self._s[216]! } - public var Passport_FieldAddressTranslationHelp: String { return self._s[217]! } - public var NotificationsSound_Aurora: String { return self._s[218]! } - public var Notification_Exceptions_DeleteAll: String { return self._s[219]! } + public var Conversation_Moderate_Report: String { return self._s[199]! } + public var TwoStepAuth_EmailInvalid: String { return self._s[200]! } + public var Passport_Language_ms: String { return self._s[201]! } + public var Channel_Edit_AboutItem: String { return self._s[203]! } + public var DialogList_SearchSectionGlobal: String { return self._s[207]! } + public var AttachmentMenu_WebSearch: String { return self._s[208]! } + public var ChatState_WaitingForNetwork: String { return self._s[209]! } + public var Channel_BanUser_Title: String { return self._s[210]! } + public var PasscodeSettings_TurnPasscodeOn: String { return self._s[211]! } + public var WallpaperPreview_SwipeTopText: String { return self._s[212]! } + public var ChatList_DeleteSavedMessagesConfirmationText: String { return self._s[213]! } + public var ArchivedChats_IntroText2: String { return self._s[214]! } + public var ChatSearch_SearchPlaceholder: String { return self._s[216]! } + public var Conversation_OpenBotLinkTitle: String { return self._s[217]! } + public var Passport_FieldAddressTranslationHelp: String { return self._s[218]! } + public var NotificationsSound_Aurora: String { return self._s[219]! } + public var Notification_Exceptions_DeleteAll: String { return self._s[220]! } public func FileSize_GB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[220]!, self._r[220]!, [_0]) + return formatWithArgumentRanges(self._s[221]!, self._r[221]!, [_0]) } - public var AuthSessions_LoggedInWithTelegram: String { return self._s[223]! } + public var AuthSessions_LoggedInWithTelegram: String { return self._s[224]! } public func Privacy_GroupsAndChannels_InviteToGroupError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[224]!, self._r[224]!, [_0, _1]) + return formatWithArgumentRanges(self._s[225]!, self._r[225]!, [_0, _1]) } - public var Passport_PasswordNext: String { return self._s[225]! } - public var Bot_GroupStatusReadsHistory: String { return self._s[226]! } - public var EmptyGroupInfo_Line2: String { return self._s[227]! } + public var Passport_PasswordNext: String { return self._s[226]! } + public var Bot_GroupStatusReadsHistory: String { return self._s[227]! } + public var EmptyGroupInfo_Line2: String { return self._s[228]! } public func Channel_AdminLog_MessageTransferedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[228]!, self._r[228]!, [_1, _2]) + return formatWithArgumentRanges(self._s[229]!, self._r[229]!, [_1, _2]) } - public var VoiceOver_Chat_SeenByRecipients: String { return self._s[229]! } - public var Settings_FAQ_Intro: String { return self._s[232]! } - public var PrivacySettings_PasscodeAndTouchId: String { return self._s[234]! } - public var FeaturedStickerPacks_Title: String { return self._s[235]! } - public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[237]! } - public var Username_Title: String { return self._s[238]! } + public var VoiceOver_Chat_SeenByRecipients: String { return self._s[230]! } + public var Settings_FAQ_Intro: String { return self._s[233]! } + public var PrivacySettings_PasscodeAndTouchId: String { return self._s[235]! } + public var FeaturedStickerPacks_Title: String { return self._s[236]! } + public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[238]! } + public var Username_Title: String { return self._s[239]! } public func Message_StickerText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[239]!, self._r[239]!, [_0]) + return formatWithArgumentRanges(self._s[240]!, self._r[240]!, [_0]) } - public var PeerInfo_PaneFiles: String { return self._s[240]! } - public var PasscodeSettings_AlphanumericCode: String { return self._s[241]! } - public var Localization_LanguageOther: String { return self._s[242]! } - public var Stickers_SuggestStickers: String { return self._s[243]! } + public var PeerInfo_PaneFiles: String { return self._s[241]! } + public var PasscodeSettings_AlphanumericCode: String { return self._s[242]! } + public var Localization_LanguageOther: String { return self._s[243]! } + public var Stickers_SuggestStickers: String { return self._s[244]! } public func Channel_AdminLog_MessageRemovedGroupUsername(_ _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 NotificationSettings_ShowNotificationsFromAccountsSection: String { return self._s[245]! } - public var Channel_AdminLogFilter_EventsAdmins: String { return self._s[246]! } - public var Conversation_DefaultRestrictedStickers: String { return self._s[247]! } + public var NotificationSettings_ShowNotificationsFromAccountsSection: String { return self._s[246]! } + public var Channel_AdminLogFilter_EventsAdmins: String { return self._s[247]! } + public var Conversation_DefaultRestrictedStickers: String { return self._s[248]! } public func Notification_PinnedDeletedMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[248]!, self._r[248]!, [_0]) + return formatWithArgumentRanges(self._s[249]!, self._r[249]!, [_0]) } - public var Wallet_TransactionInfo_CopyAddress: String { return self._s[250]! } - public var Group_UpgradeConfirmation: String { return self._s[251]! } - public var DialogList_Unpin: String { return self._s[252]! } - public var Passport_Identity_DateOfBirth: String { return self._s[253]! } - public var Month_ShortOctober: String { return self._s[254]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[255]! } - public var TwoFactorSetup_Done_Text: String { return self._s[256]! } - public var Notification_CallCanceledShort: String { return self._s[257]! } - public var Conversation_StopQuiz: String { return self._s[258]! } - public var Passport_Phone_Help: String { return self._s[259]! } - public var Passport_Language_az: String { return self._s[261]! } - public var CreatePoll_TextPlaceholder: String { return self._s[263]! } - public var VoiceOver_Chat_AnonymousPoll: String { return self._s[264]! } - public var Passport_Identity_DocumentNumber: String { return self._s[265]! } - public var PhotoEditor_CurvesRed: String { return self._s[266]! } - public var PhoneNumberHelp_Alert: String { return self._s[268]! } - public var SocksProxySetup_Port: String { return self._s[269]! } - public var Checkout_PayNone: String { return self._s[270]! } - public var AutoDownloadSettings_WiFi: String { return self._s[271]! } - public var GroupInfo_GroupType: String { return self._s[272]! } - public var StickerSettings_ContextHide: String { return self._s[273]! } - public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[274]! } - public var Group_Setup_HistoryTitle: String { return self._s[276]! } - public var Passport_Identity_FilesUploadNew: String { return self._s[277]! } - public var PasscodeSettings_AutoLock: String { return self._s[278]! } - public var Passport_Title: String { return self._s[279]! } - public var VoiceOver_Chat_ContactPhoneNumber: String { return self._s[280]! } - public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[281]! } - public var GroupPermission_NoSendGifs: String { return self._s[282]! } - public var PrivacySettings_PasscodeOn: String { return self._s[283]! } + public var Wallet_TransactionInfo_CopyAddress: String { return self._s[251]! } + public var Group_UpgradeConfirmation: String { return self._s[252]! } + public var DialogList_Unpin: String { return self._s[253]! } + public var Passport_Identity_DateOfBirth: String { return self._s[254]! } + public var Month_ShortOctober: String { return self._s[255]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[256]! } + public var TwoFactorSetup_Done_Text: String { return self._s[257]! } + public var Notification_CallCanceledShort: String { return self._s[258]! } + public var Conversation_StopQuiz: String { return self._s[259]! } + public var Passport_Phone_Help: String { return self._s[260]! } + public var Passport_Language_az: String { return self._s[262]! } + public var CreatePoll_TextPlaceholder: String { return self._s[264]! } + public var VoiceOver_Chat_AnonymousPoll: String { return self._s[265]! } + public var Passport_Identity_DocumentNumber: String { return self._s[266]! } + public var PhotoEditor_CurvesRed: String { return self._s[267]! } + public var PhoneNumberHelp_Alert: String { return self._s[269]! } + public var SocksProxySetup_Port: String { return self._s[270]! } + public var Checkout_PayNone: String { return self._s[271]! } + public var AutoDownloadSettings_WiFi: String { return self._s[272]! } + public var GroupInfo_GroupType: String { return self._s[273]! } + public var StickerSettings_ContextHide: String { return self._s[274]! } + public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[275]! } + public var Group_Setup_HistoryTitle: String { return self._s[277]! } + public var Passport_Identity_FilesUploadNew: String { return self._s[278]! } + public var PasscodeSettings_AutoLock: String { return self._s[279]! } + public var Passport_Title: String { return self._s[280]! } + public var VoiceOver_Chat_ContactPhoneNumber: String { return self._s[281]! } + public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[282]! } + public var GroupPermission_NoSendGifs: String { return self._s[283]! } + public var PrivacySettings_PasscodeOn: String { return self._s[284]! } public func Conversation_ScheduleMessage_SendTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[284]!, self._r[284]!, [_0]) + return formatWithArgumentRanges(self._s[285]!, self._r[285]!, [_0]) } - public var State_WaitingForNetwork: String { return self._s[287]! } + public var State_WaitingForNetwork: String { return self._s[288]! } public func Notification_Invited(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[288]!, self._r[288]!, [_0, _1]) + return formatWithArgumentRanges(self._s[289]!, self._r[289]!, [_0, _1]) } - public var Calls_NotNow: String { return self._s[290]! } + public var Calls_NotNow: String { return self._s[291]! } public func Channel_DiscussionGroup_HeaderSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[291]!, self._r[291]!, [_0]) + return formatWithArgumentRanges(self._s[292]!, self._r[292]!, [_0]) } - public var UserInfo_SendMessage: String { return self._s[292]! } - public var TwoStepAuth_PasswordSet: String { return self._s[293]! } - public var Passport_DeleteDocument: String { return self._s[294]! } - public var SocksProxySetup_AddProxyTitle: String { return self._s[295]! } + public var UserInfo_SendMessage: String { return self._s[293]! } + public var TwoStepAuth_PasswordSet: String { return self._s[294]! } + public var Passport_DeleteDocument: String { return self._s[295]! } + public var SocksProxySetup_AddProxyTitle: String { return self._s[296]! } public func PUSH_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[296]!, self._r[296]!, [_1]) + return formatWithArgumentRanges(self._s[297]!, self._r[297]!, [_1]) } - public var AuthSessions_AddedDeviceTitle: String { return self._s[297]! } - public var GroupRemoved_Remove: String { return self._s[298]! } - public var Passport_FieldIdentity: String { return self._s[299]! } - public var Group_Setup_TypePrivateHelp: String { return self._s[300]! } - public var Conversation_Processing: String { return self._s[303]! } - public var Wallet_Settings_BackupWallet: String { return self._s[305]! } - public var ChatSettings_AutoPlayAnimations: String { return self._s[306]! } - public var AuthSessions_LogOutApplicationsHelp: String { return self._s[309]! } - public var Forward_ErrorPublicQuizDisabledInChannels: String { return self._s[310]! } - public var Month_GenFebruary: String { return self._s[311]! } - public var Wallet_Send_NetworkErrorTitle: String { return self._s[312]! } + public var AuthSessions_AddedDeviceTitle: String { return self._s[298]! } + public var GroupRemoved_Remove: String { return self._s[299]! } + public var Passport_FieldIdentity: String { return self._s[300]! } + public var Group_Setup_TypePrivateHelp: String { return self._s[301]! } + public var Conversation_Processing: String { return self._s[304]! } + public var Wallet_Settings_BackupWallet: String { return self._s[306]! } + public var ChatSettings_AutoPlayAnimations: String { return self._s[307]! } + public var AuthSessions_LogOutApplicationsHelp: String { return self._s[310]! } + public var Forward_ErrorPublicQuizDisabledInChannels: String { return self._s[311]! } + public var Month_GenFebruary: String { return self._s[312]! } + public var Wallet_Send_NetworkErrorTitle: String { return self._s[313]! } public func Login_InvalidPhoneEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[314]!, self._r[314]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[315]!, self._r[315]!, [_1, _2, _3, _4, _5]) } - public var Passport_Identity_TypeIdentityCard: String { return self._s[315]! } - public var Wallet_Month_ShortJune: String { return self._s[317]! } - public var AutoDownloadSettings_DataUsageMedium: String { return self._s[318]! } - public var GroupInfo_AddParticipant: String { return self._s[319]! } - public var KeyCommand_SendMessage: String { return self._s[320]! } - public var VoiceOver_Chat_YourContact: String { return self._s[322]! } - public var Map_LiveLocationShowAll: String { return self._s[323]! } - public var WallpaperSearch_ColorOrange: String { return self._s[325]! } - public var Appearance_AppIconDefaultX: String { return self._s[326]! } - public var Checkout_Receipt_Title: String { return self._s[327]! } - public var Group_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[328]! } - public var WallpaperPreview_PreviewTopText: String { return self._s[329]! } - public var Message_Contact: String { return self._s[330]! } - public var Call_StatusIncoming: String { return self._s[331]! } - public var Wallet_TransactionInfo_StorageFeeInfo: String { return self._s[332]! } + public var Passport_Identity_TypeIdentityCard: String { return self._s[316]! } + public var Wallet_Month_ShortJune: String { return self._s[318]! } + public var AutoDownloadSettings_DataUsageMedium: String { return self._s[319]! } + public var GroupInfo_AddParticipant: String { return self._s[320]! } + public var KeyCommand_SendMessage: String { return self._s[321]! } + public var VoiceOver_Chat_YourContact: String { return self._s[323]! } + public var Map_LiveLocationShowAll: String { return self._s[324]! } + public var WallpaperSearch_ColorOrange: String { return self._s[326]! } + public var Appearance_AppIconDefaultX: String { return self._s[327]! } + public var Checkout_Receipt_Title: String { return self._s[328]! } + public var Group_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[329]! } + public var WallpaperPreview_PreviewTopText: String { return self._s[330]! } + public var Message_Contact: String { return self._s[331]! } + public var Call_StatusIncoming: String { return self._s[332]! } + public var Wallet_TransactionInfo_StorageFeeInfo: String { return self._s[333]! } public func Channel_AdminLog_MessageKickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[333]!, self._r[333]!, [_1]) + return formatWithArgumentRanges(self._s[334]!, self._r[334]!, [_1]) } public func PUSH_ENCRYPTED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[335]!, self._r[335]!, [_1]) + return formatWithArgumentRanges(self._s[336]!, self._r[336]!, [_1]) } - public var VoiceOver_Media_PlaybackRate: String { return self._s[336]! } - public var Passport_FieldIdentityDetailsHelp: String { return self._s[337]! } - public var Conversation_ViewChannel: String { return self._s[338]! } + public var VoiceOver_Media_PlaybackRate: String { return self._s[337]! } + public var Passport_FieldIdentityDetailsHelp: String { return self._s[338]! } + public var Conversation_ViewChannel: String { return self._s[339]! } public func Time_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[339]!, self._r[339]!, [_0]) + return formatWithArgumentRanges(self._s[340]!, self._r[340]!, [_0]) } - public var Theme_Colors_Accent: String { return self._s[340]! } - public var Passport_Language_nl: String { return self._s[342]! } - public var Camera_Retake: String { return self._s[343]! } + public var Theme_Colors_Accent: String { return self._s[341]! } + public var Passport_Language_nl: String { return self._s[343]! } + public var Camera_Retake: String { return self._s[344]! } public func UserInfo_BlockActionTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[344]!, self._r[344]!, [_0]) + return formatWithArgumentRanges(self._s[345]!, self._r[345]!, [_0]) } - public var AuthSessions_LogOutApplications: String { return self._s[345]! } - public var ApplyLanguage_ApplySuccess: String { return self._s[346]! } - public var Tour_Title6: String { return self._s[347]! } - public var Map_ChooseAPlace: String { return self._s[348]! } - public var CallSettings_Never: String { return self._s[350]! } + public var AuthSessions_LogOutApplications: String { return self._s[346]! } + public var ApplyLanguage_ApplySuccess: String { return self._s[347]! } + public var Tour_Title6: String { return self._s[348]! } + public var Map_ChooseAPlace: String { return self._s[349]! } + public var CallSettings_Never: String { return self._s[351]! } public func Notification_ChangedGroupPhoto(_ _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 ChannelRemoved_RemoveInfo: String { return self._s[352]! } + public var ChannelRemoved_RemoveInfo: String { return self._s[353]! } public func AutoDownloadSettings_PreloadVideoInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[353]!, self._r[353]!, [_0]) + return formatWithArgumentRanges(self._s[354]!, self._r[354]!, [_0]) } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsExceptions: String { return self._s[354]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsExceptions: String { return self._s[355]! } public func Conversation_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[355]!, self._r[355]!, [_0]) + return formatWithArgumentRanges(self._s[356]!, self._r[356]!, [_0]) } - public var GroupInfo_InviteLink_Title: String { return self._s[356]! } + public var GroupInfo_InviteLink_Title: String { return self._s[357]! } public func Channel_AdminLog_MessageUnkickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[357]!, self._r[357]!, [_1, _2]) + return formatWithArgumentRanges(self._s[358]!, self._r[358]!, [_1, _2]) } - public var KeyCommand_ScrollUp: String { return self._s[358]! } - public var ContactInfo_URLLabelHomepage: String { return self._s[359]! } - public var Channel_OwnershipTransfer_ChangeOwner: String { return self._s[360]! } + public var KeyCommand_ScrollUp: String { return self._s[359]! } + public var ContactInfo_URLLabelHomepage: String { return self._s[360]! } + public var Channel_OwnershipTransfer_ChangeOwner: String { return self._s[361]! } public func Channel_AdminLog_DisabledSlowmode(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[361]!, self._r[361]!, [_0]) + return formatWithArgumentRanges(self._s[362]!, self._r[362]!, [_0]) } - public var TwoFactorSetup_Done_Title: String { return self._s[362]! } + public var TwoFactorSetup_Done_Title: String { return self._s[363]! } public func Conversation_EncryptedPlaceholderTitleOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[363]!, self._r[363]!, [_0]) + return formatWithArgumentRanges(self._s[364]!, self._r[364]!, [_0]) } - public var CallFeedback_ReasonDistortedSpeech: String { return self._s[364]! } - public var Watch_LastSeen_WithinAWeek: String { return self._s[365]! } - public var ContactList_Context_SendMessage: String { return self._s[367]! } - public var Weekday_Tuesday: String { return self._s[368]! } - public var Wallet_Created_Title: String { return self._s[370]! } - public var ScheduledMessages_Delete: String { return self._s[371]! } - public var UserInfo_StartSecretChat: String { return self._s[372]! } - public var Passport_Identity_FilesTitle: String { return self._s[373]! } - public var Permissions_NotificationsAllow_v0: String { return self._s[374]! } - public var DialogList_DeleteConversationConfirmation: String { return self._s[376]! } - public var ChatList_UndoArchiveRevealedTitle: String { return self._s[377]! } + public var CallFeedback_ReasonDistortedSpeech: String { return self._s[365]! } + public var Watch_LastSeen_WithinAWeek: String { return self._s[366]! } + public var ContactList_Context_SendMessage: String { return self._s[368]! } + public var Weekday_Tuesday: String { return self._s[369]! } + public var Wallet_Created_Title: String { return self._s[371]! } + public var ScheduledMessages_Delete: String { return self._s[372]! } + public var UserInfo_StartSecretChat: String { return self._s[373]! } + public var Passport_Identity_FilesTitle: String { return self._s[374]! } + public var Permissions_NotificationsAllow_v0: String { return self._s[375]! } + public var DialogList_DeleteConversationConfirmation: String { return self._s[377]! } + public var ChatList_UndoArchiveRevealedTitle: String { return self._s[378]! } public func Wallet_Configuration_ApplyErrorTextURLUnreachable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[378]!, self._r[378]!, [_0]) + return formatWithArgumentRanges(self._s[379]!, self._r[379]!, [_0]) } - public var AuthSessions_Sessions: String { return self._s[379]! } + public var AuthSessions_Sessions: String { return self._s[380]! } public func Settings_KeepPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[381]!, self._r[381]!, [_0]) + return formatWithArgumentRanges(self._s[382]!, self._r[382]!, [_0]) } - public var TwoStepAuth_RecoveryEmailChangeDescription: String { return self._s[382]! } - public var Call_StatusWaiting: String { return self._s[383]! } - public var CreateGroup_SoftUserLimitAlert: String { return self._s[384]! } - public var FastTwoStepSetup_HintHelp: String { return self._s[385]! } - public var WallpaperPreview_CustomColorBottomText: String { return self._s[386]! } - public var EditTheme_Expand_Preview_OutgoingText: String { return self._s[387]! } - public var LogoutOptions_AddAccountText: String { return self._s[388]! } - public var PasscodeSettings_6DigitCode: String { return self._s[389]! } - public var Settings_LogoutConfirmationText: String { return self._s[390]! } - public var Passport_Identity_TypePassport: String { return self._s[392]! } - public var Map_Work: String { return self._s[395]! } + public var TwoStepAuth_RecoveryEmailChangeDescription: String { return self._s[383]! } + public var Call_StatusWaiting: String { return self._s[384]! } + public var CreateGroup_SoftUserLimitAlert: String { return self._s[385]! } + public var FastTwoStepSetup_HintHelp: String { return self._s[386]! } + public var WallpaperPreview_CustomColorBottomText: String { return self._s[387]! } + public var EditTheme_Expand_Preview_OutgoingText: String { return self._s[388]! } + public var LogoutOptions_AddAccountText: String { return self._s[389]! } + public var PasscodeSettings_6DigitCode: String { return self._s[390]! } + public var Settings_LogoutConfirmationText: String { return self._s[391]! } + public var Passport_Identity_TypePassport: String { return self._s[393]! } + public var Map_Work: String { return self._s[396]! } public func PUSH_MESSAGE_VIDEOS(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[396]!, self._r[396]!, [_1, _2]) + return formatWithArgumentRanges(self._s[397]!, self._r[397]!, [_1, _2]) } - public var SocksProxySetup_SaveProxy: String { return self._s[397]! } - public var AccessDenied_SaveMedia: String { return self._s[398]! } - public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[400]! } - public var CreatePoll_MultipleChoice: String { return self._s[401]! } - public var Settings_Title: String { return self._s[403]! } - public var VoiceOver_Chat_RecordModeVideoMessageInfo: String { return self._s[404]! } - public var Contacts_InviteSearchLabel: String { return self._s[406]! } - public var PrivacySettings_WebSessions: String { return self._s[407]! } - public var ConvertToSupergroup_Title: String { return self._s[408]! } + public var SocksProxySetup_SaveProxy: String { return self._s[398]! } + public var AccessDenied_SaveMedia: String { return self._s[399]! } + public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[401]! } + public var CreatePoll_MultipleChoice: String { return self._s[402]! } + public var Settings_Title: String { return self._s[404]! } + public var VoiceOver_Chat_RecordModeVideoMessageInfo: String { return self._s[405]! } + public var Contacts_InviteSearchLabel: String { return self._s[407]! } + public var PrivacySettings_WebSessions: String { return self._s[408]! } + public var ConvertToSupergroup_Title: String { return self._s[409]! } public func Channel_AdminLog_CaptionEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[409]!, self._r[409]!, [_0]) + return formatWithArgumentRanges(self._s[410]!, self._r[410]!, [_0]) } - public var TwoFactorSetup_Hint_Text: String { return self._s[410]! } - public var InfoPlist_NSSiriUsageDescription: String { return self._s[411]! } + public var TwoFactorSetup_Hint_Text: String { return self._s[411]! } + public var InfoPlist_NSSiriUsageDescription: String { return self._s[412]! } public func PUSH_MESSAGE_CHANNEL_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[412]!, self._r[412]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[413]!, self._r[413]!, [_1, _2, _3]) } - public var ChatSettings_AutomaticPhotoDownload: String { return self._s[413]! } - public var UserInfo_BotHelp: String { return self._s[414]! } - public var PrivacySettings_LastSeenEverybody: String { return self._s[415]! } - public var Checkout_Name: String { return self._s[416]! } - public var AutoDownloadSettings_DataUsage: String { return self._s[417]! } - public var Channel_BanUser_BlockFor: String { return self._s[418]! } - public var Checkout_ShippingAddress: String { return self._s[419]! } - public var AutoDownloadSettings_MaxVideoSize: String { return self._s[420]! } - public var Privacy_PaymentsClearInfoDoneHelp: String { return self._s[421]! } - public var Privacy_Forwards: String { return self._s[422]! } - public var Channel_BanUser_PermissionSendPolls: String { return self._s[423]! } - public var Appearance_ThemeCarouselNewNight: String { return self._s[424]! } + public var ChatSettings_AutomaticPhotoDownload: String { return self._s[414]! } + public var UserInfo_BotHelp: String { return self._s[415]! } + public var PrivacySettings_LastSeenEverybody: String { return self._s[416]! } + public var Checkout_Name: String { return self._s[417]! } + public var AutoDownloadSettings_DataUsage: String { return self._s[418]! } + public var Channel_BanUser_BlockFor: String { return self._s[419]! } + public var Checkout_ShippingAddress: String { return self._s[420]! } + public var AutoDownloadSettings_MaxVideoSize: String { return self._s[421]! } + public var Privacy_PaymentsClearInfoDoneHelp: String { return self._s[422]! } + public var Privacy_Forwards: String { return self._s[423]! } + public var Channel_BanUser_PermissionSendPolls: String { return self._s[424]! } + public var Appearance_ThemeCarouselNewNight: String { return self._s[425]! } public func SecretVideo_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[427]!, self._r[427]!, [_0]) + return formatWithArgumentRanges(self._s[428]!, self._r[428]!, [_0]) } - public var Contacts_SortedByName: String { return self._s[428]! } - public var Group_OwnershipTransfer_Title: String { return self._s[429]! } - public var PeerInfo_BioExpand: String { return self._s[431]! } - public var VoiceOver_Chat_OpenHint: String { return self._s[432]! } - public var Group_LeaveGroup: String { return self._s[433]! } - public var Settings_UsernameEmpty: String { return self._s[434]! } + public var Contacts_SortedByName: String { return self._s[429]! } + public var Group_OwnershipTransfer_Title: String { return self._s[430]! } + public var PeerInfo_BioExpand: String { return self._s[432]! } + public var VoiceOver_Chat_OpenHint: String { return self._s[433]! } + public var Group_LeaveGroup: String { return self._s[434]! } + public var Settings_UsernameEmpty: String { return self._s[435]! } public func Notification_PinnedPollMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[435]!, self._r[435]!, [_0]) + return formatWithArgumentRanges(self._s[436]!, self._r[436]!, [_0]) } public func TwoStepAuth_ConfirmEmailDescription(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[436]!, self._r[436]!, [_1]) + return formatWithArgumentRanges(self._s[437]!, self._r[437]!, [_1]) } public func Channel_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[437]!, self._r[437]!, [_1, _2]) + return formatWithArgumentRanges(self._s[438]!, self._r[438]!, [_1, _2]) } - public var Message_ImageExpired: String { return self._s[438]! } - public var TwoStepAuth_RecoveryFailed: String { return self._s[440]! } - public var EditTheme_Edit_Preview_OutgoingText: String { return self._s[441]! } - public var UserInfo_AddToExisting: String { return self._s[442]! } - public var TwoStepAuth_EnabledSuccess: String { return self._s[443]! } - public var Wallet_Send_SyncInProgress: String { return self._s[444]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_SetColor: String { return self._s[445]! } + public var Message_ImageExpired: String { return self._s[439]! } + public var TwoStepAuth_RecoveryFailed: String { return self._s[441]! } + public var EditTheme_Edit_Preview_OutgoingText: String { return self._s[442]! } + public var UserInfo_AddToExisting: String { return self._s[443]! } + public var TwoStepAuth_EnabledSuccess: String { return self._s[444]! } + public var Wallet_Send_SyncInProgress: String { return self._s[445]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_SetColor: String { return self._s[446]! } public func PUSH_CHANNEL_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[446]!, self._r[446]!, [_1]) + return formatWithArgumentRanges(self._s[447]!, self._r[447]!, [_1]) } - public var Notifications_GroupNotificationsAlert: String { return self._s[447]! } - public var Passport_Language_km: String { return self._s[448]! } - public var SocksProxySetup_AdNoticeHelp: String { return self._s[450]! } - public var VoiceOver_Media_PlaybackPlay: String { return self._s[451]! } - public var Notification_CallMissedShort: String { return self._s[452]! } - public var Wallet_Info_YourBalance: String { return self._s[453]! } - public var ReportPeer_ReasonOther_Send: String { return self._s[455]! } - public var Watch_Compose_Send: String { return self._s[456]! } - public var Passport_Identity_TypeInternalPassportUploadScan: String { return self._s[459]! } - public var TwoFactorSetup_Email_Action: String { return self._s[460]! } - public var Conversation_HoldForVideo: String { return self._s[461]! } - public var Wallet_Configuration_ApplyErrorTextURLInvalidData: String { return self._s[462]! } - public var AuthSessions_OtherDevices: String { return self._s[463]! } - public var Wallet_TransactionInfo_CommentHeader: String { return self._s[464]! } - public var CheckoutInfo_ErrorCityInvalid: String { return self._s[466]! } - public var Appearance_AutoNightThemeDisabled: String { return self._s[468]! } - public var Channel_LinkItem: String { return self._s[469]! } + public var Notifications_GroupNotificationsAlert: String { return self._s[448]! } + public var Passport_Language_km: String { return self._s[449]! } + public var SocksProxySetup_AdNoticeHelp: String { return self._s[451]! } + public var VoiceOver_Media_PlaybackPlay: String { return self._s[452]! } + public var Notification_CallMissedShort: String { return self._s[453]! } + public var Wallet_Info_YourBalance: String { return self._s[454]! } + public var ReportPeer_ReasonOther_Send: String { return self._s[456]! } + public var Watch_Compose_Send: String { return self._s[457]! } + public var Passport_Identity_TypeInternalPassportUploadScan: String { return self._s[460]! } + public var TwoFactorSetup_Email_Action: String { return self._s[461]! } + public var Conversation_HoldForVideo: String { return self._s[462]! } + public var Wallet_Configuration_ApplyErrorTextURLInvalidData: String { return self._s[463]! } + public var AuthSessions_OtherDevices: String { return self._s[464]! } + public var Wallet_TransactionInfo_CommentHeader: String { return self._s[465]! } + public var CheckoutInfo_ErrorCityInvalid: String { return self._s[467]! } + public var Appearance_AutoNightThemeDisabled: String { return self._s[469]! } + public var Channel_LinkItem: String { return self._s[470]! } public func PrivacySettings_LastSeenContactsMinusPlus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[470]!, self._r[470]!, [_0, _1]) + return formatWithArgumentRanges(self._s[471]!, self._r[471]!, [_0, _1]) } public func Passport_Identity_NativeNameTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[473]!, self._r[473]!, [_0]) + return formatWithArgumentRanges(self._s[474]!, self._r[474]!, [_0]) } - public var VoiceOver_Recording_StopAndPreview: String { return self._s[474]! } - public var Passport_Language_dv: String { return self._s[475]! } - public var Undo_LeftChannel: String { return self._s[476]! } - public var Notifications_ExceptionsMuted: String { return self._s[477]! } - public var ChatList_UnhideAction: String { return self._s[478]! } - public var Conversation_ContextMenuShare: String { return self._s[479]! } - public var Conversation_ContextMenuStickerPackInfo: String { return self._s[480]! } - public var ShareFileTip_Title: String { return self._s[481]! } - public var NotificationsSound_Chord: String { return self._s[482]! } - public var Wallet_TransactionInfo_OtherFeeHeader: String { return self._s[483]! } + public var VoiceOver_Recording_StopAndPreview: String { return self._s[475]! } + public var Passport_Language_dv: String { return self._s[476]! } + public var Undo_LeftChannel: String { return self._s[477]! } + public var Notifications_ExceptionsMuted: String { return self._s[478]! } + public var ChatList_UnhideAction: String { return self._s[479]! } + public var Conversation_ContextMenuShare: String { return self._s[480]! } + public var Conversation_ContextMenuStickerPackInfo: String { return self._s[481]! } + public var ShareFileTip_Title: String { return self._s[482]! } + public var NotificationsSound_Chord: String { return self._s[483]! } + public var Wallet_TransactionInfo_OtherFeeHeader: String { return self._s[484]! } public func PUSH_CHAT_RETURNED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[484]!, self._r[484]!, [_1, _2]) + return formatWithArgumentRanges(self._s[485]!, self._r[485]!, [_1, _2]) } - public var Passport_Address_EditTemporaryRegistration: String { return self._s[485]! } + public var Passport_Address_EditTemporaryRegistration: String { return self._s[486]! } public func Notification_Joined(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[486]!, self._r[486]!, [_0]) + return formatWithArgumentRanges(self._s[487]!, self._r[487]!, [_0]) } public func Wallet_Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[487]!, self._r[487]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[488]!, self._r[488]!, [_1, _2, _3]) } - public var Wallet_Settings_ConfigurationInfo: String { return self._s[488]! } - public var Wallpaper_ErrorNotFound: String { return self._s[489]! } - public var Notification_CallOutgoingShort: String { return self._s[491]! } - public var Wallet_WordImport_IncorrectText: String { return self._s[492]! } + public var Wallet_Settings_ConfigurationInfo: String { return self._s[489]! } + public var Wallpaper_ErrorNotFound: String { return self._s[490]! } + public var Notification_CallOutgoingShort: String { return self._s[492]! } + public var Wallet_WordImport_IncorrectText: String { return self._s[493]! } public func Watch_Time_ShortFullAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[493]!, self._r[493]!, [_1, _2]) + return formatWithArgumentRanges(self._s[494]!, self._r[494]!, [_1, _2]) } - public var Passport_Address_TypeUtilityBill: String { return self._s[494]! } - public var Privacy_Forwards_LinkIfAllowed: String { return self._s[495]! } - public var ReportPeer_Report: String { return self._s[496]! } - public var SettingsSearch_Synonyms_Proxy_Title: String { return self._s[497]! } - public var GroupInfo_DeactivatedStatus: String { return self._s[498]! } + public var Passport_Address_TypeUtilityBill: String { return self._s[495]! } + public var Privacy_Forwards_LinkIfAllowed: String { return self._s[496]! } + public var ReportPeer_Report: String { return self._s[497]! } + public var SettingsSearch_Synonyms_Proxy_Title: String { return self._s[498]! } + public var GroupInfo_DeactivatedStatus: String { return self._s[499]! } public func VoiceOver_Chat_MusicTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[499]!, self._r[499]!, [_1, _2]) + return formatWithArgumentRanges(self._s[500]!, self._r[500]!, [_1, _2]) } - public var StickerPack_Send: String { return self._s[500]! } - public var Login_CodeSentInternal: String { return self._s[501]! } - public var Wallet_Month_GenJanuary: String { return self._s[502]! } - public var GroupInfo_InviteLink_LinkSection: String { return self._s[503]! } + public var StickerPack_Send: String { return self._s[501]! } + public var Login_CodeSentInternal: String { return self._s[502]! } + public var Wallet_Month_GenJanuary: String { return self._s[503]! } + public var GroupInfo_InviteLink_LinkSection: String { return self._s[504]! } public func Channel_AdminLog_MessageDeleted(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[504]!, self._r[504]!, [_0]) + return formatWithArgumentRanges(self._s[505]!, self._r[505]!, [_0]) } public func Conversation_EncryptionWaiting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[506]!, self._r[506]!, [_0]) + return formatWithArgumentRanges(self._s[507]!, self._r[507]!, [_0]) } - public var Channel_BanUser_PermissionSendStickersAndGifs: String { return self._s[507]! } + public var Channel_BanUser_PermissionSendStickersAndGifs: String { return self._s[508]! } public func PUSH_PINNED_GAME(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[508]!, self._r[508]!, [_1]) + return formatWithArgumentRanges(self._s[509]!, self._r[509]!, [_1]) } - public var ReportPeer_ReasonViolence: String { return self._s[510]! } - public var Appearance_ShareThemeColor: String { return self._s[511]! } - public var Map_Locating: String { return self._s[512]! } + public var ReportPeer_ReasonViolence: String { return self._s[511]! } + public var Appearance_ShareThemeColor: String { return self._s[512]! } + public var Map_Locating: String { return self._s[513]! } public func VoiceOver_Chat_VideoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[513]!, self._r[513]!, [_0]) + return formatWithArgumentRanges(self._s[514]!, self._r[514]!, [_0]) } public func PUSH_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[514]!, self._r[514]!, [_1]) + return formatWithArgumentRanges(self._s[515]!, self._r[515]!, [_1]) } - public var AutoDownloadSettings_GroupChats: String { return self._s[516]! } - public var CheckoutInfo_SaveInfo: String { return self._s[517]! } - public var SharedMedia_EmptyLinksText: String { return self._s[519]! } - public var Passport_Address_CityPlaceholder: String { return self._s[520]! } - public var CheckoutInfo_ErrorStateInvalid: String { return self._s[521]! } - public var Privacy_ProfilePhoto_CustomHelp: String { return self._s[522]! } - public var Wallet_Send_OwnAddressAlertTitle: String { return self._s[524]! } - public var Channel_AdminLog_CanAddAdmins: String { return self._s[525]! } + public var AutoDownloadSettings_GroupChats: String { return self._s[517]! } + public var CheckoutInfo_SaveInfo: String { return self._s[518]! } + public var SharedMedia_EmptyLinksText: String { return self._s[520]! } + public var Passport_Address_CityPlaceholder: String { return self._s[521]! } + public var CheckoutInfo_ErrorStateInvalid: String { return self._s[522]! } + public var Privacy_ProfilePhoto_CustomHelp: String { return self._s[523]! } + public var Wallet_Send_OwnAddressAlertTitle: String { return self._s[525]! } + public var Channel_AdminLog_CanAddAdmins: String { return self._s[526]! } public func PUSH_CHANNEL_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[526]!, self._r[526]!, [_1]) + return formatWithArgumentRanges(self._s[527]!, self._r[527]!, [_1]) } public func Time_MonthOfYear_m8(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[527]!, self._r[527]!, [_0]) + return formatWithArgumentRanges(self._s[528]!, self._r[528]!, [_0]) } - public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[528]! } - public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[529]! } - public var ChangePhoneNumberCode_Code: String { return self._s[530]! } - public var Appearance_CreateTheme: String { return self._s[531]! } + public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[529]! } + public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[530]! } + public var ChangePhoneNumberCode_Code: String { return self._s[531]! } + public var Appearance_CreateTheme: String { return self._s[532]! } public func UserInfo_NotificationsDefaultSound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[532]!, self._r[532]!, [_0]) + return formatWithArgumentRanges(self._s[533]!, self._r[533]!, [_0]) } - public var TwoStepAuth_SetupEmail: String { return self._s[533]! } - public var HashtagSearch_AllChats: String { return self._s[534]! } - public var MediaPlayer_UnknownTrack: String { return self._s[535]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[537]! } + public var TwoStepAuth_SetupEmail: String { return self._s[534]! } + public var HashtagSearch_AllChats: String { return self._s[535]! } + public var MediaPlayer_UnknownTrack: String { return self._s[536]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[538]! } public func ChatList_DeleteForEveryone(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[538]!, self._r[538]!, [_0]) + return formatWithArgumentRanges(self._s[539]!, self._r[539]!, [_0]) } - public var PhotoEditor_QualityHigh: String { return self._s[540]! } + public var PhotoEditor_QualityHigh: String { return self._s[541]! } public func Passport_Phone_UseTelegramNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[541]!, self._r[541]!, [_0]) + return formatWithArgumentRanges(self._s[542]!, self._r[542]!, [_0]) } - public var ApplyLanguage_ApplyLanguageAction: String { return self._s[542]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[543]! } - public var Message_LiveLocation: String { return self._s[544]! } - public var Cache_LowDiskSpaceText: String { return self._s[545]! } - public var Wallet_Receive_ShareAddress: String { return self._s[546]! } - public var EditTheme_ErrorLinkTaken: String { return self._s[547]! } - public var Conversation_SendMessage: String { return self._s[548]! } - public var AuthSessions_EmptyTitle: String { return self._s[549]! } - public var Privacy_PhoneNumber: String { return self._s[550]! } - public var PeopleNearby_CreateGroup: String { return self._s[551]! } - public var Stats_SharesPerPost: String { return self._s[553]! } - public var CallSettings_UseLessData: String { return self._s[554]! } - public var NetworkUsageSettings_MediaDocumentDataSection: String { return self._s[555]! } - public var Stickers_AddToFavorites: String { return self._s[556]! } - public var Wallet_WordImport_Title: String { return self._s[557]! } - public var PhotoEditor_QualityLow: String { return self._s[558]! } - public var Watch_UserInfo_Unblock: String { return self._s[559]! } - public var Settings_Logout: String { return self._s[560]! } + public var ApplyLanguage_ApplyLanguageAction: String { return self._s[543]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[544]! } + public var Message_LiveLocation: String { return self._s[545]! } + public var Cache_LowDiskSpaceText: String { return self._s[546]! } + public var Wallet_Receive_ShareAddress: String { return self._s[547]! } + public var EditTheme_ErrorLinkTaken: String { return self._s[548]! } + public var Conversation_SendMessage: String { return self._s[549]! } + public var AuthSessions_EmptyTitle: String { return self._s[550]! } + public var Privacy_PhoneNumber: String { return self._s[551]! } + public var PeopleNearby_CreateGroup: String { return self._s[552]! } + public var Stats_SharesPerPost: String { return self._s[554]! } + public var CallSettings_UseLessData: String { return self._s[555]! } + public var NetworkUsageSettings_MediaDocumentDataSection: String { return self._s[556]! } + public var Stickers_AddToFavorites: String { return self._s[557]! } + public var Wallet_WordImport_Title: String { return self._s[558]! } + public var PhotoEditor_QualityLow: String { return self._s[559]! } + public var Watch_UserInfo_Unblock: String { return self._s[560]! } + public var Settings_Logout: String { return self._s[561]! } public func PUSH_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[561]!, self._r[561]!, [_1]) + return formatWithArgumentRanges(self._s[562]!, self._r[562]!, [_1]) } - public var ContactInfo_PhoneLabelWork: String { return self._s[562]! } - public var ChannelInfo_Stats: String { return self._s[563]! } - public var TextFormat_Link: String { return self._s[564]! } + public var ContactInfo_PhoneLabelWork: String { return self._s[563]! } + public var ChannelInfo_Stats: String { return self._s[564]! } + public var TextFormat_Link: String { return self._s[565]! } public func Date_ChatDateHeader(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[565]!, self._r[565]!, [_1, _2]) + return formatWithArgumentRanges(self._s[566]!, self._r[566]!, [_1, _2]) } - public var Wallet_TransactionInfo_Title: String { return self._s[566]! } + public var Wallet_TransactionInfo_Title: String { return self._s[567]! } public func Message_ForwardedMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[567]!, self._r[567]!, [_0]) + return formatWithArgumentRanges(self._s[568]!, self._r[568]!, [_0]) } - public var Watch_Notification_Joined: String { return self._s[568]! } - public var Group_Setup_TypePublicHelp: String { return self._s[569]! } - public var Passport_Scans_UploadNew: String { return self._s[570]! } - public var Checkout_LiabilityAlertTitle: String { return self._s[571]! } - public var DialogList_Title: String { return self._s[574]! } - public var NotificationSettings_ContactJoined: String { return self._s[575]! } - public var GroupInfo_LabelAdmin: String { return self._s[576]! } - public var KeyCommand_ChatInfo: String { return self._s[577]! } - public var Conversation_EditingCaptionPanelTitle: String { return self._s[578]! } - public var Call_ReportIncludeLog: String { return self._s[579]! } + public var Watch_Notification_Joined: String { return self._s[569]! } + public var Group_Setup_TypePublicHelp: String { return self._s[570]! } + public var Passport_Scans_UploadNew: String { return self._s[571]! } + public var Checkout_LiabilityAlertTitle: String { return self._s[572]! } + public var DialogList_Title: String { return self._s[575]! } + public var NotificationSettings_ContactJoined: String { return self._s[576]! } + public var GroupInfo_LabelAdmin: String { return self._s[577]! } + public var KeyCommand_ChatInfo: String { return self._s[578]! } + public var Conversation_EditingCaptionPanelTitle: String { return self._s[579]! } + public var Call_ReportIncludeLog: String { return self._s[580]! } public func Notifications_ExceptionsChangeSound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[582]!, self._r[582]!, [_0]) + return formatWithArgumentRanges(self._s[583]!, self._r[583]!, [_0]) } - public var Stats_Followers: String { return self._s[583]! } - public var Channel_AdminLog_InfoPanelChannelAlertText: String { return self._s[584]! } - public var ChatAdmins_AllMembersAreAdmins: String { return self._s[585]! } - public var LocalGroup_IrrelevantWarning: String { return self._s[586]! } - public var Conversation_DefaultRestrictedInline: String { return self._s[587]! } - public var Message_Sticker: String { return self._s[588]! } - public var LastSeen_JustNow: String { return self._s[590]! } - public var Passport_Email_EmailPlaceholder: String { return self._s[592]! } - public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[593]! } - public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[594]! } - public var Channel_EditAdmin_PermissionsHeader: String { return self._s[595]! } - public var TwoStepAuth_Email: String { return self._s[596]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsSound: String { return self._s[597]! } - public var PhotoEditor_BlurToolOff: String { return self._s[598]! } - public var Message_PinnedStickerMessage: String { return self._s[599]! } - public var ContactInfo_PhoneLabelPager: String { return self._s[600]! } - public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[601]! } - public var Passport_DiscardMessageTitle: String { return self._s[602]! } - public var Privacy_PaymentsTitle: String { return self._s[603]! } - public var EditTheme_Edit_Preview_IncomingReplyName: String { return self._s[604]! } - public var ClearCache_StorageCache: String { return self._s[605]! } - public var Appearance_TextSizeSetting: String { return self._s[606]! } - public var Channel_DiscussionGroup_Header: String { return self._s[608]! } - public var VoiceOver_Chat_OptionSelected: String { return self._s[609]! } - public var Appearance_ColorTheme: String { return self._s[610]! } - public var UserInfo_ShareContact: String { return self._s[611]! } - public var Passport_Address_TypePassportRegistration: String { return self._s[612]! } - public var Common_More: String { return self._s[613]! } - public var Watch_Message_Call: String { return self._s[614]! } - public var Profile_EncryptionKey: String { return self._s[617]! } - public var Privacy_TopPeers: String { return self._s[618]! } - public var Conversation_StopPollConfirmation: String { return self._s[619]! } - public var Wallet_Words_NotDoneText: String { return self._s[621]! } - public var Privacy_TopPeersWarning: String { return self._s[623]! } - public var SettingsSearch_Synonyms_Data_DownloadInBackground: String { return self._s[624]! } - public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[625]! } - public var Wallet_RestoreFailed_EnterWords: String { return self._s[628]! } - public var DialogList_SearchSectionMessages: String { return self._s[629]! } - public var Notifications_ChannelNotifications: String { return self._s[630]! } - public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[631]! } - public var Passport_Language_sk: String { return self._s[632]! } - public var Notification_MessageLifetime1h: String { return self._s[633]! } - public var Wallpaper_ResetWallpapersInfo: String { return self._s[634]! } - public var Appearance_ThemePreview_Chat_5_Text: String { return self._s[635]! } - public var Call_ReportSkip: String { return self._s[637]! } - public var Cache_ServiceFiles: String { return self._s[638]! } - public var Group_ErrorAddTooMuchAdmins: String { return self._s[639]! } - public var VoiceOver_Chat_YourFile: String { return self._s[640]! } - public var Map_Hybrid: String { return self._s[641]! } - public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[643]! } + public var Stats_Followers: String { return self._s[584]! } + public var Channel_AdminLog_InfoPanelChannelAlertText: String { return self._s[585]! } + public var ChatAdmins_AllMembersAreAdmins: String { return self._s[586]! } + public var LocalGroup_IrrelevantWarning: String { return self._s[587]! } + public var Conversation_DefaultRestrictedInline: String { return self._s[588]! } + public var Message_Sticker: String { return self._s[589]! } + public var LastSeen_JustNow: String { return self._s[591]! } + public var Passport_Email_EmailPlaceholder: String { return self._s[593]! } + public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[594]! } + public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[595]! } + public var Channel_EditAdmin_PermissionsHeader: String { return self._s[596]! } + public var TwoStepAuth_Email: String { return self._s[597]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsSound: String { return self._s[598]! } + public var PhotoEditor_BlurToolOff: String { return self._s[599]! } + public var Message_PinnedStickerMessage: String { return self._s[600]! } + public var ContactInfo_PhoneLabelPager: String { return self._s[601]! } + public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[602]! } + public var Passport_DiscardMessageTitle: String { return self._s[603]! } + public var Privacy_PaymentsTitle: String { return self._s[604]! } + public var EditTheme_Edit_Preview_IncomingReplyName: String { return self._s[605]! } + public var ClearCache_StorageCache: String { return self._s[606]! } + public var Appearance_TextSizeSetting: String { return self._s[607]! } + public var Channel_DiscussionGroup_Header: String { return self._s[609]! } + public var VoiceOver_Chat_OptionSelected: String { return self._s[610]! } + public var Appearance_ColorTheme: String { return self._s[611]! } + public var UserInfo_ShareContact: String { return self._s[612]! } + public var Passport_Address_TypePassportRegistration: String { return self._s[613]! } + public var Common_More: String { return self._s[614]! } + public var Watch_Message_Call: String { return self._s[615]! } + public var Profile_EncryptionKey: String { return self._s[618]! } + public var Privacy_TopPeers: String { return self._s[619]! } + public var Conversation_StopPollConfirmation: String { return self._s[620]! } + public var Wallet_Words_NotDoneText: String { return self._s[622]! } + public var Privacy_TopPeersWarning: String { return self._s[624]! } + public var SettingsSearch_Synonyms_Data_DownloadInBackground: String { return self._s[625]! } + public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[626]! } + public var Wallet_RestoreFailed_EnterWords: String { return self._s[629]! } + public var DialogList_SearchSectionMessages: String { return self._s[630]! } + public var Notifications_ChannelNotifications: String { return self._s[631]! } + public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[632]! } + public var Passport_Language_sk: String { return self._s[633]! } + public var Notification_MessageLifetime1h: String { return self._s[634]! } + public var Wallpaper_ResetWallpapersInfo: String { return self._s[635]! } + public var Appearance_ThemePreview_Chat_5_Text: String { return self._s[636]! } + public var Call_ReportSkip: String { return self._s[638]! } + public var Cache_ServiceFiles: String { return self._s[639]! } + public var Group_ErrorAddTooMuchAdmins: String { return self._s[640]! } + public var VoiceOver_Chat_YourFile: String { return self._s[641]! } + public var Map_Hybrid: String { return self._s[642]! } + public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[644]! } public func PUSH_MESSAGE_QUIZ(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[644]!, self._r[644]!, [_1]) + return formatWithArgumentRanges(self._s[645]!, self._r[645]!, [_1]) } - public var ChatSettings_AutoDownloadVideos: String { return self._s[646]! } - public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[647]! } - public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[648]! } - public var SocksProxySetup_ProxyTelegram: String { return self._s[651]! } + public var ChatSettings_AutoDownloadVideos: String { return self._s[647]! } + public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[648]! } + public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[649]! } + public var SocksProxySetup_ProxyTelegram: String { return self._s[652]! } public func PUSH_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[652]!, self._r[652]!, [_1]) + return formatWithArgumentRanges(self._s[653]!, self._r[653]!, [_1]) } - public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[654]! } - public var ScheduledMessages_ScheduledToday: String { return self._s[655]! } + public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[655]! } + public var ScheduledMessages_ScheduledToday: String { return self._s[656]! } public func PUSH_CHAT_TITLE_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[656]!, self._r[656]!, [_1, _2]) + return formatWithArgumentRanges(self._s[657]!, self._r[657]!, [_1, _2]) } - public var Conversation_LiveLocationYou: String { return self._s[657]! } - public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[658]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[659]! } - public var UserInfo_ShareBot: String { return self._s[662]! } + public var Conversation_LiveLocationYou: String { return self._s[658]! } + public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[659]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[660]! } + public var UserInfo_ShareBot: String { return self._s[663]! } public func PUSH_AUTH_REGION(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[663]!, self._r[663]!, [_1, _2]) + return formatWithArgumentRanges(self._s[664]!, self._r[664]!, [_1, _2]) } - public var Conversation_ClearCache: String { return self._s[664]! } - public var PhotoEditor_ShadowsTint: String { return self._s[665]! } - public var Message_Audio: String { return self._s[666]! } - public var Passport_Language_lt: String { return self._s[667]! } + public var Conversation_ClearCache: String { return self._s[665]! } + public var PhotoEditor_ShadowsTint: String { return self._s[666]! } + public var Message_Audio: String { return self._s[667]! } + public var Passport_Language_lt: String { return self._s[668]! } public func Message_PinnedTextMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[668]!, self._r[668]!, [_0]) + return formatWithArgumentRanges(self._s[669]!, self._r[669]!, [_0]) } - public var Permissions_SiriText_v0: String { return self._s[669]! } - public var Conversation_FileICloudDrive: String { return self._s[670]! } - public var ChatList_DeleteForEveryoneConfirmationTitle: String { return self._s[671]! } - public var Notifications_Badge_IncludeMutedChats: String { return self._s[672]! } + public var Permissions_SiriText_v0: String { return self._s[670]! } + public var Conversation_FileICloudDrive: String { return self._s[671]! } + public var ChatList_DeleteForEveryoneConfirmationTitle: String { return self._s[672]! } + public var Notifications_Badge_IncludeMutedChats: String { return self._s[673]! } public func Notification_NewAuthDetected(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[673]!, self._r[673]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[674]!, self._r[674]!, [_1, _2, _3, _4, _5, _6]) } - public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[674]! } + public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[675]! } public func Time_MonthOfYear_m5(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[675]!, self._r[675]!, [_0]) + return formatWithArgumentRanges(self._s[676]!, self._r[676]!, [_0]) } - public var Channel_SignMessages: String { return self._s[676]! } + public var Channel_SignMessages: String { return self._s[677]! } public func PUSH_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[677]!, self._r[677]!, [_1]) + return formatWithArgumentRanges(self._s[678]!, self._r[678]!, [_1]) } - public var Compose_ChannelTokenListPlaceholder: String { return self._s[678]! } - public var Passport_ScanPassport: String { return self._s[679]! } - public var Watch_Suggestion_Thanks: String { return self._s[680]! } - public var BlockedUsers_AddNew: String { return self._s[681]! } + public var Compose_ChannelTokenListPlaceholder: String { return self._s[679]! } + public var Passport_ScanPassport: String { return self._s[680]! } + public var Watch_Suggestion_Thanks: String { return self._s[681]! } + public var BlockedUsers_AddNew: String { return self._s[682]! } public func PUSH_CHAT_MESSAGE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[682]!, self._r[682]!, [_1, _2]) + return formatWithArgumentRanges(self._s[683]!, self._r[683]!, [_1, _2]) } - public var Watch_Message_Invoice: String { return self._s[683]! } - public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[684]! } - public var Month_GenJuly: String { return self._s[685]! } - public var CreatePoll_QuizInfo: String { return self._s[686]! } - public var UserInfo_StartSecretChatStart: String { return self._s[687]! } - public var SocksProxySetup_ProxySocks5: String { return self._s[688]! } - public var IntentsSettings_SuggestByShare: String { return self._s[690]! } - public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[691]! } - public var Notification_ChannelInviterSelf: String { return self._s[692]! } - public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[693]! } + public var Watch_Message_Invoice: String { return self._s[684]! } + public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[685]! } + public var Month_GenJuly: String { return self._s[686]! } + public var CreatePoll_QuizInfo: String { return self._s[687]! } + public var UserInfo_StartSecretChatStart: String { return self._s[688]! } + public var SocksProxySetup_ProxySocks5: String { return self._s[689]! } + public var IntentsSettings_SuggestByShare: String { return self._s[691]! } + public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[692]! } + public var Notification_ChannelInviterSelf: String { return self._s[693]! } + public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[694]! } public func ApplyLanguage_ChangeLanguageUnofficialText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[694]!, self._r[694]!, [_1, _2]) + return formatWithArgumentRanges(self._s[695]!, self._r[695]!, [_1, _2]) } - public var Stats_FollowersTitle: String { return self._s[695]! } - public var CheckoutInfo_Title: String { return self._s[696]! } - public var Watch_Stickers_RecentPlaceholder: String { return self._s[697]! } + public var Stats_FollowersTitle: String { return self._s[696]! } + public var CheckoutInfo_Title: String { return self._s[697]! } + public var Watch_Stickers_RecentPlaceholder: String { return self._s[698]! } public func Map_DistanceAway(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[698]!, self._r[698]!, [_0]) + return formatWithArgumentRanges(self._s[699]!, self._r[699]!, [_0]) } - public var Passport_Identity_MainPage: String { return self._s[699]! } - public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[700]! } - public var Passport_Language_de: String { return self._s[701]! } - public var PeerInfo_PaneVoice: String { return self._s[702]! } - public var Update_Title: String { return self._s[703]! } - public var ContactInfo_PhoneLabelWorkFax: String { return self._s[704]! } - public var Channel_AdminLog_BanEmbedLinks: String { return self._s[705]! } - public var Passport_Email_UseTelegramEmailHelp: String { return self._s[706]! } - public var Notifications_ChannelNotificationsPreview: String { return self._s[707]! } - public var NotificationsSound_Telegraph: String { return self._s[708]! } - public var Watch_LastSeen_ALongTimeAgo: String { return self._s[709]! } - public var ChannelMembers_WhoCanAddMembers: String { return self._s[710]! } + public var Passport_Identity_MainPage: String { return self._s[700]! } + public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[701]! } + public var Passport_Language_de: String { return self._s[702]! } + public var PeerInfo_PaneVoice: String { return self._s[703]! } + public var Update_Title: String { return self._s[704]! } + public var ContactInfo_PhoneLabelWorkFax: String { return self._s[705]! } + public var Channel_AdminLog_BanEmbedLinks: String { return self._s[706]! } + public var Passport_Email_UseTelegramEmailHelp: String { return self._s[707]! } + public var Notifications_ChannelNotificationsPreview: String { return self._s[708]! } + public var NotificationsSound_Telegraph: String { return self._s[709]! } + public var Watch_LastSeen_ALongTimeAgo: String { return self._s[710]! } + public var ChannelMembers_WhoCanAddMembers: String { return self._s[711]! } public func AutoDownloadSettings_UpTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[711]!, self._r[711]!, [_0]) + return formatWithArgumentRanges(self._s[712]!, self._r[712]!, [_0]) } - public var ClearCache_Description: String { return self._s[712]! } - public var Stickers_SuggestAll: String { return self._s[713]! } - public var Conversation_ForwardTitle: String { return self._s[714]! } - public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[715]! } + public var ClearCache_Description: String { return self._s[713]! } + public var Stickers_SuggestAll: String { return self._s[714]! } + public var Conversation_ForwardTitle: String { return self._s[715]! } + public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[716]! } public func Notification_JoinedChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[716]!, self._r[716]!, [_0]) + return formatWithArgumentRanges(self._s[717]!, self._r[717]!, [_0]) } - public var Calls_NewCall: String { return self._s[717]! } - public var Call_StatusEnded: String { return self._s[718]! } - public var AutoDownloadSettings_DataUsageLow: String { return self._s[719]! } - public var Settings_ProxyConnected: String { return self._s[720]! } - public var Channel_AdminLogFilter_EventsPinned: String { return self._s[721]! } - public var PhotoEditor_QualityVeryLow: String { return self._s[722]! } - public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[723]! } - public var Passport_PasswordPlaceholder: String { return self._s[724]! } - public var Message_PinnedInvoice: String { return self._s[725]! } - public var Passport_Identity_IssueDate: String { return self._s[726]! } - public var Passport_Language_pl: String { return self._s[727]! } + public var Calls_NewCall: String { return self._s[718]! } + public var Call_StatusEnded: String { return self._s[719]! } + public var AutoDownloadSettings_DataUsageLow: String { return self._s[720]! } + public var Settings_ProxyConnected: String { return self._s[721]! } + public var Channel_AdminLogFilter_EventsPinned: String { return self._s[722]! } + public var PhotoEditor_QualityVeryLow: String { return self._s[723]! } + public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[724]! } + public var Passport_PasswordPlaceholder: String { return self._s[725]! } + public var Message_PinnedInvoice: String { return self._s[726]! } + public var Passport_Identity_IssueDate: String { return self._s[727]! } + public var Passport_Language_pl: String { return self._s[728]! } public func ChannelInfo_ChannelForbidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[728]!, self._r[728]!, [_0]) + return formatWithArgumentRanges(self._s[729]!, self._r[729]!, [_0]) } - public var Call_StatusConnecting: String { return self._s[729]! } - public var SocksProxySetup_PasteFromClipboard: String { return self._s[730]! } + public var Call_StatusConnecting: String { return self._s[730]! } + public var SocksProxySetup_PasteFromClipboard: String { return self._s[731]! } public func Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[731]!, self._r[731]!, [_0]) + return formatWithArgumentRanges(self._s[732]!, self._r[732]!, [_0]) } - public var ChatSettings_ConnectionType_UseProxy: String { return self._s[733]! } - public var Common_Edit: String { return self._s[734]! } - public var PrivacySettings_LastSeenNobody: String { return self._s[735]! } + public var ChatSettings_ConnectionType_UseProxy: String { return self._s[734]! } + public var Common_Edit: String { return self._s[735]! } + public var PrivacySettings_LastSeenNobody: String { return self._s[736]! } public func Notification_LeftChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[736]!, self._r[736]!, [_0]) + return formatWithArgumentRanges(self._s[737]!, self._r[737]!, [_0]) } - public var GroupInfo_ChatAdmins: String { return self._s[737]! } - public var PrivateDataSettings_Title: String { return self._s[738]! } - public var Login_CancelPhoneVerificationStop: String { return self._s[739]! } - public var ChatList_Read: String { return self._s[740]! } - public var Wallet_WordImport_Text: String { return self._s[741]! } - public var Undo_ChatClearedForBothSides: String { return self._s[742]! } - public var GroupPermission_SectionTitle: String { return self._s[743]! } - public var TwoFactorSetup_Intro_Title: String { return self._s[745]! } + public var GroupInfo_ChatAdmins: String { return self._s[738]! } + public var PrivateDataSettings_Title: String { return self._s[739]! } + public var Login_CancelPhoneVerificationStop: String { return self._s[740]! } + public var ChatList_Read: String { return self._s[741]! } + public var Wallet_WordImport_Text: String { return self._s[742]! } + public var Undo_ChatClearedForBothSides: String { return self._s[743]! } + public var GroupPermission_SectionTitle: String { return self._s[744]! } + public var TwoFactorSetup_Intro_Title: String { return self._s[746]! } public func PUSH_CHAT_LEFT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[746]!, self._r[746]!, [_1, _2]) + return formatWithArgumentRanges(self._s[747]!, self._r[747]!, [_1, _2]) } - public var Checkout_ErrorPaymentFailed: String { return self._s[747]! } - public var Update_UpdateApp: String { return self._s[748]! } - public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[749]! } - public var Settings_Appearance: String { return self._s[750]! } - public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[754]! } - public var Watch_Location_Access: String { return self._s[755]! } - public var ShareMenu_CopyShareLink: String { return self._s[757]! } - public var TwoStepAuth_SetupHintTitle: String { return self._s[758]! } - public var Conversation_Theme: String { return self._s[760]! } + public var Checkout_ErrorPaymentFailed: String { return self._s[748]! } + public var Update_UpdateApp: String { return self._s[749]! } + public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[750]! } + public var Settings_Appearance: String { return self._s[751]! } + public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[755]! } + public var Watch_Location_Access: String { return self._s[756]! } + public var ShareMenu_CopyShareLink: String { return self._s[758]! } + public var TwoStepAuth_SetupHintTitle: String { return self._s[759]! } + public var Conversation_Theme: String { return self._s[761]! } public func DialogList_SingleRecordingVideoMessageSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[761]!, self._r[761]!, [_0]) + return formatWithArgumentRanges(self._s[762]!, self._r[762]!, [_0]) } - public var Notifications_ClassicTones: String { return self._s[762]! } - public var Weekday_ShortWednesday: String { return self._s[763]! } - public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[764]! } - public var Undo_LeftGroup: String { return self._s[767]! } - public var Wallet_RestoreFailed_Text: String { return self._s[768]! } - public var Conversation_LinkDialogCopy: String { return self._s[769]! } - public var Wallet_TransactionInfo_NoAddress: String { return self._s[771]! } - public var Wallet_Navigation_Back: String { return self._s[772]! } - public var KeyCommand_FocusOnInputField: String { return self._s[773]! } - public var Contacts_SelectAll: String { return self._s[774]! } - public var Preview_SaveToCameraRoll: String { return self._s[775]! } - public var PrivacySettings_PasscodeOff: String { return self._s[776]! } - public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[777]! } + public var Notifications_ClassicTones: String { return self._s[763]! } + public var Weekday_ShortWednesday: String { return self._s[764]! } + public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[765]! } + public var Undo_LeftGroup: String { return self._s[768]! } + public var Wallet_RestoreFailed_Text: String { return self._s[769]! } + public var Conversation_LinkDialogCopy: String { return self._s[770]! } + public var Wallet_TransactionInfo_NoAddress: String { return self._s[772]! } + public var Wallet_Navigation_Back: String { return self._s[773]! } + public var KeyCommand_FocusOnInputField: String { return self._s[774]! } + public var Contacts_SelectAll: String { return self._s[775]! } + public var Preview_SaveToCameraRoll: String { return self._s[776]! } + public var PrivacySettings_PasscodeOff: String { return self._s[777]! } + public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[778]! } public func PUSH_CHANNEL_MESSAGE_QUIZ(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[778]!, self._r[778]!, [_1]) + return formatWithArgumentRanges(self._s[779]!, self._r[779]!, [_1]) } - public var Wallpaper_Title: String { return self._s[779]! } - public var Conversation_FilePhotoOrVideo: String { return self._s[780]! } - public var AccessDenied_Camera: String { return self._s[781]! } - public var Watch_Compose_CurrentLocation: String { return self._s[782]! } - public var PeerInfo_ButtonMessage: String { return self._s[784]! } - public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[785]! } + public var Wallpaper_Title: String { return self._s[780]! } + public var Conversation_FilePhotoOrVideo: String { return self._s[781]! } + public var AccessDenied_Camera: String { return self._s[782]! } + public var Watch_Compose_CurrentLocation: String { return self._s[783]! } + public var PeerInfo_ButtonMessage: String { return self._s[785]! } + public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[786]! } public func SecretImage_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[786]!, self._r[786]!, [_0]) + return formatWithArgumentRanges(self._s[787]!, self._r[787]!, [_0]) } - public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[787]! } - public var Passport_Language_ro: String { return self._s[788]! } - public var EditTheme_UploadNewTheme: String { return self._s[789]! } - public var CheckoutInfo_SaveInfoHelp: String { return self._s[790]! } - public var Wallet_Intro_Terms: String { return self._s[791]! } + public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[788]! } + public var Passport_Language_ro: String { return self._s[789]! } + public var EditTheme_UploadNewTheme: String { return self._s[790]! } + public var CheckoutInfo_SaveInfoHelp: String { return self._s[791]! } + public var Wallet_Intro_Terms: String { return self._s[792]! } public func Notification_SecretChatMessageScreenshot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[792]!, self._r[792]!, [_0]) + return formatWithArgumentRanges(self._s[793]!, self._r[793]!, [_0]) } - public var Login_CancelPhoneVerification: String { return self._s[793]! } - public var State_ConnectingToProxy: String { return self._s[794]! } - public var Calls_RatingTitle: String { return self._s[795]! } - public var Generic_ErrorMoreInfo: String { return self._s[796]! } - public var ChatList_Search_ShowMore: String { return self._s[797]! } - public var Appearance_PreviewReplyText: String { return self._s[798]! } - public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[799]! } + public var Login_CancelPhoneVerification: String { return self._s[794]! } + public var State_ConnectingToProxy: String { return self._s[795]! } + public var Calls_RatingTitle: String { return self._s[796]! } + public var Generic_ErrorMoreInfo: String { return self._s[797]! } + public var ChatList_Search_ShowMore: String { return self._s[798]! } + public var Appearance_PreviewReplyText: String { return self._s[799]! } + public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[800]! } public func Wallet_Send_Balance(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[800]!, self._r[800]!, [_0]) + return formatWithArgumentRanges(self._s[801]!, self._r[801]!, [_0]) } - public var IntentsSettings_SuggestedChatsContacts: String { return self._s[801]! } - public var SharedMedia_CategoryLinks: String { return self._s[802]! } - public var Calls_Missed: String { return self._s[803]! } - public var Cache_Photos: String { return self._s[807]! } - public var GroupPermission_NoAddMembers: String { return self._s[808]! } - public var ScheduledMessages_Title: String { return self._s[809]! } + public var IntentsSettings_SuggestedChatsContacts: String { return self._s[802]! } + public var SharedMedia_CategoryLinks: String { return self._s[803]! } + public var Calls_Missed: String { return self._s[804]! } + public var Cache_Photos: String { return self._s[808]! } + public var GroupPermission_NoAddMembers: String { return self._s[809]! } + public var ScheduledMessages_Title: String { return self._s[810]! } public func Channel_AdminLog_MessageUnpinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[810]!, self._r[810]!, [_0]) + return formatWithArgumentRanges(self._s[811]!, self._r[811]!, [_0]) } - public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[811]! } - public var Settings_ProxyDisabled: String { return self._s[812]! } + public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[812]! } + public var Settings_ProxyDisabled: String { return self._s[813]! } public func Settings_ApplyProxyAlertCredentials(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[813]!, self._r[813]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[814]!, self._r[814]!, [_1, _2, _3, _4]) } public func Conversation_RestrictedMediaTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[814]!, self._r[814]!, [_0]) + return formatWithArgumentRanges(self._s[815]!, self._r[815]!, [_0]) } - public var Stats_ViewsPerPost: String { return self._s[816]! } - public var ChatList_Context_RemoveFromRecents: String { return self._s[817]! } - public var Appearance_Title: String { return self._s[818]! } + public var Stats_ViewsPerPost: String { return self._s[817]! } + public var ChatList_Context_RemoveFromRecents: String { return self._s[818]! } + public var Appearance_Title: String { return self._s[819]! } public func Time_MonthOfYear_m2(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[820]!, self._r[820]!, [_0]) + return formatWithArgumentRanges(self._s[821]!, self._r[821]!, [_0]) } - public var Conversation_WalletRequiredText: String { return self._s[821]! } - public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[822]! } - public var OldChannels_NoticeCreateText: String { return self._s[823]! } - public var Channel_EditMessageErrorGeneric: String { return self._s[824]! } - public var Privacy_Calls_IntegrationHelp: String { return self._s[825]! } - public var Preview_DeletePhoto: String { return self._s[826]! } - public var Appearance_AppIconFilledX: String { return self._s[827]! } - public var PrivacySettings_PrivacyTitle: String { return self._s[828]! } + public var Conversation_WalletRequiredText: String { return self._s[822]! } + public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[823]! } + public var OldChannels_NoticeCreateText: String { return self._s[824]! } + public var Channel_EditMessageErrorGeneric: String { return self._s[825]! } + public var Privacy_Calls_IntegrationHelp: String { return self._s[826]! } + public var Preview_DeletePhoto: String { return self._s[827]! } + public var Appearance_AppIconFilledX: String { return self._s[828]! } + public var PrivacySettings_PrivacyTitle: String { return self._s[829]! } public func Conversation_BotInteractiveUrlAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[829]!, self._r[829]!, [_0]) + return formatWithArgumentRanges(self._s[830]!, self._r[830]!, [_0]) } - public var Coub_TapForSound: String { return self._s[832]! } - public var Map_LocatingError: String { return self._s[833]! } - public var TwoStepAuth_EmailChangeSuccess: String { return self._s[835]! } - public var Conversation_SendMessage_SendSilently: String { return self._s[836]! } - public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[837]! } + public var Coub_TapForSound: String { return self._s[833]! } + public var Map_LocatingError: String { return self._s[834]! } + public var TwoStepAuth_EmailChangeSuccess: String { return self._s[836]! } + public var Conversation_SendMessage_SendSilently: String { return self._s[837]! } + public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[838]! } public func Wallet_Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[838]!, self._r[838]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[839]!, self._r[839]!, [_1, _2, _3]) } - public var Passport_ForgottenPassword: String { return self._s[839]! } - public var GroupInfo_InviteLink_RevokeLink: String { return self._s[840]! } - public var StickerPacksSettings_ArchivedPacks: String { return self._s[841]! } - public var Login_TermsOfServiceSignupDecline: String { return self._s[843]! } - public var Channel_Moderator_AccessLevelRevoke: String { return self._s[844]! } - public var Message_Location: String { return self._s[845]! } - public var Passport_Identity_NamePlaceholder: String { return self._s[846]! } - public var Channel_Management_Title: String { return self._s[847]! } - public var DialogList_SearchSectionDialogs: String { return self._s[849]! } - public var Compose_NewChannel_Members: String { return self._s[850]! } + public var Passport_ForgottenPassword: String { return self._s[840]! } + public var GroupInfo_InviteLink_RevokeLink: String { return self._s[841]! } + public var StickerPacksSettings_ArchivedPacks: String { return self._s[842]! } + public var Login_TermsOfServiceSignupDecline: String { return self._s[844]! } + public var Channel_Moderator_AccessLevelRevoke: String { return self._s[845]! } + public var Message_Location: String { return self._s[846]! } + public var Passport_Identity_NamePlaceholder: String { return self._s[847]! } + public var Channel_Management_Title: String { return self._s[848]! } + public var DialogList_SearchSectionDialogs: String { return self._s[850]! } + public var Compose_NewChannel_Members: String { return self._s[851]! } public func DialogList_SingleUploadingFileSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[851]!, self._r[851]!, [_0]) + return formatWithArgumentRanges(self._s[852]!, self._r[852]!, [_0]) } - public var GroupInfo_Location: String { return self._s[852]! } - public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[853]! } - public var ClearCache_Clear: String { return self._s[854]! } - public var AutoNightTheme_ScheduledFrom: String { return self._s[855]! } - public var PhotoEditor_WarmthTool: String { return self._s[856]! } - public var Passport_Language_tr: String { return self._s[857]! } + public var GroupInfo_Location: String { return self._s[853]! } + public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[854]! } + public var ClearCache_Clear: String { return self._s[855]! } + public var InstantPage_FeedbackButtonShort: String { return self._s[856]! } + public var AutoNightTheme_ScheduledFrom: String { return self._s[857]! } + public var PhotoEditor_WarmthTool: String { return self._s[858]! } + public var Passport_Language_tr: String { return self._s[859]! } public func PUSH_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[858]!, self._r[858]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[860]!, self._r[860]!, [_1, _2, _3]) } - public var OldChannels_NoticeUpgradeText: String { return self._s[859]! } - public var Login_ResetAccountProtected_Reset: String { return self._s[861]! } - public var Watch_PhotoView_Title: String { return self._s[862]! } - public var Passport_Phone_Delete: String { return self._s[863]! } - public var Undo_ChatDeletedForBothSides: String { return self._s[864]! } - public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[865]! } - public var GroupInfo_Permissions: String { return self._s[866]! } - public var PasscodeSettings_TurnPasscodeOff: String { return self._s[867]! } - public var Profile_ShareContactButton: String { return self._s[868]! } - public var ChatSettings_Other: String { return self._s[869]! } - public var UserInfo_NotificationsDisabled: String { return self._s[870]! } - public var CheckoutInfo_ShippingInfoCity: String { return self._s[871]! } - public var LastSeen_WithinAMonth: String { return self._s[872]! } - public var VoiceOver_Chat_PlayHint: String { return self._s[873]! } - public var Conversation_ReportGroupLocation: String { return self._s[874]! } - public var Conversation_EncryptionCanceled: String { return self._s[875]! } - public var MediaPicker_GroupDescription: String { return self._s[876]! } - public var WebSearch_Images: String { return self._s[877]! } + public var OldChannels_NoticeUpgradeText: String { return self._s[861]! } + public var Login_ResetAccountProtected_Reset: String { return self._s[863]! } + public var Watch_PhotoView_Title: String { return self._s[864]! } + public var Passport_Phone_Delete: String { return self._s[865]! } + public var Undo_ChatDeletedForBothSides: String { return self._s[866]! } + public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[867]! } + public var GroupInfo_Permissions: String { return self._s[868]! } + public var PasscodeSettings_TurnPasscodeOff: String { return self._s[869]! } + public var Profile_ShareContactButton: String { return self._s[870]! } + public var ChatSettings_Other: String { return self._s[871]! } + public var UserInfo_NotificationsDisabled: String { return self._s[872]! } + public var CheckoutInfo_ShippingInfoCity: String { return self._s[873]! } + public var LastSeen_WithinAMonth: String { return self._s[874]! } + public var VoiceOver_Chat_PlayHint: String { return self._s[875]! } + public var Conversation_ReportGroupLocation: String { return self._s[876]! } + public var Conversation_EncryptionCanceled: String { return self._s[877]! } + public var MediaPicker_GroupDescription: String { return self._s[878]! } + public var WebSearch_Images: String { return self._s[879]! } public func Channel_Management_PromotedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[878]!, self._r[878]!, [_0]) + return formatWithArgumentRanges(self._s[880]!, self._r[880]!, [_0]) } - public var Message_Photo: String { return self._s[879]! } - public var PasscodeSettings_HelpBottom: String { return self._s[880]! } - public var AutoDownloadSettings_VideosTitle: String { return self._s[881]! } - public var VoiceOver_Media_PlaybackRateChange: String { return self._s[882]! } - public var Passport_Identity_AddDriversLicense: String { return self._s[883]! } - public var TwoStepAuth_EnterPasswordPassword: String { return self._s[884]! } - public var NotificationsSound_Calypso: String { return self._s[885]! } - public var Map_Map: String { return self._s[886]! } + public var Message_Photo: String { return self._s[881]! } + public var PasscodeSettings_HelpBottom: String { return self._s[882]! } + public var AutoDownloadSettings_VideosTitle: String { return self._s[883]! } + public var VoiceOver_Media_PlaybackRateChange: String { return self._s[884]! } + public var Passport_Identity_AddDriversLicense: String { return self._s[885]! } + public var TwoStepAuth_EnterPasswordPassword: String { return self._s[886]! } + public var NotificationsSound_Calypso: String { return self._s[887]! } + public var Map_Map: String { return self._s[888]! } public func Conversation_LiveLocationYouAndOther(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[887]!, self._r[887]!, [_0]) + return formatWithArgumentRanges(self._s[889]!, self._r[889]!, [_0]) } - public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[889]! } - public var ChatSettings_TextSizeUnits: String { return self._s[890]! } + public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[891]! } + public var ChatSettings_TextSizeUnits: String { return self._s[892]! } public func VoiceOver_Chat_FileFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[891]!, self._r[891]!, [_0]) + return formatWithArgumentRanges(self._s[893]!, self._r[893]!, [_0]) } - public var Common_of: String { return self._s[892]! } - public var Conversation_ForwardContacts: String { return self._s[895]! } - public var IntentsSettings_SuggestByAll: String { return self._s[897]! } + public var Common_of: String { return self._s[894]! } + public var Conversation_ForwardContacts: String { return self._s[897]! } + public var IntentsSettings_SuggestByAll: String { return self._s[899]! } public func Call_AnsweringWithAccount(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[898]!, self._r[898]!, [_0]) + return formatWithArgumentRanges(self._s[900]!, self._r[900]!, [_0]) } - public var Passport_Language_hy: String { return self._s[899]! } - public var Notifications_MessageNotificationsHelp: String { return self._s[900]! } - public var AutoDownloadSettings_Reset: String { return self._s[901]! } - public var Wallet_TransactionInfo_AddressCopied: String { return self._s[902]! } - public var Paint_ClearConfirm: String { return self._s[903]! } - public var Camera_VideoMode: String { return self._s[904]! } + public var Passport_Language_hy: String { return self._s[901]! } + public var Notifications_MessageNotificationsHelp: String { return self._s[902]! } + public var AutoDownloadSettings_Reset: String { return self._s[903]! } + public var Wallet_TransactionInfo_AddressCopied: String { return self._s[904]! } + public var Paint_ClearConfirm: String { return self._s[905]! } + public var Camera_VideoMode: String { return self._s[906]! } public func Conversation_RestrictedStickersTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[905]!, self._r[905]!, [_0]) + return formatWithArgumentRanges(self._s[907]!, self._r[907]!, [_0]) } - public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[906]! } - public var Conversation_ViewBackground: String { return self._s[907]! } + public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[908]! } + public var Conversation_ViewBackground: String { return self._s[909]! } public func Wallet_Info_TransactionDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[908]!, self._r[908]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[910]!, self._r[910]!, [_1, _2, _3]) } - public var Passport_Language_el: String { return self._s[909]! } - public var PhotoEditor_Original: String { return self._s[910]! } - public var Settings_FAQ_Button: String { return self._s[912]! } - public var Channel_Setup_PublicNoLink: String { return self._s[914]! } - public var Conversation_UnsupportedMedia: String { return self._s[915]! } - public var Conversation_SlideToCancel: String { return self._s[916]! } - public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[917]! } - public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[918]! } - public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[919]! } - public var Conversation_ReportSpamChannelConfirmation: String { return self._s[920]! } - public var AutoNightTheme_NotAvailable: String { return self._s[921]! } - public var Conversation_Owner: String { return self._s[922]! } - public var Common_Create: String { return self._s[923]! } - public var Settings_ApplyProxyAlertEnable: String { return self._s[924]! } - public var ContactList_Context_Call: String { return self._s[925]! } - public var Localization_ChooseLanguage: String { return self._s[927]! } - public var ChatList_Context_AddToContacts: String { return self._s[929]! } - public var OldChannels_NoticeTitle: String { return self._s[930]! } - public var Settings_Proxy: String { return self._s[932]! } - public var Privacy_TopPeersHelp: String { return self._s[933]! } - public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[934]! } - public var Chat_UnsendMyMessages: String { return self._s[935]! } + public var Passport_Language_el: String { return self._s[911]! } + public var PhotoEditor_Original: String { return self._s[912]! } + public var Settings_FAQ_Button: String { return self._s[914]! } + public var Channel_Setup_PublicNoLink: String { return self._s[916]! } + public var Conversation_UnsupportedMedia: String { return self._s[917]! } + public var Conversation_SlideToCancel: String { return self._s[918]! } + public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[919]! } + public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[920]! } + public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[921]! } + public var Conversation_ReportSpamChannelConfirmation: String { return self._s[922]! } + public var AutoNightTheme_NotAvailable: String { return self._s[923]! } + public var Conversation_Owner: String { return self._s[924]! } + public var Common_Create: String { return self._s[925]! } + public var Settings_ApplyProxyAlertEnable: String { return self._s[926]! } + public var ContactList_Context_Call: String { return self._s[927]! } + public var Localization_ChooseLanguage: String { return self._s[929]! } + public var ChatList_Context_AddToContacts: String { return self._s[931]! } + public var OldChannels_NoticeTitle: String { return self._s[932]! } + public var Settings_Proxy: String { return self._s[934]! } + public var Privacy_TopPeersHelp: String { return self._s[935]! } + public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[936]! } + public var Chat_UnsendMyMessages: String { return self._s[937]! } public func VoiceOver_Chat_Duration(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[936]!, self._r[936]!, [_0]) + return formatWithArgumentRanges(self._s[938]!, self._r[938]!, [_0]) } - public var TwoStepAuth_ConfirmationAbort: String { return self._s[937]! } + public var TwoStepAuth_ConfirmationAbort: String { return self._s[939]! } public func Contacts_AccessDeniedHelpPortrait(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[939]!, self._r[939]!, [_0]) + return formatWithArgumentRanges(self._s[941]!, self._r[941]!, [_0]) } - public var Contacts_SortedByPresence: String { return self._s[940]! } - public var Passport_Identity_SurnamePlaceholder: String { return self._s[941]! } - public var Cache_Title: String { return self._s[942]! } + public var Contacts_SortedByPresence: String { return self._s[942]! } + public var Passport_Identity_SurnamePlaceholder: String { return self._s[943]! } + public var Cache_Title: String { return self._s[944]! } public func Login_PhoneBannedEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[943]!, self._r[943]!, [_0]) + return formatWithArgumentRanges(self._s[945]!, self._r[945]!, [_0]) } - public var TwoStepAuth_EmailCodeExpired: String { return self._s[944]! } - public var Channel_Moderator_Title: String { return self._s[945]! } - public var InstantPage_AutoNightTheme: String { return self._s[947]! } + public var TwoStepAuth_EmailCodeExpired: String { return self._s[946]! } + public var Channel_Moderator_Title: String { return self._s[947]! } + public var InstantPage_AutoNightTheme: String { return self._s[949]! } public func PUSH_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[950]!, self._r[950]!, [_1]) + return formatWithArgumentRanges(self._s[952]!, self._r[952]!, [_1]) } - public var Passport_Scans_Upload: String { return self._s[951]! } - public var Undo_Undo: String { return self._s[953]! } - public var Contacts_AccessDeniedHelpON: String { return self._s[954]! } - public var TwoStepAuth_RemovePassword: String { return self._s[955]! } - public var Common_Delete: String { return self._s[956]! } - public var Contacts_AddPeopleNearby: String { return self._s[958]! } - public var Conversation_ContextMenuDelete: String { return self._s[959]! } - public var SocksProxySetup_Credentials: String { return self._s[960]! } - public var Appearance_EditTheme: String { return self._s[962]! } - public var ClearCache_StorageOtherApps: String { return self._s[963]! } - public var PasscodeSettings_AutoLock_Disabled: String { return self._s[964]! } - public var Wallet_Send_NetworkErrorText: String { return self._s[965]! } - public var AuthSessions_DevicesTitle: String { return self._s[967]! } - public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[969]! } - public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[970]! } - public var Passport_Language_id: String { return self._s[972]! } - public var WallpaperSearch_ColorTeal: String { return self._s[973]! } - public var ChannelIntro_Title: String { return self._s[974]! } + public var Passport_Scans_Upload: String { return self._s[953]! } + public var Undo_Undo: String { return self._s[955]! } + public var Contacts_AccessDeniedHelpON: String { return self._s[956]! } + public var TwoStepAuth_RemovePassword: String { return self._s[957]! } + public var Common_Delete: String { return self._s[958]! } + public var Contacts_AddPeopleNearby: String { return self._s[960]! } + public var Conversation_ContextMenuDelete: String { return self._s[961]! } + public var SocksProxySetup_Credentials: String { return self._s[962]! } + public var Appearance_EditTheme: String { return self._s[964]! } + public var ClearCache_StorageOtherApps: String { return self._s[965]! } + public var PasscodeSettings_AutoLock_Disabled: String { return self._s[967]! } + public var Wallet_Send_NetworkErrorText: String { return self._s[968]! } + public var AuthSessions_DevicesTitle: String { return self._s[970]! } + public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[972]! } + public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[973]! } + public var Passport_Language_id: String { return self._s[975]! } + public var WallpaperSearch_ColorTeal: String { return self._s[976]! } + public var ChannelIntro_Title: String { return self._s[977]! } public func Channel_AdminLog_MessageToggleSignaturesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[975]!, self._r[975]!, [_0]) + return formatWithArgumentRanges(self._s[978]!, self._r[978]!, [_0]) } - public var VoiceOver_Chat_OpenLinkHint: String { return self._s[977]! } - public var VoiceOver_Chat_Reply: String { return self._s[978]! } - public var ScheduledMessages_BotActionUnavailable: String { return self._s[979]! } - public var Channel_Info_Description: String { return self._s[980]! } - public var Stickers_FavoriteStickers: String { return self._s[981]! } - public var Channel_BanUser_PermissionAddMembers: String { return self._s[982]! } - public var Notifications_DisplayNamesOnLockScreen: String { return self._s[983]! } - public var ChatSearch_ResultsTooltip: String { return self._s[984]! } - public var Wallet_VoiceOver_Editing_ClearText: String { return self._s[985]! } - public var Calls_NoMissedCallsPlacehoder: String { return self._s[986]! } - public var Group_PublicLink_Placeholder: String { return self._s[987]! } - public var Notifications_ExceptionsDefaultSound: String { return self._s[988]! } + public var VoiceOver_Chat_OpenLinkHint: String { return self._s[980]! } + public var VoiceOver_Chat_Reply: String { return self._s[981]! } + public var ScheduledMessages_BotActionUnavailable: String { return self._s[982]! } + public var Channel_Info_Description: String { return self._s[983]! } + public var Stickers_FavoriteStickers: String { return self._s[984]! } + public var Channel_BanUser_PermissionAddMembers: String { return self._s[985]! } + public var Notifications_DisplayNamesOnLockScreen: String { return self._s[986]! } + public var ChatSearch_ResultsTooltip: String { return self._s[987]! } + public var Wallet_VoiceOver_Editing_ClearText: String { return self._s[988]! } + public var Calls_NoMissedCallsPlacehoder: String { return self._s[989]! } + public var Group_PublicLink_Placeholder: String { return self._s[990]! } + public var Notifications_ExceptionsDefaultSound: String { return self._s[991]! } public func PUSH_CHANNEL_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[989]!, self._r[989]!, [_1]) + return formatWithArgumentRanges(self._s[992]!, self._r[992]!, [_1]) } - public var TextFormat_Underline: String { return self._s[990]! } + public var TextFormat_Underline: String { return self._s[993]! } public func DialogList_SearchSubtitleFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[992]!, self._r[992]!, [_1, _2]) - } - public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[993]!, self._r[993]!, [_0]) - } - public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[994]! } - public func Channel_OwnershipTransfer_TransferCompleted(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[995]!, self._r[995]!, [_1, _2]) } - public var Wallet_Intro_ImportExisting: String { return self._s[996]! } - public var GroupPermission_Delete: String { return self._s[997]! } - public var Passport_Language_uk: String { return self._s[998]! } - public var StickerPack_HideStickers: String { return self._s[1000]! } - public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[1001]! } + public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[996]!, self._r[996]!, [_0]) + } + public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[997]! } + public func Channel_OwnershipTransfer_TransferCompleted(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[998]!, self._r[998]!, [_1, _2]) + } + public var Wallet_Intro_ImportExisting: String { return self._s[999]! } + public var GroupPermission_Delete: String { return self._s[1000]! } + public var Passport_Language_uk: String { return self._s[1001]! } + public var StickerPack_HideStickers: String { return self._s[1003]! } + public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[1004]! } public func PUSH_CHAT_MESSAGE_PHOTO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1002]!, self._r[1002]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1005]!, self._r[1005]!, [_1, _2]) } - public var Activity_UploadingVideoMessage: String { return self._s[1003]! } + public var Activity_UploadingVideoMessage: String { return self._s[1006]! } public func GroupPermission_ApplyAlertText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1004]!, self._r[1004]!, [_0]) + return formatWithArgumentRanges(self._s[1007]!, self._r[1007]!, [_0]) } - public var Channel_TitleInfo: String { return self._s[1005]! } - public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[1006]! } - public var Settings_CallSettings: String { return self._s[1007]! } - public var Camera_SquareMode: String { return self._s[1008]! } - public var Conversation_SendMessage_ScheduleMessage: String { return self._s[1009]! } - public var GroupInfo_SharedMediaNone: String { return self._s[1010]! } + public var Channel_TitleInfo: String { return self._s[1008]! } + public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[1009]! } + public var Settings_CallSettings: String { return self._s[1010]! } + public var Camera_SquareMode: String { return self._s[1011]! } + public var Conversation_SendMessage_ScheduleMessage: String { return self._s[1012]! } + public var GroupInfo_SharedMediaNone: String { return self._s[1013]! } public func PUSH_MESSAGE_VIDEO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1011]!, self._r[1011]!, [_1]) + return formatWithArgumentRanges(self._s[1014]!, self._r[1014]!, [_1]) } - public var Bot_GenericBotStatus: String { return self._s[1012]! } - public var Application_Update: String { return self._s[1014]! } - public var Month_ShortJanuary: String { return self._s[1015]! } - public var Contacts_PermissionsKeepDisabled: String { return self._s[1016]! } - public var Channel_AdminLog_BanReadMessages: String { return self._s[1017]! } - public var Settings_AppLanguage_Unofficial: String { return self._s[1018]! } - public var Passport_Address_Street2Placeholder: String { return self._s[1019]! } + public var Bot_GenericBotStatus: String { return self._s[1015]! } + public var Application_Update: String { return self._s[1017]! } + public var Month_ShortJanuary: String { return self._s[1018]! } + public var Contacts_PermissionsKeepDisabled: String { return self._s[1019]! } + public var Channel_AdminLog_BanReadMessages: String { return self._s[1020]! } + public var Settings_AppLanguage_Unofficial: String { return self._s[1021]! } + public var Passport_Address_Street2Placeholder: String { return self._s[1022]! } public func Map_LiveLocationShortHour(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1020]!, self._r[1020]!, [_0]) - } - public var NetworkUsageSettings_Cellular: String { return self._s[1021]! } - public var Appearance_PreviewOutgoingText: String { return self._s[1022]! } - public func StickerPackActionInfo_RemovedText(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1023]!, self._r[1023]!, [_0]) } - public var Notifications_PermissionsAllowInSettings: String { return self._s[1024]! } - public var AutoDownloadSettings_OnForAll: String { return self._s[1026]! } - public var Map_Directions: String { return self._s[1027]! } - public var Passport_FieldIdentityTranslationHelp: String { return self._s[1029]! } - public var Appearance_ThemeDay: String { return self._s[1030]! } - public var LogoutOptions_LogOut: String { return self._s[1031]! } - public var Group_PublicLink_Title: String { return self._s[1033]! } - public var Channel_AddBotErrorNoRights: String { return self._s[1034]! } - public var ChatList_Search_ShowLess: String { return self._s[1035]! } - public var Passport_Identity_AddPassport: String { return self._s[1036]! } - public var LocalGroup_ButtonTitle: String { return self._s[1037]! } - public var Stats_InteractionsTitle: String { return self._s[1038]! } - public var Call_Message: String { return self._s[1039]! } - public var PhotoEditor_ExposureTool: String { return self._s[1040]! } - public var Wallet_Receive_CommentInfo: String { return self._s[1042]! } - public var Passport_FieldOneOf_Delimeter: String { return self._s[1043]! } - public var Channel_AdminLog_CanBanUsers: String { return self._s[1045]! } - public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[1046]! } - public var Appearance_Preview: String { return self._s[1047]! } - public var Compose_ChannelMembers: String { return self._s[1048]! } - public var Conversation_DeleteManyMessages: String { return self._s[1049]! } - public var ReportPeer_ReasonOther_Title: String { return self._s[1050]! } - public var Checkout_ErrorProviderAccountTimeout: String { return self._s[1051]! } - public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[1052]! } - public var Channel_Stickers_CreateYourOwn: String { return self._s[1055]! } - public var Conversation_UpdateTelegram: String { return self._s[1056]! } - public var EditTheme_Create_TopInfo: String { return self._s[1057]! } + public var NetworkUsageSettings_Cellular: String { return self._s[1024]! } + public var Appearance_PreviewOutgoingText: String { return self._s[1025]! } + public func StickerPackActionInfo_RemovedText(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1026]!, self._r[1026]!, [_0]) + } + public var Notifications_PermissionsAllowInSettings: String { return self._s[1027]! } + public var AutoDownloadSettings_OnForAll: String { return self._s[1029]! } + public var Map_Directions: String { return self._s[1030]! } + public var Passport_FieldIdentityTranslationHelp: String { return self._s[1032]! } + public var Appearance_ThemeDay: String { return self._s[1033]! } + public var LogoutOptions_LogOut: String { return self._s[1034]! } + public var Group_PublicLink_Title: String { return self._s[1036]! } + public var Channel_AddBotErrorNoRights: String { return self._s[1037]! } + public var ChatList_Search_ShowLess: String { return self._s[1038]! } + public var Passport_Identity_AddPassport: String { return self._s[1039]! } + public var LocalGroup_ButtonTitle: String { return self._s[1040]! } + public var Stats_InteractionsTitle: String { return self._s[1041]! } + public var Call_Message: String { return self._s[1042]! } + public var PhotoEditor_ExposureTool: String { return self._s[1043]! } + public var Wallet_Receive_CommentInfo: String { return self._s[1045]! } + public var Passport_FieldOneOf_Delimeter: String { return self._s[1046]! } + public var Channel_AdminLog_CanBanUsers: String { return self._s[1048]! } + public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[1049]! } + public var Appearance_Preview: String { return self._s[1050]! } + public var Compose_ChannelMembers: String { return self._s[1051]! } + public var Conversation_DeleteManyMessages: String { return self._s[1052]! } + public var ReportPeer_ReasonOther_Title: String { return self._s[1053]! } + public var Checkout_ErrorProviderAccountTimeout: String { return self._s[1054]! } + public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[1055]! } + public var Channel_Stickers_CreateYourOwn: String { return self._s[1058]! } + public var Conversation_UpdateTelegram: String { return self._s[1059]! } + public var EditTheme_Create_TopInfo: String { return self._s[1060]! } public func Notification_PinnedPhotoMessage(_ _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 Wallet_WordCheck_Continue: String { return self._s[1059]! } - public var TwoFactorSetup_Hint_Action: String { return self._s[1060]! } - public var IntentsSettings_ResetAll: String { return self._s[1061]! } + public var Wallet_WordCheck_Continue: String { return self._s[1062]! } + public var TwoFactorSetup_Hint_Action: String { return self._s[1063]! } + public var IntentsSettings_ResetAll: String { return self._s[1064]! } public func PUSH_PINNED_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1062]!, self._r[1062]!, [_1]) + return formatWithArgumentRanges(self._s[1065]!, self._r[1065]!, [_1]) } - public var GroupInfo_Administrators_Title: String { return self._s[1063]! } - public var Privacy_Forwards_PreviewMessageText: String { return self._s[1064]! } + public var GroupInfo_Administrators_Title: String { return self._s[1066]! } + public var Privacy_Forwards_PreviewMessageText: String { return self._s[1067]! } public func PrivacySettings_LastSeenNobodyPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1065]!, self._r[1065]!, [_0]) + return formatWithArgumentRanges(self._s[1068]!, self._r[1068]!, [_0]) } - public var Tour_Title3: String { return self._s[1066]! } - public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[1067]! } - public var Clipboard_SendPhoto: String { return self._s[1071]! } - public var MediaPicker_Videos: String { return self._s[1072]! } - public var Passport_Email_Title: String { return self._s[1073]! } + public var Tour_Title3: String { return self._s[1069]! } + public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[1070]! } + public var Clipboard_SendPhoto: String { return self._s[1074]! } + public var MediaPicker_Videos: String { return self._s[1075]! } + public var Passport_Email_Title: String { return self._s[1076]! } public func PrivacySettings_LastSeenEverybodyMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1074]!, self._r[1074]!, [_0]) + return formatWithArgumentRanges(self._s[1077]!, self._r[1077]!, [_0]) } - public var StickerPacksSettings_Title: String { return self._s[1075]! } - public var Conversation_MessageDialogDelete: String { return self._s[1076]! } - public var Privacy_Calls_CustomHelp: String { return self._s[1078]! } - public var Message_Wallpaper: String { return self._s[1079]! } - public var MemberSearch_BotSection: String { return self._s[1080]! } - public var GroupInfo_SetSound: String { return self._s[1081]! } + public var StickerPacksSettings_Title: String { return self._s[1078]! } + public var Conversation_MessageDialogDelete: String { return self._s[1079]! } + public var Privacy_Calls_CustomHelp: String { return self._s[1081]! } + public var Message_Wallpaper: String { return self._s[1082]! } + public var MemberSearch_BotSection: String { return self._s[1083]! } + public var GroupInfo_SetSound: String { return self._s[1084]! } public func Time_TomorrowAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1082]!, self._r[1082]!, [_0]) + return formatWithArgumentRanges(self._s[1085]!, self._r[1085]!, [_0]) } - public var Core_ServiceUserStatus: String { return self._s[1083]! } - public var LiveLocationUpdated_JustNow: String { return self._s[1084]! } - public var Call_StatusFailed: String { return self._s[1085]! } - public var TwoFactorSetup_Email_Placeholder: String { return self._s[1086]! } - public var TwoStepAuth_SetupPasswordDescription: String { return self._s[1087]! } - public var TwoStepAuth_SetPassword: String { return self._s[1088]! } - public var Permissions_PeopleNearbyText_v0: String { return self._s[1089]! } + public var Core_ServiceUserStatus: String { return self._s[1086]! } + public var LiveLocationUpdated_JustNow: String { return self._s[1087]! } + public var Call_StatusFailed: String { return self._s[1088]! } + public var TwoFactorSetup_Email_Placeholder: String { return self._s[1089]! } + public var TwoStepAuth_SetupPasswordDescription: String { return self._s[1090]! } + public var TwoStepAuth_SetPassword: String { return self._s[1091]! } + public var Permissions_PeopleNearbyText_v0: String { return self._s[1092]! } public func SocksProxySetup_ProxyStatusPing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1091]!, self._r[1091]!, [_0]) + return formatWithArgumentRanges(self._s[1094]!, self._r[1094]!, [_0]) } - public var Calls_SubmitRating: String { return self._s[1092]! } - public var Map_NoPlacesNearby: String { return self._s[1093]! } - public var Profile_Username: String { return self._s[1094]! } - public var Bot_DescriptionTitle: String { return self._s[1095]! } - public var MaskStickerSettings_Title: String { return self._s[1096]! } - public var SharedMedia_CategoryOther: String { return self._s[1097]! } - public var GroupInfo_SetGroupPhoto: String { return self._s[1098]! } - public var Common_NotNow: String { return self._s[1099]! } - public var CallFeedback_IncludeLogsInfo: String { return self._s[1100]! } - public var Conversation_ShareMyPhoneNumber: String { return self._s[1101]! } - public var Map_Location: String { return self._s[1102]! } - public var Invitation_JoinGroup: String { return self._s[1103]! } - public var AutoDownloadSettings_Title: String { return self._s[1105]! } - public var Conversation_DiscardVoiceMessageDescription: String { return self._s[1106]! } - public var Channel_ErrorAddBlocked: String { return self._s[1107]! } - public var Conversation_UnblockUser: String { return self._s[1108]! } - public var EditTheme_Edit_TopInfo: String { return self._s[1109]! } - public var Watch_Bot_Restart: String { return self._s[1110]! } - public var TwoStepAuth_Title: String { return self._s[1111]! } - public var Channel_AdminLog_BanSendMessages: String { return self._s[1112]! } - public var Checkout_ShippingMethod: String { return self._s[1113]! } - public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[1114]! } + public var Calls_SubmitRating: String { return self._s[1095]! } + public var Map_NoPlacesNearby: String { return self._s[1096]! } + public var Profile_Username: String { return self._s[1097]! } + public var Bot_DescriptionTitle: String { return self._s[1098]! } + public var MaskStickerSettings_Title: String { return self._s[1099]! } + public var SharedMedia_CategoryOther: String { return self._s[1100]! } + public var GroupInfo_SetGroupPhoto: String { return self._s[1101]! } + public var Common_NotNow: String { return self._s[1102]! } + public var CallFeedback_IncludeLogsInfo: String { return self._s[1103]! } + public var Conversation_ShareMyPhoneNumber: String { return self._s[1104]! } + public var Map_Location: String { return self._s[1105]! } + public var Invitation_JoinGroup: String { return self._s[1106]! } + public var AutoDownloadSettings_Title: String { return self._s[1108]! } + public var Conversation_DiscardVoiceMessageDescription: String { return self._s[1109]! } + public var Channel_ErrorAddBlocked: String { return self._s[1110]! } + public var Conversation_UnblockUser: String { return self._s[1111]! } + public var EditTheme_Edit_TopInfo: String { return self._s[1112]! } + public var Watch_Bot_Restart: String { return self._s[1113]! } + public var TwoStepAuth_Title: String { return self._s[1114]! } + public var Channel_AdminLog_BanSendMessages: String { return self._s[1115]! } + public var Checkout_ShippingMethod: String { return self._s[1116]! } + public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[1117]! } public func PUSH_CHAT_MESSAGE_STICKER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1115]!, self._r[1115]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1118]!, self._r[1118]!, [_1, _2, _3]) } - public var PeerInfo_ButtonDiscuss: String { return self._s[1116]! } - public var EditTheme_ChangeColors: String { return self._s[1118]! } + public var PeerInfo_ButtonDiscuss: String { return self._s[1119]! } + public var EditTheme_ChangeColors: String { return self._s[1121]! } public func Chat_UnsendMyMessagesAlertTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1119]!, self._r[1119]!, [_0]) + return formatWithArgumentRanges(self._s[1122]!, self._r[1122]!, [_0]) } public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1120]!, self._r[1120]!, [_0]) + return formatWithArgumentRanges(self._s[1123]!, self._r[1123]!, [_0]) } - public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[1121]! } - public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[1122]! } - public var AuthSessions_TerminateOtherSessions: String { return self._s[1123]! } - public var Contacts_FailedToSendInvitesMessage: String { return self._s[1124]! } - public var PrivacySettings_TwoStepAuth: String { return self._s[1125]! } - public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[1126]! } - public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[1127]! } - public var Conversation_EditingMessagePanelMedia: String { return self._s[1128]! } - public var Checkout_PaymentMethod_Title: String { return self._s[1129]! } - public var SocksProxySetup_Connection: String { return self._s[1130]! } - public var Group_MessagePhotoRemoved: String { return self._s[1131]! } - public var PeopleNearby_MakeInvisible: String { return self._s[1133]! } - public var Channel_Stickers_NotFound: String { return self._s[1135]! } - public var Group_About_Help: String { return self._s[1136]! } - public var Notification_PassportValueProofOfIdentity: String { return self._s[1137]! } - public var PeopleNearby_Title: String { return self._s[1139]! } + public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[1124]! } + public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[1126]! } + public var AuthSessions_TerminateOtherSessions: String { return self._s[1127]! } + public var Contacts_FailedToSendInvitesMessage: String { return self._s[1128]! } + public var PrivacySettings_TwoStepAuth: String { return self._s[1129]! } + public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[1130]! } + public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[1131]! } + public var Conversation_EditingMessagePanelMedia: String { return self._s[1132]! } + public var Checkout_PaymentMethod_Title: String { return self._s[1133]! } + public var SocksProxySetup_Connection: String { return self._s[1134]! } + public var Group_MessagePhotoRemoved: String { return self._s[1135]! } + public var PeopleNearby_MakeInvisible: String { return self._s[1137]! } + public var Channel_Stickers_NotFound: String { return self._s[1139]! } + public var Group_About_Help: String { return self._s[1140]! } + public var Notification_PassportValueProofOfIdentity: String { return self._s[1141]! } + public var PeopleNearby_Title: String { return self._s[1143]! } public func ApplyLanguage_ChangeLanguageOfficialText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1140]!, self._r[1140]!, [_1]) + return formatWithArgumentRanges(self._s[1144]!, self._r[1144]!, [_1]) } - public var Map_Home: String { return self._s[1141]! } - public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[1143]! } - public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[1144]! } - public var SocksProxySetup_Password: String { return self._s[1145]! } - public var Notifications_PermissionsEnable: String { return self._s[1146]! } - public var TwoStepAuth_ChangeEmail: String { return self._s[1148]! } + public var Map_Home: String { return self._s[1145]! } + public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[1147]! } + public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[1148]! } + public var SocksProxySetup_Password: String { return self._s[1149]! } + public var Notifications_PermissionsEnable: String { return self._s[1150]! } + public var TwoStepAuth_ChangeEmail: String { return self._s[1152]! } public func Channel_AdminLog_MessageInvitedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1149]!, self._r[1149]!, [_1]) + return formatWithArgumentRanges(self._s[1153]!, self._r[1153]!, [_1]) } public func Time_MonthOfYear_m10(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1151]!, self._r[1151]!, [_0]) + return formatWithArgumentRanges(self._s[1155]!, self._r[1155]!, [_0]) } - public var Passport_Identity_TypeDriversLicense: String { return self._s[1152]! } - public var ArchivedPacksAlert_Title: String { return self._s[1153]! } - public var Wallet_Receive_InvoiceUrlCopied: String { return self._s[1154]! } - public var Map_PlacesNearby: String { return self._s[1155]! } + public var Passport_Identity_TypeDriversLicense: String { return self._s[1156]! } + public var ArchivedPacksAlert_Title: String { return self._s[1157]! } + public var Wallet_Receive_InvoiceUrlCopied: String { return self._s[1158]! } + public var Map_PlacesNearby: String { return self._s[1159]! } public func Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1156]!, self._r[1156]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1160]!, self._r[1160]!, [_1, _2, _3]) } - public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1157]! } - public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1159]! } - public var Conversation_StatusTyping: String { return self._s[1160]! } - public var Broadcast_AdminLog_EmptyText: String { return self._s[1161]! } - public var Notification_PassportValueProofOfAddress: String { return self._s[1162]! } - public var UserInfo_CreateNewContact: String { return self._s[1163]! } - public var Passport_Identity_FrontSide: String { return self._s[1164]! } - public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1165]! } - public var Calls_CallTabTitle: String { return self._s[1166]! } - public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1167]! } + public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1161]! } + public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1163]! } + public var Conversation_StatusTyping: String { return self._s[1164]! } + public var Broadcast_AdminLog_EmptyText: String { return self._s[1165]! } + public var Notification_PassportValueProofOfAddress: String { return self._s[1166]! } + public var UserInfo_CreateNewContact: String { return self._s[1167]! } + public var Passport_Identity_FrontSide: String { return self._s[1168]! } + public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1169]! } + public var Calls_CallTabTitle: String { return self._s[1170]! } + public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1171]! } public func Login_BannedPhoneBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1169]!, self._r[1169]!, [_0]) + return formatWithArgumentRanges(self._s[1173]!, self._r[1173]!, [_0]) } - public var Watch_UserInfo_MuteTitle: String { return self._s[1170]! } - public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1171]! } - public var SharedMedia_EmptyMusicText: String { return self._s[1172]! } - public var Wallet_Completed_Text: String { return self._s[1173]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1174]! } - public var Paint_Stickers: String { return self._s[1175]! } - public var Privacy_GroupsAndChannels: String { return self._s[1176]! } - public var ChatList_Context_Delete: String { return self._s[1178]! } - public var UserInfo_AddContact: String { return self._s[1179]! } + public var Watch_UserInfo_MuteTitle: String { return self._s[1174]! } + public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1175]! } + public var SharedMedia_EmptyMusicText: String { return self._s[1176]! } + public var Wallet_Completed_Text: String { return self._s[1177]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1178]! } + public var Paint_Stickers: String { return self._s[1179]! } + public var Privacy_GroupsAndChannels: String { return self._s[1180]! } + public var ChatList_Context_Delete: String { return self._s[1182]! } + public var UserInfo_AddContact: String { return self._s[1183]! } public func Conversation_MessageViaUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1180]!, self._r[1180]!, [_0]) - } - public var PhoneNumberHelp_ChangeNumber: String { return self._s[1182]! } - public func ChatList_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1184]!, self._r[1184]!, [_0]) } - public var DialogList_NoMessagesTitle: String { return self._s[1185]! } - public var EditProfile_NameAndPhotoHelp: String { return self._s[1186]! } - public var BlockedUsers_BlockUser: String { return self._s[1187]! } - public var Notifications_PermissionsOpenSettings: String { return self._s[1188]! } - public var MediaPicker_UngroupDescription: String { return self._s[1190]! } - public var Watch_NoConnection: String { return self._s[1191]! } - public var Month_GenSeptember: String { return self._s[1192]! } - public var Conversation_ViewGroup: String { return self._s[1194]! } - public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1197]! } - public var Privacy_Forwards_AlwaysLink: String { return self._s[1198]! } - public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1199]! } - public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1200]! } - public var Wallet_WordCheck_IncorrectHeader: String { return self._s[1201]! } - public var MediaPicker_CameraRoll: String { return self._s[1203]! } - public var Month_GenAugust: String { return self._s[1204]! } - public var Wallet_Configuration_SourceHeader: String { return self._s[1205]! } - public var AccessDenied_VideoMessageMicrophone: String { return self._s[1206]! } - public var SharedMedia_EmptyText: String { return self._s[1207]! } - public var Map_ShareLiveLocation: String { return self._s[1208]! } - public var Calls_All: String { return self._s[1209]! } - public var Map_SendThisPlace: String { return self._s[1211]! } - public var Appearance_ThemeNight: String { return self._s[1213]! } - public var Conversation_HoldForAudio: String { return self._s[1214]! } - public var SettingsSearch_Synonyms_Support: String { return self._s[1217]! } - public var GroupInfo_GroupHistoryHidden: String { return self._s[1218]! } - public var SocksProxySetup_Secret: String { return self._s[1219]! } + public var PhoneNumberHelp_ChangeNumber: String { return self._s[1186]! } + public func ChatList_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1188]!, self._r[1188]!, [_0]) + } + public var DialogList_NoMessagesTitle: String { return self._s[1189]! } + public var EditProfile_NameAndPhotoHelp: String { return self._s[1190]! } + public var BlockedUsers_BlockUser: String { return self._s[1191]! } + public var Notifications_PermissionsOpenSettings: String { return self._s[1192]! } + public var MediaPicker_UngroupDescription: String { return self._s[1194]! } + public var Watch_NoConnection: String { return self._s[1195]! } + public var Month_GenSeptember: String { return self._s[1196]! } + public var Conversation_ViewGroup: String { return self._s[1198]! } + public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1201]! } + public var Privacy_Forwards_AlwaysLink: String { return self._s[1202]! } + public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1203]! } + public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1204]! } + public var Wallet_WordCheck_IncorrectHeader: String { return self._s[1205]! } + public var MediaPicker_CameraRoll: String { return self._s[1207]! } + public var Month_GenAugust: String { return self._s[1208]! } + public var Wallet_Configuration_SourceHeader: String { return self._s[1209]! } + public var AccessDenied_VideoMessageMicrophone: String { return self._s[1210]! } + public var SharedMedia_EmptyText: String { return self._s[1211]! } + public var Map_ShareLiveLocation: String { return self._s[1212]! } + public var Calls_All: String { return self._s[1213]! } + public var Map_SendThisPlace: String { return self._s[1215]! } + public var Appearance_ThemeNight: String { return self._s[1217]! } + public var Conversation_HoldForAudio: String { return self._s[1218]! } + public var SettingsSearch_Synonyms_Support: String { return self._s[1221]! } + public var GroupInfo_GroupHistoryHidden: String { return self._s[1222]! } + public var SocksProxySetup_Secret: String { return self._s[1223]! } public func Activity_RemindAboutChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1220]!, self._r[1220]!, [_0]) + return formatWithArgumentRanges(self._s[1224]!, self._r[1224]!, [_0]) } - public var Channel_BanList_RestrictedTitle: String { return self._s[1222]! } - public var Conversation_Location: String { return self._s[1223]! } + public var Channel_BanList_RestrictedTitle: String { return self._s[1226]! } + public var Conversation_Location: String { return self._s[1227]! } public func AutoDownloadSettings_UpToFor(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1224]!, self._r[1224]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1228]!, self._r[1228]!, [_1, _2]) } - public var ChatSettings_AutoDownloadPhotos: String { return self._s[1226]! } - public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1227]! } - public var Notifications_PermissionsText: String { return self._s[1228]! } - public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1229]! } - public var Call_Flip: String { return self._s[1230]! } - public var Channel_AdminLog_CanDeleteMessagesOfOthers: String { return self._s[1232]! } - public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1233]! } - public var Wallet_TransactionInfo_StorageFeeInfoUrl: String { return self._s[1234]! } - public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[1235]! } - public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1237]! } - public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1239]! } - public var Channel_TooMuchBots: String { return self._s[1241]! } - public var Passport_DeletePassportConfirmation: String { return self._s[1242]! } - public var Login_InvalidCodeError: String { return self._s[1243]! } - public var StickerPacksSettings_FeaturedPacks: String { return self._s[1244]! } + public var ChatSettings_AutoDownloadPhotos: String { return self._s[1230]! } + public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1231]! } + public var Notifications_PermissionsText: String { return self._s[1232]! } + public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1233]! } + public var Call_Flip: String { return self._s[1234]! } + public var Channel_AdminLog_CanDeleteMessagesOfOthers: String { return self._s[1236]! } + public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1237]! } + public var Wallet_TransactionInfo_StorageFeeInfoUrl: String { return self._s[1238]! } + public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[1239]! } + public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1241]! } + public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1243]! } + public var Channel_TooMuchBots: String { return self._s[1245]! } + public var Passport_DeletePassportConfirmation: String { return self._s[1246]! } + public var Login_InvalidCodeError: String { return self._s[1247]! } + public var StickerPacksSettings_FeaturedPacks: String { return self._s[1248]! } public func ChatList_DeleteSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1245]!, self._r[1245]!, [_0]) + return formatWithArgumentRanges(self._s[1249]!, self._r[1249]!, [_0]) } public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1246]!, self._r[1246]!, [_0]) + return formatWithArgumentRanges(self._s[1250]!, self._r[1250]!, [_0]) } - public var VoiceOver_Navigation_ProxySettings: String { return self._s[1247]! } - public var Call_CallInProgressTitle: String { return self._s[1248]! } - public var Month_ShortSeptember: String { return self._s[1249]! } - public var Watch_ChannelInfo_Title: String { return self._s[1250]! } - public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1253]! } - public var DialogList_PasscodeLockHelp: String { return self._s[1254]! } - public var Chat_MultipleTextMessagesDisabled: String { return self._s[1255]! } - public var Wallet_Receive_Title: String { return self._s[1256]! } - public var Notifications_Badge_IncludePublicGroups: String { return self._s[1257]! } - public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1258]! } - public var PhotoEditor_CropReset: String { return self._s[1259]! } - public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1261]! } - public var Channel_Management_LabelEditor: String { return self._s[1262]! } - public var Passport_Identity_LatinNameHelp: String { return self._s[1264]! } - public var PhotoEditor_HighlightsTool: String { return self._s[1265]! } - public var Wallet_Info_WalletCreated: String { return self._s[1266]! } - public var UserInfo_Title: String { return self._s[1267]! } - public var ChatList_HideAction: String { return self._s[1268]! } - public var AccessDenied_Title: String { return self._s[1269]! } - public var DialogList_SearchLabel: String { return self._s[1270]! } - public var Group_Setup_HistoryHidden: String { return self._s[1271]! } - public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1272]! } - public var State_Updating: String { return self._s[1274]! } - public var Contacts_TabTitle: String { return self._s[1275]! } - public var Notifications_Badge_CountUnreadMessages: String { return self._s[1277]! } - public var GroupInfo_GroupHistory: String { return self._s[1278]! } - public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1279]! } - public var Wallpaper_SetColor: String { return self._s[1280]! } - public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1281]! } - public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1282]! } - public var Chat_AttachmentLimitReached: String { return self._s[1283]! } - public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1284]! } - public var Contacts_NotRegisteredSection: String { return self._s[1285]! } + public var VoiceOver_Navigation_ProxySettings: String { return self._s[1251]! } + public var Call_CallInProgressTitle: String { return self._s[1252]! } + public var Month_ShortSeptember: String { return self._s[1253]! } + public var Watch_ChannelInfo_Title: String { return self._s[1254]! } + public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1257]! } + public var DialogList_PasscodeLockHelp: String { return self._s[1258]! } + public var Chat_MultipleTextMessagesDisabled: String { return self._s[1259]! } + public var Wallet_Receive_Title: String { return self._s[1260]! } + public var Notifications_Badge_IncludePublicGroups: String { return self._s[1261]! } + public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1262]! } + public var PhotoEditor_CropReset: String { return self._s[1263]! } + public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1265]! } + public var Channel_Management_LabelEditor: String { return self._s[1266]! } + public var Passport_Identity_LatinNameHelp: String { return self._s[1268]! } + public var PhotoEditor_HighlightsTool: String { return self._s[1269]! } + public var Wallet_Info_WalletCreated: String { return self._s[1270]! } + public var UserInfo_Title: String { return self._s[1271]! } + public var ChatList_HideAction: String { return self._s[1272]! } + public var AccessDenied_Title: String { return self._s[1273]! } + public var DialogList_SearchLabel: String { return self._s[1274]! } + public var Group_Setup_HistoryHidden: String { return self._s[1275]! } + public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1276]! } + public var State_Updating: String { return self._s[1278]! } + public var Contacts_TabTitle: String { return self._s[1279]! } + public var Notifications_Badge_CountUnreadMessages: String { return self._s[1281]! } + public var GroupInfo_GroupHistory: String { return self._s[1282]! } + public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1283]! } + public var Wallpaper_SetColor: String { return self._s[1284]! } + public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1285]! } + public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1286]! } + public var Chat_AttachmentLimitReached: String { return self._s[1287]! } + public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1288]! } + public var Contacts_NotRegisteredSection: String { return self._s[1289]! } public func Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1286]!, self._r[1286]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1290]!, self._r[1290]!, [_1, _2, _3]) } - public var Paint_Clear: String { return self._s[1287]! } - public var StickerPacksSettings_ArchivedMasks: String { return self._s[1288]! } - public var SocksProxySetup_Connecting: String { return self._s[1289]! } - public var ExplicitContent_AlertChannel: String { return self._s[1290]! } - public var CreatePoll_AllOptionsAdded: String { return self._s[1291]! } - public var Conversation_Contact: String { return self._s[1292]! } - public var Login_CodeExpired: String { return self._s[1293]! } - public var Passport_DiscardMessageAction: String { return self._s[1294]! } - public var ChatList_Context_Unpin: String { return self._s[1295]! } - public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1296]! } + public var Paint_Clear: String { return self._s[1291]! } + public var StickerPacksSettings_ArchivedMasks: String { return self._s[1292]! } + public var SocksProxySetup_Connecting: String { return self._s[1293]! } + public var ExplicitContent_AlertChannel: String { return self._s[1294]! } + public var CreatePoll_AllOptionsAdded: String { return self._s[1295]! } + public var Conversation_Contact: String { return self._s[1296]! } + public var Login_CodeExpired: String { return self._s[1297]! } + public var Passport_DiscardMessageAction: String { return self._s[1298]! } + public var ChatList_Context_Unpin: String { return self._s[1299]! } + public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1300]! } public func VoiceOver_Chat_MusicFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1297]!, self._r[1297]!, [_0]) + return formatWithArgumentRanges(self._s[1301]!, self._r[1301]!, [_0]) } - public var Channel_AdminLog_EmptyMessageText: String { return self._s[1298]! } - public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1299]! } + public var Channel_AdminLog_EmptyMessageText: String { return self._s[1302]! } + public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1303]! } public func Group_EditAdmin_RankInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1300]!, self._r[1300]!, [_0]) + return formatWithArgumentRanges(self._s[1304]!, self._r[1304]!, [_0]) } - public var Month_ShortApril: String { return self._s[1301]! } - public var AuthSessions_CurrentSession: String { return self._s[1302]! } - public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1305]! } - public var Wallet_Navigation_Cancel: String { return self._s[1307]! } - public var WallpaperPreview_CropTopText: String { return self._s[1308]! } - public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1309]! } - public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1310]! } + public var Month_ShortApril: String { return self._s[1305]! } + public var AuthSessions_CurrentSession: String { return self._s[1306]! } + public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1309]! } + public var Wallet_Navigation_Cancel: String { return self._s[1311]! } + public var WallpaperPreview_CropTopText: String { return self._s[1312]! } + public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1313]! } + public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1314]! } public func Conversation_ScheduleMessage_SendOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1311]!, self._r[1311]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1315]!, self._r[1315]!, [_0, _1]) } - public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1312]! } - public var Channel_Setup_TypePrivate: String { return self._s[1314]! } - public var Forward_ChannelReadOnly: String { return self._s[1317]! } - public var PhotoEditor_CurvesBlue: String { return self._s[1318]! } - public var AddContact_SharedContactException: String { return self._s[1319]! } - public var UserInfo_BotPrivacy: String { return self._s[1321]! } - public var Wallet_CreateInvoice_Title: String { return self._s[1322]! } - public var Notification_PassportValueEmail: String { return self._s[1323]! } - public var EmptyGroupInfo_Subtitle: String { return self._s[1324]! } - public var GroupPermission_NewTitle: String { return self._s[1325]! } - public var CallFeedback_ReasonDropped: String { return self._s[1326]! } - public var GroupInfo_Permissions_AddException: String { return self._s[1327]! } - public var Channel_SignMessages_Help: String { return self._s[1329]! } - public var Undo_ChatDeleted: String { return self._s[1331]! } - public var Conversation_ChatBackground: String { return self._s[1332]! } + public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1316]! } + public var Channel_Setup_TypePrivate: String { return self._s[1318]! } + public var Forward_ChannelReadOnly: String { return self._s[1321]! } + public var PhotoEditor_CurvesBlue: String { return self._s[1322]! } + public var AddContact_SharedContactException: String { return self._s[1323]! } + public var UserInfo_BotPrivacy: String { return self._s[1325]! } + public var Wallet_CreateInvoice_Title: String { return self._s[1326]! } + public var Notification_PassportValueEmail: String { return self._s[1327]! } + public var EmptyGroupInfo_Subtitle: String { return self._s[1328]! } + public var GroupPermission_NewTitle: String { return self._s[1329]! } + public var CallFeedback_ReasonDropped: String { return self._s[1330]! } + public var GroupInfo_Permissions_AddException: String { return self._s[1331]! } + public var Channel_SignMessages_Help: String { return self._s[1333]! } + public var Undo_ChatDeleted: String { return self._s[1335]! } + public var Conversation_ChatBackground: String { return self._s[1336]! } public func Wallet_WordCheck_Text(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1333]!, self._r[1333]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1337]!, self._r[1337]!, [_1, _2, _3]) } public func PUSH_CHAT_MESSAGE_QUIZ(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1334]!, self._r[1334]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1338]!, self._r[1338]!, [_1, _2, _3]) } - public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1335]! } - public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1336]! } - public var Passport_Language_pt: String { return self._s[1337]! } - public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1338]! } - public var NotificationsSound_Popcorn: String { return self._s[1341]! } - public var AutoNightTheme_Disabled: String { return self._s[1342]! } - public var BlockedUsers_LeavePrefix: String { return self._s[1343]! } - public var WallpaperPreview_CustomColorTopText: String { return self._s[1344]! } - public var Contacts_PermissionsSuppressWarningText: String { return self._s[1345]! } - public var WallpaperSearch_ColorBlue: String { return self._s[1346]! } + public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1339]! } + public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1340]! } + public var Passport_Language_pt: String { return self._s[1341]! } + public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1342]! } + public var NotificationsSound_Popcorn: String { return self._s[1345]! } + public var AutoNightTheme_Disabled: String { return self._s[1346]! } + public var BlockedUsers_LeavePrefix: String { return self._s[1347]! } + public var WallpaperPreview_CustomColorTopText: String { return self._s[1348]! } + public var Contacts_PermissionsSuppressWarningText: String { return self._s[1349]! } + public var WallpaperSearch_ColorBlue: String { return self._s[1350]! } public func CancelResetAccount_TextSMS(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1347]!, self._r[1347]!, [_0]) + return formatWithArgumentRanges(self._s[1351]!, self._r[1351]!, [_0]) } - public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1348]! } - public var SocksProxySetup_UseForCalls: String { return self._s[1349]! } - public var Passport_DeleteDocumentConfirmation: String { return self._s[1351]! } - public var PeerInfo_PaneGroups: String { return self._s[1352]! } + public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1352]! } + public var SocksProxySetup_UseForCalls: String { return self._s[1353]! } + public var Passport_DeleteDocumentConfirmation: String { return self._s[1355]! } + public var PeerInfo_PaneGroups: String { return self._s[1356]! } public func Conversation_Megabytes(_ _0: Float) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1353]!, self._r[1353]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1357]!, self._r[1357]!, ["\(_0)"]) } - public var SocksProxySetup_Hostname: String { return self._s[1356]! } - public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1357]! } - public var Compose_NewEncryptedChat: String { return self._s[1358]! } - public var Login_CodeFloodError: String { return self._s[1359]! } - public var Calls_TabTitle: String { return self._s[1360]! } - public var Privacy_ProfilePhoto: String { return self._s[1361]! } - public var Passport_Language_he: String { return self._s[1362]! } + public var SocksProxySetup_Hostname: String { return self._s[1360]! } + public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1361]! } + public var Compose_NewEncryptedChat: String { return self._s[1362]! } + public var Login_CodeFloodError: String { return self._s[1363]! } + public var Calls_TabTitle: String { return self._s[1364]! } + public var Privacy_ProfilePhoto: String { return self._s[1365]! } + public var Passport_Language_he: String { return self._s[1366]! } public func Conversation_SetReminder_RemindToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1363]!, self._r[1363]!, [_0]) + return formatWithArgumentRanges(self._s[1367]!, self._r[1367]!, [_0]) } - public var GroupPermission_Title: String { return self._s[1364]! } + public var GroupPermission_Title: String { return self._s[1368]! } public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1365]!, self._r[1365]!, [_0]) + return formatWithArgumentRanges(self._s[1369]!, self._r[1369]!, [_0]) } - public var Wallet_TransactionInfo_SenderHeader: String { return self._s[1366]! } - public var GroupPermission_NoChangeInfo: String { return self._s[1367]! } - public var ChatList_DeleteForCurrentUser: String { return self._s[1368]! } - public var Tour_Text1: String { return self._s[1369]! } - public var Channel_EditAdmin_TransferOwnership: String { return self._s[1370]! } - public var Month_ShortFebruary: String { return self._s[1371]! } - public var TwoStepAuth_EmailSkip: String { return self._s[1372]! } + public var Wallet_TransactionInfo_SenderHeader: String { return self._s[1370]! } + public var GroupPermission_NoChangeInfo: String { return self._s[1371]! } + public var ChatList_DeleteForCurrentUser: String { return self._s[1372]! } + public var Tour_Text1: String { return self._s[1373]! } + public var Channel_EditAdmin_TransferOwnership: String { return self._s[1374]! } + public var Month_ShortFebruary: String { return self._s[1375]! } + public var TwoStepAuth_EmailSkip: String { return self._s[1376]! } public func Wallet_Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1373]!, self._r[1373]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1377]!, self._r[1377]!, [_1, _2, _3]) } - public var Stats_LanguagesTitle: String { return self._s[1374]! } - public var NotificationsSound_Glass: String { return self._s[1375]! } - public var Appearance_ThemeNightBlue: String { return self._s[1376]! } - public var CheckoutInfo_Pay: String { return self._s[1377]! } - public var PeerInfo_ButtonLeave: String { return self._s[1379]! } - public var Invite_LargeRecipientsCountWarning: String { return self._s[1380]! } - public var Call_CallAgain: String { return self._s[1382]! } - public var AttachmentMenu_SendAsFile: String { return self._s[1383]! } - public var AccessDenied_MicrophoneRestricted: String { return self._s[1384]! } - public var Passport_InvalidPasswordError: String { return self._s[1385]! } - public var Watch_Message_Game: String { return self._s[1386]! } - public var Stickers_Install: String { return self._s[1387]! } - public var VoiceOver_Chat_Message: String { return self._s[1388]! } - public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1389]! } - public var Passport_Identity_ResidenceCountry: String { return self._s[1391]! } - public var Notifications_GroupNotificationsHelp: String { return self._s[1392]! } - public var AuthSessions_OtherSessions: String { return self._s[1393]! } - public var Channel_Username_Help: String { return self._s[1394]! } - public var Camera_Title: String { return self._s[1395]! } - public var IntentsSettings_Title: String { return self._s[1396]! } - public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1398]! } - public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1399]! } - public var Channel_AdminLog_SendPolls: String { return self._s[1400]! } - public var Channel_AdminLog_TitleAllEvents: String { return self._s[1401]! } - public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1402]! } - public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1403]! } - public var ScheduledMessages_DeleteMany: String { return self._s[1404]! } - public var Conversation_RestrictedStickers: String { return self._s[1405]! } - public var Notifications_ExceptionsResetToDefaults: String { return self._s[1407]! } - public var UserInfo_TelegramCall: String { return self._s[1409]! } - public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1410]! } - public var CreatePoll_OptionsHeader: String { return self._s[1411]! } - public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1412]! } - public var ArchivedChats_IntroTitle1: String { return self._s[1413]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1414]! } - public var Theme_Colors_Proceed: String { return self._s[1415]! } - public var Passport_Identity_EditPersonalDetails: String { return self._s[1416]! } + public var Stats_LanguagesTitle: String { return self._s[1378]! } + public var NotificationsSound_Glass: String { return self._s[1379]! } + public var Appearance_ThemeNightBlue: String { return self._s[1380]! } + public var CheckoutInfo_Pay: String { return self._s[1381]! } + public var PeerInfo_ButtonLeave: String { return self._s[1383]! } + public var Invite_LargeRecipientsCountWarning: String { return self._s[1384]! } + public var Call_CallAgain: String { return self._s[1386]! } + public var AttachmentMenu_SendAsFile: String { return self._s[1387]! } + public var AccessDenied_MicrophoneRestricted: String { return self._s[1388]! } + public var Passport_InvalidPasswordError: String { return self._s[1389]! } + public var Watch_Message_Game: String { return self._s[1390]! } + public var Stickers_Install: String { return self._s[1391]! } + public var VoiceOver_Chat_Message: String { return self._s[1392]! } + public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1393]! } + public var Passport_Identity_ResidenceCountry: String { return self._s[1395]! } + public var Notifications_GroupNotificationsHelp: String { return self._s[1396]! } + public var AuthSessions_OtherSessions: String { return self._s[1397]! } + public var Channel_Username_Help: String { return self._s[1398]! } + public var Camera_Title: String { return self._s[1399]! } + public var IntentsSettings_Title: String { return self._s[1400]! } + public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1402]! } + public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1403]! } + public var Channel_AdminLog_SendPolls: String { return self._s[1404]! } + public var Channel_AdminLog_TitleAllEvents: String { return self._s[1405]! } + public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1406]! } + public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1407]! } + public var ScheduledMessages_DeleteMany: String { return self._s[1408]! } + public var Conversation_RestrictedStickers: String { return self._s[1409]! } + public var Notifications_ExceptionsResetToDefaults: String { return self._s[1411]! } + public var UserInfo_TelegramCall: String { return self._s[1413]! } + public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1414]! } + public var CreatePoll_OptionsHeader: String { return self._s[1415]! } + public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1416]! } + public var ArchivedChats_IntroTitle1: String { return self._s[1417]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1418]! } + public var Theme_Colors_Proceed: String { return self._s[1419]! } + public var Passport_Identity_EditPersonalDetails: String { return self._s[1420]! } public func Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1417]!, self._r[1417]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1421]!, self._r[1421]!, [_1, _2, _3]) } - public var Wallet_Month_GenAugust: String { return self._s[1418]! } - public var Settings_SaveEditedPhotos: String { return self._s[1419]! } - public var Stats_FollowersBySourceTitle: String { return self._s[1420]! } - public var TwoStepAuth_ConfirmationTitle: String { return self._s[1421]! } - public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1422]! } - public var Conversation_MessageDialogRetry: String { return self._s[1423]! } - public var ChatList_Context_MarkAsUnread: String { return self._s[1424]! } - public var MessagePoll_SubmitVote: String { return self._s[1425]! } - public var Conversation_DiscardVoiceMessageAction: String { return self._s[1426]! } - public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1427]! } - public var Group_Setup_TypeHeader: String { return self._s[1428]! } - public var Paint_RecentStickers: String { return self._s[1429]! } - public var PhotoEditor_GrainTool: String { return self._s[1430]! } - public var CheckoutInfo_ShippingInfoState: String { return self._s[1431]! } - public var EmptyGroupInfo_Line4: String { return self._s[1432]! } - public var Watch_AuthRequired: String { return self._s[1434]! } + public var Wallet_Month_GenAugust: String { return self._s[1422]! } + public var Settings_SaveEditedPhotos: String { return self._s[1423]! } + public var Stats_FollowersBySourceTitle: String { return self._s[1424]! } + public var TwoStepAuth_ConfirmationTitle: String { return self._s[1425]! } + public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1426]! } + public var Conversation_MessageDialogRetry: String { return self._s[1427]! } + public var ChatList_Context_MarkAsUnread: String { return self._s[1428]! } + public var MessagePoll_SubmitVote: String { return self._s[1429]! } + public var Conversation_DiscardVoiceMessageAction: String { return self._s[1430]! } + public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1431]! } + public var Group_Setup_TypeHeader: String { return self._s[1432]! } + public var Paint_RecentStickers: String { return self._s[1433]! } + public var PhotoEditor_GrainTool: String { return self._s[1434]! } + public var CheckoutInfo_ShippingInfoState: String { return self._s[1435]! } + public var EmptyGroupInfo_Line4: String { return self._s[1436]! } + public var Watch_AuthRequired: String { return self._s[1438]! } public func Passport_Email_UseTelegramEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1435]!, self._r[1435]!, [_0]) + return formatWithArgumentRanges(self._s[1439]!, self._r[1439]!, [_0]) } - public var Conversation_EncryptedDescriptionTitle: String { return self._s[1436]! } - public var ChannelIntro_Text: String { return self._s[1437]! } - public var DialogList_DeleteBotConfirmation: String { return self._s[1438]! } - public var GroupPermission_NoSendMedia: String { return self._s[1439]! } - public var Calls_AddTab: String { return self._s[1440]! } - public var Message_ReplyActionButtonShowReceipt: String { return self._s[1441]! } - public var Channel_AdminLog_EmptyFilterText: String { return self._s[1442]! } - public var Conversation_WalletRequiredSetup: String { return self._s[1443]! } - public var Notification_MessageLifetime1d: String { return self._s[1444]! } - public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1445]! } - public var Channel_BanUser_PermissionsHeader: String { return self._s[1446]! } - public var Passport_Identity_GenderFemale: String { return self._s[1447]! } - public var BlockedUsers_BlockTitle: String { return self._s[1448]! } + public var Conversation_EncryptedDescriptionTitle: String { return self._s[1440]! } + public var ChannelIntro_Text: String { return self._s[1441]! } + public var DialogList_DeleteBotConfirmation: String { return self._s[1442]! } + public var GroupPermission_NoSendMedia: String { return self._s[1443]! } + public var Calls_AddTab: String { return self._s[1444]! } + public var Message_ReplyActionButtonShowReceipt: String { return self._s[1445]! } + public var Channel_AdminLog_EmptyFilterText: String { return self._s[1446]! } + public var Conversation_WalletRequiredSetup: String { return self._s[1447]! } + public var Notification_MessageLifetime1d: String { return self._s[1448]! } + public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1449]! } + public var Channel_BanUser_PermissionsHeader: String { return self._s[1450]! } + public var Passport_Identity_GenderFemale: String { return self._s[1451]! } + public var BlockedUsers_BlockTitle: String { return self._s[1452]! } public func PUSH_CHANNEL_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1449]!, self._r[1449]!, [_1]) + return formatWithArgumentRanges(self._s[1453]!, self._r[1453]!, [_1]) } - public var Weekday_Yesterday: String { return self._s[1450]! } - public var WallpaperSearch_ColorBlack: String { return self._s[1451]! } - public var Settings_Context_Logout: String { return self._s[1452]! } - public var Wallet_Info_UnknownTransaction: String { return self._s[1453]! } - public var ChatList_ArchiveAction: String { return self._s[1454]! } - public var AutoNightTheme_Scheduled: String { return self._s[1455]! } - public var TwoFactorSetup_Email_SkipAction: String { return self._s[1456]! } - public var Settings_Devices: String { return self._s[1457]! } - public var ContactInfo_Note: String { return self._s[1458]! } + public var Weekday_Yesterday: String { return self._s[1454]! } + public var WallpaperSearch_ColorBlack: String { return self._s[1455]! } + public var Settings_Context_Logout: String { return self._s[1456]! } + public var Wallet_Info_UnknownTransaction: String { return self._s[1457]! } + public var ChatList_ArchiveAction: String { return self._s[1458]! } + public var AutoNightTheme_Scheduled: String { return self._s[1459]! } + public var TwoFactorSetup_Email_SkipAction: String { return self._s[1460]! } + public var Settings_Devices: String { return self._s[1461]! } + public var ContactInfo_Note: String { return self._s[1462]! } public func Login_PhoneGenericEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1459]!, self._r[1459]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[1463]!, self._r[1463]!, [_1, _2, _3, _4, _5, _6]) } - public var EditTheme_ThemeTemplateAlertTitle: String { return self._s[1460]! } - public var Wallet_Receive_CreateInvoice: String { return self._s[1461]! } - public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1462]! } - public var Theme_Colors_ColorWallpaperWarningProceed: String { return self._s[1463]! } + public var EditTheme_ThemeTemplateAlertTitle: String { return self._s[1464]! } + public var Wallet_Receive_CreateInvoice: String { return self._s[1465]! } + public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1466]! } + public var Theme_Colors_ColorWallpaperWarningProceed: String { return self._s[1467]! } public func PUSH_CHAT_JOINED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1464]!, self._r[1464]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1468]!, self._r[1468]!, [_1, _2]) } - public var CreatePoll_Create: String { return self._s[1465]! } - public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1466]! } + public var CreatePoll_Create: String { return self._s[1469]! } + public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1470]! } public func Notification_CallFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1467]!, self._r[1467]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1471]!, self._r[1471]!, [_1, _2]) } - public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1468]! } - public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1469]! } - public var Notifications_InAppNotificationsSounds: String { return self._s[1471]! } + public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1472]! } + public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1473]! } + public var Notifications_InAppNotificationsSounds: String { return self._s[1475]! } public func PUSH_PINNED_GAME_SCORE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1472]!, self._r[1472]!, [_1]) + return formatWithArgumentRanges(self._s[1476]!, self._r[1476]!, [_1]) } - public var Preview_OpenInInstagram: String { return self._s[1473]! } - public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1474]! } + public var Preview_OpenInInstagram: String { return self._s[1477]! } + public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1478]! } public func PUSH_CHAT_ADD_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1475]!, self._r[1475]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1479]!, self._r[1479]!, [_1, _2, _3]) } public func Passport_PrivacyPolicy(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1476]!, self._r[1476]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1480]!, self._r[1480]!, [_1, _2]) } - public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1477]! } - public var ArchivedChats_IntroText3: String { return self._s[1478]! } - public var ChatList_UndoArchiveHiddenText: String { return self._s[1479]! } - public var NetworkUsageSettings_TotalSection: String { return self._s[1480]! } - public var Wallet_Month_GenSeptember: String { return self._s[1481]! } - public var Channel_Setup_TypePrivateHelp: String { return self._s[1482]! } + public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1481]! } + public var ArchivedChats_IntroText3: String { return self._s[1482]! } + public var ChatList_UndoArchiveHiddenText: String { return self._s[1483]! } + public var NetworkUsageSettings_TotalSection: String { return self._s[1484]! } + public var Wallet_Month_GenSeptember: String { return self._s[1485]! } + public var Channel_Setup_TypePrivateHelp: String { return self._s[1486]! } public func PUSH_CHAT_MESSAGE_POLL(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1483]!, self._r[1483]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1487]!, self._r[1487]!, [_1, _2, _3]) } - public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1485]! } - public var FastTwoStepSetup_HintSection: String { return self._s[1486]! } - public var Wallpaper_PhotoLibrary: String { return self._s[1487]! } - public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1488]! } - public var Gif_NoGifsFound: String { return self._s[1489]! } - public var Watch_LastSeen_WithinAMonth: String { return self._s[1490]! } - public var VoiceOver_MessageContextDelete: String { return self._s[1491]! } - public var EditTheme_Preview: String { return self._s[1492]! } + public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1489]! } + public var FastTwoStepSetup_HintSection: String { return self._s[1490]! } + public var Wallpaper_PhotoLibrary: String { return self._s[1491]! } + public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1492]! } + public var Gif_NoGifsFound: String { return self._s[1493]! } + public var Watch_LastSeen_WithinAMonth: String { return self._s[1494]! } + public var VoiceOver_MessageContextDelete: String { return self._s[1495]! } + public var EditTheme_Preview: String { return self._s[1496]! } public func ClearCache_StorageTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1493]!, self._r[1493]!, [_0]) + return formatWithArgumentRanges(self._s[1497]!, self._r[1497]!, [_0]) } - public var GroupInfo_ActionPromote: String { return self._s[1494]! } - public var PasscodeSettings_SimplePasscode: String { return self._s[1495]! } - public var GroupInfo_Permissions_Title: String { return self._s[1496]! } - public var Permissions_ContactsText_v0: String { return self._s[1497]! } - public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[1498]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1499]! } - public var PrivacySettings_DataSettingsHelp: String { return self._s[1502]! } - public var Passport_FieldEmailHelp: String { return self._s[1503]! } + public var GroupInfo_ActionPromote: String { return self._s[1498]! } + public var PasscodeSettings_SimplePasscode: String { return self._s[1499]! } + public var GroupInfo_Permissions_Title: String { return self._s[1500]! } + public var Permissions_ContactsText_v0: String { return self._s[1501]! } + public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[1502]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1503]! } + public var PrivacySettings_DataSettingsHelp: String { return self._s[1506]! } + public var Passport_FieldEmailHelp: String { return self._s[1507]! } public func Activity_RemindAboutUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1504]!, self._r[1504]!, [_0]) + return formatWithArgumentRanges(self._s[1508]!, self._r[1508]!, [_0]) } - public var Passport_Identity_GenderPlaceholder: String { return self._s[1505]! } - public var Weekday_ShortSaturday: String { return self._s[1506]! } - public var ContactInfo_PhoneLabelMain: String { return self._s[1507]! } - public var Watch_Conversation_UserInfo: String { return self._s[1508]! } - public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1509]! } - public var GroupPermission_PermissionDisabledByDefault: String { return self._s[1510]! } - public var PrivacyLastSeenSettings_Title: String { return self._s[1511]! } - public var Conversation_ShareBotLocationConfirmation: String { return self._s[1512]! } - public var PhotoEditor_VignetteTool: String { return self._s[1513]! } - public var Passport_Address_Street1Placeholder: String { return self._s[1514]! } - public var Passport_Language_et: String { return self._s[1515]! } - public var AppUpgrade_Running: String { return self._s[1516]! } - public var Channel_DiscussionGroup_Info: String { return self._s[1518]! } - public var EditTheme_Create_Preview_IncomingReplyName: String { return self._s[1519]! } - public var Passport_Language_bg: String { return self._s[1520]! } - public var Stickers_NoStickersFound: String { return self._s[1522]! } + public var Passport_Identity_GenderPlaceholder: String { return self._s[1509]! } + public var Weekday_ShortSaturday: String { return self._s[1510]! } + public var ContactInfo_PhoneLabelMain: String { return self._s[1511]! } + public var Watch_Conversation_UserInfo: String { return self._s[1512]! } + public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1513]! } + public var GroupPermission_PermissionDisabledByDefault: String { return self._s[1514]! } + public var PrivacyLastSeenSettings_Title: String { return self._s[1515]! } + public var Conversation_ShareBotLocationConfirmation: String { return self._s[1517]! } + public var PhotoEditor_VignetteTool: String { return self._s[1518]! } + public var Passport_Address_Street1Placeholder: String { return self._s[1519]! } + public var Passport_Language_et: String { return self._s[1520]! } + public var AppUpgrade_Running: String { return self._s[1521]! } + public var Channel_DiscussionGroup_Info: String { return self._s[1523]! } + public var EditTheme_Create_Preview_IncomingReplyName: String { return self._s[1524]! } + public var Passport_Language_bg: String { return self._s[1525]! } + public var Stickers_NoStickersFound: String { return self._s[1527]! } public func PUSH_CHANNEL_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1524]!, self._r[1524]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1529]!, self._r[1529]!, [_1, _2]) } public func VoiceOver_Chat_ContactFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1525]!, self._r[1525]!, [_0]) + return formatWithArgumentRanges(self._s[1530]!, self._r[1530]!, [_0]) } - public var Wallet_Month_GenJuly: String { return self._s[1526]! } - public var Wallet_Receive_AddressHeader: String { return self._s[1527]! } - public var Wallet_Send_AmountText: String { return self._s[1528]! } - public var Settings_About: String { return self._s[1529]! } + public var Wallet_Month_GenJuly: String { return self._s[1531]! } + public var Wallet_Receive_AddressHeader: String { return self._s[1532]! } + public var Wallet_Send_AmountText: String { return self._s[1533]! } + public var Settings_About: String { return self._s[1534]! } public func Channel_AdminLog_MessageRestricted(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1530]!, self._r[1530]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1535]!, self._r[1535]!, [_0, _1, _2]) } - public var ChatList_Context_MarkAsRead: String { return self._s[1532]! } - public var KeyCommand_NewMessage: String { return self._s[1533]! } - public var Group_ErrorAddBlocked: String { return self._s[1534]! } + public var ChatList_Context_MarkAsRead: String { return self._s[1537]! } + public var KeyCommand_NewMessage: String { return self._s[1538]! } + public var Group_ErrorAddBlocked: String { return self._s[1539]! } public func Message_PaymentSent(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1535]!, self._r[1535]!, [_0]) - } - public var Map_LocationTitle: String { return self._s[1536]! } - public var ReportGroupLocation_Title: String { return self._s[1537]! } - public var CallSettings_UseLessDataLongDescription: String { return self._s[1538]! } - public var Cache_ClearProgress: String { return self._s[1539]! } - public func Channel_Management_ErrorNotMember(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1540]!, self._r[1540]!, [_0]) } - public var GroupRemoved_AddToGroup: String { return self._s[1541]! } + public var Map_LocationTitle: String { return self._s[1541]! } + public var ReportGroupLocation_Title: String { return self._s[1542]! } + public var CallSettings_UseLessDataLongDescription: String { return self._s[1543]! } + public var Cache_ClearProgress: String { return self._s[1544]! } + public func Channel_Management_ErrorNotMember(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1545]!, self._r[1545]!, [_0]) + } + public var GroupRemoved_AddToGroup: String { return self._s[1546]! } public func External_OpenIn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1542]!, self._r[1542]!, [_0]) + return formatWithArgumentRanges(self._s[1547]!, self._r[1547]!, [_0]) } - public var Passport_UpdateRequiredError: String { return self._s[1543]! } - public var Wallet_SecureStorageNotAvailable_Text: String { return self._s[1544]! } + public var Passport_UpdateRequiredError: String { return self._s[1548]! } + public var Wallet_SecureStorageNotAvailable_Text: String { return self._s[1549]! } public func PUSH_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1545]!, self._r[1545]!, [_1]) + return formatWithArgumentRanges(self._s[1550]!, self._r[1550]!, [_1]) } - public var Notifications_PermissionsSuppressWarningText: String { return self._s[1547]! } - public var Passport_Identity_MainPageHelp: String { return self._s[1548]! } - public var PeerInfo_ButtonSearch: String { return self._s[1549]! } - public var Conversation_StatusKickedFromGroup: String { return self._s[1550]! } - public var Passport_Language_ka: String { return self._s[1551]! } + public var Notifications_PermissionsSuppressWarningText: String { return self._s[1552]! } + public var Passport_Identity_MainPageHelp: String { return self._s[1553]! } + public var PeerInfo_ButtonSearch: String { return self._s[1554]! } + public var Conversation_StatusKickedFromGroup: String { return self._s[1555]! } + public var Passport_Language_ka: String { return self._s[1556]! } public func Wallet_Time_PreciseDate_m12(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1552]!, self._r[1552]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1557]!, self._r[1557]!, [_1, _2, _3]) } - public var Call_Decline: String { return self._s[1553]! } - public var SocksProxySetup_ProxyEnabled: String { return self._s[1554]! } - public var TwoFactorSetup_Email_SkipConfirmationText: String { return self._s[1557]! } + public var Call_Decline: String { return self._s[1558]! } + public var SocksProxySetup_ProxyEnabled: String { return self._s[1559]! } + public var TwoFactorSetup_Email_SkipConfirmationText: String { return self._s[1562]! } public func AuthCode_Alert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1558]!, self._r[1558]!, [_0]) + return formatWithArgumentRanges(self._s[1563]!, self._r[1563]!, [_0]) } - public var CallFeedback_Send: String { return self._s[1559]! } - public var EditTheme_EditTitle: String { return self._s[1560]! } + public var CallFeedback_Send: String { return self._s[1564]! } + public var EditTheme_EditTitle: String { return self._s[1565]! } public func Channel_AdminLog_MessagePromotedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1561]!, self._r[1561]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1566]!, self._r[1566]!, [_1, _2]) } - public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1562]! } + public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1567]! } public func Wallet_Updated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1564]!, self._r[1564]!, [_0]) + return formatWithArgumentRanges(self._s[1569]!, self._r[1569]!, [_0]) } - public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1565]! } - public var Passport_DeletePassport: String { return self._s[1566]! } - public var Appearance_AppIconFilled: String { return self._s[1567]! } - public var Privacy_Calls_P2PAlways: String { return self._s[1568]! } - public var Month_ShortDecember: String { return self._s[1569]! } - public var Channel_AdminLog_CanEditMessages: String { return self._s[1571]! } + public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1570]! } + public var Passport_DeletePassport: String { return self._s[1571]! } + public var Appearance_AppIconFilled: String { return self._s[1572]! } + public var Privacy_Calls_P2PAlways: String { return self._s[1573]! } + public var Month_ShortDecember: String { return self._s[1574]! } + public var Channel_AdminLog_CanEditMessages: String { return self._s[1576]! } public func Contacts_AccessDeniedHelpLandscape(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1572]!, self._r[1572]!, [_0]) + return formatWithArgumentRanges(self._s[1577]!, self._r[1577]!, [_0]) } - public var Channel_Stickers_Searching: String { return self._s[1573]! } - public var Conversation_EncryptedDescription1: String { return self._s[1574]! } - public var Conversation_EncryptedDescription2: String { return self._s[1575]! } - public var PasscodeSettings_PasscodeOptions: String { return self._s[1576]! } - public var Conversation_EncryptedDescription3: String { return self._s[1578]! } - public var PhotoEditor_SharpenTool: String { return self._s[1579]! } - public var Wallet_Configuration_Title: String { return self._s[1580]! } + public var Channel_Stickers_Searching: String { return self._s[1578]! } + public var Conversation_EncryptedDescription1: String { return self._s[1579]! } + public var Conversation_EncryptedDescription2: String { return self._s[1580]! } + public var PasscodeSettings_PasscodeOptions: String { return self._s[1581]! } + public var Conversation_EncryptedDescription3: String { return self._s[1583]! } + public var PhotoEditor_SharpenTool: String { return self._s[1584]! } + public var Wallet_Configuration_Title: String { return self._s[1585]! } public func Conversation_AddNameToContacts(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1581]!, self._r[1581]!, [_0]) + return formatWithArgumentRanges(self._s[1586]!, self._r[1586]!, [_0]) } - public var Conversation_EncryptedDescription4: String { return self._s[1583]! } - public var Channel_Members_AddMembers: String { return self._s[1584]! } - public var Wallpaper_Search: String { return self._s[1585]! } - public var Weekday_Friday: String { return self._s[1587]! } - public var Privacy_ContactsSync: String { return self._s[1588]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1589]! } - public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1590]! } + public var Conversation_EncryptedDescription4: String { return self._s[1588]! } + public var Channel_Members_AddMembers: String { return self._s[1589]! } + public var Wallpaper_Search: String { return self._s[1590]! } + public var Weekday_Friday: String { return self._s[1592]! } + public var Privacy_ContactsSync: String { return self._s[1593]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1594]! } + public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1595]! } public func Channel_Management_RestrictedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1591]!, self._r[1591]!, [_0]) - } - public var Wallet_Configuration_BlockchainIdHeader: String { return self._s[1592]! } - public var GroupInfo_Permissions_Removed: String { return self._s[1593]! } - public var ScheduledMessages_ScheduledOnline: String { return self._s[1594]! } - public var Passport_Identity_GenderMale: String { return self._s[1595]! } - public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1596]!, self._r[1596]!, [_0]) } - public var Notifications_PermissionsKeepDisabled: String { return self._s[1597]! } - public var Conversation_JumpToDate: String { return self._s[1598]! } - public var Contacts_GlobalSearch: String { return self._s[1599]! } - public var AutoDownloadSettings_ResetHelp: String { return self._s[1600]! } - public var SettingsSearch_Synonyms_FAQ: String { return self._s[1601]! } - public var Profile_MessageLifetime1d: String { return self._s[1602]! } + public var Wallet_Configuration_BlockchainIdHeader: String { return self._s[1597]! } + public var GroupInfo_Permissions_Removed: String { return self._s[1598]! } + public var ScheduledMessages_ScheduledOnline: String { return self._s[1599]! } + public var Passport_Identity_GenderMale: String { return self._s[1600]! } + public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1601]!, self._r[1601]!, [_0]) + } + public var Notifications_PermissionsKeepDisabled: String { return self._s[1602]! } + public var Conversation_JumpToDate: String { return self._s[1603]! } + public var Contacts_GlobalSearch: String { return self._s[1604]! } + public var AutoDownloadSettings_ResetHelp: String { return self._s[1605]! } + public var SettingsSearch_Synonyms_FAQ: String { return self._s[1606]! } + public var Profile_MessageLifetime1d: String { return self._s[1607]! } public func MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1603]!, self._r[1603]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1608]!, self._r[1608]!, [_1, _2]) } - public var StickerPack_BuiltinPackName: String { return self._s[1606]! } + public var StickerPack_BuiltinPackName: String { return self._s[1611]! } public func PUSH_CHAT_MESSAGE_AUDIO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1607]!, self._r[1607]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1612]!, self._r[1612]!, [_1, _2]) } - public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1608]! } - public var Passport_InfoTitle: String { return self._s[1610]! } - public var Notifications_PermissionsUnreachableText: String { return self._s[1611]! } + public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1613]! } + public var Passport_InfoTitle: String { return self._s[1615]! } + public var Notifications_PermissionsUnreachableText: String { return self._s[1616]! } public func NetworkUsageSettings_CellularUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1615]!, self._r[1615]!, [_0]) + return formatWithArgumentRanges(self._s[1620]!, self._r[1620]!, [_0]) } public func PUSH_CHAT_MESSAGE_GEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1616]!, self._r[1616]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1621]!, self._r[1621]!, [_1, _2]) } - public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1617]! } - public var Profile_BotInfo: String { return self._s[1618]! } - public var Watch_Compose_CreateMessage: String { return self._s[1619]! } - public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1620]! } - public var Month_ShortNovember: String { return self._s[1621]! } - public var Conversation_ScamWarning: String { return self._s[1622]! } - public var Wallpaper_SetCustomBackground: String { return self._s[1623]! } - public var Appearance_TextSize_Title: String { return self._s[1624]! } - public var Passport_Identity_TranslationsHelp: String { return self._s[1625]! } - public var NotificationsSound_Chime: String { return self._s[1626]! } - public var Passport_Language_ko: String { return self._s[1628]! } - public var InviteText_URL: String { return self._s[1629]! } - public var TextFormat_Monospace: String { return self._s[1630]! } + public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1622]! } + public var Profile_BotInfo: String { return self._s[1623]! } + public var Watch_Compose_CreateMessage: String { return self._s[1624]! } + public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1625]! } + public var Month_ShortNovember: String { return self._s[1626]! } + public var Conversation_ScamWarning: String { return self._s[1627]! } + public var Wallpaper_SetCustomBackground: String { return self._s[1628]! } + public var Appearance_TextSize_Title: String { return self._s[1629]! } + public var Passport_Identity_TranslationsHelp: String { return self._s[1630]! } + public var NotificationsSound_Chime: String { return self._s[1631]! } + public var Passport_Language_ko: String { return self._s[1633]! } + public var InviteText_URL: String { return self._s[1634]! } + public var TextFormat_Monospace: String { return self._s[1635]! } public func Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1631]!, self._r[1631]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1636]!, self._r[1636]!, [_1, _2, _3]) } - public var EditTheme_Edit_BottomInfo: String { return self._s[1632]! } + public var EditTheme_Edit_BottomInfo: String { return self._s[1637]! } public func Login_WillSendSms(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1633]!, self._r[1633]!, [_0]) + return formatWithArgumentRanges(self._s[1638]!, self._r[1638]!, [_0]) } public func Watch_Time_ShortWeekdayAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1634]!, self._r[1634]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1639]!, self._r[1639]!, [_1, _2]) } - public var Wallet_Words_Title: String { return self._s[1635]! } - public var Wallet_Month_ShortMay: String { return self._s[1636]! } - public var EditTheme_CreateTitle: String { return self._s[1638]! } - public var Passport_InfoLearnMore: String { return self._s[1639]! } - public var TwoStepAuth_EmailPlaceholder: String { return self._s[1640]! } - public var Passport_Identity_AddIdentityCard: String { return self._s[1641]! } - public var Your_card_has_expired: String { return self._s[1642]! } - public var StickerPacksSettings_StickerPacksSection: String { return self._s[1643]! } - public var GroupInfo_InviteLink_Help: String { return self._s[1644]! } - public var TwoFactorSetup_EmailVerification_ResendAction: String { return self._s[1648]! } - public var Conversation_Report: String { return self._s[1650]! } - public var Notifications_MessageNotificationsSound: String { return self._s[1651]! } - public var Notification_MessageLifetime1m: String { return self._s[1652]! } - public var Privacy_ContactsTitle: String { return self._s[1653]! } - public var Conversation_ShareMyContactInfo: String { return self._s[1654]! } - public var Wallet_WordCheck_Title: String { return self._s[1655]! } - public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1656]! } - public var Channel_Members_Title: String { return self._s[1657]! } - public var Map_OpenInWaze: String { return self._s[1658]! } - public var Appearance_RemoveThemeColorConfirmation: String { return self._s[1659]! } - public var Login_PhoneBannedError: String { return self._s[1660]! } + public var Wallet_Words_Title: String { return self._s[1640]! } + public var Wallet_Month_ShortMay: String { return self._s[1641]! } + public var EditTheme_CreateTitle: String { return self._s[1643]! } + public var Passport_InfoLearnMore: String { return self._s[1644]! } + public var TwoStepAuth_EmailPlaceholder: String { return self._s[1645]! } + public var Passport_Identity_AddIdentityCard: String { return self._s[1646]! } + public var Your_card_has_expired: String { return self._s[1647]! } + public var StickerPacksSettings_StickerPacksSection: String { return self._s[1648]! } + public var GroupInfo_InviteLink_Help: String { return self._s[1649]! } + public var TwoFactorSetup_EmailVerification_ResendAction: String { return self._s[1653]! } + public var Conversation_Report: String { return self._s[1655]! } + public var Notifications_MessageNotificationsSound: String { return self._s[1656]! } + public var Notification_MessageLifetime1m: String { return self._s[1657]! } + public var Privacy_ContactsTitle: String { return self._s[1658]! } + public var Conversation_ShareMyContactInfo: String { return self._s[1659]! } + public var Wallet_WordCheck_Title: String { return self._s[1660]! } + public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1661]! } + public var Channel_Members_Title: String { return self._s[1662]! } + public var Map_OpenInWaze: String { return self._s[1663]! } + public var Appearance_RemoveThemeColorConfirmation: String { return self._s[1664]! } + public var Login_PhoneBannedError: String { return self._s[1665]! } public func LiveLocationUpdated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1661]!, self._r[1661]!, [_0]) + return formatWithArgumentRanges(self._s[1666]!, self._r[1666]!, [_0]) } - public var IntentsSettings_MainAccount: String { return self._s[1662]! } - public var Group_Management_AddModeratorHelp: String { return self._s[1663]! } - public var AutoDownloadSettings_WifiTitle: String { return self._s[1664]! } - public var Common_OK: String { return self._s[1665]! } - public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1666]! } - public var Wallet_Words_NotDoneResponse: String { return self._s[1667]! } - public var Cache_Music: String { return self._s[1668]! } - public var Wallet_Configuration_SourceURL: String { return self._s[1669]! } - public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1670]! } - public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1673]! } - public var ChatList_EmptyChatListEditFilter: String { return self._s[1674]! } - public var TwoStepAuth_HintPlaceholder: String { return self._s[1675]! } + public var IntentsSettings_MainAccount: String { return self._s[1667]! } + public var Group_Management_AddModeratorHelp: String { return self._s[1668]! } + public var AutoDownloadSettings_WifiTitle: String { return self._s[1669]! } + public var Common_OK: String { return self._s[1670]! } + public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1671]! } + public var Wallet_Words_NotDoneResponse: String { return self._s[1672]! } + public var Cache_Music: String { return self._s[1673]! } + public var Wallet_Configuration_SourceURL: String { return self._s[1674]! } + public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1675]! } + public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1678]! } + public var ChatList_EmptyChatListEditFilter: String { return self._s[1679]! } + public var TwoStepAuth_HintPlaceholder: String { return self._s[1680]! } public func PUSH_PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1676]!, self._r[1676]!, [_1]) + return formatWithArgumentRanges(self._s[1681]!, self._r[1681]!, [_1]) } public func Passport_RequestHeader(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1677]!, self._r[1677]!, [_0]) + return formatWithArgumentRanges(self._s[1682]!, self._r[1682]!, [_0]) } - public var TwoFactorSetup_Done_Action: String { return self._s[1678]! } + public var TwoFactorSetup_Done_Action: String { return self._s[1683]! } public func VoiceOver_Chat_ContactOrganization(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1679]!, self._r[1679]!, [_0]) + return formatWithArgumentRanges(self._s[1684]!, self._r[1684]!, [_0]) } - public var Wallet_Send_ErrorNotEnoughFundsText: String { return self._s[1680]! } - public var Watch_MessageView_ViewOnPhone: String { return self._s[1682]! } - public var Privacy_Calls_CustomShareHelp: String { return self._s[1683]! } - public var Wallet_Receive_CreateInvoiceInfo: String { return self._s[1685]! } - public var ChangePhoneNumberNumber_Title: String { return self._s[1686]! } - public var State_ConnectingToProxyInfo: String { return self._s[1687]! } - public var Conversation_SwipeToReplyHintTitle: String { return self._s[1688]! } - public var Message_VideoMessage: String { return self._s[1690]! } - public var ChannelInfo_DeleteChannel: String { return self._s[1691]! } - public var ContactInfo_PhoneLabelOther: String { return self._s[1692]! } - public var Channel_EditAdmin_CannotEdit: String { return self._s[1693]! } - public var Passport_DeleteAddressConfirmation: String { return self._s[1694]! } + public var Wallet_Send_ErrorNotEnoughFundsText: String { return self._s[1685]! } + public var Watch_MessageView_ViewOnPhone: String { return self._s[1687]! } + public var Privacy_Calls_CustomShareHelp: String { return self._s[1688]! } + public var Wallet_Receive_CreateInvoiceInfo: String { return self._s[1690]! } + public var ChangePhoneNumberNumber_Title: String { return self._s[1691]! } + public var State_ConnectingToProxyInfo: String { return self._s[1692]! } + public var Conversation_SwipeToReplyHintTitle: String { return self._s[1693]! } + public var Message_VideoMessage: String { return self._s[1695]! } + public var ChannelInfo_DeleteChannel: String { return self._s[1696]! } + public var ContactInfo_PhoneLabelOther: String { return self._s[1697]! } + public var Channel_EditAdmin_CannotEdit: String { return self._s[1698]! } + public var Passport_DeleteAddressConfirmation: String { return self._s[1699]! } public func Wallet_Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1695]!, self._r[1695]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1700]!, self._r[1700]!, [_1, _2, _3]) } - public var WallpaperPreview_SwipeBottomText: String { return self._s[1696]! } - public var Activity_RecordingAudio: String { return self._s[1697]! } - public var SettingsSearch_Synonyms_Watch: String { return self._s[1698]! } - public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1699]! } - public var Wallet_Info_Address: String { return self._s[1700]! } + public var WallpaperPreview_SwipeBottomText: String { return self._s[1701]! } + public var Activity_RecordingAudio: String { return self._s[1702]! } + public var SettingsSearch_Synonyms_Watch: String { return self._s[1703]! } + public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1704]! } + public var Wallet_Info_Address: String { return self._s[1705]! } public func Notification_ChangedGroupName(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1702]!, self._r[1702]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1707]!, self._r[1707]!, [_0, _1]) } public func EmptyGroupInfo_Line1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1706]!, self._r[1706]!, [_0]) - } - public var Conversation_ApplyLocalization: String { return self._s[1707]! } - public var TwoFactorSetup_Intro_Action: String { return self._s[1708]! } - public var UserInfo_AddPhone: String { return self._s[1709]! } - public var Map_ShareLiveLocationHelp: String { return self._s[1710]! } - public func Passport_Identity_NativeNameGenericHelp(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1711]!, self._r[1711]!, [_0]) } - public var Passport_Scans: String { return self._s[1713]! } - public var BlockedUsers_Unblock: String { return self._s[1714]! } + public var Conversation_ApplyLocalization: String { return self._s[1712]! } + public var TwoFactorSetup_Intro_Action: String { return self._s[1713]! } + public var UserInfo_AddPhone: String { return self._s[1714]! } + public var Map_ShareLiveLocationHelp: String { return self._s[1715]! } + public func Passport_Identity_NativeNameGenericHelp(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1716]!, self._r[1716]!, [_0]) + } + public var Passport_Scans: String { return self._s[1718]! } + public var BlockedUsers_Unblock: String { return self._s[1719]! } public func PUSH_ENCRYPTION_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1715]!, self._r[1715]!, [_1]) + return formatWithArgumentRanges(self._s[1720]!, self._r[1720]!, [_1]) } - public var Channel_Management_LabelCreator: String { return self._s[1716]! } - public var Conversation_ReportSpamAndLeave: String { return self._s[1717]! } - public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1718]! } - public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1719]! } - public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1720]! } + public var Channel_Management_LabelCreator: String { return self._s[1721]! } + public var Conversation_ReportSpamAndLeave: String { return self._s[1722]! } + public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1723]! } + public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1724]! } + public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1725]! } public func Login_EmailPhoneBody(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1721]!, self._r[1721]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1726]!, self._r[1726]!, [_0, _1, _2]) } - public var Login_PhoneNumberHelp: String { return self._s[1722]! } - public var LastSeen_ALongTimeAgo: String { return self._s[1723]! } - public var Channel_AdminLog_CanPinMessages: String { return self._s[1724]! } - public var ChannelIntro_CreateChannel: String { return self._s[1725]! } - public var Conversation_UnreadMessages: String { return self._s[1726]! } - public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1727]! } - public var Channel_AdminLog_EmptyText: String { return self._s[1728]! } - public var Theme_Context_Apply: String { return self._s[1729]! } - public var Notification_GroupActivated: String { return self._s[1730]! } - public var NotificationSettings_ContactJoinedInfo: String { return self._s[1731]! } - public var Wallet_Intro_CreateWallet: String { return self._s[1732]! } + public var Login_PhoneNumberHelp: String { return self._s[1727]! } + public var LastSeen_ALongTimeAgo: String { return self._s[1728]! } + public var Channel_AdminLog_CanPinMessages: String { return self._s[1729]! } + public var ChannelIntro_CreateChannel: String { return self._s[1730]! } + public var Conversation_UnreadMessages: String { return self._s[1731]! } + public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1732]! } + public var Channel_AdminLog_EmptyText: String { return self._s[1733]! } + public var Theme_Context_Apply: String { return self._s[1734]! } + public var Notification_GroupActivated: String { return self._s[1735]! } + public var NotificationSettings_ContactJoinedInfo: String { return self._s[1736]! } + public var Wallet_Intro_CreateWallet: String { return self._s[1737]! } public func Notification_PinnedContactMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1733]!, self._r[1733]!, [_0]) + return formatWithArgumentRanges(self._s[1738]!, self._r[1738]!, [_0]) } public func DownloadingStatus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1734]!, self._r[1734]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1739]!, self._r[1739]!, [_0, _1]) } - public var GroupInfo_ConvertToSupergroup: String { return self._s[1736]! } + public var GroupInfo_ConvertToSupergroup: String { return self._s[1741]! } public func PrivacyPolicy_AgeVerificationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1737]!, self._r[1737]!, [_0]) - } - public var Undo_DeletedChannel: String { return self._s[1738]! } - public var CallFeedback_AddComment: String { return self._s[1739]! } - public func Conversation_OpenBotLinkAllowMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1740]!, self._r[1740]!, [_0]) - } - public var Document_TargetConfirmationFormat: String { return self._s[1741]! } - public func Call_StatusOngoing(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1742]!, self._r[1742]!, [_0]) } - public var LogoutOptions_SetPasscodeTitle: String { return self._s[1743]! } + public var Undo_DeletedChannel: String { return self._s[1743]! } + public var CallFeedback_AddComment: String { return self._s[1744]! } + public func Conversation_OpenBotLinkAllowMessages(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1745]!, self._r[1745]!, [_0]) + } + public var Document_TargetConfirmationFormat: String { return self._s[1746]! } + public func Call_StatusOngoing(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1747]!, self._r[1747]!, [_0]) + } + public var LogoutOptions_SetPasscodeTitle: String { return self._s[1748]! } public func PUSH_CHAT_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1744]!, self._r[1744]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[1749]!, self._r[1749]!, [_1, _2, _3, _4]) } - public var Wallet_SecureStorageChanged_PasscodeText: String { return self._s[1745]! } - public var Theme_ErrorNotFound: String { return self._s[1746]! } - public var Contacts_SortByName: String { return self._s[1747]! } - public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1748]! } + public var Wallet_SecureStorageChanged_PasscodeText: String { return self._s[1750]! } + public var Theme_ErrorNotFound: String { return self._s[1751]! } + public var Contacts_SortByName: String { return self._s[1752]! } + public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1753]! } public func CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1750]!, self._r[1750]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1755]!, self._r[1755]!, [_1, _2, _3]) } - public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1751]! } - public var ScheduledMessages_EditTime: String { return self._s[1752]! } - public var Conversation_ClearSelfHistory: String { return self._s[1753]! } - public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1754]! } - public var PasscodeSettings_DoNotMatch: String { return self._s[1755]! } - public var Stickers_SuggestNone: String { return self._s[1756]! } - public var ChatSettings_Cache: String { return self._s[1757]! } - public var Settings_SaveIncomingPhotos: String { return self._s[1758]! } - public var Media_ShareThisPhoto: String { return self._s[1759]! } - public var Chat_SlowmodeTooltipPending: String { return self._s[1760]! } - public var InfoPlist_NSContactsUsageDescription: String { return self._s[1761]! } - public var Conversation_ContextMenuCopyLink: String { return self._s[1762]! } - public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1763]! } - public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1764]! } - public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1765]! } - public var Appearance_ThemePreview_Chat_6_Text: String { return self._s[1766]! } + public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1756]! } + public var ScheduledMessages_EditTime: String { return self._s[1757]! } + public var Conversation_ClearSelfHistory: String { return self._s[1758]! } + public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1759]! } + public var PasscodeSettings_DoNotMatch: String { return self._s[1760]! } + public var Stickers_SuggestNone: String { return self._s[1761]! } + public var ChatSettings_Cache: String { return self._s[1762]! } + public var Settings_SaveIncomingPhotos: String { return self._s[1763]! } + public var Media_ShareThisPhoto: String { return self._s[1764]! } + public var Chat_SlowmodeTooltipPending: String { return self._s[1765]! } + public var InfoPlist_NSContactsUsageDescription: String { return self._s[1766]! } + public var Conversation_ContextMenuCopyLink: String { return self._s[1767]! } + public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1768]! } + public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1769]! } + public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1770]! } + public var Appearance_ThemePreview_Chat_6_Text: String { return self._s[1771]! } public func Wallet_SecureStorageReset_BiometryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1767]!, self._r[1767]!, [_0]) + return formatWithArgumentRanges(self._s[1772]!, self._r[1772]!, [_0]) } - public var Permissions_CellularDataTitle_v0: String { return self._s[1768]! } - public var WallpaperSearch_ColorWhite: String { return self._s[1770]! } - public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1771]! } - public var Conversation_ErrorInaccessibleMessage: String { return self._s[1772]! } - public var Map_OpenIn: String { return self._s[1773]! } - public var PeerInfo_ButtonCall: String { return self._s[1774]! } + public var Permissions_CellularDataTitle_v0: String { return self._s[1773]! } + public var WallpaperSearch_ColorWhite: String { return self._s[1775]! } + public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1776]! } + public var Conversation_ErrorInaccessibleMessage: String { return self._s[1777]! } + public var Map_OpenIn: String { return self._s[1778]! } + public var PeerInfo_ButtonCall: String { return self._s[1779]! } public func PUSH_PHONE_CALL_MISSED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1777]!, self._r[1777]!, [_1]) + return formatWithArgumentRanges(self._s[1783]!, self._r[1783]!, [_1]) } public func ChannelInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1778]!, self._r[1778]!, [_0]) + return formatWithArgumentRanges(self._s[1784]!, self._r[1784]!, [_0]) } - public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1779]! } - public var MessagePoll_LabelClosed: String { return self._s[1780]! } - public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1782]! } - public var Wallet_Send_SendAnyway: String { return self._s[1783]! } - public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1784]! } - public var UserInfo_FirstNamePlaceholder: String { return self._s[1785]! } - public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1786]! } - public var Map_SetThisPlace: String { return self._s[1787]! } - public var Login_SelectCountry_Title: String { return self._s[1788]! } - public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1789]! } + public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1785]! } + public var MessagePoll_LabelClosed: String { return self._s[1786]! } + public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1788]! } + public var Wallet_Send_SendAnyway: String { return self._s[1789]! } + public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1790]! } + public var UserInfo_FirstNamePlaceholder: String { return self._s[1791]! } + public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1792]! } + public var Map_SetThisPlace: String { return self._s[1793]! } + public var Login_SelectCountry_Title: String { return self._s[1794]! } + public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1795]! } public func Conversation_OpenBotLinkLogin(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1790]!, self._r[1790]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1796]!, self._r[1796]!, [_1, _2]) } - public var Channel_AdminLog_ChangeInfo: String { return self._s[1791]! } - public var Watch_Suggestion_BRB: String { return self._s[1792]! } - public var Passport_Identity_EditIdentityCard: String { return self._s[1793]! } - public var Contacts_PermissionsTitle: String { return self._s[1794]! } - public var Conversation_RestrictedInline: String { return self._s[1795]! } - public var Appearance_RemoveThemeColor: String { return self._s[1797]! } - public var StickerPack_ViewPack: String { return self._s[1798]! } - public var Wallet_UnknownError: String { return self._s[1799]! } + public var Channel_AdminLog_ChangeInfo: String { return self._s[1797]! } + public var Watch_Suggestion_BRB: String { return self._s[1798]! } + public var Passport_Identity_EditIdentityCard: String { return self._s[1799]! } + public var Contacts_PermissionsTitle: String { return self._s[1800]! } + public var Conversation_RestrictedInline: String { return self._s[1801]! } + public var Appearance_RemoveThemeColor: String { return self._s[1803]! } + public var StickerPack_ViewPack: String { return self._s[1804]! } + public var Wallet_UnknownError: String { return self._s[1805]! } public func Update_AppVersion(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1800]!, self._r[1800]!, [_0]) + return formatWithArgumentRanges(self._s[1806]!, self._r[1806]!, [_0]) } - public var Compose_NewChannel: String { return self._s[1802]! } - public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1805]! } - public var MessagePoll_LabelQuiz: String { return self._s[1807]! } - public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1808]! } - public var Channel_Info_Stickers: String { return self._s[1809]! } - public var AutoNightTheme_PreferredTheme: String { return self._s[1810]! } - public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1811]! } - public var Passport_DeletePersonalDetails: String { return self._s[1812]! } - public var LogoutOptions_AddAccountTitle: String { return self._s[1813]! } - public var Channel_DiscussionGroupInfo: String { return self._s[1814]! } - public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1815]! } - public var Conversation_SearchNoResults: String { return self._s[1818]! } - public var Wallet_Configuration_ApplyErrorTextURLInvalid: String { return self._s[1819]! } - public var MessagePoll_LabelAnonymous: String { return self._s[1820]! } - public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1821]! } - public var Login_Code: String { return self._s[1822]! } - public var EditTheme_Create_BottomInfo: String { return self._s[1823]! } - public var Watch_Suggestion_WhatsUp: String { return self._s[1824]! } - public var Weekday_ShortThursday: String { return self._s[1825]! } - public var Resolve_ErrorNotFound: String { return self._s[1827]! } - public var LastSeen_Offline: String { return self._s[1828]! } - public var PeopleNearby_NoMembers: String { return self._s[1829]! } - public var GroupPermission_AddMembersNotAvailable: String { return self._s[1830]! } - public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1831]! } - public var GroupInfo_Title: String { return self._s[1833]! } - public var NotificationsSound_Note: String { return self._s[1834]! } - public var Conversation_EditingMessagePanelTitle: String { return self._s[1835]! } - public var Watch_Message_Poll: String { return self._s[1836]! } - public var Privacy_Calls: String { return self._s[1837]! } + public var Compose_NewChannel: String { return self._s[1808]! } + public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1812]! } + public var MessagePoll_LabelQuiz: String { return self._s[1814]! } + public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1815]! } + public var Channel_Info_Stickers: String { return self._s[1816]! } + public var AutoNightTheme_PreferredTheme: String { return self._s[1817]! } + public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1818]! } + public var Passport_DeletePersonalDetails: String { return self._s[1819]! } + public var LogoutOptions_AddAccountTitle: String { return self._s[1820]! } + public var Channel_DiscussionGroupInfo: String { return self._s[1821]! } + public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1822]! } + public var Conversation_SearchNoResults: String { return self._s[1825]! } + public var Wallet_Configuration_ApplyErrorTextURLInvalid: String { return self._s[1826]! } + public var MessagePoll_LabelAnonymous: String { return self._s[1827]! } + public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1828]! } + public var Login_Code: String { return self._s[1829]! } + public var EditTheme_Create_BottomInfo: String { return self._s[1830]! } + public var Watch_Suggestion_WhatsUp: String { return self._s[1831]! } + public var Weekday_ShortThursday: String { return self._s[1832]! } + public var Resolve_ErrorNotFound: String { return self._s[1834]! } + public var LastSeen_Offline: String { return self._s[1835]! } + public var PeopleNearby_NoMembers: String { return self._s[1836]! } + public var GroupPermission_AddMembersNotAvailable: String { return self._s[1837]! } + public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1838]! } + public var GroupInfo_Title: String { return self._s[1840]! } + public var NotificationsSound_Note: String { return self._s[1841]! } + public var Conversation_EditingMessagePanelTitle: String { return self._s[1842]! } + public var Watch_Message_Poll: String { return self._s[1843]! } + public var Privacy_Calls: String { return self._s[1844]! } public func Channel_AdminLog_MessageRankUsername(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1838]!, self._r[1838]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1845]!, self._r[1845]!, [_1, _2, _3]) } - public var Month_ShortAugust: String { return self._s[1839]! } - public var TwoStepAuth_SetPasswordHelp: String { return self._s[1840]! } - public var Notifications_Reset: String { return self._s[1841]! } - public var Conversation_Pin: String { return self._s[1842]! } - public var Passport_Language_lv: String { return self._s[1843]! } - public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1844]! } - public var BlockedUsers_Info: String { return self._s[1845]! } - public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1847]! } - public var Watch_Conversation_Unblock: String { return self._s[1849]! } + public var Month_ShortAugust: String { return self._s[1846]! } + public var TwoStepAuth_SetPasswordHelp: String { return self._s[1847]! } + public var Notifications_Reset: String { return self._s[1848]! } + public var Conversation_Pin: String { return self._s[1849]! } + public var Passport_Language_lv: String { return self._s[1850]! } + public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1851]! } + public var BlockedUsers_Info: String { return self._s[1852]! } + public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1854]! } + public var Watch_Conversation_Unblock: String { return self._s[1856]! } public func Time_MonthOfYear_m9(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1850]!, self._r[1850]!, [_0]) + return formatWithArgumentRanges(self._s[1857]!, self._r[1857]!, [_0]) } - public var CloudStorage_Title: String { return self._s[1851]! } - public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1852]! } + public var CloudStorage_Title: String { return self._s[1858]! } + public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1859]! } public func NetworkUsageSettings_WifiUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1853]!, self._r[1853]!, [_0]) + return formatWithArgumentRanges(self._s[1860]!, self._r[1860]!, [_0]) } - public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1854]! } - public var Watch_Suggestion_OnMyWay: String { return self._s[1855]! } - public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1856]! } - public var Passport_Address_EditBankStatement: String { return self._s[1857]! } + public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1861]! } + public var Watch_Suggestion_OnMyWay: String { return self._s[1862]! } + public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1863]! } + public var Passport_Address_EditBankStatement: String { return self._s[1864]! } public func Channel_AdminLog_MessageChangedUnlinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1858]!, self._r[1858]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1865]!, self._r[1865]!, [_1, _2]) } - public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1859]! } - public var ShareMenu_Comment: String { return self._s[1860]! } - public var Permissions_ContactsTitle_v0: String { return self._s[1861]! } - public var Notifications_PermissionsTitle: String { return self._s[1862]! } - public var GroupPermission_NoSendLinks: String { return self._s[1863]! } - public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1864]! } - public var Wallet_SecureStorageChanged_ImportWallet: String { return self._s[1865]! } - public var PeerInfo_PaneLinks: String { return self._s[1866]! } - public var Settings_Support: String { return self._s[1867]! } - public var Notifications_ChannelNotificationsSound: String { return self._s[1868]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1869]! } - public var Privacy_Forwards_Preview: String { return self._s[1870]! } - public var GroupPermission_ApplyAlertAction: String { return self._s[1871]! } - public var Watch_Stickers_StickerPacks: String { return self._s[1872]! } - public var Common_Select: String { return self._s[1874]! } - public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1875]! } - public var WallpaperSearch_ColorGray: String { return self._s[1878]! } - public var TwoFactorSetup_Password_PlaceholderPassword: String { return self._s[1879]! } - public var TwoFactorSetup_Hint_SkipAction: String { return self._s[1880]! } - public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1881]! } - public var PollResults_Title: String { return self._s[1882]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1883]! } - public var Appearance_PreviewReplyAuthor: String { return self._s[1884]! } - public var TwoStepAuth_RecoveryTitle: String { return self._s[1885]! } - public var Widget_AuthRequired: String { return self._s[1886]! } - public var Camera_FlashOn: String { return self._s[1887]! } - public var Conversation_ContextMenuLookUp: String { return self._s[1888]! } - public var Channel_Stickers_NotFoundHelp: String { return self._s[1889]! } - public var Watch_Suggestion_OK: String { return self._s[1890]! } + public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1866]! } + public var ShareMenu_Comment: String { return self._s[1867]! } + public var Permissions_ContactsTitle_v0: String { return self._s[1868]! } + public var Notifications_PermissionsTitle: String { return self._s[1869]! } + public var GroupPermission_NoSendLinks: String { return self._s[1870]! } + public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1871]! } + public var Wallet_SecureStorageChanged_ImportWallet: String { return self._s[1872]! } + public var PeerInfo_PaneLinks: String { return self._s[1873]! } + public var Settings_Support: String { return self._s[1874]! } + public var Notifications_ChannelNotificationsSound: String { return self._s[1875]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1876]! } + public var Privacy_Forwards_Preview: String { return self._s[1877]! } + public var GroupPermission_ApplyAlertAction: String { return self._s[1878]! } + public var Watch_Stickers_StickerPacks: String { return self._s[1879]! } + public var Common_Select: String { return self._s[1881]! } + public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1882]! } + public var WallpaperSearch_ColorGray: String { return self._s[1885]! } + public var TwoFactorSetup_Password_PlaceholderPassword: String { return self._s[1886]! } + public var TwoFactorSetup_Hint_SkipAction: String { return self._s[1887]! } + public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1888]! } + public var PollResults_Title: String { return self._s[1889]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1890]! } + public var Appearance_PreviewReplyAuthor: String { return self._s[1891]! } + public var TwoStepAuth_RecoveryTitle: String { return self._s[1892]! } + public var Widget_AuthRequired: String { return self._s[1893]! } + public var Camera_FlashOn: String { return self._s[1894]! } + public var Conversation_ContextMenuLookUp: String { return self._s[1895]! } + public var Channel_Stickers_NotFoundHelp: String { return self._s[1896]! } + public var Watch_Suggestion_OK: String { return self._s[1897]! } public func Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1892]!, self._r[1892]!, [_0]) + return formatWithArgumentRanges(self._s[1899]!, self._r[1899]!, [_0]) } public func Notification_PinnedLiveLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1894]!, self._r[1894]!, [_0]) + return formatWithArgumentRanges(self._s[1901]!, self._r[1901]!, [_0]) } - public var TextFormat_Strikethrough: String { return self._s[1895]! } - public var DialogList_AdLabel: String { return self._s[1896]! } - public var WatchRemote_NotificationText: String { return self._s[1897]! } - public var IntentsSettings_SuggestedChatsSavedMessages: String { return self._s[1898]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1899]! } - public var Conversation_ReportSpam: String { return self._s[1900]! } - public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1901]! } - public var Settings_LogoutConfirmationTitle: String { return self._s[1903]! } - public var PhoneLabel_Title: String { return self._s[1904]! } - public var Passport_Address_EditRentalAgreement: String { return self._s[1905]! } - public var Settings_ChangePhoneNumber: String { return self._s[1906]! } - public var Notifications_ExceptionsTitle: String { return self._s[1907]! } - public var Notifications_AlertTones: String { return self._s[1908]! } - public var Call_ReportIncludeLogDescription: String { return self._s[1909]! } - public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1910]! } - public var AutoDownloadSettings_PrivateChats: String { return self._s[1911]! } - public var VoiceOver_Chat_Photo: String { return self._s[1913]! } - public var TwoStepAuth_AddHintTitle: String { return self._s[1914]! } - public var ReportPeer_ReasonOther: String { return self._s[1915]! } - public var ChatList_Context_JoinChannel: String { return self._s[1916]! } - public var KeyCommand_ScrollDown: String { return self._s[1918]! } - public var Conversation_ScheduleMessage_Title: String { return self._s[1919]! } + public var TextFormat_Strikethrough: String { return self._s[1902]! } + public var DialogList_AdLabel: String { return self._s[1903]! } + public var WatchRemote_NotificationText: String { return self._s[1904]! } + public var IntentsSettings_SuggestedChatsSavedMessages: String { return self._s[1905]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1906]! } + public var Conversation_ReportSpam: String { return self._s[1907]! } + public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1908]! } + public var Settings_LogoutConfirmationTitle: String { return self._s[1910]! } + public var PhoneLabel_Title: String { return self._s[1911]! } + public var Passport_Address_EditRentalAgreement: String { return self._s[1912]! } + public var Settings_ChangePhoneNumber: String { return self._s[1913]! } + public var Notifications_ExceptionsTitle: String { return self._s[1914]! } + public var Notifications_AlertTones: String { return self._s[1915]! } + public var Call_ReportIncludeLogDescription: String { return self._s[1916]! } + public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1917]! } + public var AutoDownloadSettings_PrivateChats: String { return self._s[1918]! } + public var VoiceOver_Chat_Photo: String { return self._s[1920]! } + public var TwoStepAuth_AddHintTitle: String { return self._s[1921]! } + public var Stats_PostsTitle: String { return self._s[1922]! } + public var ReportPeer_ReasonOther: String { return self._s[1923]! } + public var ChatList_Context_JoinChannel: String { return self._s[1924]! } + public var KeyCommand_ScrollDown: String { return self._s[1926]! } + public var Conversation_ScheduleMessage_Title: String { return self._s[1927]! } public func Login_BannedPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1920]!, self._r[1920]!, [_0]) + return formatWithArgumentRanges(self._s[1928]!, self._r[1928]!, [_0]) } - public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1921]! } - public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1922]! } - public var AuthSessions_LogOut: String { return self._s[1923]! } - public var Passport_Identity_TypeInternalPassport: String { return self._s[1924]! } - public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1925]! } - public var Passport_Phone_Title: String { return self._s[1926]! } - public var ContactList_Context_StartSecretChat: String { return self._s[1927]! } - public var Settings_PhoneNumber: String { return self._s[1928]! } + public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1930]! } + public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1931]! } + public var AuthSessions_LogOut: String { return self._s[1932]! } + public var Passport_Identity_TypeInternalPassport: String { return self._s[1933]! } + public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1934]! } + public var Passport_Phone_Title: String { return self._s[1935]! } + public var ContactList_Context_StartSecretChat: String { return self._s[1936]! } + public var Settings_PhoneNumber: String { return self._s[1937]! } public func Conversation_ScheduleMessage_SendToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1929]!, self._r[1929]!, [_0]) + return formatWithArgumentRanges(self._s[1938]!, self._r[1938]!, [_0]) } - public var NotificationsSound_Alert: String { return self._s[1931]! } - public var Wallet_SecureStorageChanged_CreateWallet: String { return self._s[1932]! } - public var WebSearch_SearchNoResults: String { return self._s[1933]! } - public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1935]! } - public var Wallet_Configuration_SourceInfo: String { return self._s[1936]! } - public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1937]! } - public var SettingsSearch_Synonyms_Passport: String { return self._s[1938]! } - public var PhotoEditor_CurvesTool: String { return self._s[1939]! } - public var Checkout_PaymentMethod: String { return self._s[1941]! } + public var NotificationsSound_Alert: String { return self._s[1940]! } + public var Wallet_SecureStorageChanged_CreateWallet: String { return self._s[1941]! } + public var WebSearch_SearchNoResults: String { return self._s[1942]! } + public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1944]! } + public var Wallet_Configuration_SourceInfo: String { return self._s[1945]! } + public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1946]! } + public var SettingsSearch_Synonyms_Passport: String { return self._s[1947]! } + public var PhotoEditor_CurvesTool: String { return self._s[1948]! } + public var Checkout_PaymentMethod: String { return self._s[1950]! } public func PUSH_CHAT_ADD_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1942]!, self._r[1942]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1951]!, self._r[1951]!, [_1, _2]) } - public var Contacts_AccessDeniedError: String { return self._s[1943]! } - public var Camera_PhotoMode: String { return self._s[1946]! } - public var EditTheme_Expand_Preview_IncomingText: String { return self._s[1947]! } - public var Appearance_TextSize_Apply: String { return self._s[1948]! } - public var Passport_Address_AddUtilityBill: String { return self._s[1950]! } - public var CallSettings_OnMobile: String { return self._s[1951]! } - public var Tour_Text2: String { return self._s[1952]! } + public var Contacts_AccessDeniedError: String { return self._s[1952]! } + public var Camera_PhotoMode: String { return self._s[1955]! } + public var EditTheme_Expand_Preview_IncomingText: String { return self._s[1956]! } + public var Appearance_TextSize_Apply: String { return self._s[1957]! } + public var Passport_Address_AddUtilityBill: String { return self._s[1959]! } + public var CallSettings_OnMobile: String { return self._s[1960]! } + public var Tour_Text2: String { return self._s[1961]! } public func PUSH_CHAT_MESSAGE_ROUND(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1953]!, self._r[1953]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1962]!, self._r[1962]!, [_1, _2]) } - public var DialogList_EncryptionProcessing: String { return self._s[1955]! } - public var Permissions_Skip: String { return self._s[1956]! } - public var Wallet_Words_NotDoneOk: String { return self._s[1957]! } - public var SecretImage_Title: String { return self._s[1958]! } - public var Watch_MessageView_Title: String { return self._s[1959]! } - public var Channel_DiscussionGroupAdd: String { return self._s[1960]! } - public var AttachmentMenu_Poll: String { return self._s[1961]! } + public var DialogList_EncryptionProcessing: String { return self._s[1964]! } + public var Permissions_Skip: String { return self._s[1965]! } + public var Wallet_Words_NotDoneOk: String { return self._s[1966]! } + public var SecretImage_Title: String { return self._s[1967]! } + public var Watch_MessageView_Title: String { return self._s[1968]! } + public var Channel_DiscussionGroupAdd: String { return self._s[1969]! } + public var AttachmentMenu_Poll: String { return self._s[1970]! } public func Notification_GroupInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1962]!, self._r[1962]!, [_0]) + return formatWithArgumentRanges(self._s[1971]!, self._r[1971]!, [_0]) } public func Channel_DiscussionGroup_PrivateChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1963]!, self._r[1963]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1972]!, self._r[1972]!, [_1, _2]) } - public var Notification_CallCanceled: String { return self._s[1964]! } - public var WallpaperPreview_Title: String { return self._s[1965]! } - public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1966]! } - public var Settings_ProxyConnecting: String { return self._s[1967]! } - public var Settings_CheckPhoneNumberText: String { return self._s[1969]! } - public var VoiceOver_Chat_YourVideo: String { return self._s[1970]! } - public var Wallet_Intro_Title: String { return self._s[1971]! } - public var TwoFactorSetup_Password_Action: String { return self._s[1972]! } - public var Profile_MessageLifetime5s: String { return self._s[1973]! } - public var Username_InvalidCharacters: String { return self._s[1974]! } - public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1975]! } - public var ScheduledMessages_ClearAll: String { return self._s[1976]! } - public var WallpaperPreview_CropBottomText: String { return self._s[1977]! } - public var AutoDownloadSettings_LimitBySize: String { return self._s[1978]! } - public var Settings_AddAccount: String { return self._s[1979]! } - public var Notification_CreatedChannel: String { return self._s[1982]! } + public var Notification_CallCanceled: String { return self._s[1973]! } + public var WallpaperPreview_Title: String { return self._s[1974]! } + public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1975]! } + public var Settings_ProxyConnecting: String { return self._s[1976]! } + public var Settings_CheckPhoneNumberText: String { return self._s[1978]! } + public var VoiceOver_Chat_YourVideo: String { return self._s[1979]! } + public var Wallet_Intro_Title: String { return self._s[1980]! } + public var TwoFactorSetup_Password_Action: String { return self._s[1981]! } + public var Profile_MessageLifetime5s: String { return self._s[1982]! } + public var Username_InvalidCharacters: String { return self._s[1983]! } + public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1984]! } + public var ScheduledMessages_ClearAll: String { return self._s[1985]! } + public var WallpaperPreview_CropBottomText: String { return self._s[1986]! } + public var AutoDownloadSettings_LimitBySize: String { return self._s[1987]! } + public var Settings_AddAccount: String { return self._s[1988]! } + public var Notification_CreatedChannel: String { return self._s[1991]! } public func PUSH_CHAT_DELETE_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1983]!, self._r[1983]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1992]!, self._r[1992]!, [_1, _2, _3]) } - public var Passcode_AppLockedAlert: String { return self._s[1985]! } - public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1986]! } - public var VoiceOver_Media_PlaybackStop: String { return self._s[1987]! } - public var Contacts_TopSection: String { return self._s[1988]! } - public var ChatList_DeleteForEveryoneConfirmationAction: String { return self._s[1989]! } + public var Passcode_AppLockedAlert: String { return self._s[1994]! } + public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1995]! } + public var VoiceOver_Media_PlaybackStop: String { return self._s[1996]! } + public var Contacts_TopSection: String { return self._s[1997]! } + public var ChatList_DeleteForEveryoneConfirmationAction: String { return self._s[1998]! } public func Conversation_SetReminder_RemindOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1990]!, self._r[1990]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1999]!, self._r[1999]!, [_0, _1]) } - public var Wallet_Info_Receive: String { return self._s[1991]! } - public var Wallet_Completed_ViewWallet: String { return self._s[1992]! } + public var Wallet_Info_Receive: String { return self._s[2000]! } + public var Wallet_Completed_ViewWallet: String { return self._s[2001]! } public func Time_MonthOfYear_m6(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1993]!, self._r[1993]!, [_0]) + return formatWithArgumentRanges(self._s[2002]!, self._r[2002]!, [_0]) } - public var ReportPeer_ReasonSpam: String { return self._s[1994]! } - public var UserInfo_TapToCall: String { return self._s[1995]! } - public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1997]! } - public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1998]! } - public var Common_Search: String { return self._s[1999]! } - public var ScheduledMessages_EmptyPlaceholder: String { return self._s[2000]! } + public var ReportPeer_ReasonSpam: String { return self._s[2003]! } + public var UserInfo_TapToCall: String { return self._s[2004]! } + public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[2006]! } + public var AutoDownloadSettings_DataUsageCustom: String { return self._s[2007]! } + public var Common_Search: String { return self._s[2008]! } + public var ScheduledMessages_EmptyPlaceholder: String { return self._s[2009]! } public func Channel_AdminLog_MessageChangedGroupGeoLocation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2001]!, self._r[2001]!, [_0]) + return formatWithArgumentRanges(self._s[2010]!, self._r[2010]!, [_0]) } - public var Wallet_Month_ShortJuly: String { return self._s[2002]! } - public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[2004]! } - public var Message_InvoiceLabel: String { return self._s[2005]! } - public var Conversation_InputTextPlaceholder: String { return self._s[2006]! } - public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[2007]! } + public var Wallet_Month_ShortJuly: String { return self._s[2011]! } + public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[2013]! } + public var Message_InvoiceLabel: String { return self._s[2014]! } + public var Conversation_InputTextPlaceholder: String { return self._s[2015]! } + public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[2016]! } public func Passport_Address_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2008]!, self._r[2008]!, [_0]) + return formatWithArgumentRanges(self._s[2017]!, self._r[2017]!, [_0]) } - public var IntentsSettings_Reset: String { return self._s[2009]! } - public var Conversation_Info: String { return self._s[2010]! } - public var Login_InfoDeletePhoto: String { return self._s[2011]! } - public var Passport_Language_vi: String { return self._s[2013]! } - public var UserInfo_ScamUserWarning: String { return self._s[2014]! } - public var Conversation_Search: String { return self._s[2015]! } - public var DialogList_DeleteBotConversationConfirmation: String { return self._s[2017]! } - public var ReportPeer_ReasonPornography: String { return self._s[2018]! } - public var AutoDownloadSettings_PhotosTitle: String { return self._s[2019]! } - public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[2020]! } - public var Map_LiveLocationGroupDescription: String { return self._s[2021]! } - public var Channel_Setup_TypeHeader: String { return self._s[2022]! } - public var AuthSessions_LoggedIn: String { return self._s[2023]! } - public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[2024]! } - public var Login_SmsRequestState3: String { return self._s[2025]! } - public var Passport_Address_EditUtilityBill: String { return self._s[2026]! } - public var Appearance_ReduceMotionInfo: String { return self._s[2027]! } - public var Join_ChannelsTooMuch: String { return self._s[2028]! } - public var Channel_Edit_LinkItem: String { return self._s[2029]! } - public var Privacy_Calls_P2PNever: String { return self._s[2030]! } - public var Conversation_AddToReadingList: String { return self._s[2032]! } - public var Share_MultipleMessagesDisabled: String { return self._s[2033]! } - public var Message_Animation: String { return self._s[2034]! } - public var Conversation_DefaultRestrictedMedia: String { return self._s[2035]! } - public var Map_Unknown: String { return self._s[2036]! } - public var AutoDownloadSettings_LastDelimeter: String { return self._s[2037]! } + public var IntentsSettings_Reset: String { return self._s[2018]! } + public var Conversation_Info: String { return self._s[2019]! } + public var Login_InfoDeletePhoto: String { return self._s[2020]! } + public var Passport_Language_vi: String { return self._s[2022]! } + public var UserInfo_ScamUserWarning: String { return self._s[2023]! } + public var Conversation_Search: String { return self._s[2024]! } + public var DialogList_DeleteBotConversationConfirmation: String { return self._s[2026]! } + public var ReportPeer_ReasonPornography: String { return self._s[2027]! } + public var AutoDownloadSettings_PhotosTitle: String { return self._s[2028]! } + public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[2029]! } + public var Map_LiveLocationGroupDescription: String { return self._s[2030]! } + public var Channel_Setup_TypeHeader: String { return self._s[2031]! } + public var AuthSessions_LoggedIn: String { return self._s[2032]! } + public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[2033]! } + public var Login_SmsRequestState3: String { return self._s[2034]! } + public var Passport_Address_EditUtilityBill: String { return self._s[2035]! } + public var Appearance_ReduceMotionInfo: String { return self._s[2036]! } + public var Join_ChannelsTooMuch: String { return self._s[2037]! } + public var Channel_Edit_LinkItem: String { return self._s[2038]! } + public var Privacy_Calls_P2PNever: String { return self._s[2039]! } + public var Conversation_AddToReadingList: String { return self._s[2041]! } + public var Share_MultipleMessagesDisabled: String { return self._s[2042]! } + public var Message_Animation: String { return self._s[2043]! } + public var Conversation_DefaultRestrictedMedia: String { return self._s[2044]! } + public var Map_Unknown: String { return self._s[2045]! } + public var AutoDownloadSettings_LastDelimeter: String { return self._s[2046]! } public func PUSH_PINNED_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2038]!, self._r[2038]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2047]!, self._r[2047]!, [_1, _2]) } public func Passport_FieldOneOf_Or(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2039]!, self._r[2039]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2048]!, self._r[2048]!, [_1, _2]) } - public var Call_StatusRequesting: String { return self._s[2040]! } - public var Conversation_SecretChatContextBotAlert: String { return self._s[2041]! } - public var SocksProxySetup_ProxyStatusChecking: String { return self._s[2042]! } + public var Call_StatusRequesting: String { return self._s[2049]! } + public var Conversation_SecretChatContextBotAlert: String { return self._s[2050]! } + public var SocksProxySetup_ProxyStatusChecking: String { return self._s[2051]! } public func PUSH_CHAT_MESSAGE_DOC(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2043]!, self._r[2043]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2052]!, self._r[2052]!, [_1, _2]) } public func Notification_PinnedLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2044]!, self._r[2044]!, [_0]) + return formatWithArgumentRanges(self._s[2053]!, self._r[2053]!, [_0]) } - public var Update_Skip: String { return self._s[2045]! } - public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[2046]! } - public var BlockedUsers_Title: String { return self._s[2047]! } - public var Weekday_Monday: String { return self._s[2048]! } + public var Update_Skip: String { return self._s[2054]! } + public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[2055]! } + public var BlockedUsers_Title: String { return self._s[2056]! } + public var Weekday_Monday: String { return self._s[2057]! } public func PUSH_CHANNEL_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2049]!, self._r[2049]!, [_1]) + return formatWithArgumentRanges(self._s[2058]!, self._r[2058]!, [_1]) } - public var Username_CheckingUsername: String { return self._s[2050]! } - public var NotificationsSound_Bell: String { return self._s[2051]! } - public var Conversation_SendMessageErrorFlood: String { return self._s[2052]! } - public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[2053]! } - public var ChannelMembers_ChannelAdminsTitle: String { return self._s[2054]! } - public var ChatSettings_Groups: String { return self._s[2055]! } - public var WallpaperPreview_PatternPaternDiscard: String { return self._s[2056]! } + public var Username_CheckingUsername: String { return self._s[2059]! } + public var NotificationsSound_Bell: String { return self._s[2060]! } + public var Conversation_SendMessageErrorFlood: String { return self._s[2061]! } + public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[2062]! } + public var ChannelMembers_ChannelAdminsTitle: String { return self._s[2063]! } + public var ChatSettings_Groups: String { return self._s[2064]! } + public var WallpaperPreview_PatternPaternDiscard: String { return self._s[2065]! } public func Conversation_SetReminder_RemindTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2057]!, self._r[2057]!, [_0]) + return formatWithArgumentRanges(self._s[2066]!, self._r[2066]!, [_0]) } - public var Your_card_was_declined: String { return self._s[2058]! } - public var TwoStepAuth_EnterPasswordHelp: String { return self._s[2060]! } - public var Wallet_Month_ShortApril: String { return self._s[2061]! } - public var ChatList_Unmute: String { return self._s[2062]! } - public var AuthSessions_AddDevice_ScanTitle: String { return self._s[2063]! } - public var PhotoEditor_CurvesAll: String { return self._s[2064]! } - public var Weekday_ShortTuesday: String { return self._s[2065]! } - public var DialogList_Read: String { return self._s[2066]! } - public var Appearance_AppIconClassic: String { return self._s[2067]! } - public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[2068]! } - public var Passport_Identity_Gender: String { return self._s[2069]! } + public var Your_card_was_declined: String { return self._s[2067]! } + public var TwoStepAuth_EnterPasswordHelp: String { return self._s[2069]! } + public var Wallet_Month_ShortApril: String { return self._s[2070]! } + public var ChatList_Unmute: String { return self._s[2071]! } + public var AuthSessions_AddDevice_ScanTitle: String { return self._s[2072]! } + public var PhotoEditor_CurvesAll: String { return self._s[2073]! } + public var Weekday_ShortTuesday: String { return self._s[2074]! } + public var DialogList_Read: String { return self._s[2075]! } + public var Appearance_AppIconClassic: String { return self._s[2076]! } + public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[2077]! } + public var Passport_Identity_Gender: String { return self._s[2078]! } public func Target_ShareGameConfirmationPrivate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2070]!, self._r[2070]!, [_0]) + return formatWithArgumentRanges(self._s[2079]!, self._r[2079]!, [_0]) } - public var Target_SelectGroup: String { return self._s[2071]! } - public var Map_HomeAndWorkInfo: String { return self._s[2073]! } + public var Target_SelectGroup: String { return self._s[2080]! } + public var Map_HomeAndWorkInfo: String { return self._s[2082]! } public func DialogList_EncryptedChatStartedIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2074]!, self._r[2074]!, [_0]) + return formatWithArgumentRanges(self._s[2083]!, self._r[2083]!, [_0]) } - public var Passport_Language_en: String { return self._s[2075]! } - public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[2076]! } - public var Channel_Username_CreatePublicLinkHelp: String { return self._s[2077]! } - public var Login_CancelPhoneVerificationContinue: String { return self._s[2078]! } - public var ScheduledMessages_SendNow: String { return self._s[2079]! } - public var Checkout_NewCard_PaymentCard: String { return self._s[2081]! } - public var Login_InfoHelp: String { return self._s[2082]! } - public var Appearance_BubbleCorners_AdjustAdjacent: String { return self._s[2083]! } - public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[2084]! } - public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[2085]! } + public var Passport_Language_en: String { return self._s[2084]! } + public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[2085]! } + public var Channel_Username_CreatePublicLinkHelp: String { return self._s[2086]! } + public var Login_CancelPhoneVerificationContinue: String { return self._s[2087]! } + public var ScheduledMessages_SendNow: String { return self._s[2088]! } + public var Checkout_NewCard_PaymentCard: String { return self._s[2090]! } + public var Login_InfoHelp: String { return self._s[2091]! } + public var Appearance_BubbleCorners_AdjustAdjacent: String { return self._s[2092]! } + public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[2093]! } + public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[2094]! } public func Channel_AdminLog_MessageChangedLinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2086]!, self._r[2086]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2095]!, self._r[2095]!, [_1, _2]) } - public var SocksProxySetup_AddProxy: String { return self._s[2089]! } - public var CreatePoll_Title: String { return self._s[2090]! } - public var MessagePoll_QuizNoUsers: String { return self._s[2091]! } - public var Conversation_ViewTheme: String { return self._s[2092]! } - public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[2093]! } - public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[2094]! } - public var TwoFactorSetup_Intro_Text: String { return self._s[2095]! } - public var UserInfo_GroupsInCommon: String { return self._s[2096]! } - public var TelegramWallet_Intro_TermsUrl: String { return self._s[2097]! } - public var Call_AudioRouteHide: String { return self._s[2098]! } + public var SocksProxySetup_AddProxy: String { return self._s[2098]! } + public var CreatePoll_Title: String { return self._s[2099]! } + public var MessagePoll_QuizNoUsers: String { return self._s[2100]! } + public var Conversation_ViewTheme: String { return self._s[2101]! } + public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[2102]! } + public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[2103]! } + public var TwoFactorSetup_Intro_Text: String { return self._s[2104]! } + public var UserInfo_GroupsInCommon: String { return self._s[2105]! } + public var TelegramWallet_Intro_TermsUrl: String { return self._s[2106]! } + public var Call_AudioRouteHide: String { return self._s[2107]! } public func Wallet_Info_TransactionDateHeader(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2100]!, self._r[2100]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2109]!, self._r[2109]!, [_1, _2]) } - public var ContactInfo_PhoneLabelMobile: String { return self._s[2101]! } - public var IntentsSettings_SuggestedChatsInfo: String { return self._s[2102]! } - public var CreatePoll_QuizOptionsHeader: String { return self._s[2103]! } + public var ContactInfo_PhoneLabelMobile: String { return self._s[2110]! } + public var IntentsSettings_SuggestedChatsInfo: String { return self._s[2111]! } + public var CreatePoll_QuizOptionsHeader: String { return self._s[2112]! } public func ChatList_LeaveGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2104]!, self._r[2104]!, [_0]) + return formatWithArgumentRanges(self._s[2113]!, self._r[2113]!, [_0]) } - public var TextFormat_Bold: String { return self._s[2105]! } - public var FastTwoStepSetup_EmailSection: String { return self._s[2106]! } - public var StickerPackActionInfo_AddedTitle: String { return self._s[2107]! } - public var Notifications_Title: String { return self._s[2108]! } - public var Group_Username_InvalidTooShort: String { return self._s[2109]! } - public var Channel_ErrorAddTooMuch: String { return self._s[2110]! } + public var TextFormat_Bold: String { return self._s[2114]! } + public var FastTwoStepSetup_EmailSection: String { return self._s[2115]! } + public var StickerPackActionInfo_AddedTitle: String { return self._s[2116]! } + public var Notifications_Title: String { return self._s[2117]! } + public var Group_Username_InvalidTooShort: String { return self._s[2118]! } + public var Channel_ErrorAddTooMuch: String { return self._s[2119]! } public func DialogList_MultipleTypingSuffix(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2111]!, self._r[2111]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[2120]!, self._r[2120]!, ["\(_0)"]) } - public var VoiceOver_DiscardPreparedContent: String { return self._s[2113]! } - public var Stickers_SuggestAdded: String { return self._s[2114]! } - public var Login_CountryCode: String { return self._s[2115]! } - public var ChatSettings_AutoPlayVideos: String { return self._s[2116]! } - public var Map_GetDirections: String { return self._s[2117]! } - public var Wallet_Receive_ShareInvoiceUrl: String { return self._s[2118]! } - public var Login_PhoneFloodError: String { return self._s[2119]! } + public var VoiceOver_DiscardPreparedContent: String { return self._s[2122]! } + public var Stickers_SuggestAdded: String { return self._s[2123]! } + public var Login_CountryCode: String { return self._s[2124]! } + public var ChatSettings_AutoPlayVideos: String { return self._s[2125]! } + public var Map_GetDirections: String { return self._s[2126]! } + public var Wallet_Receive_ShareInvoiceUrl: String { return self._s[2127]! } + public var Login_PhoneFloodError: String { return self._s[2128]! } public func Time_MonthOfYear_m3(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2120]!, self._r[2120]!, [_0]) + return formatWithArgumentRanges(self._s[2129]!, self._r[2129]!, [_0]) } public func Wallet_Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2121]!, self._r[2121]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2130]!, self._r[2130]!, [_1, _2, _3]) } - public var IntentsSettings_SuggestedChatsPrivateChats: String { return self._s[2122]! } - public var Settings_SetUsername: String { return self._s[2124]! } - public var Group_Location_ChangeLocation: String { return self._s[2125]! } - public var Notification_GroupInviterSelf: String { return self._s[2126]! } - public var InstantPage_TapToOpenLink: String { return self._s[2127]! } + public var IntentsSettings_SuggestedChatsPrivateChats: String { return self._s[2131]! } + public var Settings_SetUsername: String { return self._s[2133]! } + public var Group_Location_ChangeLocation: String { return self._s[2134]! } + public var Notification_GroupInviterSelf: String { return self._s[2135]! } + public var InstantPage_TapToOpenLink: String { return self._s[2136]! } public func Notification_ChannelInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2128]!, self._r[2128]!, [_0]) + return formatWithArgumentRanges(self._s[2137]!, self._r[2137]!, [_0]) } - public var Watch_Suggestion_TalkLater: String { return self._s[2129]! } - public var SecretChat_Title: String { return self._s[2130]! } - public var Group_UpgradeNoticeText1: String { return self._s[2131]! } - public var AuthSessions_Title: String { return self._s[2132]! } + public var Watch_Suggestion_TalkLater: String { return self._s[2138]! } + public var SecretChat_Title: String { return self._s[2139]! } + public var Group_UpgradeNoticeText1: String { return self._s[2140]! } + public var AuthSessions_Title: String { return self._s[2141]! } public func TextFormat_AddLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2133]!, self._r[2133]!, [_0]) + return formatWithArgumentRanges(self._s[2142]!, self._r[2142]!, [_0]) } - public var PhotoEditor_CropAuto: String { return self._s[2134]! } - public var Channel_About_Title: String { return self._s[2135]! } - public var Theme_ThemeChanged: String { return self._s[2136]! } - public var FastTwoStepSetup_EmailHelp: String { return self._s[2137]! } + public var PhotoEditor_CropAuto: String { return self._s[2143]! } + public var Channel_About_Title: String { return self._s[2144]! } + public var Theme_ThemeChanged: String { return self._s[2145]! } + public var FastTwoStepSetup_EmailHelp: String { return self._s[2146]! } public func Conversation_Bytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2139]!, self._r[2139]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[2148]!, self._r[2148]!, ["\(_0)"]) } - public var VoiceOver_MessageContextReport: String { return self._s[2140]! } - public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[2142]! } - public var Group_Setup_HistoryVisibleHelp: String { return self._s[2143]! } + public var VoiceOver_MessageContextReport: String { return self._s[2149]! } + public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[2151]! } + public var Group_Setup_HistoryVisibleHelp: String { return self._s[2152]! } public func PUSH_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2144]!, self._r[2144]!, [_1]) + return formatWithArgumentRanges(self._s[2153]!, self._r[2153]!, [_1]) } public func SharedMedia_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2146]!, self._r[2146]!, [_0]) + return formatWithArgumentRanges(self._s[2155]!, self._r[2155]!, [_0]) } public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2147]!, self._r[2147]!, [_0]) + return formatWithArgumentRanges(self._s[2156]!, self._r[2156]!, [_0]) } - public var Privacy_PaymentsClearInfoHelp: String { return self._s[2148]! } - public var PeopleNearby_DiscoverDescription: String { return self._s[2150]! } - public var Presence_online: String { return self._s[2152]! } - public var PasscodeSettings_Title: String { return self._s[2153]! } - public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[2154]! } - public var Web_OpenExternal: String { return self._s[2155]! } - public var AutoDownloadSettings_AutoDownload: String { return self._s[2157]! } - public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[2158]! } - public var LocalGroup_Title: String { return self._s[2159]! } + public var Privacy_PaymentsClearInfoHelp: String { return self._s[2157]! } + public var PeopleNearby_DiscoverDescription: String { return self._s[2159]! } + public var Presence_online: String { return self._s[2161]! } + public var PasscodeSettings_Title: String { return self._s[2162]! } + public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[2163]! } + public var Web_OpenExternal: String { return self._s[2164]! } + public var AutoDownloadSettings_AutoDownload: String { return self._s[2166]! } + public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[2167]! } + public var LocalGroup_Title: String { return self._s[2168]! } public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2160]!, self._r[2160]!, [_0]) - } - public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[2161]! } - public var Conversation_StopQuizConfirmation: String { return self._s[2162]! } - public var Map_YouAreHere: String { return self._s[2163]! } - public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2164]!, self._r[2164]!, [_0]) - } - public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2165]!, self._r[2165]!, [_0]) - } - public var Theme_Context_ChangeColors: String { return self._s[2166]! } - public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[2167]! } - public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[2168]! } - public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2169]!, self._r[2169]!, [_0]) } - public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2170]!, self._r[2170]!, [_0]) - } - public var SocksProxySetup_Username: String { return self._s[2171]! } - public var Bot_Start: String { return self._s[2172]! } - public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { + public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[2170]! } + public var Conversation_StopQuizConfirmation: String { return self._s[2171]! } + public var Map_YouAreHere: String { return self._s[2172]! } + public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2173]!, self._r[2173]!, [_0]) } - public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { + public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2174]!, self._r[2174]!, [_0]) } - public var Contacts_SortByPresence: String { return self._s[2175]! } - public var AccentColor_Title: String { return self._s[2177]! } - public var Conversation_DiscardVoiceMessageTitle: String { return self._s[2178]! } + public var Theme_Context_ChangeColors: String { return self._s[2175]! } + public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[2176]! } + public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[2177]! } + public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2178]!, self._r[2178]!, [_0]) + } + public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2179]!, self._r[2179]!, [_0]) + } + public var SocksProxySetup_Username: String { return self._s[2180]! } + public var Bot_Start: String { return self._s[2181]! } + public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2182]!, self._r[2182]!, [_0]) + } + public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2183]!, self._r[2183]!, [_0]) + } + public var Contacts_SortByPresence: String { return self._s[2184]! } + public var AccentColor_Title: String { return self._s[2187]! } + public var Conversation_DiscardVoiceMessageTitle: String { return self._s[2188]! } public func PUSH_CHAT_CREATED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2179]!, self._r[2179]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2189]!, self._r[2189]!, [_1, _2]) } public func PrivacySettings_LastSeenContactsMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2180]!, self._r[2180]!, [_0]) + return formatWithArgumentRanges(self._s[2190]!, self._r[2190]!, [_0]) } public func Channel_AdminLog_MessageChangedLinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2181]!, self._r[2181]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2191]!, self._r[2191]!, [_1, _2]) } - public var Passport_Email_EnterOtherEmail: String { return self._s[2182]! } - public var Login_InfoAvatarPhoto: String { return self._s[2183]! } - public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[2184]! } - public var Tour_Title4: String { return self._s[2185]! } - public var Passport_Identity_Translation: String { return self._s[2186]! } - public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[2187]! } - public var Login_TermsOfServiceLabel: String { return self._s[2189]! } - public var Passport_Language_it: String { return self._s[2190]! } - public var KeyCommand_JumpToNextUnreadChat: String { return self._s[2191]! } - public var Passport_Identity_SelfieHelp: String { return self._s[2192]! } - public var Conversation_ClearAll: String { return self._s[2194]! } - public var Wallet_Send_UninitializedText: String { return self._s[2196]! } - public var Channel_OwnershipTransfer_Title: String { return self._s[2197]! } - public var TwoStepAuth_FloodError: String { return self._s[2198]! } + public var Passport_Email_EnterOtherEmail: String { return self._s[2192]! } + public var Login_InfoAvatarPhoto: String { return self._s[2193]! } + public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[2194]! } + public var Tour_Title4: String { return self._s[2195]! } + public var Passport_Identity_Translation: String { return self._s[2196]! } + public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[2197]! } + public var Login_TermsOfServiceLabel: String { return self._s[2199]! } + public var Passport_Language_it: String { return self._s[2200]! } + public var KeyCommand_JumpToNextUnreadChat: String { return self._s[2201]! } + public var Passport_Identity_SelfieHelp: String { return self._s[2202]! } + public var Conversation_ClearAll: String { return self._s[2204]! } + public var Wallet_Send_UninitializedText: String { return self._s[2206]! } + public var Channel_OwnershipTransfer_Title: String { return self._s[2207]! } + public var TwoStepAuth_FloodError: String { return self._s[2208]! } public func PUSH_CHANNEL_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2199]!, self._r[2199]!, [_1]) + return formatWithArgumentRanges(self._s[2209]!, self._r[2209]!, [_1]) } - public var Paint_Delete: String { return self._s[2200]! } + public var Paint_Delete: String { return self._s[2210]! } public func Wallet_Sent_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2201]!, self._r[2201]!, [_0]) + return formatWithArgumentRanges(self._s[2211]!, self._r[2211]!, [_0]) } - public var Privacy_AddNewPeer: String { return self._s[2202]! } + public var Privacy_AddNewPeer: String { return self._s[2212]! } public func Channel_AdminLog_MessageRank(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2203]!, self._r[2203]!, [_1]) + return formatWithArgumentRanges(self._s[2213]!, self._r[2213]!, [_1]) } - public var LogoutOptions_SetPasscodeText: String { return self._s[2204]! } + public var LogoutOptions_SetPasscodeText: String { return self._s[2214]! } public func Passport_AcceptHelp(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2205]!, self._r[2205]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2215]!, self._r[2215]!, [_1, _2]) } - public var Message_PinnedAudioMessage: String { return self._s[2206]! } + public var Message_PinnedAudioMessage: String { return self._s[2216]! } public func Watch_Time_ShortTodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2207]!, self._r[2207]!, [_0]) + return formatWithArgumentRanges(self._s[2217]!, self._r[2217]!, [_0]) } - public var Notification_Mute1hMin: String { return self._s[2208]! } - public var Notifications_GroupNotificationsSound: String { return self._s[2209]! } - public var Wallet_Month_GenNovember: String { return self._s[2210]! } - public var SocksProxySetup_ShareProxyList: String { return self._s[2211]! } - public var Conversation_MessageEditedLabel: String { return self._s[2212]! } + public var Notification_Mute1hMin: String { return self._s[2218]! } + public var Notifications_GroupNotificationsSound: String { return self._s[2219]! } + public var Wallet_Month_GenNovember: String { return self._s[2220]! } + public var SocksProxySetup_ShareProxyList: String { return self._s[2221]! } + public var Conversation_MessageEditedLabel: String { return self._s[2222]! } public func ClearCache_Success(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2213]!, self._r[2213]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2223]!, self._r[2223]!, [_0, _1]) } - public var Notification_Exceptions_AlwaysOff: String { return self._s[2214]! } - public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[2215]! } + public var Notification_Exceptions_AlwaysOff: String { return self._s[2224]! } + public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[2225]! } public func Channel_AdminLog_MessageAdmin(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2216]!, self._r[2216]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[2226]!, self._r[2226]!, [_0, _1, _2]) } - public var NetworkUsageSettings_ResetStats: String { return self._s[2217]! } + public var NetworkUsageSettings_ResetStats: String { return self._s[2227]! } public func PUSH_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2218]!, self._r[2218]!, [_1]) + return formatWithArgumentRanges(self._s[2228]!, self._r[2228]!, [_1]) } - public var AccessDenied_LocationTracking: String { return self._s[2219]! } - public var Month_GenOctober: String { return self._s[2220]! } - public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[2221]! } - public var EnterPasscode_EnterPasscode: String { return self._s[2222]! } - public var MediaPicker_TimerTooltip: String { return self._s[2224]! } - public var SharedMedia_TitleAll: String { return self._s[2225]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[2228]! } - public var Conversation_RestrictedMedia: String { return self._s[2229]! } - public var AccessDenied_PhotosRestricted: String { return self._s[2230]! } - public var Privacy_Forwards_WhoCanForward: String { return self._s[2232]! } - public var ChangePhoneNumberCode_Called: String { return self._s[2233]! } + public var AccessDenied_LocationTracking: String { return self._s[2229]! } + public var Month_GenOctober: String { return self._s[2230]! } + public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[2231]! } + public var EnterPasscode_EnterPasscode: String { return self._s[2232]! } + public var MediaPicker_TimerTooltip: String { return self._s[2234]! } + public var SharedMedia_TitleAll: String { return self._s[2235]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[2238]! } + public var Conversation_RestrictedMedia: String { return self._s[2239]! } + public var AccessDenied_PhotosRestricted: String { return self._s[2240]! } + public var Privacy_Forwards_WhoCanForward: String { return self._s[2242]! } + public var ChangePhoneNumberCode_Called: String { return self._s[2243]! } public func Notification_PinnedDocumentMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2234]!, self._r[2234]!, [_0]) - } - public var Conversation_SavedMessages: String { return self._s[2237]! } - public var Your_cards_expiration_month_is_invalid: String { return self._s[2239]! } - public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[2240]! } - public func Target_ShareGameConfirmationGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2242]!, self._r[2242]!, [_0]) - } - public var VoiceOver_Chat_YourMessage: String { return self._s[2243]! } - public func VoiceOver_Chat_Title(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2244]!, self._r[2244]!, [_0]) } - public var ReportPeer_AlertSuccess: String { return self._s[2245]! } - public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[2246]! } - public func InstantPage_RelatedArticleAuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2247]!, self._r[2247]!, [_1, _2]) - } - public var Checkout_PasswordEntry_Title: String { return self._s[2248]! } - public var PhotoEditor_FadeTool: String { return self._s[2249]! } - public var Privacy_ContactsReset: String { return self._s[2250]! } - public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { + public var Conversation_SavedMessages: String { return self._s[2247]! } + public var Your_cards_expiration_month_is_invalid: String { return self._s[2249]! } + public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[2250]! } + public func Target_ShareGameConfirmationGroup(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2252]!, self._r[2252]!, [_0]) } - public var Message_PinnedVideoMessage: String { return self._s[2253]! } - public var ChatList_Mute: String { return self._s[2254]! } + public var VoiceOver_Chat_YourMessage: String { return self._s[2253]! } + public func VoiceOver_Chat_Title(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2254]!, self._r[2254]!, [_0]) + } + public var ReportPeer_AlertSuccess: String { return self._s[2255]! } + public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[2256]! } + public func InstantPage_RelatedArticleAuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2257]!, self._r[2257]!, [_1, _2]) + } + public var Checkout_PasswordEntry_Title: String { return self._s[2258]! } + public var PhotoEditor_FadeTool: String { return self._s[2259]! } + public var Privacy_ContactsReset: String { return self._s[2260]! } + public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2262]!, self._r[2262]!, [_0]) + } + public var Message_PinnedVideoMessage: String { return self._s[2263]! } + public var ChatList_Mute: String { return self._s[2264]! } public func Wallet_Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2255]!, self._r[2255]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2265]!, self._r[2265]!, [_1, _2, _3]) } - public var Permissions_CellularDataText_v0: String { return self._s[2256]! } - public var Conversation_PinnedQuiz: String { return self._s[2258]! } - public var ShareMenu_SelectChats: String { return self._s[2260]! } - public var ChatList_Context_Unarchive: String { return self._s[2261]! } - public var MusicPlayer_VoiceNote: String { return self._s[2262]! } - public var Conversation_RestrictedText: String { return self._s[2263]! } - public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[2264]! } - public var Wallet_Month_GenApril: String { return self._s[2265]! } - public var Wallet_Month_ShortMarch: String { return self._s[2266]! } - public var TwoStepAuth_DisableSuccess: String { return self._s[2267]! } - public var Cache_Videos: String { return self._s[2268]! } - public var PrivacySettings_PhoneNumber: String { return self._s[2269]! } - public var Wallet_Month_GenFebruary: String { return self._s[2270]! } - public var FeatureDisabled_Oops: String { return self._s[2272]! } - public var Passport_Address_PostcodePlaceholder: String { return self._s[2273]! } + public var Permissions_CellularDataText_v0: String { return self._s[2266]! } + public var Conversation_PinnedQuiz: String { return self._s[2268]! } + public var ShareMenu_SelectChats: String { return self._s[2270]! } + public var ChatList_Context_Unarchive: String { return self._s[2271]! } + public var MusicPlayer_VoiceNote: String { return self._s[2272]! } + public var Conversation_RestrictedText: String { return self._s[2273]! } + public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[2274]! } + public var Wallet_Month_GenApril: String { return self._s[2275]! } + public var Wallet_Month_ShortMarch: String { return self._s[2276]! } + public var TwoStepAuth_DisableSuccess: String { return self._s[2277]! } + public var Cache_Videos: String { return self._s[2278]! } + public var PrivacySettings_PhoneNumber: String { return self._s[2279]! } + public var Wallet_Month_GenFebruary: String { return self._s[2280]! } + public var FeatureDisabled_Oops: String { return self._s[2282]! } + public var Passport_Address_PostcodePlaceholder: String { return self._s[2283]! } public func AddContact_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2274]!, self._r[2274]!, [_0]) + return formatWithArgumentRanges(self._s[2284]!, self._r[2284]!, [_0]) } - public var Stickers_GroupStickersHelp: String { return self._s[2276]! } - public var GroupPermission_NoSendPolls: String { return self._s[2277]! } - public var Wallet_Qr_ScanCode: String { return self._s[2278]! } - public var Message_VideoExpired: String { return self._s[2280]! } - public var GroupInfo_GroupHistoryVisible: String { return self._s[2281]! } - public var Notifications_Badge: String { return self._s[2282]! } - public var Wallet_Receive_AddressCopied: String { return self._s[2283]! } - public var CreatePoll_OptionPlaceholder: String { return self._s[2284]! } - public var Username_InvalidTooShort: String { return self._s[2285]! } - public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[2286]! } - public var Channel_AdminLog_PinMessages: String { return self._s[2287]! } - public var ArchivedChats_IntroTitle3: String { return self._s[2288]! } + public var Stickers_GroupStickersHelp: String { return self._s[2286]! } + public var GroupPermission_NoSendPolls: String { return self._s[2287]! } + public var Wallet_Qr_ScanCode: String { return self._s[2288]! } + public var Message_VideoExpired: String { return self._s[2290]! } + public var GroupInfo_GroupHistoryVisible: String { return self._s[2291]! } + public var Notifications_Badge: String { return self._s[2292]! } + public var Wallet_Receive_AddressCopied: String { return self._s[2293]! } + public var CreatePoll_OptionPlaceholder: String { return self._s[2294]! } + public var Username_InvalidTooShort: String { return self._s[2295]! } + public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[2296]! } + public var Channel_AdminLog_PinMessages: String { return self._s[2297]! } + public var ArchivedChats_IntroTitle3: String { return self._s[2298]! } public func Notification_MessageLifetimeRemoved(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2289]!, self._r[2289]!, [_1]) + return formatWithArgumentRanges(self._s[2299]!, self._r[2299]!, [_1]) } - public var Permissions_SiriAllowInSettings_v0: String { return self._s[2290]! } - public var Conversation_DefaultRestrictedText: String { return self._s[2291]! } - public var SharedMedia_CategoryDocs: String { return self._s[2294]! } + public var Permissions_SiriAllowInSettings_v0: String { return self._s[2300]! } + public var Conversation_DefaultRestrictedText: String { return self._s[2301]! } + public var SharedMedia_CategoryDocs: String { return self._s[2304]! } public func PUSH_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2295]!, self._r[2295]!, [_1]) + return formatWithArgumentRanges(self._s[2305]!, self._r[2305]!, [_1]) } - public var Wallet_Send_UninitializedTitle: String { return self._s[2296]! } - public var StickerPackActionInfo_ArchivedTitle: String { return self._s[2297]! } - public var Privacy_Forwards_NeverLink: String { return self._s[2299]! } + public var Wallet_Send_UninitializedTitle: String { return self._s[2306]! } + public var StickerPackActionInfo_ArchivedTitle: String { return self._s[2307]! } + public var Privacy_Forwards_NeverLink: String { return self._s[2309]! } public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2300]!, self._r[2300]!, [_1]) + return formatWithArgumentRanges(self._s[2310]!, self._r[2310]!, [_1]) } - public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[2301]! } + public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[2311]! } public func Time_MonthOfYear_m12(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2302]!, self._r[2302]!, [_0]) + return formatWithArgumentRanges(self._s[2312]!, self._r[2312]!, [_0]) } - public var ChatSettings_PrivateChats: String { return self._s[2303]! } - public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[2304]! } - public var Conversation_PrivateMessageLinkCopied: String { return self._s[2305]! } - public var Channel_UpdatePhotoItem: String { return self._s[2306]! } - public var GroupInfo_LeftStatus: String { return self._s[2307]! } - public var Watch_MessageView_Forward: String { return self._s[2309]! } - public var ReportPeer_ReasonChildAbuse: String { return self._s[2310]! } - public var Cache_ClearEmpty: String { return self._s[2312]! } - public var Localization_LanguageName: String { return self._s[2313]! } - public var Wallet_AccessDenied_Title: String { return self._s[2314]! } - public var WebSearch_GIFs: String { return self._s[2315]! } - public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2316]! } - public var Wallet_AccessDenied_Settings: String { return self._s[2317]! } - public var Username_InvalidStartsWithNumber: String { return self._s[2318]! } - public var Common_Back: String { return self._s[2319]! } - public var GroupInfo_Permissions_EditingDisabled: String { return self._s[2320]! } - public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2321]! } - public var Wallet_Send_Send: String { return self._s[2322]! } + public var ChatSettings_PrivateChats: String { return self._s[2313]! } + public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[2314]! } + public var Conversation_PrivateMessageLinkCopied: String { return self._s[2315]! } + public var Channel_UpdatePhotoItem: String { return self._s[2316]! } + public var GroupInfo_LeftStatus: String { return self._s[2317]! } + public var Watch_MessageView_Forward: String { return self._s[2319]! } + public var ReportPeer_ReasonChildAbuse: String { return self._s[2320]! } + public var Cache_ClearEmpty: String { return self._s[2322]! } + public var Localization_LanguageName: String { return self._s[2323]! } + public var Wallet_AccessDenied_Title: String { return self._s[2324]! } + public var WebSearch_GIFs: String { return self._s[2325]! } + public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2326]! } + public var Wallet_AccessDenied_Settings: String { return self._s[2327]! } + public var Username_InvalidStartsWithNumber: String { return self._s[2328]! } + public var Common_Back: String { return self._s[2329]! } + public var GroupInfo_Permissions_EditingDisabled: String { return self._s[2330]! } + public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2331]! } + public var Wallet_Send_Send: String { return self._s[2332]! } public func PUSH_CHANNEL_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2324]!, self._r[2324]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2334]!, self._r[2334]!, [_1, _2]) } - public var Wallet_Info_RefreshErrorTitle: String { return self._s[2325]! } - public var Wallet_Month_GenJune: String { return self._s[2326]! } - public var Passport_Email_Help: String { return self._s[2327]! } - public var Watch_Conversation_Reply: String { return self._s[2329]! } - public var Conversation_EditingMessageMediaChange: String { return self._s[2332]! } - public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2333]! } - public var Channel_BanUser_Unban: String { return self._s[2335]! } - public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2336]! } - public var Group_Username_CreatePublicLinkHelp: String { return self._s[2337]! } - public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2339]! } - public var Wallet_Send_AddressHeader: String { return self._s[2340]! } - public var Passport_Identity_Name: String { return self._s[2341]! } + public var Wallet_Info_RefreshErrorTitle: String { return self._s[2335]! } + public var Wallet_Month_GenJune: String { return self._s[2336]! } + public var Passport_Email_Help: String { return self._s[2337]! } + public var Watch_Conversation_Reply: String { return self._s[2339]! } + public var Conversation_EditingMessageMediaChange: String { return self._s[2342]! } + public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2343]! } + public var Channel_BanUser_Unban: String { return self._s[2345]! } + public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2346]! } + public var Group_Username_CreatePublicLinkHelp: String { return self._s[2347]! } + public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2349]! } + public var Wallet_Send_AddressHeader: String { return self._s[2350]! } + public var Passport_Identity_Name: String { return self._s[2351]! } public func Channel_DiscussionGroup_HeaderGroupSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2342]!, self._r[2342]!, [_0]) + return formatWithArgumentRanges(self._s[2352]!, self._r[2352]!, [_0]) } - public var GroupRemoved_ViewUserInfo: String { return self._s[2343]! } - public var Conversation_BlockUser: String { return self._s[2344]! } - public var Month_GenJanuary: String { return self._s[2345]! } - public var ChatSettings_TextSize: String { return self._s[2346]! } - public var Notification_PassportValuePhone: String { return self._s[2347]! } - public var MediaPlayer_UnknownArtist: String { return self._s[2348]! } - public var Passport_Language_ne: String { return self._s[2349]! } - public var Notification_CallBack: String { return self._s[2350]! } - public var Wallet_SecureStorageReset_BiometryTouchId: String { return self._s[2351]! } - public var TwoStepAuth_EmailHelp: String { return self._s[2352]! } + public var GroupRemoved_ViewUserInfo: String { return self._s[2353]! } + public var Conversation_BlockUser: String { return self._s[2354]! } + public var Month_GenJanuary: String { return self._s[2355]! } + public var ChatSettings_TextSize: String { return self._s[2356]! } + public var Notification_PassportValuePhone: String { return self._s[2357]! } + public var MediaPlayer_UnknownArtist: String { return self._s[2358]! } + public var Passport_Language_ne: String { return self._s[2359]! } + public var Notification_CallBack: String { return self._s[2360]! } + public var Wallet_SecureStorageReset_BiometryTouchId: String { return self._s[2361]! } + public var TwoStepAuth_EmailHelp: String { return self._s[2362]! } public func Time_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2353]!, self._r[2353]!, [_0]) + return formatWithArgumentRanges(self._s[2363]!, self._r[2363]!, [_0]) } - public var Channel_Info_Management: String { return self._s[2354]! } - public var Passport_FieldIdentityUploadHelp: String { return self._s[2355]! } - public var Stickers_FrequentlyUsed: String { return self._s[2356]! } - public var Channel_BanUser_PermissionSendMessages: String { return self._s[2357]! } - public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2359]! } + public var Channel_Info_Management: String { return self._s[2364]! } + public var Passport_FieldIdentityUploadHelp: String { return self._s[2365]! } + public var Stickers_FrequentlyUsed: String { return self._s[2367]! } + public var Channel_BanUser_PermissionSendMessages: String { return self._s[2368]! } + public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2370]! } public func LOCAL_CHANNEL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2360]!, self._r[2360]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[2371]!, self._r[2371]!, [_1, "\(_2)"]) } - public var TwoFactorSetup_Password_Title: String { return self._s[2361]! } - public var Passport_Address_EditResidentialAddress: String { return self._s[2362]! } - public var PrivacyPolicy_DeclineTitle: String { return self._s[2363]! } - public var CreatePoll_TextHeader: String { return self._s[2364]! } + public var TwoFactorSetup_Password_Title: String { return self._s[2372]! } + public var Passport_Address_EditResidentialAddress: String { return self._s[2373]! } + public var PrivacyPolicy_DeclineTitle: String { return self._s[2374]! } + public var CreatePoll_TextHeader: String { return self._s[2375]! } public func Checkout_SavePasswordTimeoutAndTouchId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2365]!, self._r[2365]!, [_0]) + return formatWithArgumentRanges(self._s[2376]!, self._r[2376]!, [_0]) } - public var PhotoEditor_QualityMedium: String { return self._s[2366]! } - public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2367]! } - public var Conversation_StatusKickedFromChannel: String { return self._s[2369]! } - public var CheckoutInfo_ReceiverInfoName: String { return self._s[2370]! } - public var Group_ErrorSendRestrictedStickers: String { return self._s[2371]! } + public var PhotoEditor_QualityMedium: String { return self._s[2377]! } + public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2378]! } + public var Conversation_StatusKickedFromChannel: String { return self._s[2380]! } + public var CheckoutInfo_ReceiverInfoName: String { return self._s[2381]! } + public var Group_ErrorSendRestrictedStickers: String { return self._s[2382]! } public func Conversation_RestrictedInlineTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2372]!, self._r[2372]!, [_0]) + return formatWithArgumentRanges(self._s[2383]!, self._r[2383]!, [_0]) } public func Channel_AdminLog_MessageTransferedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2373]!, self._r[2373]!, [_1]) + return formatWithArgumentRanges(self._s[2384]!, self._r[2384]!, [_1]) } - public var LogoutOptions_LogOutWalletInfo: String { return self._s[2374]! } - public var TwoFactorSetup_Email_SkipConfirmationTitle: String { return self._s[2375]! } - public var Conversation_LinkDialogOpen: String { return self._s[2377]! } - public var TwoFactorSetup_Hint_Title: String { return self._s[2378]! } - public var VoiceOver_Chat_PollNoVotes: String { return self._s[2379]! } - public var Settings_Username: String { return self._s[2381]! } - public var Conversation_Block: String { return self._s[2383]! } - public var Wallpaper_Wallpaper: String { return self._s[2384]! } - public var SocksProxySetup_UseProxy: String { return self._s[2386]! } - public var Wallet_Send_Confirmation: String { return self._s[2387]! } - public var EditTheme_UploadEditedTheme: String { return self._s[2388]! } - public var UserInfo_ShareMyContactInfo: String { return self._s[2389]! } - public var MessageTimer_Forever: String { return self._s[2390]! } - public var Privacy_Calls_WhoCanCallMe: String { return self._s[2391]! } - public var PhotoEditor_DiscardChanges: String { return self._s[2392]! } - public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2393]! } - public var Passport_Language_da: String { return self._s[2394]! } - public var SocksProxySetup_PortPlaceholder: String { return self._s[2395]! } + public var LogoutOptions_LogOutWalletInfo: String { return self._s[2385]! } + public var TwoFactorSetup_Email_SkipConfirmationTitle: String { return self._s[2386]! } + public var Conversation_LinkDialogOpen: String { return self._s[2388]! } + public var TwoFactorSetup_Hint_Title: String { return self._s[2389]! } + public var VoiceOver_Chat_PollNoVotes: String { return self._s[2390]! } + public var Settings_Username: String { return self._s[2392]! } + public var Conversation_Block: String { return self._s[2394]! } + public var Wallpaper_Wallpaper: String { return self._s[2395]! } + public var SocksProxySetup_UseProxy: String { return self._s[2397]! } + public var Wallet_Send_Confirmation: String { return self._s[2398]! } + public var EditTheme_UploadEditedTheme: String { return self._s[2399]! } + public var UserInfo_ShareMyContactInfo: String { return self._s[2400]! } + public var MessageTimer_Forever: String { return self._s[2401]! } + public var Privacy_Calls_WhoCanCallMe: String { return self._s[2402]! } + public var PhotoEditor_DiscardChanges: String { return self._s[2403]! } + public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2404]! } + public var Passport_Language_da: String { return self._s[2405]! } + public var SocksProxySetup_PortPlaceholder: String { return self._s[2407]! } public func SecretGIF_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2396]!, self._r[2396]!, [_0]) + return formatWithArgumentRanges(self._s[2408]!, self._r[2408]!, [_0]) } - public var Passport_Address_EditPassportRegistration: String { return self._s[2397]! } + public var Passport_Address_EditPassportRegistration: String { return self._s[2409]! } public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2399]!, self._r[2399]!, [_0]) + return formatWithArgumentRanges(self._s[2411]!, self._r[2411]!, [_0]) } - public var Settings_AddDevice: String { return self._s[2400]! } - public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2402]! } - public var AuthSessions_AddDeviceIntro_Text1: String { return self._s[2403]! } - public var Conversation_SearchByName_Prefix: String { return self._s[2404]! } - public var Conversation_PinnedPoll: String { return self._s[2405]! } - public var AuthSessions_AddDeviceIntro_Text2: String { return self._s[2406]! } - public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2407]! } - public var AuthSessions_AddDeviceIntro_Text3: String { return self._s[2408]! } + public var Settings_AddDevice: String { return self._s[2412]! } + public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2414]! } + public var AuthSessions_AddDeviceIntro_Text1: String { return self._s[2415]! } + public var Conversation_SearchByName_Prefix: String { return self._s[2416]! } + public var Conversation_PinnedPoll: String { return self._s[2417]! } + public var AuthSessions_AddDeviceIntro_Text2: String { return self._s[2418]! } + public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2419]! } + public var AuthSessions_AddDeviceIntro_Text3: String { return self._s[2420]! } public func PUSH_ENCRYPTION_ACCEPT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2409]!, self._r[2409]!, [_1]) + return formatWithArgumentRanges(self._s[2421]!, self._r[2421]!, [_1]) } - public var WallpaperSearch_ColorPurple: String { return self._s[2410]! } - public var Cache_ByPeerHeader: String { return self._s[2411]! } + public var WallpaperSearch_ColorPurple: String { return self._s[2422]! } + public var Cache_ByPeerHeader: String { return self._s[2423]! } public func Conversation_EncryptedPlaceholderTitleIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2412]!, self._r[2412]!, [_0]) + return formatWithArgumentRanges(self._s[2424]!, self._r[2424]!, [_0]) } - public var ChatSettings_AutoDownloadDocuments: String { return self._s[2413]! } - public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2416]! } - public var Wallet_Completed_Title: String { return self._s[2417]! } - public var Notification_PinnedMessage: String { return self._s[2418]! } - public var TwoFactorSetup_EmailVerification_Placeholder: String { return self._s[2419]! } - public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2421]! } - public var Contacts_SortBy: String { return self._s[2422]! } + public var ChatSettings_AutoDownloadDocuments: String { return self._s[2425]! } + public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2428]! } + public var Wallet_Completed_Title: String { return self._s[2429]! } + public var Notification_PinnedMessage: String { return self._s[2430]! } + public var TwoFactorSetup_EmailVerification_Placeholder: String { return self._s[2431]! } + public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2433]! } + public var Contacts_SortBy: String { return self._s[2434]! } public func PUSH_CHANNEL_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2423]!, self._r[2423]!, [_1]) + return formatWithArgumentRanges(self._s[2435]!, self._r[2435]!, [_1]) } - public var Appearance_ColorThemeNight: String { return self._s[2425]! } + public var Appearance_ColorThemeNight: String { return self._s[2437]! } public func PUSH_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2426]!, self._r[2426]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2438]!, self._r[2438]!, [_1, _2]) } - public var Call_EncryptionKey_Title: String { return self._s[2427]! } - public var Watch_UserInfo_Service: String { return self._s[2428]! } - public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2430]! } - public var Conversation_Unpin: String { return self._s[2432]! } - public var CancelResetAccount_Title: String { return self._s[2433]! } - public var Map_LiveLocationFor15Minutes: String { return self._s[2434]! } + public var Call_EncryptionKey_Title: String { return self._s[2439]! } + public var Watch_UserInfo_Service: String { return self._s[2440]! } + public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2442]! } + public var Conversation_Unpin: String { return self._s[2444]! } + public var CancelResetAccount_Title: String { return self._s[2445]! } + public var Map_LiveLocationFor15Minutes: String { return self._s[2446]! } public func Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2436]!, self._r[2436]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2448]!, self._r[2448]!, [_1, _2, _3]) } - public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2437]! } - public var Appearance_BubbleCorners_Title: String { return self._s[2438]! } - public var CallSettings_Title: String { return self._s[2439]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2440]! } - public var PasscodeSettings_EncryptDataHelp: String { return self._s[2442]! } - public var AutoDownloadSettings_Contacts: String { return self._s[2443]! } + public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2449]! } + public var Appearance_BubbleCorners_Title: String { return self._s[2450]! } + public var CallSettings_Title: String { return self._s[2451]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2452]! } + public var PasscodeSettings_EncryptDataHelp: String { return self._s[2454]! } + public var AutoDownloadSettings_Contacts: String { return self._s[2455]! } public func Channel_AdminLog_MessageRankName(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2444]!, self._r[2444]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2456]!, self._r[2456]!, [_1, _2]) } - public var Passport_Identity_DocumentDetails: String { return self._s[2445]! } - public var LoginPassword_PasswordHelp: String { return self._s[2446]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2447]! } - public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2448]! } - public var ChatContextMenu_TextSelectionTip: String { return self._s[2449]! } - public var Checkout_TotalPaidAmount: String { return self._s[2450]! } + public var Passport_Identity_DocumentDetails: String { return self._s[2457]! } + public var LoginPassword_PasswordHelp: String { return self._s[2458]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2459]! } + public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2460]! } + public var ChatContextMenu_TextSelectionTip: String { return self._s[2461]! } + public var Checkout_TotalPaidAmount: String { return self._s[2462]! } public func FileSize_KB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2451]!, self._r[2451]!, [_0]) + return formatWithArgumentRanges(self._s[2463]!, self._r[2463]!, [_0]) } - public var ChatState_Updating: String { return self._s[2452]! } - public var PasscodeSettings_ChangePasscode: String { return self._s[2453]! } - public var Conversation_SecretLinkPreviewAlert: String { return self._s[2455]! } - public var Privacy_SecretChatsLinkPreviews: String { return self._s[2456]! } + public var ChatState_Updating: String { return self._s[2464]! } + public var PasscodeSettings_ChangePasscode: String { return self._s[2465]! } + public var Conversation_SecretLinkPreviewAlert: String { return self._s[2467]! } + public var Privacy_SecretChatsLinkPreviews: String { return self._s[2468]! } public func PUSH_CHANNEL_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2457]!, self._r[2457]!, [_1]) + return formatWithArgumentRanges(self._s[2469]!, self._r[2469]!, [_1]) } - public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2458]! } - public var Contacts_InviteFriends: String { return self._s[2460]! } - public var Map_ChooseLocationTitle: String { return self._s[2461]! } - public var Conversation_StopPoll: String { return self._s[2463]! } + public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2470]! } + public var Contacts_InviteFriends: String { return self._s[2472]! } + public var Map_ChooseLocationTitle: String { return self._s[2473]! } + public var Conversation_StopPoll: String { return self._s[2475]! } public func WebSearch_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2464]!, self._r[2464]!, [_0]) + return formatWithArgumentRanges(self._s[2476]!, self._r[2476]!, [_0]) } - public var Call_Camera: String { return self._s[2465]! } - public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2466]! } - public var AppWallet_Intro_Text: String { return self._s[2467]! } - public var Appearance_BubbleCornersSetting: String { return self._s[2468]! } - public var Calls_RatingFeedback: String { return self._s[2469]! } - public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2471]! } - public var Wallet_Alert_OK: String { return self._s[2472]! } - public var NotificationsSound_Pulse: String { return self._s[2473]! } - public var Watch_LastSeen_Lately: String { return self._s[2474]! } - public var ReportGroupLocation_Report: String { return self._s[2477]! } - public var Widget_NoUsers: String { return self._s[2478]! } - public var Conversation_UnvotePoll: String { return self._s[2479]! } - public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2481]! } - public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2482]! } - public var NotificationsSound_Circles: String { return self._s[2483]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2486]! } - public var Wallet_Settings_DeleteWallet: String { return self._s[2487]! } - public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2488]! } - public var Proxy_TooltipUnavailable: String { return self._s[2489]! } - public var Passport_Identity_CountryPlaceholder: String { return self._s[2491]! } - public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2493]! } - public var Conversation_FileDropbox: String { return self._s[2494]! } - public var Notifications_ExceptionsUnmuted: String { return self._s[2495]! } - public var Tour_Text3: String { return self._s[2497]! } - public var Login_ResetAccountProtected_Title: String { return self._s[2499]! } - public var GroupPermission_NoSendMessages: String { return self._s[2500]! } - public var WallpaperSearch_ColorTitle: String { return self._s[2501]! } - public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2502]! } + public var Call_Camera: String { return self._s[2477]! } + public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2478]! } + public var AppWallet_Intro_Text: String { return self._s[2479]! } + public var Appearance_BubbleCornersSetting: String { return self._s[2480]! } + public var Calls_RatingFeedback: String { return self._s[2481]! } + public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2483]! } + public var Wallet_Alert_OK: String { return self._s[2484]! } + public var NotificationsSound_Pulse: String { return self._s[2485]! } + public var Watch_LastSeen_Lately: String { return self._s[2486]! } + public var ReportGroupLocation_Report: String { return self._s[2489]! } + public var Widget_NoUsers: String { return self._s[2490]! } + public var Conversation_UnvotePoll: String { return self._s[2491]! } + public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2493]! } + public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2494]! } + public var NotificationsSound_Circles: String { return self._s[2495]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2498]! } + public var Wallet_Settings_DeleteWallet: String { return self._s[2499]! } + public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2500]! } + public var Proxy_TooltipUnavailable: String { return self._s[2501]! } + public var Passport_Identity_CountryPlaceholder: String { return self._s[2503]! } + public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2505]! } + public var Conversation_FileDropbox: String { return self._s[2506]! } + public var Notifications_ExceptionsUnmuted: String { return self._s[2507]! } + public var Tour_Text3: String { return self._s[2509]! } + public var Login_ResetAccountProtected_Title: String { return self._s[2512]! } + public var GroupPermission_NoSendMessages: String { return self._s[2513]! } + public var WallpaperSearch_ColorTitle: String { return self._s[2514]! } + public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2515]! } public func Conversation_LiveLocationYouAnd(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2504]!, self._r[2504]!, [_0]) + return formatWithArgumentRanges(self._s[2517]!, self._r[2517]!, [_0]) } - public var GroupInfo_AddParticipantTitle: String { return self._s[2505]! } - public var Checkout_ShippingOption_Title: String { return self._s[2506]! } - public var ChatSettings_AutoDownloadTitle: String { return self._s[2507]! } + public var GroupInfo_AddParticipantTitle: String { return self._s[2518]! } + public var Checkout_ShippingOption_Title: String { return self._s[2519]! } + public var ChatSettings_AutoDownloadTitle: String { return self._s[2520]! } public func DialogList_SingleTypingSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2508]!, self._r[2508]!, [_0]) + return formatWithArgumentRanges(self._s[2521]!, self._r[2521]!, [_0]) } public func ChatSettings_AutoDownloadSettings_TypeVideo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2509]!, self._r[2509]!, [_0]) + return formatWithArgumentRanges(self._s[2522]!, self._r[2522]!, [_0]) } - public var Channel_Management_LabelAdministrator: String { return self._s[2510]! } - public var EditTheme_FileReadError: String { return self._s[2511]! } - public var OwnershipTransfer_ComeBackLater: String { return self._s[2512]! } - public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2513]! } - public var AutoDownloadSettings_Photos: String { return self._s[2515]! } - public var Appearance_PreviewIncomingText: String { return self._s[2516]! } - public var ChatList_Context_MarkAllAsRead: String { return self._s[2517]! } - public var ChannelInfo_ConfirmLeave: String { return self._s[2518]! } - public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2519]! } - public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2520]! } - public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2521]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2522]! } - public var GroupInfo_SetGroupPhotoStop: String { return self._s[2523]! } - public var Notification_SecretChatScreenshot: String { return self._s[2524]! } - public var AccessDenied_Wallpapers: String { return self._s[2525]! } - public var ChatList_Context_Mute: String { return self._s[2527]! } - public var Passport_Address_City: String { return self._s[2528]! } - public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2529]! } - public var Appearance_ThemeCarouselClassic: String { return self._s[2530]! } - public var SocksProxySetup_SecretPlaceholder: String { return self._s[2531]! } - public var AccessDenied_LocationDisabled: String { return self._s[2532]! } - public var Group_Location_Title: String { return self._s[2533]! } - public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2535]! } - public var GroupInfo_Sound: String { return self._s[2536]! } - public var SettingsSearch_Synonyms_ChatSettings_OpenLinksIn: String { return self._s[2537]! } - public var ChannelInfo_ScamChannelWarning: String { return self._s[2538]! } - public var Stickers_RemoveFromFavorites: String { return self._s[2539]! } - public var Contacts_Title: String { return self._s[2540]! } - public var EditTheme_ThemeTemplateAlertText: String { return self._s[2541]! } - public var Passport_Language_fr: String { return self._s[2542]! } - public var TwoFactorSetup_EmailVerification_Action: String { return self._s[2543]! } - public var Notifications_ResetAllNotifications: String { return self._s[2544]! } - public var IntentsSettings_SuggestedChats: String { return self._s[2546]! } - public var PrivacySettings_SecurityTitle: String { return self._s[2548]! } - public var Checkout_NewCard_Title: String { return self._s[2549]! } - public var Login_HaveNotReceivedCodeInternal: String { return self._s[2550]! } - public var Conversation_ForwardChats: String { return self._s[2551]! } - public var Wallet_SecureStorageReset_PasscodeText: String { return self._s[2553]! } - public var PasscodeSettings_4DigitCode: String { return self._s[2554]! } - public var Settings_FAQ: String { return self._s[2556]! } - public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2557]! } - public var Conversation_ContextMenuForward: String { return self._s[2558]! } - public var VoiceOver_Chat_YourPhoto: String { return self._s[2561]! } - public var PrivacyPolicy_Title: String { return self._s[2564]! } - public var Notifications_TextTone: String { return self._s[2565]! } - public var Profile_CreateNewContact: String { return self._s[2566]! } - public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2567]! } - public var TwoFactorSetup_EmailVerification_Title: String { return self._s[2569]! } - public var Call_Speaker: String { return self._s[2570]! } - public var AutoNightTheme_AutomaticSection: String { return self._s[2571]! } - public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2573]! } - public var Channel_Username_InvalidCharacters: String { return self._s[2574]! } + public var Channel_Management_LabelAdministrator: String { return self._s[2523]! } + public var EditTheme_FileReadError: String { return self._s[2524]! } + public var OwnershipTransfer_ComeBackLater: String { return self._s[2525]! } + public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2526]! } + public var AutoDownloadSettings_Photos: String { return self._s[2528]! } + public var Appearance_PreviewIncomingText: String { return self._s[2529]! } + public var ChatList_Context_MarkAllAsRead: String { return self._s[2530]! } + public var ChannelInfo_ConfirmLeave: String { return self._s[2531]! } + public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2532]! } + public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2533]! } + public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2534]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2535]! } + public var GroupInfo_SetGroupPhotoStop: String { return self._s[2536]! } + public var Notification_SecretChatScreenshot: String { return self._s[2537]! } + public var AccessDenied_Wallpapers: String { return self._s[2538]! } + public var ChatList_Context_Mute: String { return self._s[2540]! } + public var Passport_Address_City: String { return self._s[2541]! } + public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2542]! } + public var Appearance_ThemeCarouselClassic: String { return self._s[2543]! } + public var SocksProxySetup_SecretPlaceholder: String { return self._s[2544]! } + public var AccessDenied_LocationDisabled: String { return self._s[2545]! } + public var Group_Location_Title: String { return self._s[2546]! } + public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2548]! } + public var GroupInfo_Sound: String { return self._s[2549]! } + public var SettingsSearch_Synonyms_ChatSettings_OpenLinksIn: String { return self._s[2550]! } + public var ChannelInfo_ScamChannelWarning: String { return self._s[2551]! } + public var Stickers_RemoveFromFavorites: String { return self._s[2552]! } + public var Contacts_Title: String { return self._s[2553]! } + public var EditTheme_ThemeTemplateAlertText: String { return self._s[2554]! } + public var Passport_Language_fr: String { return self._s[2555]! } + public var TwoFactorSetup_EmailVerification_Action: String { return self._s[2556]! } + public var Notifications_ResetAllNotifications: String { return self._s[2557]! } + public var IntentsSettings_SuggestedChats: String { return self._s[2559]! } + public var PrivacySettings_SecurityTitle: String { return self._s[2561]! } + public var Checkout_NewCard_Title: String { return self._s[2562]! } + public var Login_HaveNotReceivedCodeInternal: String { return self._s[2563]! } + public var Conversation_ForwardChats: String { return self._s[2564]! } + public var Wallet_SecureStorageReset_PasscodeText: String { return self._s[2566]! } + public var PasscodeSettings_4DigitCode: String { return self._s[2567]! } + public var Settings_FAQ: String { return self._s[2569]! } + public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2570]! } + public var Conversation_ContextMenuForward: String { return self._s[2571]! } + public var VoiceOver_Chat_YourPhoto: String { return self._s[2574]! } + public var PrivacyPolicy_Title: String { return self._s[2577]! } + public var Notifications_TextTone: String { return self._s[2578]! } + public var Profile_CreateNewContact: String { return self._s[2579]! } + public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2580]! } + public var TwoFactorSetup_EmailVerification_Title: String { return self._s[2582]! } + public var Call_Speaker: String { return self._s[2583]! } + public var AutoNightTheme_AutomaticSection: String { return self._s[2584]! } + public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2586]! } + public var Channel_Username_InvalidCharacters: String { return self._s[2587]! } public func Channel_AdminLog_MessageChangedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2575]!, self._r[2575]!, [_0]) + return formatWithArgumentRanges(self._s[2588]!, self._r[2588]!, [_0]) } - public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2576]! } - public var PrivacySettings_LastSeenTitle: String { return self._s[2577]! } - public var Channel_AdminLog_CanInviteUsers: String { return self._s[2578]! } - public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2579]! } - public var OwnershipTransfer_SecurityCheck: String { return self._s[2580]! } - public var Conversation_MessageDeliveryFailed: String { return self._s[2581]! } - public var Watch_ChatList_NoConversationsText: String { return self._s[2582]! } - public var Bot_Unblock: String { return self._s[2583]! } - public var TextFormat_Italic: String { return self._s[2584]! } - public var WallpaperSearch_ColorPink: String { return self._s[2585]! } - public var Settings_About_Help: String { return self._s[2587]! } - public var SearchImages_Title: String { return self._s[2588]! } - public var Weekday_Wednesday: String { return self._s[2589]! } - public var Conversation_ClousStorageInfo_Description1: String { return self._s[2590]! } - public var ExplicitContent_AlertTitle: String { return self._s[2591]! } + public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2589]! } + public var PrivacySettings_LastSeenTitle: String { return self._s[2590]! } + public var Channel_AdminLog_CanInviteUsers: String { return self._s[2591]! } + public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2592]! } + public var OwnershipTransfer_SecurityCheck: String { return self._s[2593]! } + public var Conversation_MessageDeliveryFailed: String { return self._s[2594]! } + public var Watch_ChatList_NoConversationsText: String { return self._s[2595]! } + public var Bot_Unblock: String { return self._s[2596]! } + public var TextFormat_Italic: String { return self._s[2597]! } + public var WallpaperSearch_ColorPink: String { return self._s[2598]! } + public var Settings_About_Help: String { return self._s[2600]! } + public var SearchImages_Title: String { return self._s[2601]! } + public var Weekday_Wednesday: String { return self._s[2602]! } + public var Conversation_ClousStorageInfo_Description1: String { return self._s[2603]! } + public var ExplicitContent_AlertTitle: String { return self._s[2604]! } public func Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2592]!, self._r[2592]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2605]!, self._r[2605]!, [_1, _2, _3]) } - public var Channel_DiscussionGroup_Create: String { return self._s[2593]! } - public var Weekday_Thursday: String { return self._s[2594]! } - public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2595]! } - public var Channel_Members_AddMembersHelp: String { return self._s[2596]! } + public var Channel_DiscussionGroup_Create: String { return self._s[2606]! } + public var Weekday_Thursday: String { return self._s[2607]! } + public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2608]! } + public var Channel_Members_AddMembersHelp: String { return self._s[2609]! } public func Checkout_SavePasswordTimeout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2597]!, self._r[2597]!, [_0]) + return formatWithArgumentRanges(self._s[2610]!, self._r[2610]!, [_0]) } - public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2598]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2599]! } - public var Passport_RequestedInformation: String { return self._s[2600]! } - public var Login_PhoneAndCountryHelp: String { return self._s[2601]! } - public var Conversation_EncryptionProcessing: String { return self._s[2603]! } - public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2604]! } - public var PhotoEditor_EnhanceTool: String { return self._s[2606]! } - public var Channel_Setup_Title: String { return self._s[2607]! } - public var Conversation_SearchPlaceholder: String { return self._s[2608]! } - public var OldChannels_GroupEmptyFormat: String { return self._s[2609]! } - public var AccessDenied_LocationAlwaysDenied: String { return self._s[2610]! } - public var Checkout_ErrorGeneric: String { return self._s[2611]! } - public var Passport_Language_hu: String { return self._s[2612]! } - public var GroupPermission_EditingDisabled: String { return self._s[2613]! } - public var Wallet_Month_ShortSeptember: String { return self._s[2615]! } + public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2611]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2612]! } + public var Passport_RequestedInformation: String { return self._s[2613]! } + public var Login_PhoneAndCountryHelp: String { return self._s[2614]! } + public var Conversation_EncryptionProcessing: String { return self._s[2616]! } + public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2617]! } + public var PhotoEditor_EnhanceTool: String { return self._s[2619]! } + public var Channel_Setup_Title: String { return self._s[2620]! } + public var Conversation_SearchPlaceholder: String { return self._s[2621]! } + public var OldChannels_GroupEmptyFormat: String { return self._s[2622]! } + public var AccessDenied_LocationAlwaysDenied: String { return self._s[2623]! } + public var Checkout_ErrorGeneric: String { return self._s[2624]! } + public var Passport_Language_hu: String { return self._s[2625]! } + public var GroupPermission_EditingDisabled: String { return self._s[2626]! } + public var Wallet_Month_ShortSeptember: String { return self._s[2628]! } public func Passport_Identity_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2616]!, self._r[2616]!, [_0]) + return formatWithArgumentRanges(self._s[2629]!, self._r[2629]!, [_0]) } public func PUSH_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2619]!, self._r[2619]!, [_1]) + return formatWithArgumentRanges(self._s[2632]!, self._r[2632]!, [_1]) } - public var ChatList_DeleteSavedMessagesConfirmationTitle: String { return self._s[2620]! } + public var ChatList_DeleteSavedMessagesConfirmationTitle: String { return self._s[2633]! } public func UserInfo_BlockConfirmationTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2621]!, self._r[2621]!, [_0]) + return formatWithArgumentRanges(self._s[2634]!, self._r[2634]!, [_0]) } - public var Conversation_CloudStorageInfo_Title: String { return self._s[2622]! } - public var Group_Location_Info: String { return self._s[2623]! } - public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2624]! } - public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2625]! } + public var Conversation_CloudStorageInfo_Title: String { return self._s[2635]! } + public var Group_Location_Info: String { return self._s[2636]! } + public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2637]! } + public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2638]! } public func Notification_Exceptions_MutedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2626]!, self._r[2626]!, [_0]) + return formatWithArgumentRanges(self._s[2639]!, self._r[2639]!, [_0]) } - public var Conversation_ClearPrivateHistory: String { return self._s[2627]! } - public var ContactInfo_PhoneLabelHome: String { return self._s[2628]! } - public var Appearance_RemoveThemeConfirmation: String { return self._s[2629]! } - public var PrivacySettings_LastSeenContacts: String { return self._s[2630]! } + public var Conversation_ClearPrivateHistory: String { return self._s[2640]! } + public var ContactInfo_PhoneLabelHome: String { return self._s[2641]! } + public var Appearance_RemoveThemeConfirmation: String { return self._s[2642]! } + public var PrivacySettings_LastSeenContacts: String { return self._s[2643]! } public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2631]!, self._r[2631]!, [_0]) + return formatWithArgumentRanges(self._s[2644]!, self._r[2644]!, [_0]) } public func Notification_PinnedQuizMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2632]!, self._r[2632]!, [_0]) + return formatWithArgumentRanges(self._s[2645]!, self._r[2645]!, [_0]) } - public var Passport_Language_cs: String { return self._s[2633]! } - public var Message_PinnedAnimationMessage: String { return self._s[2635]! } - public var Passport_Identity_ReverseSideHelp: String { return self._s[2637]! } - public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2638]! } - public var Wallet_Info_TransactionTo: String { return self._s[2640]! } - public var Stats_ViewsBySourceTitle: String { return self._s[2641]! } - public var ChatList_DeleteForEveryoneConfirmationText: String { return self._s[2642]! } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2643]! } - public var Embed_PlayingInPIP: String { return self._s[2644]! } - public var Appearance_ThemePreview_Chat_3_TextWithLink: String { return self._s[2645]! } - public var AutoNightTheme_ScheduleSection: String { return self._s[2646]! } + public var Passport_Language_cs: String { return self._s[2646]! } + public var Message_PinnedAnimationMessage: String { return self._s[2648]! } + public var Passport_Identity_ReverseSideHelp: String { return self._s[2650]! } + public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2651]! } + public var Wallet_Info_TransactionTo: String { return self._s[2653]! } + public var Stats_ViewsBySourceTitle: String { return self._s[2654]! } + public var ChatList_DeleteForEveryoneConfirmationText: String { return self._s[2655]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2656]! } + public var Embed_PlayingInPIP: String { return self._s[2657]! } + public var Appearance_ThemePreview_Chat_3_TextWithLink: String { return self._s[2658]! } + public var AutoNightTheme_ScheduleSection: String { return self._s[2659]! } public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2647]!, self._r[2647]!, [_0]) + return formatWithArgumentRanges(self._s[2660]!, self._r[2660]!, [_0]) } - public var MediaPicker_LivePhotoDescription: String { return self._s[2648]! } + public var MediaPicker_LivePhotoDescription: String { return self._s[2661]! } public func Channel_AdminLog_MessageRestrictedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2649]!, self._r[2649]!, [_1]) - } - public var Notification_PaymentSent: String { return self._s[2650]! } - public var PhotoEditor_CurvesGreen: String { return self._s[2651]! } - public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2652]! } - public var AutoNightTheme_System: String { return self._s[2653]! } - public var SaveIncomingPhotosSettings_Title: String { return self._s[2654]! } - public var CreatePoll_QuizTitle: String { return self._s[2655]! } - public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2656]! } - public var VoiceOver_Chat_PagePreview: String { return self._s[2657]! } - public func PUSH_MESSAGE_SCREENSHOT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2660]!, self._r[2660]!, [_1]) - } - public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2661]!, self._r[2661]!, [_1]) - } - public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2662]!, self._r[2662]!, [_1]) } - public var NetworkUsageSettings_CallDataSection: String { return self._s[2664]! } - public var PasscodeSettings_HelpTop: String { return self._s[2665]! } - public var Conversation_WalletRequiredTitle: String { return self._s[2666]! } - public var PeerInfo_AddToContacts: String { return self._s[2667]! } - public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2668]! } - public var Passport_Address_TypeRentalAgreement: String { return self._s[2669]! } - public var EditTheme_ShortLink: String { return self._s[2670]! } - public var Theme_Colors_ColorWallpaperWarning: String { return self._s[2671]! } - public var ProxyServer_VoiceOver_Active: String { return self._s[2672]! } - public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2673]! } - public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2674]! } - public var Call_Accept: String { return self._s[2676]! } - public var GroupRemoved_RemoveInfo: String { return self._s[2677]! } - public var Month_GenMarch: String { return self._s[2679]! } - public var PhotoEditor_ShadowsTool: String { return self._s[2680]! } - public var LoginPassword_Title: String { return self._s[2681]! } - public var Call_End: String { return self._s[2682]! } - public var Watch_Conversation_GroupInfo: String { return self._s[2683]! } - public var VoiceOver_Chat_Contact: String { return self._s[2684]! } - public var EditTheme_Create_Preview_IncomingText: String { return self._s[2685]! } - public var CallSettings_Always: String { return self._s[2686]! } - public var CallFeedback_Success: String { return self._s[2687]! } - public var TwoStepAuth_SetupHint: String { return self._s[2688]! } + public var Notification_PaymentSent: String { return self._s[2663]! } + public var PhotoEditor_CurvesGreen: String { return self._s[2664]! } + public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2665]! } + public var AutoNightTheme_System: String { return self._s[2666]! } + public var SaveIncomingPhotosSettings_Title: String { return self._s[2667]! } + public var CreatePoll_QuizTitle: String { return self._s[2668]! } + public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2669]! } + public var VoiceOver_Chat_PagePreview: String { return self._s[2670]! } + public func PUSH_MESSAGE_SCREENSHOT(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2673]!, self._r[2673]!, [_1]) + } + public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2674]!, self._r[2674]!, [_1]) + } + public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2675]!, self._r[2675]!, [_1]) + } + public var NetworkUsageSettings_CallDataSection: String { return self._s[2677]! } + public var PasscodeSettings_HelpTop: String { return self._s[2678]! } + public var Conversation_WalletRequiredTitle: String { return self._s[2679]! } + public var PeerInfo_AddToContacts: String { return self._s[2680]! } + public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2681]! } + public var Passport_Address_TypeRentalAgreement: String { return self._s[2682]! } + public var EditTheme_ShortLink: String { return self._s[2683]! } + public var Theme_Colors_ColorWallpaperWarning: String { return self._s[2684]! } + public var ProxyServer_VoiceOver_Active: String { return self._s[2685]! } + public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2686]! } + public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2687]! } + public var Call_Accept: String { return self._s[2689]! } + public var GroupRemoved_RemoveInfo: String { return self._s[2690]! } + public var Month_GenMarch: String { return self._s[2692]! } + public var PhotoEditor_ShadowsTool: String { return self._s[2693]! } + public var LoginPassword_Title: String { return self._s[2694]! } + public var Call_End: String { return self._s[2695]! } + public var Watch_Conversation_GroupInfo: String { return self._s[2696]! } + public var VoiceOver_Chat_Contact: String { return self._s[2697]! } + public var EditTheme_Create_Preview_IncomingText: String { return self._s[2698]! } + public var CallSettings_Always: String { return self._s[2699]! } + public var CallFeedback_Success: String { return self._s[2700]! } + public var TwoStepAuth_SetupHint: String { return self._s[2701]! } public func AddContact_ContactWillBeSharedAfterMutual(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2689]!, self._r[2689]!, [_1]) + return formatWithArgumentRanges(self._s[2702]!, self._r[2702]!, [_1]) } - public var ConversationProfile_UsersTooMuchError: String { return self._s[2690]! } - public var PeerInfo_ButtonAddMember: String { return self._s[2691]! } - public var Login_PhoneTitle: String { return self._s[2692]! } - public var Passport_FieldPhoneHelp: String { return self._s[2693]! } - public var Weekday_ShortSunday: String { return self._s[2694]! } - public var Passport_InfoFAQ_URL: String { return self._s[2695]! } - public var ContactInfo_Job: String { return self._s[2697]! } - public var UserInfo_InviteBotToGroup: String { return self._s[2698]! } - public var Appearance_ThemeCarouselNightBlue: String { return self._s[2699]! } - public var CreatePoll_QuizTip: String { return self._s[2700]! } - public var TwoFactorSetup_Email_Text: String { return self._s[2701]! } - public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2702]! } - public var Invite_ChannelsTooMuch: String { return self._s[2703]! } - public var Wallet_Send_ConfirmationConfirm: String { return self._s[2704]! } - public var Wallet_TransactionInfo_OtherFeeInfo: String { return self._s[2705]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2706]! } - public var Wallet_Receive_AmountText: String { return self._s[2707]! } - public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2708]! } - public var CallFeedback_ReasonNoise: String { return self._s[2709]! } - public var Appearance_AppIconDefault: String { return self._s[2711]! } - public var Passport_Identity_AddInternalPassport: String { return self._s[2712]! } - public var MediaPicker_AddCaption: String { return self._s[2713]! } - public var CallSettings_TabIconDescription: String { return self._s[2714]! } + public var ConversationProfile_UsersTooMuchError: String { return self._s[2703]! } + public var PeerInfo_ButtonAddMember: String { return self._s[2704]! } + public var Login_PhoneTitle: String { return self._s[2705]! } + public var Passport_FieldPhoneHelp: String { return self._s[2706]! } + public var Weekday_ShortSunday: String { return self._s[2707]! } + public var Passport_InfoFAQ_URL: String { return self._s[2708]! } + public var ContactInfo_Job: String { return self._s[2710]! } + public var UserInfo_InviteBotToGroup: String { return self._s[2711]! } + public var Appearance_ThemeCarouselNightBlue: String { return self._s[2712]! } + public var CreatePoll_QuizTip: String { return self._s[2713]! } + public var TwoFactorSetup_Email_Text: String { return self._s[2714]! } + public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2715]! } + public var Invite_ChannelsTooMuch: String { return self._s[2716]! } + public var Wallet_Send_ConfirmationConfirm: String { return self._s[2717]! } + public var Wallet_TransactionInfo_OtherFeeInfo: String { return self._s[2718]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2719]! } + public var Wallet_Receive_AmountText: String { return self._s[2720]! } + public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2721]! } + public var CallFeedback_ReasonNoise: String { return self._s[2722]! } + public var Appearance_AppIconDefault: String { return self._s[2724]! } + public var Passport_Identity_AddInternalPassport: String { return self._s[2725]! } + public var MediaPicker_AddCaption: String { return self._s[2726]! } + public var CallSettings_TabIconDescription: String { return self._s[2727]! } public func VoiceOver_Chat_Caption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2715]!, self._r[2715]!, [_0]) + return formatWithArgumentRanges(self._s[2728]!, self._r[2728]!, [_0]) } - public var IntentsSettings_SuggestedChatsGroups: String { return self._s[2716]! } + public var IntentsSettings_SuggestedChatsGroups: String { return self._s[2729]! } public func Map_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2717]!, self._r[2717]!, [_0]) + return formatWithArgumentRanges(self._s[2730]!, self._r[2730]!, [_0]) } - public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2718]! } - public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2719]! } - public var Passport_Identity_TypePersonalDetails: String { return self._s[2720]! } - public var DialogList_SearchSectionRecent: String { return self._s[2721]! } - public var PrivacyPolicy_DeclineMessage: String { return self._s[2722]! } - public var CreatePoll_Anonymous: String { return self._s[2723]! } - public var LogoutOptions_ClearCacheText: String { return self._s[2726]! } - public var LastSeen_WithinAWeek: String { return self._s[2727]! } - public var ChannelMembers_GroupAdminsTitle: String { return self._s[2728]! } - public var Conversation_CloudStorage_ChatStatus: String { return self._s[2730]! } - public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2731]! } + public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2732]! } + public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2733]! } + public var Passport_Identity_TypePersonalDetails: String { return self._s[2734]! } + public var DialogList_SearchSectionRecent: String { return self._s[2735]! } + public var PrivacyPolicy_DeclineMessage: String { return self._s[2736]! } + public var CreatePoll_Anonymous: String { return self._s[2737]! } + public var LogoutOptions_ClearCacheText: String { return self._s[2740]! } + public var LastSeen_WithinAWeek: String { return self._s[2741]! } + public var ChannelMembers_GroupAdminsTitle: String { return self._s[2742]! } + public var Conversation_CloudStorage_ChatStatus: String { return self._s[2744]! } + public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2745]! } public func AddContact_SharedContactExceptionInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2732]!, self._r[2732]!, [_0]) + return formatWithArgumentRanges(self._s[2746]!, self._r[2746]!, [_0]) } - public var Passport_Address_TypeResidentialAddress: String { return self._s[2733]! } - public var Conversation_StatusLeftGroup: String { return self._s[2734]! } - public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2735]! } - public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2737]! } - public var GroupPermission_AddSuccess: String { return self._s[2738]! } - public var PhotoEditor_BlurToolRadial: String { return self._s[2740]! } - public var Conversation_ContextMenuCopy: String { return self._s[2741]! } - public var AccessDenied_CallMicrophone: String { return self._s[2742]! } + public var Passport_Address_TypeResidentialAddress: String { return self._s[2747]! } + public var Conversation_StatusLeftGroup: String { return self._s[2748]! } + public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2749]! } + public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2751]! } + public var GroupPermission_AddSuccess: String { return self._s[2752]! } + public var PhotoEditor_BlurToolRadial: String { return self._s[2754]! } + public var Conversation_ContextMenuCopy: String { return self._s[2755]! } + public var AccessDenied_CallMicrophone: String { return self._s[2756]! } public func Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2743]!, self._r[2743]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2757]!, self._r[2757]!, [_1, _2, _3]) } - public var Login_InvalidFirstNameError: String { return self._s[2744]! } - public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2745]! } - public var Checkout_PaymentMethod_New: String { return self._s[2746]! } - public var ShareMenu_CopyShareLinkGame: String { return self._s[2747]! } - public var PhotoEditor_QualityTool: String { return self._s[2748]! } - public var Login_SendCodeViaSms: String { return self._s[2749]! } - public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2750]! } - public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2751]! } - public var Wallet_Receive_CopyAddress: String { return self._s[2752]! } - public var Login_EmailNotConfiguredError: String { return self._s[2753]! } - public var SocksProxySetup_Status: String { return self._s[2754]! } - public var Conversation_ScheduleMessage_SendWhenOnline: String { return self._s[2755]! } - public var PrivacyPolicy_Accept: String { return self._s[2756]! } - public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2757]! } - public var Appearance_AppIconClassicX: String { return self._s[2758]! } + public var Login_InvalidFirstNameError: String { return self._s[2758]! } + public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2759]! } + public var Checkout_PaymentMethod_New: String { return self._s[2760]! } + public var ShareMenu_CopyShareLinkGame: String { return self._s[2761]! } + public var PhotoEditor_QualityTool: String { return self._s[2762]! } + public var Login_SendCodeViaSms: String { return self._s[2763]! } + public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2764]! } + public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2765]! } + public var Wallet_Receive_CopyAddress: String { return self._s[2766]! } + public var Login_EmailNotConfiguredError: String { return self._s[2767]! } + public var SocksProxySetup_Status: String { return self._s[2768]! } + public var Conversation_ScheduleMessage_SendWhenOnline: String { return self._s[2769]! } + public var PrivacyPolicy_Accept: String { return self._s[2770]! } + public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2771]! } + public var Appearance_AppIconClassicX: String { return self._s[2772]! } public func PUSH_CHAT_MESSAGE_TEXT(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2759]!, self._r[2759]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2773]!, self._r[2773]!, [_1, _2, _3]) } - public var OwnershipTransfer_SecurityRequirements: String { return self._s[2760]! } - public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2762]! } - public var AutoNightTheme_Automatic: String { return self._s[2763]! } - public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2764]! } - public var Privacy_ContactsSyncHelp: String { return self._s[2765]! } - public var Cache_Help: String { return self._s[2766]! } - public var Group_ErrorAccessDenied: String { return self._s[2767]! } - public var Passport_Language_fa: String { return self._s[2768]! } - public var Wallet_Intro_Text: String { return self._s[2769]! } - public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2770]! } - public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2771]! } - public var PrivacySettings_LastSeen: String { return self._s[2772]! } + public var OwnershipTransfer_SecurityRequirements: String { return self._s[2774]! } + public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2776]! } + public var AutoNightTheme_Automatic: String { return self._s[2777]! } + public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2778]! } + public var Privacy_ContactsSyncHelp: String { return self._s[2779]! } + public var Cache_Help: String { return self._s[2780]! } + public var Group_ErrorAccessDenied: String { return self._s[2781]! } + public var Passport_Language_fa: String { return self._s[2782]! } + public var Wallet_Intro_Text: String { return self._s[2783]! } + public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2784]! } + public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2785]! } + public var PrivacySettings_LastSeen: String { return self._s[2786]! } public func DialogList_MultipleTyping(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2773]!, self._r[2773]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2787]!, self._r[2787]!, [_0, _1]) } - public var Wallet_Configuration_Apply: String { return self._s[2777]! } - public var Preview_SaveGif: String { return self._s[2778]! } - public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2779]! } - public var Profile_About: String { return self._s[2780]! } - public var Channel_About_Placeholder: String { return self._s[2781]! } - public var Login_InfoTitle: String { return self._s[2782]! } + public var Wallet_Configuration_Apply: String { return self._s[2791]! } + public var Preview_SaveGif: String { return self._s[2792]! } + public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2793]! } + public var Profile_About: String { return self._s[2794]! } + public var Channel_About_Placeholder: String { return self._s[2795]! } + public var Login_InfoTitle: String { return self._s[2796]! } public func TwoStepAuth_SetupPendingEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2783]!, self._r[2783]!, [_0]) + return formatWithArgumentRanges(self._s[2797]!, self._r[2797]!, [_0]) } - public var EditTheme_Expand_Preview_IncomingReplyText: String { return self._s[2784]! } - public var Watch_Suggestion_CantTalk: String { return self._s[2786]! } - public var ContactInfo_Title: String { return self._s[2787]! } - public var Media_ShareThisVideo: String { return self._s[2788]! } - public var Weekday_ShortFriday: String { return self._s[2789]! } - public var AccessDenied_Contacts: String { return self._s[2791]! } - public var Notification_CallIncomingShort: String { return self._s[2792]! } - public var Group_Setup_TypePublic: String { return self._s[2793]! } - public var Notifications_MessageNotificationsExceptions: String { return self._s[2794]! } - public var Notifications_Badge_IncludeChannels: String { return self._s[2795]! } - public var Notifications_MessageNotificationsPreview: String { return self._s[2798]! } - public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2799]! } - public var Group_ErrorAddTooMuchBots: String { return self._s[2800]! } - public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2801]! } - public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2802]! } + public var EditTheme_Expand_Preview_IncomingReplyText: String { return self._s[2798]! } + public var Watch_Suggestion_CantTalk: String { return self._s[2800]! } + public var ContactInfo_Title: String { return self._s[2801]! } + public var Media_ShareThisVideo: String { return self._s[2802]! } + public var Weekday_ShortFriday: String { return self._s[2803]! } + public var AccessDenied_Contacts: String { return self._s[2805]! } + public var Notification_CallIncomingShort: String { return self._s[2806]! } + public var Group_Setup_TypePublic: String { return self._s[2807]! } + public var Notifications_MessageNotificationsExceptions: String { return self._s[2808]! } + public var Notifications_Badge_IncludeChannels: String { return self._s[2809]! } + public var Notifications_MessageNotificationsPreview: String { return self._s[2812]! } + public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2813]! } + public var Group_ErrorAddTooMuchBots: String { return self._s[2814]! } + public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2815]! } + public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2816]! } public func Wallet_SecureStorageChanged_BiometryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2803]!, self._r[2803]!, [_0]) + return formatWithArgumentRanges(self._s[2817]!, self._r[2817]!, [_0]) } - public var DialogList_Typing: String { return self._s[2804]! } - public var CallFeedback_IncludeLogs: String { return self._s[2806]! } - public var Checkout_Phone: String { return self._s[2808]! } - public var Login_InfoFirstNamePlaceholder: String { return self._s[2811]! } - public var Privacy_Calls_Integration: String { return self._s[2812]! } - public var Notifications_PermissionsAllow: String { return self._s[2813]! } - public var TwoStepAuth_AddHintDescription: String { return self._s[2818]! } - public var Settings_ChatSettings: String { return self._s[2819]! } - public var Conversation_SendingOptionsTooltip: String { return self._s[2820]! } + public var DialogList_Typing: String { return self._s[2818]! } + public var CallFeedback_IncludeLogs: String { return self._s[2820]! } + public var Checkout_Phone: String { return self._s[2822]! } + public var Login_InfoFirstNamePlaceholder: String { return self._s[2825]! } + public var Privacy_Calls_Integration: String { return self._s[2826]! } + public var Notifications_PermissionsAllow: String { return self._s[2827]! } + public var TwoStepAuth_AddHintDescription: String { return self._s[2833]! } + public var Settings_ChatSettings: String { return self._s[2834]! } + public var Conversation_SendingOptionsTooltip: String { return self._s[2835]! } public func UserInfo_StartSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2822]!, self._r[2822]!, [_0]) + return formatWithArgumentRanges(self._s[2837]!, self._r[2837]!, [_0]) } public func Channel_AdminLog_MessageInvitedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2823]!, self._r[2823]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2838]!, self._r[2838]!, [_1, _2]) } - public var GroupRemoved_DeleteUser: String { return self._s[2825]! } + public var GroupRemoved_DeleteUser: String { return self._s[2840]! } public func Channel_AdminLog_PollStopped(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2826]!, self._r[2826]!, [_0]) + return formatWithArgumentRanges(self._s[2841]!, self._r[2841]!, [_0]) } public func PUSH_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2827]!, self._r[2827]!, [_1]) + return formatWithArgumentRanges(self._s[2842]!, self._r[2842]!, [_1]) } - public var Login_ContinueWithLocalization: String { return self._s[2828]! } - public var Watch_Message_ForwardedFrom: String { return self._s[2829]! } - public var TwoStepAuth_EnterEmailCode: String { return self._s[2831]! } - public var Conversation_Unblock: String { return self._s[2832]! } - public var PrivacySettings_DataSettings: String { return self._s[2833]! } - public var WallpaperPreview_PatternPaternApply: String { return self._s[2834]! } - public var Group_PublicLink_Info: String { return self._s[2835]! } + public var Login_ContinueWithLocalization: String { return self._s[2843]! } + public var Watch_Message_ForwardedFrom: String { return self._s[2844]! } + public var TwoStepAuth_EnterEmailCode: String { return self._s[2846]! } + public var Conversation_Unblock: String { return self._s[2847]! } + public var PrivacySettings_DataSettings: String { return self._s[2848]! } + public var WallpaperPreview_PatternPaternApply: String { return self._s[2849]! } + public var Group_PublicLink_Info: String { return self._s[2850]! } public func Wallet_Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2836]!, self._r[2836]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2851]!, self._r[2851]!, [_1, _2, _3]) } - public var Notifications_InAppNotificationsVibrate: String { return self._s[2837]! } + public var Notifications_InAppNotificationsVibrate: String { return self._s[2852]! } public func Privacy_GroupsAndChannels_InviteToChannelError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2838]!, self._r[2838]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2853]!, self._r[2853]!, [_0, _1]) } - public var OldChannels_ChannelsHeader: String { return self._s[2840]! } - public var Wallet_RestoreFailed_CreateWallet: String { return self._s[2841]! } - public var PrivacySettings_Passcode: String { return self._s[2843]! } - public var Call_Mute: String { return self._s[2844]! } - public var Wallet_Weekday_Yesterday: String { return self._s[2845]! } - public var Passport_Language_dz: String { return self._s[2846]! } - public var Wallet_Receive_AmountHeader: String { return self._s[2847]! } - public var Wallet_TransactionInfo_OtherFeeInfoUrl: String { return self._s[2848]! } - public var Passport_Language_tk: String { return self._s[2849]! } + public var OldChannels_ChannelsHeader: String { return self._s[2855]! } + public var Wallet_RestoreFailed_CreateWallet: String { return self._s[2856]! } + public var PrivacySettings_Passcode: String { return self._s[2858]! } + public var Call_Mute: String { return self._s[2859]! } + public var Wallet_Weekday_Yesterday: String { return self._s[2860]! } + public var Passport_Language_dz: String { return self._s[2861]! } + public var Wallet_Receive_AmountHeader: String { return self._s[2862]! } + public var Wallet_TransactionInfo_OtherFeeInfoUrl: String { return self._s[2863]! } + public var Passport_Language_tk: String { return self._s[2864]! } public func Login_EmailCodeSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2850]!, self._r[2850]!, [_0]) + return formatWithArgumentRanges(self._s[2865]!, self._r[2865]!, [_0]) } - public var Settings_Search: String { return self._s[2851]! } - public var Wallet_Month_ShortFebruary: String { return self._s[2852]! } - public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2853]! } - public var Wallet_Configuration_SourceJSON: String { return self._s[2854]! } - public var Conversation_ContextMenuReply: String { return self._s[2855]! } - public var WallpaperSearch_ColorBrown: String { return self._s[2856]! } - public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2857]! } - public var Tour_Title1: String { return self._s[2858]! } - public var Wallet_Alert_Cancel: String { return self._s[2859]! } - public var Conversation_ClearGroupHistory: String { return self._s[2861]! } - public var Wallet_TransactionInfo_RecipientHeader: String { return self._s[2862]! } - public var WallpaperPreview_Motion: String { return self._s[2863]! } + public var Settings_Search: String { return self._s[2866]! } + public var Wallet_Month_ShortFebruary: String { return self._s[2867]! } + public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2868]! } + public var Wallet_Configuration_SourceJSON: String { return self._s[2869]! } + public var Conversation_ContextMenuReply: String { return self._s[2870]! } + public var WallpaperSearch_ColorBrown: String { return self._s[2871]! } + public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2872]! } + public var Tour_Title1: String { return self._s[2873]! } + public var Wallet_Alert_Cancel: String { return self._s[2874]! } + public var Conversation_ClearGroupHistory: String { return self._s[2876]! } + public var Wallet_TransactionInfo_RecipientHeader: String { return self._s[2877]! } + public var WallpaperPreview_Motion: String { return self._s[2878]! } public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2864]!, self._r[2864]!, [_0]) + return formatWithArgumentRanges(self._s[2879]!, self._r[2879]!, [_0]) } - public var Wallet_Configuration_ApplyErrorTextJSONInvalidData: String { return self._s[2865]! } - public var Call_RateCall: String { return self._s[2866]! } - public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2867]! } - public var Passport_PasswordCompleteSetup: String { return self._s[2868]! } - public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2869]! } - public var UserInfo_LastNamePlaceholder: String { return self._s[2871]! } + public var Wallet_Configuration_ApplyErrorTextJSONInvalidData: String { return self._s[2880]! } + public var Call_RateCall: String { return self._s[2881]! } + public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2882]! } + public var Passport_PasswordCompleteSetup: String { return self._s[2883]! } + public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2884]! } + public var UserInfo_LastNamePlaceholder: String { return self._s[2886]! } public func Login_WillCallYou(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2873]!, self._r[2873]!, [_0]) + return formatWithArgumentRanges(self._s[2888]!, self._r[2888]!, [_0]) } - public var Compose_Create: String { return self._s[2874]! } - public var Contacts_InviteToTelegram: String { return self._s[2875]! } - public var GroupInfo_Notifications: String { return self._s[2876]! } - public var ChatList_DeleteSavedMessagesConfirmationAction: String { return self._s[2878]! } - public var Message_PinnedLiveLocationMessage: String { return self._s[2879]! } - public var Month_GenApril: String { return self._s[2880]! } - public var Appearance_AutoNightTheme: String { return self._s[2881]! } - public var ChatSettings_AutomaticAudioDownload: String { return self._s[2883]! } - public var Login_CodeSentSms: String { return self._s[2885]! } + public var Compose_Create: String { return self._s[2889]! } + public var Contacts_InviteToTelegram: String { return self._s[2890]! } + public var GroupInfo_Notifications: String { return self._s[2891]! } + public var ChatList_DeleteSavedMessagesConfirmationAction: String { return self._s[2893]! } + public var Message_PinnedLiveLocationMessage: String { return self._s[2894]! } + public var Month_GenApril: String { return self._s[2895]! } + public var Appearance_AutoNightTheme: String { return self._s[2896]! } + public var ChatSettings_AutomaticAudioDownload: String { return self._s[2898]! } + public var Login_CodeSentSms: String { return self._s[2900]! } public func UserInfo_UnblockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2886]!, self._r[2886]!, [_0]) + return formatWithArgumentRanges(self._s[2901]!, self._r[2901]!, [_0]) } - public var EmptyGroupInfo_Line3: String { return self._s[2887]! } - public var LogoutOptions_ContactSupportText: String { return self._s[2888]! } - public var Passport_Language_hr: String { return self._s[2889]! } - public var Common_ActionNotAllowedError: String { return self._s[2890]! } + public var EmptyGroupInfo_Line3: String { return self._s[2902]! } + public var LogoutOptions_ContactSupportText: String { return self._s[2903]! } + public var Passport_Language_hr: String { return self._s[2904]! } + public var Common_ActionNotAllowedError: String { return self._s[2905]! } public func Channel_AdminLog_MessageRestrictedNewSetting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2891]!, self._r[2891]!, [_0]) + return formatWithArgumentRanges(self._s[2906]!, self._r[2906]!, [_0]) } - public var GroupInfo_InviteLink_CopyLink: String { return self._s[2892]! } - public var Wallet_Info_TransactionFrom: String { return self._s[2893]! } - public var Wallet_Send_ErrorDecryptionFailed: String { return self._s[2894]! } - public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2895]! } - public var Privacy_SecretChatsTitle: String { return self._s[2896]! } - public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2898]! } - public var GroupInfo_AddUserLeftError: String { return self._s[2899]! } - public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2900]! } - public var LogoutOptions_ContactSupportTitle: String { return self._s[2901]! } - public var Appearance_ThemePreview_Chat_7_Text: String { return self._s[2902]! } - public var Channel_AddBotErrorHaveRights: String { return self._s[2903]! } - public var Preview_DeleteGif: String { return self._s[2904]! } - public var GroupInfo_Permissions_Exceptions: String { return self._s[2905]! } - public var Group_ErrorNotMutualContact: String { return self._s[2906]! } - public var Notification_MessageLifetime5s: String { return self._s[2907]! } - public var Wallet_Send_OwnAddressAlertText: String { return self._s[2908]! } - public var OldChannels_ChannelFormat: String { return self._s[2909]! } + public var GroupInfo_InviteLink_CopyLink: String { return self._s[2907]! } + public var Wallet_Info_TransactionFrom: String { return self._s[2908]! } + public var Wallet_Send_ErrorDecryptionFailed: String { return self._s[2909]! } + public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2910]! } + public var Privacy_SecretChatsTitle: String { return self._s[2911]! } + public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2913]! } + public var GroupInfo_AddUserLeftError: String { return self._s[2914]! } + public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2915]! } + public var LogoutOptions_ContactSupportTitle: String { return self._s[2916]! } + public var Appearance_ThemePreview_Chat_7_Text: String { return self._s[2917]! } + public var Channel_AddBotErrorHaveRights: String { return self._s[2918]! } + public var Preview_DeleteGif: String { return self._s[2919]! } + public var GroupInfo_Permissions_Exceptions: String { return self._s[2920]! } + public var Group_ErrorNotMutualContact: String { return self._s[2921]! } + public var Notification_MessageLifetime5s: String { return self._s[2922]! } + public var Wallet_Send_OwnAddressAlertText: String { return self._s[2923]! } + public var OldChannels_ChannelFormat: String { return self._s[2924]! } public func Watch_LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2910]!, self._r[2910]!, [_0]) + return formatWithArgumentRanges(self._s[2925]!, self._r[2925]!, [_0]) } - public var VoiceOver_Chat_Video: String { return self._s[2911]! } - public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2913]! } - public var ReportSpam_DeleteThisChat: String { return self._s[2914]! } - public var Passport_Address_AddBankStatement: String { return self._s[2915]! } - public var Notification_CallIncoming: String { return self._s[2916]! } - public var Wallet_Words_NotDoneTitle: String { return self._s[2917]! } - public var Compose_NewGroupTitle: String { return self._s[2918]! } - public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2920]! } - public var Passport_Address_Postcode: String { return self._s[2922]! } + public var VoiceOver_Chat_Video: String { return self._s[2926]! } + public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2928]! } + public var ReportSpam_DeleteThisChat: String { return self._s[2929]! } + public var Passport_Address_AddBankStatement: String { return self._s[2930]! } + public var Notification_CallIncoming: String { return self._s[2931]! } + public var Wallet_Words_NotDoneTitle: String { return self._s[2932]! } + public var Compose_NewGroupTitle: String { return self._s[2933]! } + public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2935]! } + public var Passport_Address_Postcode: String { return self._s[2937]! } public func LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2923]!, self._r[2923]!, [_0]) + return formatWithArgumentRanges(self._s[2938]!, self._r[2938]!, [_0]) } - public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2924]! } - public var Wallet_Month_ShortOctober: String { return self._s[2925]! } - public var VoiceOver_Chat_YourMusic: String { return self._s[2926]! } - public var WallpaperColors_Title: String { return self._s[2927]! } - public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2928]! } - public var VoiceOver_MessageContextForward: String { return self._s[2929]! } - public var GroupPermission_Duration: String { return self._s[2930]! } + public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2939]! } + public var Wallet_Month_ShortOctober: String { return self._s[2940]! } + public var VoiceOver_Chat_YourMusic: String { return self._s[2941]! } + public var WallpaperColors_Title: String { return self._s[2942]! } + public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2943]! } + public var VoiceOver_MessageContextForward: String { return self._s[2944]! } + public var GroupPermission_Duration: String { return self._s[2945]! } public func Cache_Clear(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2931]!, self._r[2931]!, [_0]) + return formatWithArgumentRanges(self._s[2946]!, self._r[2946]!, [_0]) } - public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2932]! } - public var Username_Placeholder: String { return self._s[2933]! } - public var CallFeedback_WhatWentWrong: String { return self._s[2934]! } - public var Passport_FieldAddressUploadHelp: String { return self._s[2935]! } - public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2936]! } + public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2947]! } + public var Username_Placeholder: String { return self._s[2948]! } + public var CallFeedback_WhatWentWrong: String { return self._s[2949]! } + public var Passport_FieldAddressUploadHelp: String { return self._s[2950]! } + public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2951]! } public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2938]!, self._r[2938]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2953]!, self._r[2953]!, [_1, _2]) } - public var Passport_PasswordDescription: String { return self._s[2939]! } - public var Channel_MessagePhotoUpdated: String { return self._s[2940]! } - public var MediaPicker_TapToUngroupDescription: String { return self._s[2941]! } - public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2942]! } - public var AttachmentMenu_PhotoOrVideo: String { return self._s[2943]! } - public var Conversation_ContextMenuMore: String { return self._s[2944]! } - public var Privacy_PaymentsClearInfo: String { return self._s[2945]! } - public var CallSettings_TabIcon: String { return self._s[2946]! } - public var KeyCommand_Find: String { return self._s[2947]! } - public var ClearCache_FreeSpaceDescription: String { return self._s[2948]! } - public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2949]! } - public var EditTheme_Edit_Preview_IncomingText: String { return self._s[2950]! } - public var Message_PinnedGame: String { return self._s[2951]! } - public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2952]! } - public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2954]! } - public var Login_CallRequestState2: String { return self._s[2956]! } - public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2958]! } + public var Passport_PasswordDescription: String { return self._s[2954]! } + public var Channel_MessagePhotoUpdated: String { return self._s[2955]! } + public var MediaPicker_TapToUngroupDescription: String { return self._s[2956]! } + public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2957]! } + public var AttachmentMenu_PhotoOrVideo: String { return self._s[2958]! } + public var Conversation_ContextMenuMore: String { return self._s[2959]! } + public var Privacy_PaymentsClearInfo: String { return self._s[2960]! } + public var CallSettings_TabIcon: String { return self._s[2961]! } + public var KeyCommand_Find: String { return self._s[2962]! } + public var ClearCache_FreeSpaceDescription: String { return self._s[2963]! } + public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2964]! } + public var EditTheme_Edit_Preview_IncomingText: String { return self._s[2965]! } + public var Message_PinnedGame: String { return self._s[2966]! } + public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2967]! } + public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2969]! } + public var Login_CallRequestState2: String { return self._s[2971]! } + public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2973]! } public func VoiceOver_Chat_PhotoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2959]!, self._r[2959]!, [_0]) + return formatWithArgumentRanges(self._s[2974]!, self._r[2974]!, [_0]) } public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2961]!, self._r[2961]!, [_0]) + return formatWithArgumentRanges(self._s[2976]!, self._r[2976]!, [_0]) } - public var AuthSessions_AddDevice: String { return self._s[2962]! } - public var WallpaperPreview_Blurred: String { return self._s[2963]! } - public var Conversation_InstantPagePreview: String { return self._s[2964]! } - public var PeerInfo_ButtonUnmute: String { return self._s[2965]! } + public var AuthSessions_AddDevice: String { return self._s[2977]! } + public var WallpaperPreview_Blurred: String { return self._s[2978]! } + public var Conversation_InstantPagePreview: String { return self._s[2979]! } + public var PeerInfo_ButtonUnmute: String { return self._s[2980]! } public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2966]!, self._r[2966]!, [_0]) + return formatWithArgumentRanges(self._s[2981]!, self._r[2981]!, [_0]) } - public var SecretTimer_VideoDescription: String { return self._s[2969]! } - public var WallpaperSearch_ColorRed: String { return self._s[2970]! } - public var GroupPermission_NoPinMessages: String { return self._s[2971]! } - public var Passport_Language_es: String { return self._s[2972]! } - public var Permissions_ContactsAllow_v0: String { return self._s[2974]! } - public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2975]! } + public var SecretTimer_VideoDescription: String { return self._s[2984]! } + public var WallpaperSearch_ColorRed: String { return self._s[2985]! } + public var GroupPermission_NoPinMessages: String { return self._s[2986]! } + public var Passport_Language_es: String { return self._s[2987]! } + public var Permissions_ContactsAllow_v0: String { return self._s[2989]! } + public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2990]! } public func PUSH_CHAT_MESSAGE_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2976]!, self._r[2976]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2991]!, self._r[2991]!, [_1, _2]) } - public var Privacy_Forwards_CustomHelp: String { return self._s[2977]! } - public var WebPreview_GettingLinkInfo: String { return self._s[2978]! } - public var Watch_UserInfo_Unmute: String { return self._s[2979]! } - public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2980]! } - public var AccessDenied_CameraRestricted: String { return self._s[2982]! } + public var Privacy_Forwards_CustomHelp: String { return self._s[2992]! } + public var WebPreview_GettingLinkInfo: String { return self._s[2993]! } + public var Watch_UserInfo_Unmute: String { return self._s[2994]! } + public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2995]! } + public var AccessDenied_CameraRestricted: String { return self._s[2997]! } public func Conversation_Kilobytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2983]!, self._r[2983]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[2998]!, self._r[2998]!, ["\(_0)"]) } - public var ChatList_ReadAll: String { return self._s[2985]! } - public var Settings_CopyUsername: String { return self._s[2986]! } - public var Contacts_SearchLabel: String { return self._s[2987]! } - public var Map_OpenInYandexNavigator: String { return self._s[2989]! } - public var PasscodeSettings_EncryptData: String { return self._s[2990]! } - public var Settings_Wallet: String { return self._s[2991]! } - public var Group_ErrorSupergroupConversionNotPossible: String { return self._s[2992]! } - public var WallpaperSearch_ColorPrefix: String { return self._s[2993]! } - public var Notifications_GroupNotificationsPreview: String { return self._s[2994]! } - public var DialogList_AdNoticeAlert: String { return self._s[2995]! } - public var Wallet_Month_GenMay: String { return self._s[2997]! } - public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2998]! } - public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2999]! } - public var Localization_LanguageCustom: String { return self._s[3000]! } - public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[3001]! } - public var CallFeedback_Title: String { return self._s[3002]! } - public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[3005]! } - public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[3006]! } - public var Wallet_Intro_CreateErrorTitle: String { return self._s[3007]! } - public var Conversation_InfoGroup: String { return self._s[3008]! } - public var Compose_NewMessage: String { return self._s[3009]! } - public var FastTwoStepSetup_HintPlaceholder: String { return self._s[3010]! } - public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[3011]! } - public var Wallet_SecureStorageReset_BiometryFaceId: String { return self._s[3012]! } - public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[3013]! } + public var ChatList_ReadAll: String { return self._s[3000]! } + public var Settings_CopyUsername: String { return self._s[3001]! } + public var Contacts_SearchLabel: String { return self._s[3002]! } + public var Map_OpenInYandexNavigator: String { return self._s[3004]! } + public var PasscodeSettings_EncryptData: String { return self._s[3005]! } + public var Settings_Wallet: String { return self._s[3006]! } + public var Group_ErrorSupergroupConversionNotPossible: String { return self._s[3007]! } + public var WallpaperSearch_ColorPrefix: String { return self._s[3008]! } + public var Notifications_GroupNotificationsPreview: String { return self._s[3009]! } + public var DialogList_AdNoticeAlert: String { return self._s[3010]! } + public var Wallet_Month_GenMay: String { return self._s[3012]! } + public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[3013]! } + public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[3014]! } + public var Localization_LanguageCustom: String { return self._s[3015]! } + public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[3016]! } + public var CallFeedback_Title: String { return self._s[3017]! } + public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[3020]! } + public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[3021]! } + public var Wallet_Intro_CreateErrorTitle: String { return self._s[3022]! } + public var Conversation_InfoGroup: String { return self._s[3023]! } + public var Compose_NewMessage: String { return self._s[3024]! } + public var FastTwoStepSetup_HintPlaceholder: String { return self._s[3025]! } + public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[3026]! } + public var Wallet_SecureStorageReset_BiometryFaceId: String { return self._s[3027]! } + public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[3028]! } public func Passport_Scans_ScanIndex(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3014]!, self._r[3014]!, [_0]) - } - public var Channel_AdminLog_CanDeleteMessages: String { return self._s[3015]! } - public var Login_CancelSignUpConfirmation: String { return self._s[3016]! } - public var ChangePhoneNumberCode_Help: String { return self._s[3017]! } - public var PrivacySettings_DeleteAccountHelp: String { return self._s[3018]! } - public var Channel_BlackList_Title: String { return self._s[3019]! } - public var UserInfo_PhoneCall: String { return self._s[3020]! } - public var Passport_Address_OneOfTypeBankStatement: String { return self._s[3022]! } - public var Wallet_Month_ShortJanuary: String { return self._s[3023]! } - public var State_connecting: String { return self._s[3024]! } - public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[3025]! } - public var Wallet_Month_GenMarch: String { return self._s[3026]! } - public var EditTheme_Expand_BottomInfo: String { return self._s[3027]! } - public var AuthSessions_AddedDeviceTerminate: String { return self._s[3028]! } - public func LastSeen_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3029]!, self._r[3029]!, [_0]) } + public var Channel_AdminLog_CanDeleteMessages: String { return self._s[3030]! } + public var Login_CancelSignUpConfirmation: String { return self._s[3031]! } + public var ChangePhoneNumberCode_Help: String { return self._s[3032]! } + public var PrivacySettings_DeleteAccountHelp: String { return self._s[3033]! } + public var Channel_BlackList_Title: String { return self._s[3034]! } + public var UserInfo_PhoneCall: String { return self._s[3035]! } + public var Passport_Address_OneOfTypeBankStatement: String { return self._s[3037]! } + public var Wallet_Month_ShortJanuary: String { return self._s[3038]! } + public var State_connecting: String { return self._s[3039]! } + public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[3040]! } + public var Wallet_Month_GenMarch: String { return self._s[3041]! } + public var EditTheme_Expand_BottomInfo: String { return self._s[3042]! } + public var AuthSessions_AddedDeviceTerminate: String { return self._s[3043]! } + public func LastSeen_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3044]!, self._r[3044]!, [_0]) + } public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3030]!, self._r[3030]!, [_0]) + return formatWithArgumentRanges(self._s[3045]!, self._r[3045]!, [_0]) } - public var Notifications_GroupNotifications: String { return self._s[3031]! } - public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[3032]! } - public var Passport_Identity_EditPassport: String { return self._s[3033]! } - public var EnterPasscode_RepeatNewPasscode: String { return self._s[3035]! } - public var Localization_EnglishLanguageName: String { return self._s[3036]! } - public var Share_AuthDescription: String { return self._s[3037]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[3038]! } - public var Passport_Identity_Surname: String { return self._s[3039]! } - public var Compose_TokenListPlaceholder: String { return self._s[3040]! } - public var Wallet_AccessDenied_Camera: String { return self._s[3041]! } - public var Passport_Identity_OneOfTypePassport: String { return self._s[3042]! } - public var Settings_AboutEmpty: String { return self._s[3043]! } - public var Conversation_Unmute: String { return self._s[3044]! } - public var CreateGroup_ChannelsTooMuch: String { return self._s[3046]! } - public var Wallet_Sending_Text: String { return self._s[3047]! } + public var Notifications_GroupNotifications: String { return self._s[3046]! } + public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[3047]! } + public var Passport_Identity_EditPassport: String { return self._s[3048]! } + public var EnterPasscode_RepeatNewPasscode: String { return self._s[3050]! } + public var Localization_EnglishLanguageName: String { return self._s[3051]! } + public var Share_AuthDescription: String { return self._s[3052]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[3053]! } + public var Passport_Identity_Surname: String { return self._s[3054]! } + public var Compose_TokenListPlaceholder: String { return self._s[3055]! } + public var Wallet_AccessDenied_Camera: String { return self._s[3056]! } + public var Passport_Identity_OneOfTypePassport: String { return self._s[3057]! } + public var Settings_AboutEmpty: String { return self._s[3058]! } + public var Conversation_Unmute: String { return self._s[3059]! } + public var CreateGroup_ChannelsTooMuch: String { return self._s[3061]! } + public var Wallet_Sending_Text: String { return self._s[3062]! } public func PUSH_CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3048]!, self._r[3048]!, [_1]) + return formatWithArgumentRanges(self._s[3063]!, self._r[3063]!, [_1]) } - public var Login_CodeSentCall: String { return self._s[3049]! } - public var ContactInfo_PhoneLabelHomeFax: String { return self._s[3051]! } - public var ChatSettings_Appearance: String { return self._s[3052]! } - public var ClearCache_StorageUsage: String { return self._s[3053]! } - public var Appearance_PickAccentColor: String { return self._s[3054]! } + public var Login_CodeSentCall: String { return self._s[3064]! } + public var ContactInfo_PhoneLabelHomeFax: String { return self._s[3066]! } + public var ChatSettings_Appearance: String { return self._s[3067]! } + public var ClearCache_StorageUsage: String { return self._s[3068]! } + public var Appearance_PickAccentColor: String { return self._s[3069]! } public func PUSH_CHAT_MESSAGE_NOTEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3055]!, self._r[3055]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3070]!, self._r[3070]!, [_1, _2]) } public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3056]!, self._r[3056]!, [_1]) + return formatWithArgumentRanges(self._s[3071]!, self._r[3071]!, [_1]) } - public var Notification_CallMissed: String { return self._s[3057]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[3058]! } - public var Channel_AdminLogFilter_EventsInfo: String { return self._s[3059]! } - public var Wallet_Month_GenOctober: String { return self._s[3061]! } - public var ChatAdmins_AdminLabel: String { return self._s[3062]! } - public var KeyCommand_JumpToNextChat: String { return self._s[3063]! } - public var Conversation_StopPollConfirmationTitle: String { return self._s[3065]! } - public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[3066]! } - public var Month_GenJune: String { return self._s[3067]! } - public var IntentsSettings_MainAccountInfo: String { return self._s[3068]! } - public var Watch_Location_Current: String { return self._s[3069]! } - public var Wallet_Receive_CopyInvoiceUrl: String { return self._s[3070]! } - public var Conversation_TitleMute: String { return self._s[3071]! } - public var Map_PlacesInThisArea: String { return self._s[3072]! } + public var Notification_CallMissed: String { return self._s[3072]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[3073]! } + public var Channel_AdminLogFilter_EventsInfo: String { return self._s[3074]! } + public var Wallet_Month_GenOctober: String { return self._s[3076]! } + public var ChatAdmins_AdminLabel: String { return self._s[3077]! } + public var KeyCommand_JumpToNextChat: String { return self._s[3078]! } + public var Conversation_StopPollConfirmationTitle: String { return self._s[3080]! } + public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[3081]! } + public var Month_GenJune: String { return self._s[3082]! } + public var IntentsSettings_MainAccountInfo: String { return self._s[3083]! } + public var Watch_Location_Current: String { return self._s[3084]! } + public var Wallet_Receive_CopyInvoiceUrl: String { return self._s[3085]! } + public var Conversation_TitleMute: String { return self._s[3086]! } + public var Map_PlacesInThisArea: String { return self._s[3087]! } public func PUSH_CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3073]!, self._r[3073]!, [_1]) + return formatWithArgumentRanges(self._s[3088]!, self._r[3088]!, [_1]) } - public var GroupInfo_DeleteAndExit: String { return self._s[3074]! } + public var GroupInfo_DeleteAndExit: String { return self._s[3089]! } public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3075]!, self._r[3075]!, [_0]) + return formatWithArgumentRanges(self._s[3090]!, self._r[3090]!, [_0]) } - public var Call_ReportPlaceholder: String { return self._s[3076]! } - public var Chat_SlowmodeSendError: String { return self._s[3077]! } - public var MaskStickerSettings_Info: String { return self._s[3078]! } - public var EditTheme_Expand_TopInfo: String { return self._s[3079]! } + public var Call_ReportPlaceholder: String { return self._s[3091]! } + public var Chat_SlowmodeSendError: String { return self._s[3092]! } + public var MaskStickerSettings_Info: String { return self._s[3093]! } + public var EditTheme_Expand_TopInfo: String { return self._s[3094]! } public func GroupInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3080]!, self._r[3080]!, [_0]) + return formatWithArgumentRanges(self._s[3095]!, self._r[3095]!, [_0]) } - public var Checkout_NewCard_PostcodeTitle: String { return self._s[3081]! } - public var Passport_Address_RegionPlaceholder: String { return self._s[3083]! } - public var Contacts_ShareTelegram: String { return self._s[3084]! } - public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[3085]! } - public var Map_AddressOnMap: String { return self._s[3086]! } - public var Channel_ErrorAccessDenied: String { return self._s[3087]! } - public var UserInfo_ScamBotWarning: String { return self._s[3089]! } - public var Stickers_GroupChooseStickerPack: String { return self._s[3090]! } - public var Call_ConnectionErrorTitle: String { return self._s[3091]! } - public var UserInfo_NotificationsEnable: String { return self._s[3092]! } - public var ArchivedChats_IntroText1: String { return self._s[3093]! } - public var Tour_Text4: String { return self._s[3096]! } - public var WallpaperSearch_Recent: String { return self._s[3097]! } - public var GroupInfo_ScamGroupWarning: String { return self._s[3098]! } - public var PeopleNearby_MakeVisibleTitle: String { return self._s[3099]! } - public var Profile_MessageLifetime2s: String { return self._s[3101]! } - public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[3102]! } - public var Notification_MessageLifetime2s: String { return self._s[3103]! } + public var Checkout_NewCard_PostcodeTitle: String { return self._s[3096]! } + public var Passport_Address_RegionPlaceholder: String { return self._s[3098]! } + public var Contacts_ShareTelegram: String { return self._s[3099]! } + public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[3100]! } + public var Map_AddressOnMap: String { return self._s[3101]! } + public var Channel_ErrorAccessDenied: String { return self._s[3102]! } + public var UserInfo_ScamBotWarning: String { return self._s[3104]! } + public var Stickers_GroupChooseStickerPack: String { return self._s[3105]! } + public var Call_ConnectionErrorTitle: String { return self._s[3106]! } + public var UserInfo_NotificationsEnable: String { return self._s[3107]! } + public var ArchivedChats_IntroText1: String { return self._s[3108]! } + public var Tour_Text4: String { return self._s[3111]! } + public var WallpaperSearch_Recent: String { return self._s[3112]! } + public var GroupInfo_ScamGroupWarning: String { return self._s[3113]! } + public var PeopleNearby_MakeVisibleTitle: String { return self._s[3114]! } + public var Profile_MessageLifetime2s: String { return self._s[3116]! } + public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[3117]! } + public var Notification_MessageLifetime2s: String { return self._s[3118]! } public func Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3104]!, self._r[3104]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3119]!, self._r[3119]!, [_1, _2, _3]) } - public var Cache_ClearCache: String { return self._s[3105]! } - public var AutoNightTheme_UpdateLocation: String { return self._s[3106]! } - public var Permissions_NotificationsUnreachableText_v0: String { return self._s[3107]! } + public var Cache_ClearCache: String { return self._s[3120]! } + public var AutoNightTheme_UpdateLocation: String { return self._s[3121]! } + public var Permissions_NotificationsUnreachableText_v0: String { return self._s[3122]! } public func Channel_AdminLog_MessageChangedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3111]!, self._r[3111]!, [_0]) + return formatWithArgumentRanges(self._s[3126]!, self._r[3126]!, [_0]) } public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3113]!, self._r[3113]!, [_0]) + return formatWithArgumentRanges(self._s[3128]!, self._r[3128]!, [_0]) } - public var LocalGroup_Text: String { return self._s[3114]! } - public var PeerInfo_PaneMembers: String { return self._s[3115]! } - public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[3116]! } - public var SocksProxySetup_TypeSocks: String { return self._s[3117]! } - public var ChatList_UnarchiveAction: String { return self._s[3118]! } - public var AutoNightTheme_Title: String { return self._s[3119]! } - public var InstantPage_FeedbackButton: String { return self._s[3120]! } - public var Passport_FieldAddress: String { return self._s[3121]! } + public var LocalGroup_Text: String { return self._s[3129]! } + public var PeerInfo_PaneMembers: String { return self._s[3130]! } + public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[3131]! } + public var SocksProxySetup_TypeSocks: String { return self._s[3132]! } + public var ChatList_UnarchiveAction: String { return self._s[3133]! } + public var AutoNightTheme_Title: String { return self._s[3134]! } + public var InstantPage_FeedbackButton: String { return self._s[3135]! } + public var Passport_FieldAddress: String { return self._s[3136]! } public func Channel_AdminLog_SetSlowmode(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3122]!, self._r[3122]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3137]!, self._r[3137]!, [_1, _2]) } - public var Month_ShortMarch: String { return self._s[3123]! } + public var Month_ShortMarch: String { return self._s[3138]! } public func PUSH_MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3124]!, self._r[3124]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3139]!, self._r[3139]!, [_1, _2]) } - public var SocksProxySetup_UsernamePlaceholder: String { return self._s[3125]! } - public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[3126]! } - public var Passport_FloodError: String { return self._s[3127]! } - public var SecretGif_Title: String { return self._s[3128]! } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[3129]! } - public var ChatList_Context_UnhideArchive: String { return self._s[3130]! } - public var Passport_Language_th: String { return self._s[3132]! } - public var Passport_Address_Address: String { return self._s[3133]! } - public var Login_InvalidLastNameError: String { return self._s[3134]! } - public var Notifications_InAppNotificationsPreview: String { return self._s[3135]! } - public var Notifications_PermissionsUnreachableTitle: String { return self._s[3136]! } - public var ChatList_Context_Archive: String { return self._s[3137]! } - public var SettingsSearch_FAQ: String { return self._s[3138]! } - public var ShareMenu_Send: String { return self._s[3139]! } - public var ChatState_Connecting: String { return self._s[3140]! } - public var WallpaperSearch_ColorYellow: String { return self._s[3142]! } - public var Month_GenNovember: String { return self._s[3144]! } - public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[3146]! } + public var SocksProxySetup_UsernamePlaceholder: String { return self._s[3140]! } + public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[3141]! } + public var Passport_FloodError: String { return self._s[3142]! } + public var SecretGif_Title: String { return self._s[3143]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[3144]! } + public var ChatList_Context_UnhideArchive: String { return self._s[3145]! } + public var Passport_Language_th: String { return self._s[3147]! } + public var Passport_Address_Address: String { return self._s[3148]! } + public var Login_InvalidLastNameError: String { return self._s[3149]! } + public var Notifications_InAppNotificationsPreview: String { return self._s[3150]! } + public var Notifications_PermissionsUnreachableTitle: String { return self._s[3151]! } + public var ChatList_Context_Archive: String { return self._s[3152]! } + public var SettingsSearch_FAQ: String { return self._s[3153]! } + public var ShareMenu_Send: String { return self._s[3154]! } + public var ChatState_Connecting: String { return self._s[3155]! } + public var WallpaperSearch_ColorYellow: String { return self._s[3157]! } + public var Month_GenNovember: String { return self._s[3159]! } + public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[3161]! } public func Conversation_ShareMyPhoneNumberConfirmation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3147]!, self._r[3147]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3162]!, self._r[3162]!, [_1, _2]) } - public var Conversation_SwipeToReplyHintText: String { return self._s[3148]! } - public var Checkout_Email: String { return self._s[3149]! } - public var NotificationsSound_Tritone: String { return self._s[3150]! } - public var StickerPacksSettings_ManagingHelp: String { return self._s[3152]! } - public var Wallet_ContextMenuCopy: String { return self._s[3154]! } + public var Conversation_SwipeToReplyHintText: String { return self._s[3163]! } + public var Checkout_Email: String { return self._s[3164]! } + public var NotificationsSound_Tritone: String { return self._s[3165]! } + public var StickerPacksSettings_ManagingHelp: String { return self._s[3167]! } + public var Wallet_ContextMenuCopy: String { return self._s[3169]! } public func Wallet_Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3156]!, self._r[3156]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3171]!, self._r[3171]!, [_1, _2, _3]) } - public var Appearance_TextSize_Automatic: String { return self._s[3157]! } + public var Appearance_TextSize_Automatic: String { return self._s[3172]! } public func PUSH_PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3158]!, self._r[3158]!, [_1]) + return formatWithArgumentRanges(self._s[3174]!, self._r[3174]!, [_1]) } public func StickerPackActionInfo_AddedText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3159]!, self._r[3159]!, [_0]) - } - public var ChangePhoneNumberNumber_Help: String { return self._s[3160]! } - public func Checkout_LiabilityAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3161]!, self._r[3161]!, [_1, _1, _1, _2]) - } - public var ChatList_UndoArchiveTitle: String { return self._s[3162]! } - public var Notification_Exceptions_Add: String { return self._s[3163]! } - public var DialogList_You: String { return self._s[3164]! } - public var MediaPicker_Send: String { return self._s[3167]! } - public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[3168]! } - public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[3169]! } - public var Call_AudioRouteSpeaker: String { return self._s[3170]! } - public var Watch_UserInfo_Title: String { return self._s[3171]! } - public var VoiceOver_Chat_PollFinalResults: String { return self._s[3172]! } - public var Appearance_AccentColor: String { return self._s[3174]! } - public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3175]!, self._r[3175]!, [_0]) } - public var Permissions_ContactsAllowInSettings_v0: String { return self._s[3176]! } - public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3177]!, self._r[3177]!, [_1, _2]) + public var ChangePhoneNumberNumber_Help: String { return self._s[3176]! } + public func Checkout_LiabilityAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3177]!, self._r[3177]!, [_1, _1, _1, _2]) } - public var Conversation_ClousStorageInfo_Description2: String { return self._s[3178]! } - public var WebSearch_RecentClearConfirmation: String { return self._s[3179]! } - public var Notification_CallOutgoing: String { return self._s[3180]! } - public var PrivacySettings_PasscodeAndFaceId: String { return self._s[3181]! } - public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[3182]! } - public var Call_RecordingDisabledMessage: String { return self._s[3183]! } - public var Message_Game: String { return self._s[3184]! } - public var Conversation_PressVolumeButtonForSound: String { return self._s[3185]! } - public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[3186]! } - public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[3187]! } - public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[3188]! } - public var Date_DialogDateFormat: String { return self._s[3190]! } - public var WallpaperColors_SetCustomColor: String { return self._s[3191]! } - public var Notifications_InAppNotifications: String { return self._s[3192]! } + public var ChatList_UndoArchiveTitle: String { return self._s[3178]! } + public var Notification_Exceptions_Add: String { return self._s[3179]! } + public var DialogList_You: String { return self._s[3180]! } + public var MediaPicker_Send: String { return self._s[3183]! } + public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[3184]! } + public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[3185]! } + public var Call_AudioRouteSpeaker: String { return self._s[3186]! } + public var Watch_UserInfo_Title: String { return self._s[3187]! } + public var VoiceOver_Chat_PollFinalResults: String { return self._s[3188]! } + public var Appearance_AccentColor: String { return self._s[3190]! } + public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3191]!, self._r[3191]!, [_0]) + } + public var Permissions_ContactsAllowInSettings_v0: String { return self._s[3192]! } + public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3193]!, self._r[3193]!, [_1, _2]) + } + public var Conversation_ClousStorageInfo_Description2: String { return self._s[3194]! } + public var WebSearch_RecentClearConfirmation: String { return self._s[3195]! } + public var Notification_CallOutgoing: String { return self._s[3196]! } + public var PrivacySettings_PasscodeAndFaceId: String { return self._s[3197]! } + public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[3198]! } + public var Call_RecordingDisabledMessage: String { return self._s[3199]! } + public var Message_Game: String { return self._s[3200]! } + public var Conversation_PressVolumeButtonForSound: String { return self._s[3201]! } + public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[3202]! } + public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[3203]! } + public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[3204]! } + public var Date_DialogDateFormat: String { return self._s[3206]! } + public var WallpaperColors_SetCustomColor: String { return self._s[3207]! } + public var Notifications_InAppNotifications: String { return self._s[3208]! } public func Channel_Management_RemovedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3193]!, self._r[3193]!, [_0]) + return formatWithArgumentRanges(self._s[3209]!, self._r[3209]!, [_0]) } public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3194]!, self._r[3194]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3210]!, self._r[3210]!, [_1, _2]) } - public var NewContact_Title: String { return self._s[3195]! } + public var NewContact_Title: String { return self._s[3211]! } public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3196]!, self._r[3196]!, [_0]) + return formatWithArgumentRanges(self._s[3212]!, self._r[3212]!, [_0]) } - public var Conversation_ViewContactDetails: String { return self._s[3197]! } + public var Conversation_ViewContactDetails: String { return self._s[3213]! } public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3199]!, self._r[3199]!, [_1]) + return formatWithArgumentRanges(self._s[3215]!, self._r[3215]!, [_1]) } - public var Checkout_NewCard_CardholderNameTitle: String { return self._s[3200]! } - public var Passport_Identity_ExpiryDateNone: String { return self._s[3201]! } - public var PrivacySettings_Title: String { return self._s[3202]! } - public var Conversation_SilentBroadcastTooltipOff: String { return self._s[3205]! } - public var GroupRemoved_UsersSectionTitle: String { return self._s[3206]! } - public var VoiceOver_Chat_ContactEmail: String { return self._s[3207]! } - public var Contacts_PhoneNumber: String { return self._s[3208]! } - public var PeerInfo_ButtonMute: String { return self._s[3209]! } - public var TwoFactorSetup_Password_PlaceholderConfirmPassword: String { return self._s[3211]! } - public var Map_ShowPlaces: String { return self._s[3212]! } - public var ChatAdmins_Title: String { return self._s[3213]! } - public var InstantPage_Reference: String { return self._s[3215]! } - public var Wallet_Info_Updating: String { return self._s[3216]! } - public var ReportGroupLocation_Text: String { return self._s[3217]! } + public var Checkout_NewCard_CardholderNameTitle: String { return self._s[3216]! } + public var Passport_Identity_ExpiryDateNone: String { return self._s[3217]! } + public var PrivacySettings_Title: String { return self._s[3218]! } + public var Conversation_SilentBroadcastTooltipOff: String { return self._s[3221]! } + public var GroupRemoved_UsersSectionTitle: String { return self._s[3222]! } + public var VoiceOver_Chat_ContactEmail: String { return self._s[3223]! } + public var Contacts_PhoneNumber: String { return self._s[3224]! } + public var PeerInfo_ButtonMute: String { return self._s[3225]! } + public var TwoFactorSetup_Password_PlaceholderConfirmPassword: String { return self._s[3227]! } + public var Map_ShowPlaces: String { return self._s[3228]! } + public var ChatAdmins_Title: String { return self._s[3229]! } + public var InstantPage_Reference: String { return self._s[3231]! } + public var Wallet_Info_Updating: String { return self._s[3232]! } + public var ReportGroupLocation_Text: String { return self._s[3233]! } public func PUSH_CHAT_MESSAGE_FWD(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3218]!, self._r[3218]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3234]!, self._r[3234]!, [_1, _2]) } - public var Camera_FlashOff: String { return self._s[3219]! } - public var Watch_UserInfo_Block: String { return self._s[3220]! } - public var ChatSettings_Stickers: String { return self._s[3221]! } - public var ChatSettings_DownloadInBackground: String { return self._s[3222]! } - public var Appearance_ThemeCarouselTintedNight: String { return self._s[3223]! } + public var Camera_FlashOff: String { return self._s[3235]! } + public var Watch_UserInfo_Block: String { return self._s[3236]! } + public var ChatSettings_Stickers: String { return self._s[3237]! } + public var ChatSettings_DownloadInBackground: String { return self._s[3238]! } + public var Appearance_ThemeCarouselTintedNight: String { return self._s[3239]! } public func UserInfo_BlockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3224]!, self._r[3224]!, [_0]) + return formatWithArgumentRanges(self._s[3240]!, self._r[3240]!, [_0]) } - public var Settings_ViewPhoto: String { return self._s[3225]! } - public var Login_CheckOtherSessionMessages: String { return self._s[3226]! } - public var AutoDownloadSettings_Cellular: String { return self._s[3227]! } - public var Wallet_Created_ExportErrorTitle: String { return self._s[3228]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[3229]! } - public var VoiceOver_MessageContextShare: String { return self._s[3230]! } + public var Settings_ViewPhoto: String { return self._s[3241]! } + public var Login_CheckOtherSessionMessages: String { return self._s[3242]! } + public var AutoDownloadSettings_Cellular: String { return self._s[3243]! } + public var Wallet_Created_ExportErrorTitle: String { return self._s[3244]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[3245]! } + public var VoiceOver_MessageContextShare: String { return self._s[3246]! } public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3232]!, self._r[3232]!, [_0]) + return formatWithArgumentRanges(self._s[3248]!, self._r[3248]!, [_0]) } - public var Privacy_DeleteDrafts: String { return self._s[3233]! } - public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[3234]! } + public var Privacy_DeleteDrafts: String { return self._s[3249]! } + public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[3250]! } public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3235]!, self._r[3235]!, [_0]) + return formatWithArgumentRanges(self._s[3251]!, self._r[3251]!, [_0]) } - public var DialogList_SavedMessagesHelp: String { return self._s[3236]! } - public var Wallet_SecureStorageNotAvailable_Title: String { return self._s[3237]! } - public var DialogList_SavedMessages: String { return self._s[3238]! } - public var GroupInfo_UpgradeButton: String { return self._s[3239]! } - public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[3241]! } - public var DialogList_Pin: String { return self._s[3242]! } + public var DialogList_SavedMessagesHelp: String { return self._s[3252]! } + public var Wallet_SecureStorageNotAvailable_Title: String { return self._s[3253]! } + public var DialogList_SavedMessages: String { return self._s[3254]! } + public var GroupInfo_UpgradeButton: String { return self._s[3255]! } + public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[3257]! } + public var DialogList_Pin: String { return self._s[3258]! } public func ForwardedAuthors2(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3243]!, self._r[3243]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3259]!, self._r[3259]!, [_0, _1]) } public func Login_PhoneGenericEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3244]!, self._r[3244]!, [_0]) + return formatWithArgumentRanges(self._s[3260]!, self._r[3260]!, [_0]) } - public var Notification_Exceptions_AlwaysOn: String { return self._s[3245]! } - public var UserInfo_NotificationsDisable: String { return self._s[3246]! } - public var Conversation_ContextMenuCancelEditing: String { return self._s[3247]! } - public var Paint_Outlined: String { return self._s[3248]! } - public var Activity_PlayingGame: String { return self._s[3249]! } - public var SearchImages_NoImagesFound: String { return self._s[3250]! } - public var SocksProxySetup_ProxyType: String { return self._s[3251]! } - public var AppleWatch_ReplyPresetsHelp: String { return self._s[3253]! } - public var Conversation_ContextMenuCancelSending: String { return self._s[3254]! } - public var Settings_AppLanguage: String { return self._s[3255]! } - public var TwoStepAuth_ResetAccountHelp: String { return self._s[3256]! } - public var Common_ChoosePhoto: String { return self._s[3257]! } - public var AuthSessions_AddDevice_InvalidQRCode: String { return self._s[3258]! } - public var CallFeedback_ReasonEcho: String { return self._s[3259]! } + public var Notification_Exceptions_AlwaysOn: String { return self._s[3261]! } + public var UserInfo_NotificationsDisable: String { return self._s[3262]! } + public var Conversation_ContextMenuCancelEditing: String { return self._s[3263]! } + public var Paint_Outlined: String { return self._s[3264]! } + public var Activity_PlayingGame: String { return self._s[3265]! } + public var SearchImages_NoImagesFound: String { return self._s[3266]! } + public var SocksProxySetup_ProxyType: String { return self._s[3267]! } + public var AppleWatch_ReplyPresetsHelp: String { return self._s[3269]! } + public var Conversation_ContextMenuCancelSending: String { return self._s[3270]! } + public var Settings_AppLanguage: String { return self._s[3271]! } + public var TwoStepAuth_ResetAccountHelp: String { return self._s[3272]! } + public var Common_ChoosePhoto: String { return self._s[3273]! } + public var AuthSessions_AddDevice_InvalidQRCode: String { return self._s[3274]! } + public var CallFeedback_ReasonEcho: String { return self._s[3275]! } public func PUSH_PINNED_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3260]!, self._r[3260]!, [_1]) - } - public var Privacy_Calls_AlwaysAllow: String { return self._s[3261]! } - public var PollResults_Collapse: String { return self._s[3262]! } - public var Activity_UploadingVideo: String { return self._s[3263]! } - public var Conversation_WalletRequiredNotNow: String { return self._s[3264]! } - public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[3265]! } - public var NetworkUsageSettings_Wifi: String { return self._s[3266]! } - public var VoiceOver_Editing_ClearText: String { return self._s[3267]! } - public var PUSH_SENDER_YOU: String { return self._s[3268]! } - public var Channel_BanUser_PermissionReadMessages: String { return self._s[3269]! } - public var Checkout_PayWithTouchId: String { return self._s[3270]! } - public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[3271]! } - public func PUSH_LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3273]!, self._r[3273]!, [_1]) - } - public var Notifications_ExceptionsNone: String { return self._s[3274]! } - public func Message_ForwardedMessageShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3275]!, self._r[3275]!, [_0]) - } - public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3276]!, self._r[3276]!, [_1]) } - public var AuthSessions_IncompleteAttempts: String { return self._s[3278]! } - public var Passport_Address_Region: String { return self._s[3281]! } - public var ChatList_DeleteChat: String { return self._s[3282]! } - public var LogoutOptions_ClearCacheTitle: String { return self._s[3283]! } - public var PhotoEditor_TiltShift: String { return self._s[3284]! } - public var Settings_FAQ_URL: String { return self._s[3285]! } - public var TwoFactorSetup_EmailVerification_ChangeAction: String { return self._s[3286]! } - public var Passport_Language_sl: String { return self._s[3287]! } - public var Settings_PrivacySettings: String { return self._s[3289]! } - public var SharedMedia_TitleLink: String { return self._s[3290]! } - public var Passport_Identity_TypePassportUploadScan: String { return self._s[3291]! } - public var Settings_SetProfilePhoto: String { return self._s[3292]! } - public var Channel_About_Help: String { return self._s[3293]! } - public var Contacts_PermissionsEnable: String { return self._s[3294]! } - public var Wallet_Sending_Title: String { return self._s[3295]! } - public var PeerInfo_PaneMedia: String { return self._s[3296]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[3297]! } - public var AttachmentMenu_SendAsFiles: String { return self._s[3298]! } - public var CallFeedback_ReasonInterruption: String { return self._s[3300]! } - public var Passport_Address_AddTemporaryRegistration: String { return self._s[3301]! } - public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[3302]! } - public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[3303]! } - public var OldChannels_Title: String { return self._s[3304]! } - public var PrivacySettings_DeleteAccountTitle: String { return self._s[3305]! } - public var AccessDenied_VideoMessageCamera: String { return self._s[3307]! } - public var Map_OpenInYandexMaps: String { return self._s[3309]! } - public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[3310]! } - public var VoiceOver_MessageContextReply: String { return self._s[3311]! } - public var PhotoEditor_SaturationTool: String { return self._s[3313]! } + public var Privacy_Calls_AlwaysAllow: String { return self._s[3277]! } + public var PollResults_Collapse: String { return self._s[3278]! } + public var Activity_UploadingVideo: String { return self._s[3279]! } + public var Conversation_WalletRequiredNotNow: String { return self._s[3280]! } + public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[3281]! } + public var NetworkUsageSettings_Wifi: String { return self._s[3282]! } + public var VoiceOver_Editing_ClearText: String { return self._s[3283]! } + public var PUSH_SENDER_YOU: String { return self._s[3284]! } + public var Channel_BanUser_PermissionReadMessages: String { return self._s[3285]! } + public var Checkout_PayWithTouchId: String { return self._s[3286]! } + public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[3287]! } + public func PUSH_LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3289]!, self._r[3289]!, [_1]) + } + public var Notifications_ExceptionsNone: String { return self._s[3290]! } + public func Message_ForwardedMessageShort(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3291]!, self._r[3291]!, [_0]) + } + public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3292]!, self._r[3292]!, [_1]) + } + public var AuthSessions_IncompleteAttempts: String { return self._s[3294]! } + public var Passport_Address_Region: String { return self._s[3297]! } + public var ChatList_DeleteChat: String { return self._s[3298]! } + public var LogoutOptions_ClearCacheTitle: String { return self._s[3299]! } + public var PhotoEditor_TiltShift: String { return self._s[3300]! } + public var Settings_FAQ_URL: String { return self._s[3301]! } + public var TwoFactorSetup_EmailVerification_ChangeAction: String { return self._s[3302]! } + public var Passport_Language_sl: String { return self._s[3304]! } + public var Settings_PrivacySettings: String { return self._s[3306]! } + public var SharedMedia_TitleLink: String { return self._s[3307]! } + public var Passport_Identity_TypePassportUploadScan: String { return self._s[3308]! } + public var Settings_SetProfilePhoto: String { return self._s[3309]! } + public var Channel_About_Help: String { return self._s[3310]! } + public var Contacts_PermissionsEnable: String { return self._s[3311]! } + public var Wallet_Sending_Title: String { return self._s[3312]! } + public var PeerInfo_PaneMedia: String { return self._s[3313]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[3314]! } + public var AttachmentMenu_SendAsFiles: String { return self._s[3315]! } + public var CallFeedback_ReasonInterruption: String { return self._s[3317]! } + public var Passport_Address_AddTemporaryRegistration: String { return self._s[3318]! } + public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[3319]! } + public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[3320]! } + public var OldChannels_Title: String { return self._s[3321]! } + public var PrivacySettings_DeleteAccountTitle: String { return self._s[3322]! } + public var AccessDenied_VideoMessageCamera: String { return self._s[3324]! } + public var Map_OpenInYandexMaps: String { return self._s[3326]! } + public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[3327]! } + public var VoiceOver_MessageContextReply: String { return self._s[3328]! } + public var PhotoEditor_SaturationTool: String { return self._s[3330]! } public func PUSH_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3314]!, self._r[3314]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3331]!, self._r[3331]!, [_1, _2]) } - public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[3315]! } - public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[3316]! } - public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[3317]! } + public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[3332]! } + public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[3333]! } + public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[3334]! } public func LOCAL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3318]!, self._r[3318]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3335]!, self._r[3335]!, [_1, "\(_2)"]) } - public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[3319]! } - public var Channel_Username_InvalidTooShort: String { return self._s[3321]! } - public var SettingsSearch_Synonyms_Wallet: String { return self._s[3322]! } + public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[3336]! } + public var Channel_Username_InvalidTooShort: String { return self._s[3338]! } + public var SettingsSearch_Synonyms_Wallet: String { return self._s[3339]! } public func Group_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3323]!, self._r[3323]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3340]!, self._r[3340]!, [_1, _2]) } - public var Forward_ErrorPublicPollDisabledInChannels: String { return self._s[3324]! } + public var Forward_ErrorPublicPollDisabledInChannels: String { return self._s[3341]! } public func PUSH_CHAT_MESSAGE_GAME(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3325]!, self._r[3325]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3342]!, self._r[3342]!, [_1, _2, _3]) } - public var WallpaperPreview_PatternTitle: String { return self._s[3326]! } - public var GroupInfo_PublicLinkAdd: String { return self._s[3327]! } - public var Passport_PassportInformation: String { return self._s[3330]! } - public var Theme_Unsupported: String { return self._s[3331]! } - public var WatchRemote_AlertTitle: String { return self._s[3332]! } - public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[3333]! } - public var ConvertToSupergroup_HelpText: String { return self._s[3335]! } + public var WallpaperPreview_PatternTitle: String { return self._s[3343]! } + public var GroupInfo_PublicLinkAdd: String { return self._s[3344]! } + public var Passport_PassportInformation: String { return self._s[3347]! } + public var Theme_Unsupported: String { return self._s[3348]! } + public var WatchRemote_AlertTitle: String { return self._s[3349]! } + public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[3350]! } + public var ConvertToSupergroup_HelpText: String { return self._s[3352]! } public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3336]!, self._r[3336]!, [_0]) - } - public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3337]!, self._r[3337]!, [_1]) - } - public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[3338]! } - public var Wallet_Navigation_Done: String { return self._s[3340]! } - public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[3341]! } - public var AccessDenied_CameraDisabled: String { return self._s[3342]! } - public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3343]!, self._r[3343]!, [_0]) - } - public var ClearCache_Forever: String { return self._s[3344]! } - public var AuthSessions_AddDeviceIntro_Title: String { return self._s[3345]! } - public var CreatePoll_Quiz: String { return self._s[3346]! } - public var PhotoEditor_ContrastTool: String { return self._s[3349]! } - public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3350]!, self._r[3350]!, [_1]) - } - public var DialogList_Draft: String { return self._s[3351]! } - public var Wallet_Configuration_BlockchainIdInfo: String { return self._s[3352]! } - public func PeopleNearby_VisibleUntil(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3353]!, self._r[3353]!, [_0]) } - public var Privacy_TopPeersDelete: String { return self._s[3355]! } - public var LoginPassword_PasswordPlaceholder: String { return self._s[3356]! } - public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[3357]! } - public var WebSearch_RecentSectionClear: String { return self._s[3358]! } - public var EditTheme_ErrorInvalidCharacters: String { return self._s[3359]! } - public var Watch_ChatList_NoConversationsTitle: String { return self._s[3361]! } - public var PeerInfo_ButtonMore: String { return self._s[3363]! } - public var Common_Done: String { return self._s[3364]! } - public var Shortcut_SwitchAccount: String { return self._s[3365]! } - public var AuthSessions_EmptyText: String { return self._s[3366]! } - public var Wallet_Configuration_BlockchainNameChangedTitle: String { return self._s[3367]! } - public var Conversation_ShareBotContactConfirmation: String { return self._s[3368]! } - public var Tour_Title5: String { return self._s[3369]! } - public var Wallet_Settings_Title: String { return self._s[3370]! } - public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3371]!, self._r[3371]!, [_0]) + public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3354]!, self._r[3354]!, [_1]) } - public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[3372]! } - public var Conversation_LinkDialogSave: String { return self._s[3373]! } - public var GroupInfo_ActionRestrict: String { return self._s[3374]! } - public var Checkout_Title: String { return self._s[3375]! } - public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[3377]! } - public var Channel_AdminLog_CanChangeInfo: String { return self._s[3379]! } - public var Notification_RenamedGroup: String { return self._s[3380]! } - public var PeopleNearby_Groups: String { return self._s[3381]! } - public var Checkout_PayWithFaceId: String { return self._s[3382]! } - public var Channel_BanList_BlockedTitle: String { return self._s[3383]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[3385]! } - public var Checkout_WebConfirmation_Title: String { return self._s[3386]! } - public var Notifications_MessageNotificationsAlert: String { return self._s[3387]! } - public func Activity_RemindAboutGroup(_ _0: String) -> (String, [(Int, NSRange)]) { + public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[3355]! } + public var Wallet_Navigation_Done: String { return self._s[3357]! } + public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[3358]! } + public var AccessDenied_CameraDisabled: String { return self._s[3359]! } + public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3360]!, self._r[3360]!, [_0]) + } + public var ClearCache_Forever: String { return self._s[3361]! } + public var AuthSessions_AddDeviceIntro_Title: String { return self._s[3362]! } + public var CreatePoll_Quiz: String { return self._s[3363]! } + public var PhotoEditor_ContrastTool: String { return self._s[3366]! } + public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3367]!, self._r[3367]!, [_1]) + } + public var DialogList_Draft: String { return self._s[3368]! } + public var Wallet_Configuration_BlockchainIdInfo: String { return self._s[3369]! } + public func PeopleNearby_VisibleUntil(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3370]!, self._r[3370]!, [_0]) + } + public var Privacy_TopPeersDelete: String { return self._s[3372]! } + public var LoginPassword_PasswordPlaceholder: String { return self._s[3373]! } + public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[3374]! } + public var WebSearch_RecentSectionClear: String { return self._s[3375]! } + public var EditTheme_ErrorInvalidCharacters: String { return self._s[3376]! } + public var Watch_ChatList_NoConversationsTitle: String { return self._s[3378]! } + public var PeerInfo_ButtonMore: String { return self._s[3380]! } + public var Common_Done: String { return self._s[3381]! } + public var Shortcut_SwitchAccount: String { return self._s[3382]! } + public var AuthSessions_EmptyText: String { return self._s[3383]! } + public var Wallet_Configuration_BlockchainNameChangedTitle: String { return self._s[3384]! } + public var Conversation_ShareBotContactConfirmation: String { return self._s[3385]! } + public var Tour_Title5: String { return self._s[3386]! } + public var Wallet_Settings_Title: String { return self._s[3387]! } + public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3388]!, self._r[3388]!, [_0]) } - public var Profile_AddToExisting: String { return self._s[3390]! } + public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[3389]! } + public var Conversation_LinkDialogSave: String { return self._s[3390]! } + public var GroupInfo_ActionRestrict: String { return self._s[3391]! } + public var Checkout_Title: String { return self._s[3392]! } + public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[3394]! } + public var Channel_AdminLog_CanChangeInfo: String { return self._s[3396]! } + public var Notification_RenamedGroup: String { return self._s[3397]! } + public var PeopleNearby_Groups: String { return self._s[3398]! } + public var Checkout_PayWithFaceId: String { return self._s[3399]! } + public var Channel_BanList_BlockedTitle: String { return self._s[3400]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[3402]! } + public var Checkout_WebConfirmation_Title: String { return self._s[3403]! } + public var Notifications_MessageNotificationsAlert: String { return self._s[3404]! } + public func Activity_RemindAboutGroup(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3405]!, self._r[3405]!, [_0]) + } + public var Profile_AddToExisting: String { return self._s[3407]! } public func Profile_CreateEncryptedChatOutdatedError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3391]!, self._r[3391]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3408]!, self._r[3408]!, [_0, _1]) } - public var Cache_Files: String { return self._s[3393]! } - public var Permissions_PrivacyPolicy: String { return self._s[3394]! } - public var SocksProxySetup_ConnectAndSave: String { return self._s[3395]! } - public var UserInfo_NotificationsDefaultDisabled: String { return self._s[3396]! } - public var AutoDownloadSettings_TypeContacts: String { return self._s[3398]! } - public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[3400]! } - public var Calls_NoCallsPlaceholder: String { return self._s[3401]! } + public var Cache_Files: String { return self._s[3410]! } + public var Permissions_PrivacyPolicy: String { return self._s[3411]! } + public var SocksProxySetup_ConnectAndSave: String { return self._s[3412]! } + public var UserInfo_NotificationsDefaultDisabled: String { return self._s[3413]! } + public var AutoDownloadSettings_TypeContacts: String { return self._s[3415]! } + public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[3417]! } + public var Calls_NoCallsPlaceholder: String { return self._s[3418]! } public func Wallet_Receive_ShareInvoiceUrlInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3402]!, self._r[3402]!, [_0]) + return formatWithArgumentRanges(self._s[3419]!, self._r[3419]!, [_0]) } - public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[3403]! } - public var VoiceOver_AttachMedia: String { return self._s[3406]! } - public var ChatList_EmptyChatFilterList: String { return self._s[3407]! } - public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[3408]! } + public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[3420]! } + public var VoiceOver_AttachMedia: String { return self._s[3423]! } + public var ChatList_EmptyChatFilterList: String { return self._s[3424]! } + public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[3425]! } public func PUSH_CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3409]!, self._r[3409]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3426]!, self._r[3426]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[3410]! } - public var Conversation_SetReminder_Title: String { return self._s[3411]! } - public var Passport_FieldAddressHelp: String { return self._s[3412]! } - public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[3413]! } - public var PUSH_REMINDER_TITLE: String { return self._s[3414]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[3427]! } + public var Conversation_SetReminder_Title: String { return self._s[3428]! } + public var Passport_FieldAddressHelp: String { return self._s[3429]! } + public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[3430]! } + public var PUSH_REMINDER_TITLE: String { return self._s[3431]! } public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3415]!, self._r[3415]!, [_0]) + return formatWithArgumentRanges(self._s[3432]!, self._r[3432]!, [_0]) } - public var Channel_AdminLog_EmptyTitle: String { return self._s[3416]! } - public var Privacy_Calls_NeverAllow_Title: String { return self._s[3417]! } - public var Login_UnknownError: String { return self._s[3418]! } - public var Group_UpgradeNoticeText2: String { return self._s[3421]! } - public var Watch_Compose_AddContact: String { return self._s[3422]! } - public var ClearCache_StorageServiceFiles: String { return self._s[3423]! } - public var Web_Error: String { return self._s[3424]! } - public var Gif_Search: String { return self._s[3425]! } - public var Profile_MessageLifetime1h: String { return self._s[3426]! } - public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[3427]! } - public var Channel_Username_CheckingUsername: String { return self._s[3428]! } - public var CallFeedback_ReasonSilentRemote: String { return self._s[3429]! } - public var AutoDownloadSettings_TypeChannels: String { return self._s[3430]! } - public var Channel_AboutItem: String { return self._s[3431]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[3433]! } - public var VoiceOver_Chat_VoiceMessage: String { return self._s[3434]! } - public var GroupInfo_SharedMedia: String { return self._s[3435]! } + public var Channel_AdminLog_EmptyTitle: String { return self._s[3433]! } + public var Privacy_Calls_NeverAllow_Title: String { return self._s[3434]! } + public var Login_UnknownError: String { return self._s[3435]! } + public var Group_UpgradeNoticeText2: String { return self._s[3438]! } + public var Watch_Compose_AddContact: String { return self._s[3439]! } + public var ClearCache_StorageServiceFiles: String { return self._s[3440]! } + public var Web_Error: String { return self._s[3441]! } + public var Gif_Search: String { return self._s[3442]! } + public var Profile_MessageLifetime1h: String { return self._s[3443]! } + public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[3444]! } + public var Channel_Username_CheckingUsername: String { return self._s[3445]! } + public var CallFeedback_ReasonSilentRemote: String { return self._s[3446]! } + public var AutoDownloadSettings_TypeChannels: String { return self._s[3447]! } + public var Channel_AboutItem: String { return self._s[3448]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[3450]! } + public var VoiceOver_Chat_VoiceMessage: String { return self._s[3451]! } + public var GroupInfo_SharedMedia: String { return self._s[3452]! } public func Channel_AdminLog_MessagePromotedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3436]!, self._r[3436]!, [_1]) + return formatWithArgumentRanges(self._s[3453]!, self._r[3453]!, [_1]) } - public var Call_PhoneCallInProgressMessage: String { return self._s[3437]! } + public var Call_PhoneCallInProgressMessage: String { return self._s[3454]! } public func PUSH_CHANNEL_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3438]!, self._r[3438]!, [_1]) + return formatWithArgumentRanges(self._s[3455]!, self._r[3455]!, [_1]) } - public var ChatList_UndoArchiveRevealedText: String { return self._s[3439]! } - public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[3440]! } - public var Conversation_SearchByName_Placeholder: String { return self._s[3441]! } - public var CreatePoll_AddOption: String { return self._s[3442]! } - public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[3443]! } - public var Group_UpgradeNoticeHeader: String { return self._s[3444]! } - public var Channel_Management_AddModerator: String { return self._s[3445]! } - public var AutoDownloadSettings_MaxFileSize: String { return self._s[3446]! } - public var StickerPacksSettings_ShowStickersButton: String { return self._s[3447]! } - public var Wallet_Info_RefreshErrorNetworkText: String { return self._s[3448]! } - public var Theme_Colors_Background: String { return self._s[3449]! } - public var NotificationsSound_Hello: String { return self._s[3451]! } - public var SocksProxySetup_SavedProxies: String { return self._s[3452]! } - public var Channel_Stickers_Placeholder: String { return self._s[3454]! } + public var ChatList_UndoArchiveRevealedText: String { return self._s[3456]! } + public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[3457]! } + public var Conversation_SearchByName_Placeholder: String { return self._s[3458]! } + public var CreatePoll_AddOption: String { return self._s[3459]! } + public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[3460]! } + public var Group_UpgradeNoticeHeader: String { return self._s[3461]! } + public var Channel_Management_AddModerator: String { return self._s[3462]! } + public var AutoDownloadSettings_MaxFileSize: String { return self._s[3463]! } + public var StickerPacksSettings_ShowStickersButton: String { return self._s[3464]! } + public var Wallet_Info_RefreshErrorNetworkText: String { return self._s[3465]! } + public var Theme_Colors_Background: String { return self._s[3466]! } + public var NotificationsSound_Hello: String { return self._s[3469]! } + public var SocksProxySetup_SavedProxies: String { return self._s[3471]! } + public var Channel_Stickers_Placeholder: String { return self._s[3473]! } public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3455]!, self._r[3455]!, [_0]) + return formatWithArgumentRanges(self._s[3474]!, self._r[3474]!, [_0]) } - public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[3456]! } - public var Channel_Management_AddModeratorHelp: String { return self._s[3457]! } - public var ContactInfo_BirthdayLabel: String { return self._s[3458]! } - public var ChangePhoneNumberCode_RequestingACall: String { return self._s[3459]! } - public var AutoDownloadSettings_Channels: String { return self._s[3460]! } - public var Passport_Language_mn: String { return self._s[3461]! } - public var Notifications_ResetAllNotificationsHelp: String { return self._s[3464]! } - public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[3465]! } - public var Passport_Language_ja: String { return self._s[3467]! } - public var Settings_About_Title: String { return self._s[3468]! } - public var Settings_NotificationsAndSounds: String { return self._s[3469]! } - public var ChannelInfo_DeleteGroup: String { return self._s[3470]! } - public var Settings_BlockedUsers: String { return self._s[3471]! } + public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[3475]! } + public var Channel_Management_AddModeratorHelp: String { return self._s[3476]! } + public var ContactInfo_BirthdayLabel: String { return self._s[3477]! } + public var ChangePhoneNumberCode_RequestingACall: String { return self._s[3478]! } + public var AutoDownloadSettings_Channels: String { return self._s[3479]! } + public var Passport_Language_mn: String { return self._s[3480]! } + public var Notifications_ResetAllNotificationsHelp: String { return self._s[3483]! } + public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[3484]! } + public var Passport_Language_ja: String { return self._s[3486]! } + public var Settings_About_Title: String { return self._s[3487]! } + public var Settings_NotificationsAndSounds: String { return self._s[3488]! } + public var ChannelInfo_DeleteGroup: String { return self._s[3489]! } + public var Settings_BlockedUsers: String { return self._s[3490]! } public func Time_MonthOfYear_m4(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3472]!, self._r[3472]!, [_0]) + return formatWithArgumentRanges(self._s[3491]!, self._r[3491]!, [_0]) } - public var EditTheme_Create_Preview_OutgoingText: String { return self._s[3473]! } - public var Wallet_Weekday_Today: String { return self._s[3474]! } - public var AutoDownloadSettings_PreloadVideo: String { return self._s[3475]! } - public var Widget_ApplicationLocked: String { return self._s[3476]! } - public var Passport_Address_AddResidentialAddress: String { return self._s[3477]! } - public var Channel_Username_Title: String { return self._s[3478]! } + public var EditTheme_Create_Preview_OutgoingText: String { return self._s[3492]! } + public var Wallet_Weekday_Today: String { return self._s[3493]! } + public var AutoDownloadSettings_PreloadVideo: String { return self._s[3494]! } + public var Widget_ApplicationLocked: String { return self._s[3495]! } + public var Passport_Address_AddResidentialAddress: String { return self._s[3496]! } + public var Channel_Username_Title: String { return self._s[3497]! } public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3479]!, self._r[3479]!, [_0]) + return formatWithArgumentRanges(self._s[3498]!, self._r[3498]!, [_0]) } - public var AttachmentMenu_File: String { return self._s[3481]! } - public var AppleWatch_Title: String { return self._s[3482]! } - public var Activity_RecordingVideoMessage: String { return self._s[3483]! } + public var AttachmentMenu_File: String { return self._s[3500]! } + public var AppleWatch_Title: String { return self._s[3501]! } + public var Activity_RecordingVideoMessage: String { return self._s[3502]! } public func Channel_DiscussionGroup_PublicChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3484]!, self._r[3484]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3503]!, self._r[3503]!, [_1, _2]) } - public var Theme_Colors_Messages: String { return self._s[3485]! } - public var Weekday_Saturday: String { return self._s[3486]! } - public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3487]! } - public var Profile_CreateEncryptedChatError: String { return self._s[3488]! } - public var Common_Next: String { return self._s[3490]! } - public var Channel_Stickers_YourStickers: String { return self._s[3492]! } - public var Message_Theme: String { return self._s[3493]! } - public var Call_AudioRouteHeadphones: String { return self._s[3494]! } - public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3496]! } - public var Watch_Contacts_NoResults: String { return self._s[3498]! } - public var PhotoEditor_TintTool: String { return self._s[3501]! } - public var LoginPassword_ResetAccount: String { return self._s[3503]! } - public var Settings_SavedMessages: String { return self._s[3504]! } - public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3505]! } - public var Bot_GenericSupportStatus: String { return self._s[3506]! } - public var StickerPack_Add: String { return self._s[3507]! } - public var Checkout_TotalAmount: String { return self._s[3508]! } - public var Your_cards_number_is_invalid: String { return self._s[3509]! } - public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3510]! } - public var VoiceOver_Chat_VideoMessage: String { return self._s[3511]! } + public var Theme_Colors_Messages: String { return self._s[3504]! } + public var Weekday_Saturday: String { return self._s[3505]! } + public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3506]! } + public var Profile_CreateEncryptedChatError: String { return self._s[3507]! } + public var Common_Next: String { return self._s[3509]! } + public var Channel_Stickers_YourStickers: String { return self._s[3511]! } + public var Message_Theme: String { return self._s[3512]! } + public var Call_AudioRouteHeadphones: String { return self._s[3513]! } + public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3515]! } + public var Watch_Contacts_NoResults: String { return self._s[3517]! } + public var PhotoEditor_TintTool: String { return self._s[3520]! } + public var LoginPassword_ResetAccount: String { return self._s[3522]! } + public var Settings_SavedMessages: String { return self._s[3523]! } + public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3524]! } + public var Bot_GenericSupportStatus: String { return self._s[3525]! } + public var StickerPack_Add: String { return self._s[3526]! } + public var Checkout_TotalAmount: String { return self._s[3527]! } + public var Your_cards_number_is_invalid: String { return self._s[3528]! } + public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3529]! } + public var VoiceOver_Chat_VideoMessage: String { return self._s[3530]! } public func ChangePhoneNumberCode_CallTimer(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3512]!, self._r[3512]!, [_0]) + return formatWithArgumentRanges(self._s[3531]!, self._r[3531]!, [_0]) } public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3513]!, self._r[3513]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3532]!, self._r[3532]!, [_1, _2]) } - public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3514]! } + public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3533]! } public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3516]!, self._r[3516]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3535]!, self._r[3535]!, [_1, _2]) } public func Conversation_RestrictedTextTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3517]!, self._r[3517]!, [_0]) + return formatWithArgumentRanges(self._s[3536]!, self._r[3536]!, [_0]) } - public var GroupInfo_InviteLink_ShareLink: String { return self._s[3518]! } - public var StickerPack_Share: String { return self._s[3519]! } - public var Passport_DeleteAddress: String { return self._s[3520]! } - public var Settings_Passport: String { return self._s[3521]! } - public var SharedMedia_EmptyFilesText: String { return self._s[3522]! } - public var Conversation_DeleteMessagesForMe: String { return self._s[3523]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3524]! } - public var Contacts_PermissionsText: String { return self._s[3525]! } - public var Group_Setup_HistoryVisible: String { return self._s[3526]! } - public var Wallet_Month_ShortDecember: String { return self._s[3528]! } - public var Channel_EditAdmin_PermissionEnabledByDefault: String { return self._s[3529]! } - public var Passport_Address_AddRentalAgreement: String { return self._s[3530]! } - public var SocksProxySetup_Title: String { return self._s[3531]! } - public var Notification_Mute1h: String { return self._s[3532]! } + public var GroupInfo_InviteLink_ShareLink: String { return self._s[3537]! } + public var StickerPack_Share: String { return self._s[3538]! } + public var Passport_DeleteAddress: String { return self._s[3539]! } + public var Settings_Passport: String { return self._s[3540]! } + public var SharedMedia_EmptyFilesText: String { return self._s[3541]! } + public var Conversation_DeleteMessagesForMe: String { return self._s[3542]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3543]! } + public var Contacts_PermissionsText: String { return self._s[3544]! } + public var Group_Setup_HistoryVisible: String { return self._s[3545]! } + public var Wallet_Month_ShortDecember: String { return self._s[3547]! } + public var Channel_EditAdmin_PermissionEnabledByDefault: String { return self._s[3548]! } + public var Passport_Address_AddRentalAgreement: String { return self._s[3549]! } + public var SocksProxySetup_Title: String { return self._s[3550]! } + public var Notification_Mute1h: String { return self._s[3551]! } public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3533]!, self._r[3533]!, [_0]) + return formatWithArgumentRanges(self._s[3552]!, self._r[3552]!, [_0]) } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3534]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3553]! } public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3535]!, self._r[3535]!, [_1]) + return formatWithArgumentRanges(self._s[3554]!, self._r[3554]!, [_1]) } - public var FastTwoStepSetup_PasswordSection: String { return self._s[3536]! } - public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3539]! } - public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3541]! } - public var DialogList_NoMessagesText: String { return self._s[3542]! } - public var Privacy_ContactsResetConfirmation: String { return self._s[3543]! } - public var Privacy_Calls_P2PHelp: String { return self._s[3544]! } - public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3546]! } - public var Your_cards_expiration_year_is_invalid: String { return self._s[3547]! } - public var Common_TakePhotoOrVideo: String { return self._s[3548]! } - public var Wallet_Words_Text: String { return self._s[3549]! } - public var Call_StatusBusy: String { return self._s[3550]! } - public var Conversation_PinnedMessage: String { return self._s[3551]! } - public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3552]! } - public var ChatList_EmptyChatListNewMessage: String { return self._s[3553]! } - public var Wallet_Configuration_BlockchainNameChangedProceed: String { return self._s[3554]! } - public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3555]! } - public var Undo_ChatCleared: String { return self._s[3556]! } - public var AppleWatch_ReplyPresets: String { return self._s[3557]! } - public var Passport_DiscardMessageDescription: String { return self._s[3559]! } - public var Login_NetworkError: String { return self._s[3560]! } + public var FastTwoStepSetup_PasswordSection: String { return self._s[3555]! } + public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3558]! } + public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3560]! } + public var DialogList_NoMessagesText: String { return self._s[3561]! } + public var Privacy_ContactsResetConfirmation: String { return self._s[3562]! } + public var Privacy_Calls_P2PHelp: String { return self._s[3563]! } + public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3565]! } + public var Your_cards_expiration_year_is_invalid: String { return self._s[3566]! } + public var Common_TakePhotoOrVideo: String { return self._s[3567]! } + public var Wallet_Words_Text: String { return self._s[3568]! } + public var Call_StatusBusy: String { return self._s[3569]! } + public var Conversation_PinnedMessage: String { return self._s[3570]! } + public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3571]! } + public var ChatList_EmptyChatListNewMessage: String { return self._s[3572]! } + public var Wallet_Configuration_BlockchainNameChangedProceed: String { return self._s[3573]! } + public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3574]! } + public var Undo_ChatCleared: String { return self._s[3575]! } + public var AppleWatch_ReplyPresets: String { return self._s[3576]! } + public var Passport_DiscardMessageDescription: String { return self._s[3578]! } + public var Login_NetworkError: String { return self._s[3579]! } public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3561]!, self._r[3561]!, [_0]) + return formatWithArgumentRanges(self._s[3580]!, self._r[3580]!, [_0]) } public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3562]!, self._r[3562]!, [_0]) + return formatWithArgumentRanges(self._s[3581]!, self._r[3581]!, [_0]) } - public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3563]! } - public var Wallet_WordCheck_ViewWords: String { return self._s[3565]! } - public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3566]! } + public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3582]! } + public var Wallet_WordCheck_ViewWords: String { return self._s[3584]! } + public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3585]! } public func Watch_LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3568]!, self._r[3568]!, [_0]) + return formatWithArgumentRanges(self._s[3587]!, self._r[3587]!, [_0]) } - public var Call_ConnectionErrorMessage: String { return self._s[3569]! } - public var VoiceOver_Chat_Music: String { return self._s[3570]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3571]! } - public var Compose_GroupTokenListPlaceholder: String { return self._s[3573]! } - public var ConversationMedia_Title: String { return self._s[3574]! } - public var EncryptionKey_Title: String { return self._s[3576]! } - public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3577]! } - public var Notification_Exceptions_AddException: String { return self._s[3578]! } - public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3579]! } - public var Profile_MessageLifetime1m: String { return self._s[3580]! } + public var Call_ConnectionErrorMessage: String { return self._s[3588]! } + public var VoiceOver_Chat_Music: String { return self._s[3589]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3590]! } + public var Compose_GroupTokenListPlaceholder: String { return self._s[3592]! } + public var ConversationMedia_Title: String { return self._s[3593]! } + public var EncryptionKey_Title: String { return self._s[3595]! } + public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3596]! } + public var Notification_Exceptions_AddException: String { return self._s[3597]! } + public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3598]! } + public var Profile_MessageLifetime1m: String { return self._s[3599]! } public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3581]!, self._r[3581]!, [_1]) + return formatWithArgumentRanges(self._s[3600]!, self._r[3600]!, [_1]) } - public var Month_GenMay: String { return self._s[3582]! } + public var Month_GenMay: String { return self._s[3601]! } public func LiveLocationUpdated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3583]!, self._r[3583]!, [_0]) + return formatWithArgumentRanges(self._s[3602]!, self._r[3602]!, [_0]) } - public var PeopleNearby_Users: String { return self._s[3584]! } - public var Wallet_Send_AddressInfo: String { return self._s[3585]! } - public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3586]! } - public var AutoDownloadSettings_ResetSettings: String { return self._s[3587]! } + public var PeopleNearby_Users: String { return self._s[3603]! } + public var Wallet_Send_AddressInfo: String { return self._s[3604]! } + public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3605]! } + public var AutoDownloadSettings_ResetSettings: String { return self._s[3606]! } public func Wallet_Updated_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3589]!, self._r[3589]!, [_0]) + return formatWithArgumentRanges(self._s[3608]!, self._r[3608]!, [_0]) } - public var Conversation_EmptyPlaceholder: String { return self._s[3590]! } - public var Passport_Address_AddPassportRegistration: String { return self._s[3591]! } - public var Notifications_ChannelNotificationsAlert: String { return self._s[3592]! } - public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3593]! } - public var Camera_TapAndHoldForVideo: String { return self._s[3594]! } - public var Channel_JoinChannel: String { return self._s[3596]! } - public var Appearance_Animations: String { return self._s[3599]! } + public var Conversation_EmptyPlaceholder: String { return self._s[3609]! } + public var Passport_Address_AddPassportRegistration: String { return self._s[3610]! } + public var Notifications_ChannelNotificationsAlert: String { return self._s[3611]! } + public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3612]! } + public var Camera_TapAndHoldForVideo: String { return self._s[3613]! } + public var Channel_JoinChannel: String { return self._s[3615]! } + public var Appearance_Animations: String { return self._s[3618]! } public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3600]!, self._r[3600]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3619]!, self._r[3619]!, [_1, _2]) } - public var Stickers_GroupStickers: String { return self._s[3602]! } - public var Appearance_ShareTheme: String { return self._s[3603]! } - public var TwoFactorSetup_Hint_Placeholder: String { return self._s[3604]! } - public var ConvertToSupergroup_HelpTitle: String { return self._s[3606]! } - public var StickerPackActionInfo_RemovedTitle: String { return self._s[3607]! } - public var Passport_Address_Street: String { return self._s[3608]! } - public var Conversation_AddContact: String { return self._s[3609]! } - public var Login_PhonePlaceholder: String { return self._s[3610]! } - public var Channel_Members_InviteLink: String { return self._s[3612]! } - public var Bot_Stop: String { return self._s[3613]! } - public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3615]! } - public var Notification_PassportValueAddress: String { return self._s[3616]! } - public var Month_ShortJuly: String { return self._s[3617]! } - public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3618]! } - public var Channel_AdminLog_BanSendMedia: String { return self._s[3619]! } - public var Passport_Identity_ReverseSide: String { return self._s[3620]! } - public var Watch_Stickers_Recents: String { return self._s[3623]! } - public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3625]! } - public var Map_SendThisLocation: String { return self._s[3626]! } + public var Stickers_GroupStickers: String { return self._s[3621]! } + public var Appearance_ShareTheme: String { return self._s[3622]! } + public var TwoFactorSetup_Hint_Placeholder: String { return self._s[3623]! } + public var ConvertToSupergroup_HelpTitle: String { return self._s[3625]! } + public var StickerPackActionInfo_RemovedTitle: String { return self._s[3626]! } + public var Passport_Address_Street: String { return self._s[3627]! } + public var Conversation_AddContact: String { return self._s[3628]! } + public var Login_PhonePlaceholder: String { return self._s[3629]! } + public var Channel_Members_InviteLink: String { return self._s[3631]! } + public var Bot_Stop: String { return self._s[3632]! } + public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3634]! } + public var Notification_PassportValueAddress: String { return self._s[3635]! } + public var Month_ShortJuly: String { return self._s[3636]! } + public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3637]! } + public var Channel_AdminLog_BanSendMedia: String { return self._s[3638]! } + public var Passport_Identity_ReverseSide: String { return self._s[3639]! } + public var Watch_Stickers_Recents: String { return self._s[3642]! } + public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3644]! } + public var Map_SendThisLocation: String { return self._s[3645]! } public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3627]!, self._r[3627]!, [_0]) + return formatWithArgumentRanges(self._s[3646]!, self._r[3646]!, [_0]) } public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3628]!, self._r[3628]!, [_0]) + return formatWithArgumentRanges(self._s[3647]!, self._r[3647]!, [_0]) } - public var ConvertToSupergroup_Note: String { return self._s[3629]! } - public var Wallet_Intro_NotNow: String { return self._s[3630]! } + public var ConvertToSupergroup_Note: String { return self._s[3648]! } + public var Wallet_Intro_NotNow: String { return self._s[3649]! } public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3631]!, self._r[3631]!, [_0]) + return formatWithArgumentRanges(self._s[3650]!, self._r[3650]!, [_0]) } - public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3632]! } + public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3651]! } public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3633]!, self._r[3633]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3652]!, self._r[3652]!, [_0, _1]) } - public var Login_CallRequestState3: String { return self._s[3635]! } - public var Wallpaper_SearchShort: String { return self._s[3636]! } - public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3638]! } - public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3639]! } - public var Channel_BotDoesntSupportGroups: String { return self._s[3640]! } + public var Login_CallRequestState3: String { return self._s[3654]! } + public var Wallpaper_SearchShort: String { return self._s[3655]! } + public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3657]! } + public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3658]! } + public var Channel_BotDoesntSupportGroups: String { return self._s[3659]! } public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3641]!, self._r[3641]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3660]!, self._r[3660]!, [_1, _2]) } - public var Channel_AdminLogFilter_Title: String { return self._s[3642]! } - public var Appearance_ThemePreview_Chat_4_Text: String { return self._s[3644]! } - public var Notifications_GroupNotificationsExceptions: String { return self._s[3647]! } + public var Channel_AdminLogFilter_Title: String { return self._s[3661]! } + public var Appearance_ThemePreview_Chat_4_Text: String { return self._s[3663]! } + public var Notifications_GroupNotificationsExceptions: String { return self._s[3666]! } public func FileSize_B(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3648]!, self._r[3648]!, [_0]) - } - public var Passport_CorrectErrors: String { return self._s[3649]! } - public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3650]! } - public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3651]!, self._r[3651]!, [_0]) - } - public var Map_SendMyCurrentLocation: String { return self._s[3652]! } - public var Channel_DiscussionGroup: String { return self._s[3653]! } - public var TwoFactorSetup_Email_SkipConfirmationSkip: String { return self._s[3654]! } - public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3655]!, self._r[3655]!, [_1, _2]) - } - public var SharedMedia_SearchNoResults: String { return self._s[3656]! } - public var Permissions_NotificationsText_v0: String { return self._s[3657]! } - public var Channel_EditAdmin_PermissionDeleteMessagesOfOthers: String { return self._s[3658]! } - public var Appearance_AppIcon: String { return self._s[3659]! } - public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3660]! } - public var LoginPassword_FloodError: String { return self._s[3661]! } - public var Wallet_Send_OwnAddressAlertProceed: String { return self._s[3663]! } - public var Group_Setup_HistoryHiddenHelp: String { return self._s[3664]! } - public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3665]!, self._r[3665]!, [_0]) - } - public var Passport_Language_bn: String { return self._s[3666]! } - public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3667]!, self._r[3667]!, [_0]) } - public var ChatList_Context_Pin: String { return self._s[3668]! } - public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3669]!, self._r[3669]!, [_0]) - } - public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { + public var Passport_CorrectErrors: String { return self._s[3668]! } + public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3669]! } + public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3670]!, self._r[3670]!, [_0]) } - public var Wallet_Navigation_Close: String { return self._s[3671]! } - public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3675]! } - public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3677]! } - public var Wallet_Month_GenDecember: String { return self._s[3678]! } - public var Contacts_PermissionsAllow: String { return self._s[3679]! } - public var ReportPeer_ReasonCopyright: String { return self._s[3680]! } - public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3681]! } - public var WallpaperPreview_Pattern: String { return self._s[3682]! } - public var Paint_Duplicate: String { return self._s[3683]! } - public var Passport_Address_Country: String { return self._s[3684]! } - public var Notification_RenamedChannel: String { return self._s[3686]! } - public var ChatList_Context_Unmute: String { return self._s[3687]! } - public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3688]! } - public var Group_MessagePhotoUpdated: String { return self._s[3689]! } - public var Channel_BanUser_PermissionSendMedia: String { return self._s[3690]! } - public var Conversation_ContextMenuBan: String { return self._s[3691]! } - public var TwoStepAuth_EmailSent: String { return self._s[3692]! } - public var MessagePoll_NoVotes: String { return self._s[3693]! } - public var Wallet_Send_ErrorNotEnoughFundsTitle: String { return self._s[3694]! } - public var Passport_Language_is: String { return self._s[3696]! } - public var PeopleNearby_UsersEmpty: String { return self._s[3698]! } - public var Tour_Text5: String { return self._s[3699]! } + public var Map_SendMyCurrentLocation: String { return self._s[3671]! } + public var Channel_DiscussionGroup: String { return self._s[3672]! } + public var TwoFactorSetup_Email_SkipConfirmationSkip: String { return self._s[3673]! } + public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3674]!, self._r[3674]!, [_1, _2]) + } + public var SharedMedia_SearchNoResults: String { return self._s[3675]! } + public var Permissions_NotificationsText_v0: String { return self._s[3676]! } + public var Channel_EditAdmin_PermissionDeleteMessagesOfOthers: String { return self._s[3677]! } + public var Appearance_AppIcon: String { return self._s[3678]! } + public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3679]! } + public var LoginPassword_FloodError: String { return self._s[3680]! } + public var Wallet_Send_OwnAddressAlertProceed: String { return self._s[3682]! } + public var Group_Setup_HistoryHiddenHelp: String { return self._s[3683]! } + public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3684]!, self._r[3684]!, [_0]) + } + public var Passport_Language_bn: String { return self._s[3685]! } + public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3686]!, self._r[3686]!, [_0]) + } + public var ChatList_Context_Pin: String { return self._s[3687]! } + public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3688]!, self._r[3688]!, [_0]) + } + public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3689]!, self._r[3689]!, [_0]) + } + public var Wallet_Navigation_Close: String { return self._s[3690]! } + public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3694]! } + public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3696]! } + public var Wallet_Month_GenDecember: String { return self._s[3697]! } + public var Contacts_PermissionsAllow: String { return self._s[3698]! } + public var ReportPeer_ReasonCopyright: String { return self._s[3699]! } + public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3700]! } + public var WallpaperPreview_Pattern: String { return self._s[3701]! } + public var Paint_Duplicate: String { return self._s[3702]! } + public var Passport_Address_Country: String { return self._s[3703]! } + public var Notification_RenamedChannel: String { return self._s[3705]! } + public var ChatList_Context_Unmute: String { return self._s[3706]! } + public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3707]! } + public var Group_MessagePhotoUpdated: String { return self._s[3708]! } + public var Channel_BanUser_PermissionSendMedia: String { return self._s[3709]! } + public var Conversation_ContextMenuBan: String { return self._s[3710]! } + public var TwoStepAuth_EmailSent: String { return self._s[3711]! } + public var MessagePoll_NoVotes: String { return self._s[3712]! } + public var Wallet_Send_ErrorNotEnoughFundsTitle: String { return self._s[3713]! } + public var Passport_Language_is: String { return self._s[3715]! } + public var PeopleNearby_UsersEmpty: String { return self._s[3717]! } + public var Tour_Text5: String { return self._s[3718]! } public func Call_GroupFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3702]!, self._r[3702]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3721]!, self._r[3721]!, [_1, _2]) } - public var Undo_SecretChatDeleted: String { return self._s[3703]! } - public var SocksProxySetup_ShareQRCode: String { return self._s[3704]! } + public var Undo_SecretChatDeleted: String { return self._s[3722]! } + public var SocksProxySetup_ShareQRCode: String { return self._s[3723]! } public func VoiceOver_Chat_Size(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3705]!, self._r[3705]!, [_0]) + return formatWithArgumentRanges(self._s[3724]!, self._r[3724]!, [_0]) } - public var Forward_ErrorDisabledForChat: String { return self._s[3706]! } - public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3707]! } - public var Paint_Edit: String { return self._s[3709]! } - public var ScheduledMessages_ReminderNotification: String { return self._s[3711]! } - public var Undo_DeletedGroup: String { return self._s[3713]! } - public var LoginPassword_ForgotPassword: String { return self._s[3714]! } - public var Wallet_WordImport_IncorrectTitle: String { return self._s[3715]! } - public var GroupInfo_GroupNamePlaceholder: String { return self._s[3716]! } + public var Forward_ErrorDisabledForChat: String { return self._s[3725]! } + public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3726]! } + public var Paint_Edit: String { return self._s[3728]! } + public var ScheduledMessages_ReminderNotification: String { return self._s[3730]! } + public var Undo_DeletedGroup: String { return self._s[3732]! } + public var LoginPassword_ForgotPassword: String { return self._s[3733]! } + public var Wallet_WordImport_IncorrectTitle: String { return self._s[3734]! } + public var GroupInfo_GroupNamePlaceholder: String { return self._s[3735]! } public func Notification_Kicked(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3717]!, self._r[3717]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3736]!, self._r[3736]!, [_0, _1]) } - public var AppWallet_TransactionInfo_FeeInfoURL: String { return self._s[3718]! } - public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3719]! } - public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3720]! } - public var Passport_Language_uz: String { return self._s[3721]! } - public var Conversation_PinMessageAlertGroup: String { return self._s[3722]! } - public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3723]! } - public var Map_StopLiveLocation: String { return self._s[3725]! } - public var VoiceOver_MessageContextSend: String { return self._s[3727]! } - public var PasscodeSettings_Help: String { return self._s[3728]! } - public var NotificationsSound_Input: String { return self._s[3729]! } - public var Share_Title: String { return self._s[3732]! } - public var LogoutOptions_Title: String { return self._s[3733]! } - public var Wallet_Send_AddressText: String { return self._s[3734]! } - public var Login_TermsOfServiceAgree: String { return self._s[3735]! } - public var Compose_NewEncryptedChatTitle: String { return self._s[3736]! } - public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3737]! } - public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3738]! } - public var EnterPasscode_EnterTitle: String { return self._s[3739]! } + public var AppWallet_TransactionInfo_FeeInfoURL: String { return self._s[3737]! } + public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3738]! } + public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3739]! } + public var Passport_Language_uz: String { return self._s[3740]! } + public var Conversation_PinMessageAlertGroup: String { return self._s[3741]! } + public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3742]! } + public var Map_StopLiveLocation: String { return self._s[3744]! } + public var VoiceOver_MessageContextSend: String { return self._s[3746]! } + public var PasscodeSettings_Help: String { return self._s[3747]! } + public var NotificationsSound_Input: String { return self._s[3748]! } + public var Share_Title: String { return self._s[3751]! } + public var LogoutOptions_Title: String { return self._s[3752]! } + public var Wallet_Send_AddressText: String { return self._s[3753]! } + public var Login_TermsOfServiceAgree: String { return self._s[3754]! } + public var Compose_NewEncryptedChatTitle: String { return self._s[3755]! } + public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3756]! } + public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3757]! } + public var EnterPasscode_EnterTitle: String { return self._s[3758]! } public func Call_PrivacyErrorMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3740]!, self._r[3740]!, [_0]) + return formatWithArgumentRanges(self._s[3759]!, self._r[3759]!, [_0]) } - public var Settings_CopyPhoneNumber: String { return self._s[3741]! } - public var Conversation_AddToContacts: String { return self._s[3742]! } + public var Settings_CopyPhoneNumber: String { return self._s[3760]! } + public var Conversation_AddToContacts: String { return self._s[3761]! } public func VoiceOver_Chat_ReplyFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3743]!, self._r[3743]!, [_0]) + return formatWithArgumentRanges(self._s[3762]!, self._r[3762]!, [_0]) } - public var NotificationsSound_Keys: String { return self._s[3744]! } + public var NotificationsSound_Keys: String { return self._s[3763]! } public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3745]!, self._r[3745]!, [_0]) + return formatWithArgumentRanges(self._s[3764]!, self._r[3764]!, [_0]) } - public var Notification_MessageLifetime1w: String { return self._s[3746]! } - public var Message_Video: String { return self._s[3747]! } - public var AutoDownloadSettings_CellularTitle: String { return self._s[3748]! } + public var Notification_MessageLifetime1w: String { return self._s[3765]! } + public var Message_Video: String { return self._s[3766]! } + public var AutoDownloadSettings_CellularTitle: String { return self._s[3767]! } public func PUSH_CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3749]!, self._r[3749]!, [_1]) + return formatWithArgumentRanges(self._s[3768]!, self._r[3768]!, [_1]) } - public var Wallet_Receive_AmountInfo: String { return self._s[3752]! } - public var Stats_Overview: String { return self._s[3753]! } + public var Wallet_Receive_AmountInfo: String { return self._s[3771]! } + public var Stats_Overview: String { return self._s[3772]! } public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3754]!, self._r[3754]!, [_0]) + return formatWithArgumentRanges(self._s[3773]!, self._r[3773]!, [_0]) } public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3755]!, self._r[3755]!, [_0]) + return formatWithArgumentRanges(self._s[3774]!, self._r[3774]!, [_0]) } - public var Passport_Language_mk: String { return self._s[3756]! } + public var Passport_Language_mk: String { return self._s[3775]! } public func Wallet_Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3757]!, self._r[3757]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3776]!, self._r[3776]!, [_1, _2, _3]) } - public var CreatePoll_CancelConfirmation: String { return self._s[3758]! } - public var MessagePoll_LabelAnonymousQuiz: String { return self._s[3759]! } - public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3761]! } - public var PrivacyPolicy_Decline: String { return self._s[3762]! } - public var Passport_Identity_DoesNotExpire: String { return self._s[3763]! } - public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3764]! } - public var AuthSessions_AddDeviceIntro_Action: String { return self._s[3765]! } - public var Permissions_SiriAllow_v0: String { return self._s[3767]! } - public var Wallet_Month_ShortAugust: String { return self._s[3768]! } - public var Appearance_ThemeCarouselNight: String { return self._s[3769]! } + public var CreatePoll_CancelConfirmation: String { return self._s[3777]! } + public var MessagePoll_LabelAnonymousQuiz: String { return self._s[3778]! } + public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3780]! } + public var PrivacyPolicy_Decline: String { return self._s[3781]! } + public var Passport_Identity_DoesNotExpire: String { return self._s[3782]! } + public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3783]! } + public var AuthSessions_AddDeviceIntro_Action: String { return self._s[3784]! } + public var Permissions_SiriAllow_v0: String { return self._s[3786]! } + public var Wallet_Month_ShortAugust: String { return self._s[3787]! } + public var Appearance_ThemeCarouselNight: String { return self._s[3788]! } public func LOCAL_CHAT_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3770]!, self._r[3770]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3789]!, self._r[3789]!, [_1, "\(_2)"]) } public func Notification_RenamedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3771]!, self._r[3771]!, [_0]) + return formatWithArgumentRanges(self._s[3790]!, self._r[3790]!, [_0]) } - public var Paint_Regular: String { return self._s[3772]! } - public var ChatSettings_AutoDownloadReset: String { return self._s[3773]! } - public var SocksProxySetup_ShareLink: String { return self._s[3774]! } - public var Wallet_Qr_Title: String { return self._s[3775]! } - public var BlockedUsers_SelectUserTitle: String { return self._s[3776]! } - public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3778]! } - public var Wallet_Settings_Configuration: String { return self._s[3779]! } - public var GroupInfo_InviteByLink: String { return self._s[3780]! } - public var MessageTimer_Custom: String { return self._s[3781]! } - public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3782]! } - public var Conversation_StopQuizConfirmationTitle: String { return self._s[3783]! } - public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3785]! } - public var Conversation_SendMessage_SetReminder: String { return self._s[3786]! } - public var VoiceOver_Chat_Selected: String { return self._s[3787]! } - public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3788]! } - public var Channel_Username_InvalidTaken: String { return self._s[3789]! } - public var Conversation_ClousStorageInfo_Description3: String { return self._s[3790]! } - public var Wallet_WordCheck_TryAgain: String { return self._s[3791]! } - public var Wallet_Info_TransactionPendingHeader: String { return self._s[3792]! } - public var Settings_ChatBackground: String { return self._s[3793]! } - public var Channel_Subscribers_Title: String { return self._s[3794]! } - public var Wallet_Receive_InvoiceUrlHeader: String { return self._s[3795]! } - public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3796]! } - public var Watch_ConnectionDescription: String { return self._s[3797]! } - public var OldChannels_NoticeText: String { return self._s[3800]! } - public var Wallet_Configuration_ApplyErrorTitle: String { return self._s[3801]! } - public var IntentsSettings_SuggestBy: String { return self._s[3803]! } - public var Theme_ThemeChangedText: String { return self._s[3804]! } - public var ChatList_ArchivedChatsTitle: String { return self._s[3805]! } - public var Wallpaper_ResetWallpapers: String { return self._s[3806]! } - public var Wallet_Send_TransactionInProgress: String { return self._s[3807]! } - public var EditProfile_Title: String { return self._s[3808]! } - public var NotificationsSound_Bamboo: String { return self._s[3810]! } - public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3812]! } - public var Login_SmsRequestState2: String { return self._s[3813]! } - public var Passport_Language_ar: String { return self._s[3814]! } + public var Paint_Regular: String { return self._s[3791]! } + public var ChatSettings_AutoDownloadReset: String { return self._s[3792]! } + public var SocksProxySetup_ShareLink: String { return self._s[3793]! } + public var Wallet_Qr_Title: String { return self._s[3794]! } + public var BlockedUsers_SelectUserTitle: String { return self._s[3795]! } + public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3797]! } + public var Wallet_Settings_Configuration: String { return self._s[3798]! } + public var GroupInfo_InviteByLink: String { return self._s[3799]! } + public var MessageTimer_Custom: String { return self._s[3800]! } + public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3801]! } + public var Conversation_StopQuizConfirmationTitle: String { return self._s[3802]! } + public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3804]! } + public var Conversation_SendMessage_SetReminder: String { return self._s[3805]! } + public var VoiceOver_Chat_Selected: String { return self._s[3806]! } + public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3807]! } + public var Channel_Username_InvalidTaken: String { return self._s[3808]! } + public var Conversation_ClousStorageInfo_Description3: String { return self._s[3809]! } + public var Wallet_WordCheck_TryAgain: String { return self._s[3810]! } + public var Wallet_Info_TransactionPendingHeader: String { return self._s[3811]! } + public var Settings_ChatBackground: String { return self._s[3812]! } + public var Channel_Subscribers_Title: String { return self._s[3813]! } + public var Wallet_Receive_InvoiceUrlHeader: String { return self._s[3814]! } + public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3815]! } + public var Watch_ConnectionDescription: String { return self._s[3816]! } + public var OldChannels_NoticeText: String { return self._s[3819]! } + public var Wallet_Configuration_ApplyErrorTitle: String { return self._s[3820]! } + public var IntentsSettings_SuggestBy: String { return self._s[3822]! } + public var Theme_ThemeChangedText: String { return self._s[3823]! } + public var ChatList_ArchivedChatsTitle: String { return self._s[3824]! } + public var Wallpaper_ResetWallpapers: String { return self._s[3825]! } + public var Wallet_Send_TransactionInProgress: String { return self._s[3826]! } + public var EditProfile_Title: String { return self._s[3827]! } + public var NotificationsSound_Bamboo: String { return self._s[3829]! } + public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3831]! } + public var Login_SmsRequestState2: String { return self._s[3832]! } + public var Passport_Language_ar: String { return self._s[3833]! } public func Message_AuthorPinnedGame(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3815]!, self._r[3815]!, [_0]) + return formatWithArgumentRanges(self._s[3834]!, self._r[3834]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3816]! } - public var Wallet_Created_Text: String { return self._s[3817]! } - public var Conversation_MessageDialogEdit: String { return self._s[3819]! } - public var Wallet_Created_Proceed: String { return self._s[3820]! } - public var Wallet_Words_Done: String { return self._s[3821]! } - public var VoiceOver_Media_PlaybackPause: String { return self._s[3822]! } + public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3835]! } + public var Wallet_Created_Text: String { return self._s[3836]! } + public var Conversation_MessageDialogEdit: String { return self._s[3838]! } + public var Wallet_Created_Proceed: String { return self._s[3839]! } + public var Wallet_Words_Done: String { return self._s[3840]! } + public var VoiceOver_Media_PlaybackPause: String { return self._s[3841]! } public func PUSH_AUTH_UNKNOWN(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3823]!, self._r[3823]!, [_1]) + return formatWithArgumentRanges(self._s[3842]!, self._r[3842]!, [_1]) } - public var Common_Close: String { return self._s[3824]! } - public var GroupInfo_PublicLink: String { return self._s[3825]! } - public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3826]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3827]! } + public var Common_Close: String { return self._s[3843]! } + public var GroupInfo_PublicLink: String { return self._s[3844]! } + public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3845]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3846]! } public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3831]!, self._r[3831]!, [_0]) + return formatWithArgumentRanges(self._s[3850]!, self._r[3850]!, [_0]) } - public var UserInfo_About_Placeholder: String { return self._s[3832]! } + public var UserInfo_About_Placeholder: String { return self._s[3851]! } public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3833]!, self._r[3833]!, [_0]) + return formatWithArgumentRanges(self._s[3852]!, self._r[3852]!, [_0]) } - public var GroupInfo_Permissions_SectionTitle: String { return self._s[3834]! } - public var Channel_Info_Banned: String { return self._s[3836]! } + public var GroupInfo_Permissions_SectionTitle: String { return self._s[3853]! } + public var Channel_Info_Banned: String { return self._s[3855]! } public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3837]!, self._r[3837]!, [_0]) + return formatWithArgumentRanges(self._s[3856]!, self._r[3856]!, [_0]) } - public var Appearance_Other: String { return self._s[3838]! } - public var Passport_Language_my: String { return self._s[3839]! } - public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3840]! } + public var Appearance_Other: String { return self._s[3857]! } + public var Passport_Language_my: String { return self._s[3858]! } + public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3859]! } public func Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3841]!, self._r[3841]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3860]!, self._r[3860]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3842]! } - public var IntentsSettings_SuggestedAndSpotlightChatsInfo: String { return self._s[3843]! } - public var Preview_CopyAddress: String { return self._s[3844]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3861]! } + public var IntentsSettings_SuggestedAndSpotlightChatsInfo: String { return self._s[3862]! } + public var Preview_CopyAddress: String { return self._s[3863]! } public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3845]!, self._r[3845]!, [_0]) + return formatWithArgumentRanges(self._s[3864]!, self._r[3864]!, [_0]) } - public var KeyCommand_JumpToPreviousChat: String { return self._s[3846]! } - public var UserInfo_BotSettings: String { return self._s[3847]! } - public var LiveLocation_MenuStopAll: String { return self._s[3849]! } - public var Passport_PasswordCreate: String { return self._s[3850]! } - public var StickerSettings_MaskContextInfo: String { return self._s[3851]! } - public var Message_PinnedLocationMessage: String { return self._s[3852]! } - public var Map_Satellite: String { return self._s[3853]! } - public var Watch_Message_Unsupported: String { return self._s[3854]! } - public var Username_TooManyPublicUsernamesError: String { return self._s[3855]! } - public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3856]! } + public var KeyCommand_JumpToPreviousChat: String { return self._s[3865]! } + public var UserInfo_BotSettings: String { return self._s[3866]! } + public var LiveLocation_MenuStopAll: String { return self._s[3868]! } + public var Passport_PasswordCreate: String { return self._s[3869]! } + public var StickerSettings_MaskContextInfo: String { return self._s[3870]! } + public var Message_PinnedLocationMessage: String { return self._s[3871]! } + public var Map_Satellite: String { return self._s[3872]! } + public var Watch_Message_Unsupported: String { return self._s[3873]! } + public var Username_TooManyPublicUsernamesError: String { return self._s[3874]! } + public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3875]! } public func Notification_PinnedTextMessage(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3857]!, self._r[3857]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3876]!, self._r[3876]!, [_0, _1]) } public func Conversation_OpenBotLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3858]!, self._r[3858]!, [_0]) + return formatWithArgumentRanges(self._s[3877]!, self._r[3877]!, [_0]) } - public var Wallet_WordImport_Continue: String { return self._s[3859]! } + public var Wallet_WordImport_Continue: String { return self._s[3878]! } public func TwoFactorSetup_EmailVerification_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3860]!, self._r[3860]!, [_0]) + return formatWithArgumentRanges(self._s[3879]!, self._r[3879]!, [_0]) } - public var Notifications_ChannelNotificationsHelp: String { return self._s[3861]! } - public var Privacy_Calls_P2PContacts: String { return self._s[3862]! } - public var NotificationsSound_None: String { return self._s[3863]! } - public var Wallet_TransactionInfo_StorageFeeHeader: String { return self._s[3864]! } - public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3866]! } - public var AccessDenied_VoiceMicrophone: String { return self._s[3867]! } + public var Notifications_ChannelNotificationsHelp: String { return self._s[3880]! } + public var Privacy_Calls_P2PContacts: String { return self._s[3881]! } + public var NotificationsSound_None: String { return self._s[3882]! } + public var Wallet_TransactionInfo_StorageFeeHeader: String { return self._s[3883]! } + public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3885]! } + public var AccessDenied_VoiceMicrophone: String { return self._s[3886]! } public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3868]!, self._r[3868]!, [_1]) + return formatWithArgumentRanges(self._s[3887]!, self._r[3887]!, [_1]) } - public var Cache_Indexing: String { return self._s[3869]! } - public var DialogList_RecentTitlePeople: String { return self._s[3871]! } - public var DialogList_EncryptionRejected: String { return self._s[3872]! } - public var GroupInfo_Administrators: String { return self._s[3873]! } - public var Passport_ScanPassportHelp: String { return self._s[3874]! } - public var Application_Name: String { return self._s[3875]! } - public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3876]! } - public var PeopleNearby_MakeVisible: String { return self._s[3878]! } - public var Appearance_ThemeCarouselDay: String { return self._s[3879]! } - public var Stats_GrowthTitle: String { return self._s[3880]! } - public var Passport_Identity_TranslationHelp: String { return self._s[3881]! } + public var Cache_Indexing: String { return self._s[3888]! } + public var DialogList_RecentTitlePeople: String { return self._s[3890]! } + public var DialogList_EncryptionRejected: String { return self._s[3891]! } + public var GroupInfo_Administrators: String { return self._s[3892]! } + public var Passport_ScanPassportHelp: String { return self._s[3893]! } + public var Application_Name: String { return self._s[3894]! } + public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3895]! } + public var PeopleNearby_MakeVisible: String { return self._s[3897]! } + public var Appearance_ThemeCarouselDay: String { return self._s[3898]! } + public var Stats_GrowthTitle: String { return self._s[3899]! } + public var Passport_Identity_TranslationHelp: String { return self._s[3900]! } public func VoiceOver_Chat_VideoMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3882]!, self._r[3882]!, [_0]) + return formatWithArgumentRanges(self._s[3901]!, self._r[3901]!, [_0]) } public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3883]!, self._r[3883]!, [_0]) - } - public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3884]!, self._r[3884]!, [_0]) - } - public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3885]! } - public var Privacy_ChatsTitle: String { return self._s[3886]! } - public var DialogList_ClearHistoryConfirmation: String { return self._s[3887]! } - public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3888]! } - public var Watch_Suggestion_HoldOn: String { return self._s[3889]! } - public var Group_EditAdmin_TransferOwnership: String { return self._s[3890]! } - public var WebBrowser_Title: String { return self._s[3891]! } - public var Group_LinkedChannel: String { return self._s[3892]! } - public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3893]! } - public var SocksProxySetup_RequiredCredentials: String { return self._s[3894]! } - public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3895]! } - public var Appearance_TextSize_UseSystem: String { return self._s[3896]! } - public var TwoStepAuth_EmailSkipAlert: String { return self._s[3897]! } - public var ScheduledMessages_RemindersTitle: String { return self._s[3899]! } - public var Channel_Setup_TypePublic: String { return self._s[3901]! } - public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3902]!, self._r[3902]!, [_0]) } - public var Channel_TypeSetup_Title: String { return self._s[3904]! } - public var MessagePoll_ViewResults: String { return self._s[3905]! } - public var Map_OpenInMaps: String { return self._s[3907]! } + public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3903]!, self._r[3903]!, [_0]) + } + public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3904]! } + public var Privacy_ChatsTitle: String { return self._s[3905]! } + public var DialogList_ClearHistoryConfirmation: String { return self._s[3906]! } + public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3907]! } + public var Watch_Suggestion_HoldOn: String { return self._s[3908]! } + public var Group_EditAdmin_TransferOwnership: String { return self._s[3909]! } + public var WebBrowser_Title: String { return self._s[3910]! } + public var Group_LinkedChannel: String { return self._s[3911]! } + public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3912]! } + public var SocksProxySetup_RequiredCredentials: String { return self._s[3913]! } + public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3914]! } + public var Appearance_TextSize_UseSystem: String { return self._s[3915]! } + public var TwoStepAuth_EmailSkipAlert: String { return self._s[3916]! } + public var ScheduledMessages_RemindersTitle: String { return self._s[3918]! } + public var Channel_Setup_TypePublic: String { return self._s[3920]! } + public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3921]!, self._r[3921]!, [_0]) + } + public var Channel_TypeSetup_Title: String { return self._s[3923]! } + public var MessagePoll_ViewResults: String { return self._s[3924]! } + public var Map_OpenInMaps: String { return self._s[3926]! } public func PUSH_PINNED_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3908]!, self._r[3908]!, [_1]) + return formatWithArgumentRanges(self._s[3927]!, self._r[3927]!, [_1]) } - public var NotificationsSound_Tremolo: String { return self._s[3910]! } + public var NotificationsSound_Tremolo: String { return self._s[3929]! } public func Date_ChatDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3911]!, self._r[3911]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3930]!, self._r[3930]!, [_1, _2, _3]) } - public var ConversationProfile_UnknownAddMemberError: String { return self._s[3912]! } - public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3913]! } - public var Passport_PasswordHelp: String { return self._s[3914]! } - public var Login_CodeExpiredError: String { return self._s[3915]! } - public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3916]! } - public var Conversation_TitleUnmute: String { return self._s[3917]! } - public var Passport_Identity_ScansHelp: String { return self._s[3918]! } - public var Passport_Language_lo: String { return self._s[3919]! } - public var Camera_FlashAuto: String { return self._s[3920]! } - public var Conversation_OpenBotLinkOpen: String { return self._s[3921]! } - public var Common_Cancel: String { return self._s[3922]! } - public var DialogList_SavedMessagesTooltip: String { return self._s[3923]! } - public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3924]! } - public var Appearance_TintAllColors: String { return self._s[3925]! } + public var ConversationProfile_UnknownAddMemberError: String { return self._s[3931]! } + public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3932]! } + public var Passport_PasswordHelp: String { return self._s[3934]! } + public var Login_CodeExpiredError: String { return self._s[3935]! } + public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3936]! } + public var Conversation_TitleUnmute: String { return self._s[3937]! } + public var Passport_Identity_ScansHelp: String { return self._s[3938]! } + public var Passport_Language_lo: String { return self._s[3939]! } + public var Camera_FlashAuto: String { return self._s[3940]! } + public var Conversation_OpenBotLinkOpen: String { return self._s[3941]! } + public var Common_Cancel: String { return self._s[3942]! } + public var DialogList_SavedMessagesTooltip: String { return self._s[3943]! } + public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3944]! } + public var Appearance_TintAllColors: String { return self._s[3945]! } public func PUSH_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3926]!, self._r[3926]!, [_1]) + return formatWithArgumentRanges(self._s[3946]!, self._r[3946]!, [_1]) } - public var Conversation_ReportSpamConfirmation: String { return self._s[3927]! } - public var ChatSettings_Title: String { return self._s[3929]! } - public var Passport_PasswordReset: String { return self._s[3930]! } - public var SocksProxySetup_TypeNone: String { return self._s[3931]! } - public var EditTheme_Title: String { return self._s[3934]! } - public var PhoneNumberHelp_Help: String { return self._s[3935]! } - public var Checkout_EnterPassword: String { return self._s[3936]! } - public var Activity_UploadingDocument: String { return self._s[3938]! } - public var Share_AuthTitle: String { return self._s[3939]! } - public var State_Connecting: String { return self._s[3940]! } - public var Profile_MessageLifetime1w: String { return self._s[3941]! } - public var Conversation_ContextMenuReport: String { return self._s[3942]! } - public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3943]! } - public var AutoNightTheme_ScheduledTo: String { return self._s[3944]! } + public var Conversation_ReportSpamConfirmation: String { return self._s[3947]! } + public var ChatSettings_Title: String { return self._s[3949]! } + public var Passport_PasswordReset: String { return self._s[3950]! } + public var SocksProxySetup_TypeNone: String { return self._s[3951]! } + public var EditTheme_Title: String { return self._s[3954]! } + public var PhoneNumberHelp_Help: String { return self._s[3955]! } + public var Checkout_EnterPassword: String { return self._s[3956]! } + public var Activity_UploadingDocument: String { return self._s[3958]! } + public var Share_AuthTitle: String { return self._s[3959]! } + public var State_Connecting: String { return self._s[3960]! } + public var Profile_MessageLifetime1w: String { return self._s[3961]! } + public var Conversation_ContextMenuReport: String { return self._s[3962]! } + public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3963]! } + public var AutoNightTheme_ScheduledTo: String { return self._s[3964]! } public func VoiceOver_Chat_AnonymousPollFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3945]!, self._r[3945]!, [_0]) + return formatWithArgumentRanges(self._s[3965]!, self._r[3965]!, [_0]) } - public var AuthSessions_Terminate: String { return self._s[3946]! } - public var Wallet_WordImport_CanNotRemember: String { return self._s[3947]! } - public var PeerInfo_PaneAudio: String { return self._s[3948]! } - public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3950]! } - public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3951]! } - public var PhotoEditor_Set: String { return self._s[3952]! } - public var EmptyGroupInfo_Title: String { return self._s[3953]! } - public var Login_PadPhoneHelp: String { return self._s[3954]! } - public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3956]! } - public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3958]! } - public var NotificationsSound_Complete: String { return self._s[3959]! } - public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3960]! } - public var Group_Info_AdminLog: String { return self._s[3961]! } - public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3962]! } + public var AuthSessions_Terminate: String { return self._s[3966]! } + public var Wallet_WordImport_CanNotRemember: String { return self._s[3967]! } + public var PeerInfo_PaneAudio: String { return self._s[3968]! } + public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3970]! } + public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3971]! } + public var PhotoEditor_Set: String { return self._s[3972]! } + public var EmptyGroupInfo_Title: String { return self._s[3973]! } + public var Login_PadPhoneHelp: String { return self._s[3975]! } + public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3977]! } + public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3979]! } + public var NotificationsSound_Complete: String { return self._s[3980]! } + public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3981]! } + public var Group_Info_AdminLog: String { return self._s[3982]! } + public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3983]! } public func Wallet_Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3963]!, self._r[3963]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3984]!, self._r[3984]!, [_1, _2, _3]) } - public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3964]! } - public var Group_Location_CreateInThisPlace: String { return self._s[3966]! } - public var Conversation_Admin: String { return self._s[3967]! } - public var Conversation_GifTooltip: String { return self._s[3968]! } - public var Passport_NotLoggedInMessage: String { return self._s[3969]! } + public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3985]! } + public var Group_Location_CreateInThisPlace: String { return self._s[3987]! } + public var Conversation_Admin: String { return self._s[3988]! } + public var Conversation_GifTooltip: String { return self._s[3989]! } + public var Passport_NotLoggedInMessage: String { return self._s[3990]! } public func AutoDownloadSettings_OnFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3971]!, self._r[3971]!, [_0]) + return formatWithArgumentRanges(self._s[3992]!, self._r[3992]!, [_0]) } - public var Profile_MessageLifetimeForever: String { return self._s[3972]! } - public var SharedMedia_EmptyTitle: String { return self._s[3974]! } - public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3976]! } - public var Username_Help: String { return self._s[3977]! } - public var DialogList_LanguageTooltip: String { return self._s[3979]! } - public var Map_LoadError: String { return self._s[3980]! } - public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3981]! } - public var Channel_AdminLog_AddMembers: String { return self._s[3982]! } - public var ArchivedChats_IntroTitle2: String { return self._s[3983]! } - public var Notification_Exceptions_NewException: String { return self._s[3984]! } - public var TwoStepAuth_EmailTitle: String { return self._s[3985]! } - public var WatchRemote_AlertText: String { return self._s[3986]! } + public var Profile_MessageLifetimeForever: String { return self._s[3993]! } + public var SharedMedia_EmptyTitle: String { return self._s[3995]! } + public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3997]! } + public var Username_Help: String { return self._s[3998]! } + public var DialogList_LanguageTooltip: String { return self._s[4000]! } + public var Map_LoadError: String { return self._s[4001]! } + public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[4002]! } + public var Channel_AdminLog_AddMembers: String { return self._s[4003]! } + public var ArchivedChats_IntroTitle2: String { return self._s[4004]! } + public var Notification_Exceptions_NewException: String { return self._s[4005]! } + public var TwoStepAuth_EmailTitle: String { return self._s[4006]! } + public var WatchRemote_AlertText: String { return self._s[4007]! } public func Wallet_Send_ConfirmationText(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3987]!, self._r[3987]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4008]!, self._r[4008]!, [_1, _2, _3]) } - public var ChatSettings_ConnectionType_Title: String { return self._s[3991]! } + public var ChatSettings_ConnectionType_Title: String { return self._s[4012]! } public func PUSH_PINNED_QUIZ(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3992]!, self._r[3992]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4013]!, self._r[4013]!, [_1, _2]) } public func Settings_CheckPhoneNumberTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3993]!, self._r[3993]!, [_0]) + return formatWithArgumentRanges(self._s[4014]!, self._r[4014]!, [_0]) } - public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3994]! } - public var WebBrowser_DefaultBrowser: String { return self._s[3995]! } - public var Passport_Address_CountryPlaceholder: String { return self._s[3996]! } + public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[4015]! } + public var WebBrowser_DefaultBrowser: String { return self._s[4016]! } + public var Passport_Address_CountryPlaceholder: String { return self._s[4017]! } public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3997]!, self._r[3997]!, [_0]) + return formatWithArgumentRanges(self._s[4018]!, self._r[4018]!, [_0]) } public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3998]!, self._r[3998]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4019]!, self._r[4019]!, [_1, _2, _3]) } - public var Group_AdminLog_EmptyText: String { return self._s[3999]! } - public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[4000]! } - public var Conversation_PrivateChannelTooltip: String { return self._s[4002]! } - public var Wallet_Created_ExportErrorText: String { return self._s[4003]! } - public var ChatList_UndoArchiveText1: String { return self._s[4004]! } - public var AccessDenied_VideoMicrophone: String { return self._s[4005]! } - public var Conversation_ContextMenuStickerPackAdd: String { return self._s[4006]! } - public var Cache_ClearNone: String { return self._s[4007]! } - public var SocksProxySetup_FailedToConnect: String { return self._s[4008]! } - public var Permissions_NotificationsTitle_v0: String { return self._s[4009]! } + public var Group_AdminLog_EmptyText: String { return self._s[4020]! } + public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[4021]! } + public var Conversation_PrivateChannelTooltip: String { return self._s[4023]! } + public var Wallet_Created_ExportErrorText: String { return self._s[4024]! } + public var ChatList_UndoArchiveText1: String { return self._s[4025]! } + public var AccessDenied_VideoMicrophone: String { return self._s[4026]! } + public var Conversation_ContextMenuStickerPackAdd: String { return self._s[4027]! } + public var Cache_ClearNone: String { return self._s[4028]! } + public var SocksProxySetup_FailedToConnect: String { return self._s[4029]! } + public var Permissions_NotificationsTitle_v0: String { return self._s[4030]! } public func Channel_AdminLog_MessageEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4010]!, self._r[4010]!, [_0]) + return formatWithArgumentRanges(self._s[4031]!, self._r[4031]!, [_0]) } - public var Passport_Identity_Country: String { return self._s[4011]! } + public var Passport_Identity_Country: String { return self._s[4032]! } public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4012]!, self._r[4012]!, [_0]) - } - public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4013]!, self._r[4013]!, [_0]) - } - public var Exceptions_AddToExceptions: String { return self._s[4014]! } - public var AccessDenied_Settings: String { return self._s[4015]! } - public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[4016]! } - public var Month_ShortMay: String { return self._s[4017]! } - public var Compose_NewGroup: String { return self._s[4019]! } - public var Group_Setup_TypePrivate: String { return self._s[4021]! } - public var Login_PadPhoneHelpTitle: String { return self._s[4023]! } - public var Appearance_ThemeDayClassic: String { return self._s[4024]! } - public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[4025]! } - public var AutoDownloadSettings_OffForAll: String { return self._s[4026]! } - public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[4027]! } - public var Conversation_typing: String { return self._s[4029]! } - public var Undo_ScheduledMessagesCleared: String { return self._s[4030]! } - public var Paint_Masks: String { return self._s[4031]! } - public var Contacts_DeselectAll: String { return self._s[4032]! } - public func Wallet_Updated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4033]!, self._r[4033]!, [_0]) } - public var CreatePoll_MultipleChoiceQuizAlert: String { return self._s[4034]! } - public var Username_InvalidTaken: String { return self._s[4035]! } - public var Call_StatusNoAnswer: String { return self._s[4036]! } - public var TwoStepAuth_EmailAddSuccess: String { return self._s[4037]! } - public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[4038]! } - public var Passport_Identity_Selfie: String { return self._s[4039]! } - public var Login_InfoLastNamePlaceholder: String { return self._s[4040]! } - public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[4041]! } - public var Conversation_ClearSecretHistory: String { return self._s[4042]! } - public var PeopleNearby_Description: String { return self._s[4044]! } - public var NetworkUsageSettings_Title: String { return self._s[4045]! } - public var Your_cards_security_code_is_invalid: String { return self._s[4047]! } - public var Stats_EnabledNotifications: String { return self._s[4048]! } + public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4034]!, self._r[4034]!, [_0]) + } + public var Exceptions_AddToExceptions: String { return self._s[4035]! } + public var AccessDenied_Settings: String { return self._s[4036]! } + public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[4037]! } + public var Month_ShortMay: String { return self._s[4038]! } + public var Compose_NewGroup: String { return self._s[4040]! } + public var Group_Setup_TypePrivate: String { return self._s[4042]! } + public var Login_PadPhoneHelpTitle: String { return self._s[4044]! } + public var Appearance_ThemeDayClassic: String { return self._s[4045]! } + public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[4046]! } + public var AutoDownloadSettings_OffForAll: String { return self._s[4047]! } + public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[4048]! } + public var Conversation_typing: String { return self._s[4050]! } + public var Undo_ScheduledMessagesCleared: String { return self._s[4051]! } + public var Paint_Masks: String { return self._s[4052]! } + public var Contacts_DeselectAll: String { return self._s[4053]! } + public func Wallet_Updated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4054]!, self._r[4054]!, [_0]) + } + public var CreatePoll_MultipleChoiceQuizAlert: String { return self._s[4055]! } + public var Username_InvalidTaken: String { return self._s[4056]! } + public var Call_StatusNoAnswer: String { return self._s[4057]! } + public var TwoStepAuth_EmailAddSuccess: String { return self._s[4058]! } + public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[4059]! } + public var Passport_Identity_Selfie: String { return self._s[4060]! } + public var Login_InfoLastNamePlaceholder: String { return self._s[4061]! } + public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[4062]! } + public var Conversation_ClearSecretHistory: String { return self._s[4063]! } + public var PeopleNearby_Description: String { return self._s[4065]! } + public var NetworkUsageSettings_Title: String { return self._s[4066]! } + public var Your_cards_security_code_is_invalid: String { return self._s[4068]! } + public var Stats_EnabledNotifications: String { return self._s[4069]! } public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4050]!, self._r[4050]!, [_0]) + return formatWithArgumentRanges(self._s[4071]!, self._r[4071]!, [_0]) } public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4051]!, self._r[4051]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4072]!, self._r[4072]!, [_1, _2]) } - public var SaveIncomingPhotosSettings_From: String { return self._s[4053]! } - public var VoiceOver_Navigation_Search: String { return self._s[4054]! } - public var Map_LiveLocationTitle: String { return self._s[4055]! } - public var Login_InfoAvatarAdd: String { return self._s[4056]! } - public var Passport_Identity_FilesView: String { return self._s[4057]! } - public var UserInfo_GenericPhoneLabel: String { return self._s[4058]! } - public var Privacy_Calls_NeverAllow: String { return self._s[4059]! } - public var VoiceOver_Chat_File: String { return self._s[4060]! } - public var Wallet_Settings_DeleteWalletInfo: String { return self._s[4061]! } + public var SaveIncomingPhotosSettings_From: String { return self._s[4074]! } + public var VoiceOver_Navigation_Search: String { return self._s[4075]! } + public var Map_LiveLocationTitle: String { return self._s[4076]! } + public var Login_InfoAvatarAdd: String { return self._s[4077]! } + public var Passport_Identity_FilesView: String { return self._s[4078]! } + public var UserInfo_GenericPhoneLabel: String { return self._s[4079]! } + public var Privacy_Calls_NeverAllow: String { return self._s[4080]! } + public var VoiceOver_Chat_File: String { return self._s[4081]! } + public var Wallet_Settings_DeleteWalletInfo: String { return self._s[4082]! } public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4062]!, self._r[4062]!, [_0]) + return formatWithArgumentRanges(self._s[4083]!, self._r[4083]!, [_0]) } - public var ChatList_EmptyChatList: String { return self._s[4063]! } - public var ContactInfo_PhoneNumberHidden: String { return self._s[4064]! } - public var TwoStepAuth_ConfirmationText: String { return self._s[4065]! } - public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[4066]! } + public var ChatList_EmptyChatList: String { return self._s[4084]! } + public var ContactInfo_PhoneNumberHidden: String { return self._s[4085]! } + public var TwoStepAuth_ConfirmationText: String { return self._s[4086]! } + public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[4087]! } public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4067]!, self._r[4067]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4088]!, self._r[4088]!, [_1, _2, _3]) } - public var Channel_AdminLogFilter_AdminsAll: String { return self._s[4068]! } - public var Wallet_Intro_CreateErrorText: String { return self._s[4069]! } - public var Tour_Title2: String { return self._s[4070]! } - public var Wallet_Sent_ViewWallet: String { return self._s[4071]! } - public var Conversation_FileOpenIn: String { return self._s[4072]! } - public var Checkout_ErrorPrecheckoutFailed: String { return self._s[4073]! } - public var Wallet_Send_ErrorInvalidAddress: String { return self._s[4074]! } - public var Wallpaper_Set: String { return self._s[4075]! } - public var Passport_Identity_Translations: String { return self._s[4077]! } + public var Channel_AdminLogFilter_AdminsAll: String { return self._s[4089]! } + public var Wallet_Intro_CreateErrorText: String { return self._s[4090]! } + public var Tour_Title2: String { return self._s[4091]! } + public var Wallet_Sent_ViewWallet: String { return self._s[4092]! } + public var Conversation_FileOpenIn: String { return self._s[4093]! } + public var Checkout_ErrorPrecheckoutFailed: String { return self._s[4094]! } + public var Wallet_Send_ErrorInvalidAddress: String { return self._s[4095]! } + public var Wallpaper_Set: String { return self._s[4096]! } + public var Passport_Identity_Translations: String { return self._s[4098]! } public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4078]!, self._r[4078]!, [_0]) + return formatWithArgumentRanges(self._s[4099]!, self._r[4099]!, [_0]) } - public var Channel_LeaveChannel: String { return self._s[4079]! } + public var Channel_LeaveChannel: String { return self._s[4100]! } public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4080]!, self._r[4080]!, [_1]) + return formatWithArgumentRanges(self._s[4101]!, self._r[4101]!, [_1]) } - public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[4082]! } - public var PhotoEditor_HighlightsTint: String { return self._s[4083]! } - public var MessagePoll_LabelPoll: String { return self._s[4084]! } - public var Passport_Email_Delete: String { return self._s[4085]! } - public var Conversation_Mute: String { return self._s[4087]! } - public var Channel_AddBotAsAdmin: String { return self._s[4088]! } - public var Channel_AdminLog_CanSendMessages: String { return self._s[4090]! } - public var Wallet_Configuration_BlockchainNameChangedText: String { return self._s[4091]! } - public var ChatSettings_IntentsSettings: String { return self._s[4093]! } - public var Channel_Management_LabelOwner: String { return self._s[4094]! } + public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[4103]! } + public var PhotoEditor_HighlightsTint: String { return self._s[4104]! } + public var MessagePoll_LabelPoll: String { return self._s[4105]! } + public var Passport_Email_Delete: String { return self._s[4106]! } + public var Conversation_Mute: String { return self._s[4108]! } + public var Channel_AddBotAsAdmin: String { return self._s[4109]! } + public var Channel_AdminLog_CanSendMessages: String { return self._s[4111]! } + public var Wallet_Configuration_BlockchainNameChangedText: String { return self._s[4112]! } + public var ChatSettings_IntentsSettings: String { return self._s[4114]! } + public var Channel_Management_LabelOwner: String { return self._s[4115]! } public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4095]!, self._r[4095]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4116]!, self._r[4116]!, [_1, _2]) } - public var Calls_CallTabDescription: String { return self._s[4096]! } - public var Passport_Identity_NativeNameHelp: String { return self._s[4097]! } - public var Common_No: String { return self._s[4098]! } - public var Weekday_Sunday: String { return self._s[4099]! } - public var Notification_Reply: String { return self._s[4100]! } - public var Conversation_ViewMessage: String { return self._s[4101]! } + public var Calls_CallTabDescription: String { return self._s[4117]! } + public var Passport_Identity_NativeNameHelp: String { return self._s[4118]! } + public var Common_No: String { return self._s[4119]! } + public var Weekday_Sunday: String { return self._s[4120]! } + public var Notification_Reply: String { return self._s[4121]! } + public var Conversation_ViewMessage: String { return self._s[4122]! } public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4102]!, self._r[4102]!, [_0]) + return formatWithArgumentRanges(self._s[4123]!, self._r[4123]!, [_0]) } public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4103]!, self._r[4103]!, [_0]) + return formatWithArgumentRanges(self._s[4124]!, self._r[4124]!, [_0]) } public func Wallet_Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4104]!, self._r[4104]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4125]!, self._r[4125]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[4105]! } - public var Wallet_Send_Title: String { return self._s[4106]! } - public var Message_PinnedDocumentMessage: String { return self._s[4107]! } - public var Wallet_Info_RefreshErrorText: String { return self._s[4108]! } - public var DialogList_TabTitle: String { return self._s[4110]! } - public var ChatSettings_AutoPlayTitle: String { return self._s[4111]! } - public var Passport_FieldEmail: String { return self._s[4112]! } - public var Conversation_UnpinMessageAlert: String { return self._s[4113]! } - public var Passport_Address_TypeBankStatement: String { return self._s[4114]! } - public var Wallet_SecureStorageReset_Title: String { return self._s[4115]! } - public var Passport_Identity_ExpiryDate: String { return self._s[4116]! } - public var Privacy_Calls_P2P: String { return self._s[4117]! } + public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[4126]! } + public var Wallet_Send_Title: String { return self._s[4127]! } + public var Message_PinnedDocumentMessage: String { return self._s[4128]! } + public var Wallet_Info_RefreshErrorText: String { return self._s[4129]! } + public var DialogList_TabTitle: String { return self._s[4131]! } + public var ChatSettings_AutoPlayTitle: String { return self._s[4132]! } + public var Passport_FieldEmail: String { return self._s[4133]! } + public var Conversation_UnpinMessageAlert: String { return self._s[4134]! } + public var Passport_Address_TypeBankStatement: String { return self._s[4135]! } + public var Wallet_SecureStorageReset_Title: String { return self._s[4136]! } + public var Passport_Identity_ExpiryDate: String { return self._s[4137]! } + public var Privacy_Calls_P2P: String { return self._s[4138]! } public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4119]!, self._r[4119]!, [_0]) + return formatWithArgumentRanges(self._s[4140]!, self._r[4140]!, [_0]) } - public var SocksProxySetup_UseForCallsHelp: String { return self._s[4120]! } + public var SocksProxySetup_UseForCallsHelp: String { return self._s[4141]! } public func PUSH_CHAT_ALBUM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4121]!, self._r[4121]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4142]!, self._r[4142]!, [_1, _2]) } - public var Stickers_ClearRecent: String { return self._s[4122]! } - public var EnterPasscode_ChangeTitle: String { return self._s[4123]! } - public var TwoFactorSetup_Email_Title: String { return self._s[4124]! } - public var Passport_InfoText: String { return self._s[4125]! } - public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[4126]! } + public var Stickers_ClearRecent: String { return self._s[4143]! } + public var EnterPasscode_ChangeTitle: String { return self._s[4144]! } + public var TwoFactorSetup_Email_Title: String { return self._s[4145]! } + public var Passport_InfoText: String { return self._s[4146]! } + public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[4147]! } public func Login_InvalidPhoneEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4127]!, self._r[4127]!, [_0]) - } - public func Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4128]!, self._r[4128]!, [_1, _2, _3]) - } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[4129]! } - public var ScheduledMessages_PollUnavailable: String { return self._s[4130]! } - public var VoiceOver_Navigation_Compose: String { return self._s[4131]! } - public var Passport_Identity_EditDriversLicense: String { return self._s[4132]! } - public var Conversation_TapAndHoldToRecord: String { return self._s[4134]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[4135]! } - public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4136]!, self._r[4136]!, [_1, _2]) - } - public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[4139]! } - public var ChatSettings_OpenLinksIn: String { return self._s[4140]! } - public var Map_HomeAndWorkTitle: String { return self._s[4141]! } - public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4143]!, self._r[4143]!, [_0]) - } - public var DialogList_Unread: String { return self._s[4144]! } - public func PUSH_CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4145]!, self._r[4145]!, [_1, _2]) - } - public var User_DeletedAccount: String { return self._s[4146]! } - public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[4147]! } - public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4148]!, self._r[4148]!, [_0]) } - public var UserInfo_NotificationsDefault: String { return self._s[4149]! } - public var SharedMedia_CategoryMedia: String { return self._s[4150]! } - public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[4151]! } - public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[4152]! } - public var Watch_ChatList_Compose: String { return self._s[4153]! } - public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[4154]! } - public var AutoDownloadSettings_Delimeter: String { return self._s[4155]! } - public var Watch_Microphone_Access: String { return self._s[4156]! } - public var Group_Setup_HistoryHeader: String { return self._s[4157]! } - public var Map_SetThisLocation: String { return self._s[4158]! } - public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[4159]! } - public var Activity_UploadingPhoto: String { return self._s[4160]! } - public var Conversation_Edit: String { return self._s[4162]! } - public var Group_ErrorSendRestrictedMedia: String { return self._s[4163]! } - public var Login_TermsOfServiceDecline: String { return self._s[4164]! } - public var Message_PinnedContactMessage: String { return self._s[4165]! } - public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + public func Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4149]!, self._r[4149]!, [_1, _2, _3]) + } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[4150]! } + public var ScheduledMessages_PollUnavailable: String { return self._s[4151]! } + public var VoiceOver_Navigation_Compose: String { return self._s[4152]! } + public var Passport_Identity_EditDriversLicense: String { return self._s[4153]! } + public var Conversation_TapAndHoldToRecord: String { return self._s[4155]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[4156]! } + public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4157]!, self._r[4157]!, [_1, _2]) + } + public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[4160]! } + public var ChatSettings_OpenLinksIn: String { return self._s[4161]! } + public var Map_HomeAndWorkTitle: String { return self._s[4162]! } + public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4164]!, self._r[4164]!, [_0]) + } + public var DialogList_Unread: String { return self._s[4165]! } + public func PUSH_CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4166]!, self._r[4166]!, [_1, _2]) } + public var User_DeletedAccount: String { return self._s[4167]! } + public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[4168]! } + public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4169]!, self._r[4169]!, [_0]) + } + public var UserInfo_NotificationsDefault: String { return self._s[4170]! } + public var SharedMedia_CategoryMedia: String { return self._s[4171]! } + public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[4172]! } + public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[4173]! } + public var Watch_ChatList_Compose: String { return self._s[4174]! } + public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[4175]! } + public var AutoDownloadSettings_Delimeter: String { return self._s[4176]! } + public var Watch_Microphone_Access: String { return self._s[4177]! } + public var Group_Setup_HistoryHeader: String { return self._s[4178]! } + public var Map_SetThisLocation: String { return self._s[4179]! } + public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[4180]! } + public var Activity_UploadingPhoto: String { return self._s[4181]! } + public var Conversation_Edit: String { return self._s[4183]! } + public var Group_ErrorSendRestrictedMedia: String { return self._s[4184]! } + public var Login_TermsOfServiceDecline: String { return self._s[4185]! } + public var Message_PinnedContactMessage: String { return self._s[4186]! } + public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4187]!, self._r[4187]!, [_1, _2]) + } public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4167]!, self._r[4167]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[4188]!, self._r[4188]!, [_1, _2, _3, _4, _5]) } - public var Appearance_LargeEmoji: String { return self._s[4168]! } - public var TwoStepAuth_AdditionalPassword: String { return self._s[4170]! } - public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[4171]! } + public var Appearance_LargeEmoji: String { return self._s[4189]! } + public var TwoStepAuth_AdditionalPassword: String { return self._s[4191]! } + public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[4192]! } public func PUSH_CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4172]!, self._r[4172]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4193]!, self._r[4193]!, [_1, _2]) } - public var Passport_Phone_EnterOtherNumber: String { return self._s[4173]! } - public var Message_PinnedPhotoMessage: String { return self._s[4174]! } - public var Passport_FieldPhone: String { return self._s[4175]! } - public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[4176]! } - public var Stats_NotificationsTitle: String { return self._s[4177]! } - public var ChatSettings_AutoPlayGifs: String { return self._s[4178]! } - public var InfoPlist_NSCameraUsageDescription: String { return self._s[4180]! } - public var Conversation_Call: String { return self._s[4181]! } - public var Common_TakePhoto: String { return self._s[4183]! } - public var Group_EditAdmin_RankTitle: String { return self._s[4184]! } - public var Wallet_Receive_CommentHeader: String { return self._s[4185]! } - public var Channel_NotificationLoading: String { return self._s[4186]! } + public var Passport_Phone_EnterOtherNumber: String { return self._s[4194]! } + public var Message_PinnedPhotoMessage: String { return self._s[4195]! } + public var Passport_FieldPhone: String { return self._s[4196]! } + public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[4197]! } + public var Stats_NotificationsTitle: String { return self._s[4198]! } + public var ChatSettings_AutoPlayGifs: String { return self._s[4199]! } + public var InfoPlist_NSCameraUsageDescription: String { return self._s[4201]! } + public var Conversation_Call: String { return self._s[4202]! } + public var Common_TakePhoto: String { return self._s[4204]! } + public var Group_EditAdmin_RankTitle: String { return self._s[4205]! } + public var Wallet_Receive_CommentHeader: String { return self._s[4206]! } + public var Channel_NotificationLoading: String { return self._s[4207]! } public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4187]!, self._r[4187]!, [_0]) + return formatWithArgumentRanges(self._s[4208]!, self._r[4208]!, [_0]) } public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4188]!, self._r[4188]!, [_0]) + return formatWithArgumentRanges(self._s[4209]!, self._r[4209]!, [_0]) } public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4189]!, self._r[4189]!, [_1]) + return formatWithArgumentRanges(self._s[4210]!, self._r[4210]!, [_1]) } - public var Permissions_SiriTitle_v0: String { return self._s[4190]! } + public var Permissions_SiriTitle_v0: String { return self._s[4211]! } public func VoiceOver_Chat_VoiceMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4191]!, self._r[4191]!, [_0]) - } - public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4192]!, self._r[4192]!, [_0]) - } - public var Channel_MessagePhotoRemoved: String { return self._s[4193]! } - public var Wallet_Info_ReceiveGrams: String { return self._s[4194]! } - public var ClearCache_FreeSpace: String { return self._s[4195]! } - public var Appearance_BubbleCorners_Apply: String { return self._s[4196]! } - public var Common_edit: String { return self._s[4197]! } - public var PrivacySettings_AuthSessions: String { return self._s[4198]! } - public var Month_ShortJune: String { return self._s[4199]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[4200]! } - public var Call_ReportSend: String { return self._s[4201]! } - public var Watch_LastSeen_JustNow: String { return self._s[4202]! } - public var Notifications_MessageNotifications: String { return self._s[4203]! } - public var WallpaperSearch_ColorGreen: String { return self._s[4204]! } - public var BroadcastListInfo_AddRecipient: String { return self._s[4206]! } - public var Group_Status: String { return self._s[4207]! } - public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4208]!, self._r[4208]!, [_0, _1]) - } - public var TextFormat_AddLinkTitle: String { return self._s[4209]! } - public var ShareMenu_ShareTo: String { return self._s[4210]! } - public var Conversation_Moderate_Ban: String { return self._s[4211]! } - public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4212]!, self._r[4212]!, [_0]) } - public var SharedMedia_ViewInChat: String { return self._s[4213]! } - public var Map_LiveLocationFor8Hours: String { return self._s[4214]! } + public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4213]!, self._r[4213]!, [_0]) + } + public var Channel_MessagePhotoRemoved: String { return self._s[4214]! } + public var Wallet_Info_ReceiveGrams: String { return self._s[4215]! } + public var ClearCache_FreeSpace: String { return self._s[4216]! } + public var Appearance_BubbleCorners_Apply: String { return self._s[4217]! } + public var Common_edit: String { return self._s[4218]! } + public var PrivacySettings_AuthSessions: String { return self._s[4219]! } + public var Month_ShortJune: String { return self._s[4220]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[4221]! } + public var Call_ReportSend: String { return self._s[4222]! } + public var Watch_LastSeen_JustNow: String { return self._s[4223]! } + public var Notifications_MessageNotifications: String { return self._s[4224]! } + public var WallpaperSearch_ColorGreen: String { return self._s[4225]! } + public var BroadcastListInfo_AddRecipient: String { return self._s[4227]! } + public var Group_Status: String { return self._s[4228]! } + public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4229]!, self._r[4229]!, [_0, _1]) + } + public var TextFormat_AddLinkTitle: String { return self._s[4230]! } + public var ShareMenu_ShareTo: String { return self._s[4231]! } + public var Conversation_Moderate_Ban: String { return self._s[4232]! } + public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4233]!, self._r[4233]!, [_0]) + } + public var SharedMedia_ViewInChat: String { return self._s[4234]! } + public var Map_LiveLocationFor8Hours: String { return self._s[4235]! } public func PUSH_PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4215]!, self._r[4215]!, [_1]) + return formatWithArgumentRanges(self._s[4236]!, self._r[4236]!, [_1]) } public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4216]!, self._r[4216]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4237]!, self._r[4237]!, [_1, _2]) } public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4218]!, self._r[4218]!, [_0]) + return formatWithArgumentRanges(self._s[4239]!, self._r[4239]!, [_0]) } - public var Map_OpenInHereMaps: String { return self._s[4219]! } - public var Appearance_ReduceMotion: String { return self._s[4220]! } + public var Map_OpenInHereMaps: String { return self._s[4240]! } + public var Appearance_ReduceMotion: String { return self._s[4241]! } public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4221]!, self._r[4221]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4242]!, self._r[4242]!, [_1, _2]) } - public var Channel_Setup_TypePublicHelp: String { return self._s[4222]! } - public var Passport_Identity_EditInternalPassport: String { return self._s[4223]! } - public var PhotoEditor_Skip: String { return self._s[4224]! } - public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { + public var Channel_Setup_TypePublicHelp: String { return self._s[4243]! } + public var Passport_Identity_EditInternalPassport: String { return self._s[4244]! } + public var PhotoEditor_Skip: String { return self._s[4245]! } + public func StickerPack_RemoveMaskCount(_ 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 MessageTimer_ShortMinutes(_ value: Int32) -> String { + public func AttachmentMenu_SendItem(_ 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 ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { + public func DialogList_LiveLocationChatsCount(_ 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 Map_ETAHours(_ value: Int32) -> String { + public func Contacts_ImportersCount(_ 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 Wallpaper_DeleteConfirmation(_ value: Int32) -> String { + 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[4 * 6 + Int(form.rawValue)]!, stringValue) } - public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { + public func Wallpaper_DeleteConfirmation(_ 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 StickerPack_StickerCount(_ 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[6 * 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[7 * 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[7 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func Call_Seconds(_ 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[8 * 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[9 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Media_ShareItem(_ value: Int32) -> String { + public func Conversation_StatusOnline(_ 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) + return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, _1, _2) } - public func ForwardedPolls(_ value: Int32) -> String { + 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[11 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func SharedMedia_Link(_ 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 GroupInfo_ParticipantCount(_ value: Int32) -> String { + public func LastSeen_HoursAgo(_ 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 MessageTimer_Years(_ 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[14 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { + public func Conversation_StatusMembers(_ 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 Conversation_StatusMembers(_ value: Int32) -> String { + public func OldChannels_InactiveWeek(_ 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 PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, _2, _1, _3) + return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, _1, _2) } - public func SharedMedia_Generic(_ value: Int32) -> String { + 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[18 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortHours(_ value: Int32) -> String { + public func SharedMedia_Generic(_ 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 Conversation_StatusSubscribers(_ value: Int32) -> String { + public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, _0, _1) + } + public func ForwardedVideoMessages(_ 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_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[21 * 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[22 * 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[23 * 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[24 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_ROUNDS(_ 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[25 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Call_ShortMinutes(_ 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 ChatList_DeletedChats(_ 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 SharedMedia_Photo(_ 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 Conversation_LiveLocationMembersCount(_ 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 Conversation_SelectedMessages(_ 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 Media_ShareVideo(_ 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) + return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, _1, _2) } public func MuteExpires_Hours(_ 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) + return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_AddStickerCount(_ value: Int32) -> String { + public func SharedMedia_Photo(_ 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 Notification_GameScoreSelfSimple(_ 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 PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MessageTimer_Days(_ 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 GroupInfo_ShowMoreMembers(_ 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 LiveLocationUpdated_MinutesAgo(_ 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_ShortSeconds(_ 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 ForwardedVideoMessages(_ 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 Map_ETAMinutes(_ 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 OldChannels_InactiveYear(_ 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 ForwardedFiles(_ 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) + return String(format: self._ps[25 * 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[45 * 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[46 * 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[47 * 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[48 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MessageTimer_ShortWeeks(_ 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 PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func UserCount(_ 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 ChatList_DeleteConfirmation(_ 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 SharedMedia_Video(_ 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 Conversation_StatusOnline(_ 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_SendPhoto(_ 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 Passport_Scans(_ 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 StickerPack_RemoveMaskCount(_ 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 MessageTimer_Seconds(_ 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 MessageTimer_Hours(_ 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 VoiceOver_Chat_ContactPhoneNumberCount(_ 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 ServiceMessage_GameScoreSelfExtended(_ 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 StickerPack_AddMaskCount(_ 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 AttachmentMenu_SendItem(_ 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 MuteExpires_Days(_ 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 Watch_UserInfo_Mute(_ 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 LiveLocation_MenuChatsCount(_ 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 ForwardedGifs(_ 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 ForwardedContacts(_ 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 ForwardedPhotos(_ 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 ForwardedMessages(_ 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 AttachmentMenu_SendVideo(_ 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 Watch_LastSeen_MinutesAgo(_ 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 PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func DialogList_LiveLocationChatsCount(_ 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 MessageTimer_Months(_ 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 LastSeen_MinutesAgo(_ 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 ForwardedLocations(_ 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 PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[78 * 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[79 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PeopleNearby_ShowMorePeople(_ 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_InactiveMonth(_ 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_QuizCount(_ 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_Minutes(_ 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 MuteExpires_Minutes(_ 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 MuteFor_Hours(_ 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 VoiceOver_Chat_PollOptionCount(_ 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 Contacts_ImportersCount(_ 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 Chat_DeleteMessagesConfirmation(_ 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 Contacts_InviteContacts(_ 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 VoiceOver_Chat_ContactEmailCount(_ 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) + return String(format: self._ps[26 * 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[91 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatList_SelectedChats(_ value: Int32) -> String { + public func MessageTimer_ShortMinutes(_ 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) + return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteFor_Days(_ value: Int32) -> String { + public func SharedMedia_Video(_ 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_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - 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 OldChannels_InactiveWeek(_ 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 MessageTimer_ShortDays(_ 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 PollResults_ShowMore(_ 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 ForwardedAudios(_ 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 StickerPack_RemoveStickerCount(_ 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 AttachmentMenu_SendGif(_ 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_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, _1, _2) - } - 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[103 * 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[104 * 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[105 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[29 * 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[106 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[30 * 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[31 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ForwardedPhotos(_ 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 Call_ShortMinutes(_ 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 Notifications_ExceptionMuteExpires_Hours(_ 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 OldChannels_InactiveYear(_ 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 PrivacyLastSeenSettings_AddUsers(_ 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 StickerPack_AddMaskCount(_ 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 Watch_LastSeen_HoursAgo(_ 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 MessagePoll_QuizCount(_ 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 LastSeen_MinutesAgo(_ 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 ForwardedStickers(_ 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 OldChannels_GroupFormat(_ 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 MessageTimer_ShortDays(_ 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 SharedMedia_DeleteItemsConfirmation(_ 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 Media_ShareVideo(_ 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_Minutes(_ 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 ServiceMessage_GameScoreSimple(_ 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) + return String(format: self._ps[47 * 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[48 * 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[49 * 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[50 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func GroupInfo_ShowMoreMembers(_ 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 Stats_MessageViews(_ 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 Passport_Scans(_ 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 PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ForwardedVideos(_ 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 LiveLocation_MenuChatsCount(_ 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 Wallet_Updated_MinutesAgo(_ 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 Notifications_ExceptionMuteExpires_Days(_ 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 MessageTimer_Seconds(_ 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 Media_ShareItem(_ 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 ChatList_DeletedChats(_ 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 MessageTimer_Hours(_ 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 Forward_ConfirmMultipleFiles(_ 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 Chat_DeleteMessagesConfirmation(_ 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 ChatList_DeleteConfirmation(_ 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 Wallet_Updated_HoursAgo(_ 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 Stats_MessageForwards(_ 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 StickerPack_RemoveStickerCount(_ 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 Notification_GameScoreSimple(_ 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_PollOptionCount(_ 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 ForwardedPolls(_ 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 ForwardedFiles(_ 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 ForwardedMessages(_ 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 Contacts_InviteContacts(_ 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 LiveLocationUpdated_MinutesAgo(_ 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 AttachmentMenu_SendVideo(_ 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 StickerPack_StickerCount(_ 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 PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func PUSH_CHANNEL_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 ForwardedAudios(_ 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 AttachmentMenu_SendGif(_ 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 ForwardedContacts(_ 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 Notification_GameScoreSelfExtended(_ 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 PeopleNearby_ShowMorePeople(_ 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 PollResults_ShowMore(_ 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 SharedMedia_File(_ 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 Call_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_PHOTOS(_ 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 Media_SharePhoto(_ 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 MessageTimer_ShortSeconds(_ 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_LiveLocationMembersCount(_ 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_GameScoreSelfSimple(_ 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 Watch_UserInfo_Mute(_ 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 OldChannels_InactiveMonth(_ 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 PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, _1, _2) + } + 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 ChatList_SelectedChats(_ 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 Call_Seconds(_ 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 MuteFor_Days(_ 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 MuteExpires_Minutes(_ 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_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[102 * 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[103 * 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[104 * 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[105 * 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[106 * 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[107 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func UserCount(_ 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 Notification_GameScoreSimple(_ value: Int32) -> String { + public func Call_ShortSeconds(_ 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) @@ -5302,82 +5301,101 @@ public final class PresentationStrings: Equatable { let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) } - public func OldChannels_Leave(_ 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[111 * 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[112 * 6 + Int(form.rawValue)]!, _1, _2) + public func Conversation_SelectedMessages(_ 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 SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + 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[113 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notification_GameScoreSelfExtended(_ 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[114 * 6 + Int(form.rawValue)]!, stringValue) } - public func Call_ShortSeconds(_ 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[115 * 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[116 * 6 + Int(form.rawValue)]!, _1, _2) + public func MessageTimer_Years(_ 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) } - public func ForwardedVideos(_ 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[117 * 6 + Int(form.rawValue)]!, stringValue) } - public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + public func InstantPage_Views(_ 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 PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[119 * 6 + Int(form.rawValue)]!, _1, _2) + public func Conversation_StatusSubscribers(_ 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 Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + public func StickerPack_AddStickerCount(_ 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 ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[121 * 6 + Int(form.rawValue)]!, _0, _1) + public func Map_ETAHours(_ 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 MessageTimer_Weeks(_ value: Int32) -> String { + public func MuteFor_Hours(_ 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 Wallet_Updated_MinutesAgo(_ value: Int32) -> String { + public func QuickSend_Photos(_ 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 LastSeen_HoursAgo(_ value: Int32) -> String { + public func Theme_UsersCount(_ 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 OldChannels_GroupFormat(_ value: Int32) -> String { + public func MessageTimer_Weeks(_ 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 ServiceMessage_GameScoreExtended(_ value: Int32) -> String { + public func Notification_GameScoreSelfSimple(_ 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 func MuteExpires_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[127 * 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[128 * 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[129 * 6 + Int(form.rawValue)]!, stringValue) + } public init(primaryComponent: PresentationStringsComponent, secondaryComponent: PresentationStringsComponent?, groupingSeparator: String) { self.primaryComponent = primaryComponent diff --git a/submodules/TelegramUI/Images.xcassets/Chart/arrow_left.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chart/arrow_left.imageset/Contents.json index 147027fa6d..a08f875796 100644 --- a/submodules/TelegramUI/Images.xcassets/Chart/arrow_left.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Chart/arrow_left.imageset/Contents.json @@ -8,5 +8,8 @@ "info" : { "version" : 1, "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" } } \ No newline at end of file diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index 7f2c20ee23..1393f0cb4b 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -193,6 +193,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G private var resolvePeerByNameDisposable: MetaDisposable? private var shareStatusDisposable: MetaDisposable? private var clearCacheDisposable: MetaDisposable? + private var bankCardDisposable: MetaDisposable? private let editingMessage = ValuePromise(nil, ignoreRepeated: true) private let startingBot = ValuePromise(false, ignoreRepeated: true) @@ -1056,7 +1057,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G var cancelImpl: (() -> Void)? let presentationData = strongSelf.presentationData let progressSignal = Signal { subscriber in - let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { cancelImpl?() })) self?.present(controller, in: .window(.root)) @@ -1362,60 +1363,67 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G return } -// var signal = getBankCardInfo(account: strongSelf.context.account, cardNumber: number) -// -// var cancelImpl: (() -> Void)? -// let presentationData = strongSelf.context.sharedContext.currentPresentationData.with { $0 } -// let progressSignal = Signal { subscriber in -// let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { -// cancelImpl?() -// })) -// strongSelf.present(controller, in: .window(.root), with: ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) -// return ActionDisposable { [weak controller] in -// Queue.mainQueue().async() { -// controller?.dismiss() -// } -// } -// } -// |> runOn(Queue.mainQueue()) -// |> delay(0.15, queue: Queue.mainQueue()) -// let progressDisposable = progressSignal.start() -// -// signal = signal -// |> afterDisposed { -// Queue.mainQueue().async { -// progressDisposable.dispose() -// } -// } -// cancelImpl = { -// disposable.set(nil) -// } -// disposable.set((signal -// |> 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)) -// for url in info.urls { -// items.append(ActionSheetButtonItem(title: url.title, color: .accent, action: { [weak actionSheet] in -// actionSheet?.dismissAnimated() -// if let strongSelf = self { -// strongSelf.controllerInteraction?.openUrl(url.url, false, false, message) -// } -// })) -// } -// items.append(ActionSheetButtonItem(title: strongSelf.presentationData.strings.Conversation_LinkDialogCopy, color: .accent, action: { [weak actionSheet] in -// actionSheet?.dismissAnimated() -// UIPasteboard.general.string = number -// })) -// 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)) -// } -// })) + var signal = getBankCardInfo(account: strongSelf.context.account, cardNumber: number) + let disposable: MetaDisposable + if let current = strongSelf.bankCardDisposable { + disposable = current + } else { + disposable = MetaDisposable() + strongSelf.bankCardDisposable = disposable + } + + var cancelImpl: (() -> Void)? + let presentationData = strongSelf.context.sharedContext.currentPresentationData.with { $0 } + let progressSignal = Signal { subscriber in + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { + cancelImpl?() + })) + strongSelf.present(controller, in: .window(.root), with: ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) + return ActionDisposable { [weak controller] in + Queue.mainQueue().async() { + controller?.dismiss() + } + } + } + |> runOn(Queue.mainQueue()) + |> delay(0.15, queue: Queue.mainQueue()) + let progressDisposable = progressSignal.start() + + signal = signal + |> afterDisposed { + Queue.mainQueue().async { + progressDisposable.dispose() + } + } + cancelImpl = { + disposable.set(nil) + } + disposable.set((signal + |> 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)) + for url in info.urls { + items.append(ActionSheetButtonItem(title: url.title, color: .accent, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + if let strongSelf = self { + strongSelf.controllerInteraction?.openUrl(url.url, false, false, message) + } + })) + } + items.append(ActionSheetButtonItem(title: strongSelf.presentationData.strings.Conversation_LinkDialogCopy, color: .accent, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + UIPasteboard.general.string = number + })) + 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() } @@ -2555,6 +2563,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G self.resolvePeerByNameDisposable?.dispose() self.shareStatusDisposable?.dispose() self.clearCacheDisposable?.dispose() + self.bankCardDisposable?.dispose() self.botCallbackAlertMessageDisposable?.dispose() self.selectMessagePollOptionDisposables?.dispose() for (_, info) in self.contextQueryStates { @@ -5597,7 +5606,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G var cancelImpl: (() -> Void)? let presentationData = strongSelf.context.sharedContext.currentPresentationData.with { $0 } let progressSignal = Signal { subscriber in - let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { cancelImpl?() })) strongSelf.present(controller, in: .window(.root), with: ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) @@ -7656,7 +7665,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G var cancelImpl: (() -> Void)? let presentationData = strongSelf.presentationData let progressSignal = Signal { subscriber in - let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { cancelImpl?() })) self?.present(controller, in: .window(.root)) diff --git a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift index 53a7b86c40..bde70d062b 100644 --- a/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatControllerNode.swift @@ -1494,7 +1494,6 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate { } if let textInputPanelNode = self.textInputPanelNode, updateInputTextState { - textInputPanelNode.updateInputTextState(chatPresentationInterfaceState.interfaceState.effectiveInputState, keepSendButtonEnabled: keepSendButtonEnabled, extendedSearchLayout: extendedSearchLayout, accessoryItems: chatPresentationInterfaceState.inputTextPanelState.accessoryItems, animated: transition.isAnimated) } else { self.textInputPanelNode?.updateKeepSendButtonEnabled(keepSendButtonEnabled: keepSendButtonEnabled, extendedSearchLayout: extendedSearchLayout, animated: transition.isAnimated) diff --git a/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift b/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift index 0742b7d9c5..51410a8295 100644 --- a/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatHistoryListNode.swift @@ -613,12 +613,12 @@ 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 - switch result { + + let animatedEmojiStickers = combineLatest(loadedStickerPack(postbox: context.account.postbox, network: context.account.network, reference: .animatedEmoji, forceActualized: false), loadedStickerPack(postbox: context.account.postbox, network: context.account.network, reference: .dice, forceActualized: false)) + |> map { animatedEmoji, dice -> [String: [StickerPackItem]] in + var animatedEmojiStickers: [String: [StickerPackItem]] = [:] + switch animatedEmoji { case let .result(_, items, _): - var animatedEmojiStickers: [String: [StickerPackItem]] = [:] for case let item as StickerPackItem in items { if let emoji = item.getStringRepresentationsOfIndexKeys().first { animatedEmojiStickers[emoji.basicEmoji.0] = [item] @@ -628,22 +628,22 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { } } } - - 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 [:] + break } + switch dice { + case let .result(_, items, _): + var diceStickers: [StickerPackItem] = [] + for case let item as StickerPackItem in items { + if let emoji = item.getStringRepresentationsOfIndexKeys().first { + diceStickers.append(item) + } + } + animatedEmojiStickers["🎲".strippedEmoji] = diceStickers + default: + break + } + return animatedEmojiStickers } let previousHistoryAppearsCleared = Atomic(value: nil) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift index 0731b00c15..627a56966d 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift @@ -19,10 +19,271 @@ import TelegramAnimatedStickerNode import Emoji import Markdown +import RLottieBinding +import AppBundle +import GZip + private let nameFont = Font.medium(14.0) private let inlineBotPrefixFont = Font.regular(14.0) private let inlineBotNameFont = nameFont +private final class ManagedAnimationState { + let item: ManagedAnimationItem + + private let instance: LottieInstance + + let frameCount: Int + let fps: Double + + var relativeTime: Double = 0.0 + var frameIndex: Int? + + private let renderContext: DrawingContext + + init?(displaySize: CGSize, item: ManagedAnimationItem, current: ManagedAnimationState?) { + let resolvedInstance: LottieInstance + let renderContext: DrawingContext + + if let current = current { + resolvedInstance = current.instance + renderContext = current.renderContext + } else { + guard let path = item.source.path else { + return nil + } + guard let data = try? Data(contentsOf: URL(fileURLWithPath: path)) else { + return nil + } + guard let unpackedData = TGGUnzipData(data, 5 * 1024 * 1024) else { + return nil + } + guard let instance = LottieInstance(data: unpackedData, cacheKey: item.source.cacheKey) else { + return nil + } + resolvedInstance = instance + renderContext = DrawingContext(size: displaySize, scale: UIScreenScale, premultiplied: true, clear: true) + } + + self.item = item + self.instance = resolvedInstance + self.renderContext = renderContext + + self.frameCount = Int(self.instance.frameCount) + self.fps = Double(self.instance.frameRate) + } + + func draw() -> UIImage? { + self.instance.renderFrame(with: Int32(self.frameIndex ?? 0), into: self.renderContext.bytes.assumingMemoryBound(to: UInt8.self), width: Int32(self.renderContext.size.width * self.renderContext.scale), height: Int32(self.renderContext.size.height * self.renderContext.scale), bytesPerRow: Int32(self.renderContext.bytesPerRow)) + return self.renderContext.generateImage() + } +} + +struct ManagedAnimationFrameRange: Equatable { + var startFrame: Int + var endFrame: Int +} + +enum ManagedAnimationSource: Equatable { + case local(String) + case resource(MediaBox, MediaResource) + + var cacheKey: String { + switch self { + case let .local(name): + return name + case let .resource(mediaBox, resource): + return resource.id.uniqueId + } + } + + var path: String? { + switch self { + case let .local(name): + return getAppBundle().path(forResource: name, ofType: "tgs") + case let .resource(mediaBox, resource): + return mediaBox.completedResourcePath(resource) + } + } + + static func == (lhs: ManagedAnimationSource, rhs: ManagedAnimationSource) -> Bool { + switch lhs { + case let .local(lhsPath): + if case let .local(rhsPath) = rhs, lhsPath == rhsPath { + return true + } else { + return false + } + case let .resource(lhsMediaBox, lhsResource): + if case let .resource(rhsMediaBox, rhsResource) = rhs, lhsMediaBox === rhsMediaBox, lhsResource.isEqual(to: rhsResource) { + return true + } else { + return false + } + } + } +} + +struct ManagedAnimationItem: Equatable { + let source: ManagedAnimationSource + var frames: ManagedAnimationFrameRange + var duration: Double +} + +class ManagedAnimationNode: ASDisplayNode { + let intrinsicSize: CGSize + + private let imageNode: ASImageNode + private let displayLink: CADisplayLink + + fileprivate var state: ManagedAnimationState? + fileprivate var trackStack: [ManagedAnimationItem] = [] + fileprivate var didTryAdvancingState = false + + init(size: CGSize) { + self.intrinsicSize = size + + self.imageNode = ASImageNode() + self.imageNode.displayWithoutProcessing = true + self.imageNode.displaysAsynchronously = false + self.imageNode.frame = CGRect(origin: CGPoint(), size: self.intrinsicSize) + + final class DisplayLinkTarget: NSObject { + private let f: () -> Void + + init(_ f: @escaping () -> Void) { + self.f = f + } + + @objc func event() { + self.f() + } + } + var displayLinkUpdate: (() -> Void)? + self.displayLink = CADisplayLink(target: DisplayLinkTarget { + displayLinkUpdate?() + }, selector: #selector(DisplayLinkTarget.event)) + + super.init() + + self.addSubnode(self.imageNode) + + self.displayLink.add(to: RunLoop.main, forMode: .common) + + displayLinkUpdate = { [weak self] in + self?.updateAnimation() + } + } + + func advanceState() { + guard !self.trackStack.isEmpty else { + return + } + + let item = self.trackStack.removeFirst() + + if let state = self.state, state.item.source == item.source { + self.state = ManagedAnimationState(displaySize: self.intrinsicSize, item: item, current: state) + } else { + self.state = ManagedAnimationState(displaySize: self.intrinsicSize, item: item, current: nil) + } + + self.didTryAdvancingState = false + } + + fileprivate func updateAnimation() { + if self.state == nil { + self.advanceState() + } + + guard let state = self.state else { + return + } + let timestamp = CACurrentMediaTime() + + let fps = state.fps + let frameRange = state.item.frames + + let duration: Double = state.item.duration + var t = state.relativeTime / duration + t = max(0.0, t) + t = min(1.0, t) + + let frameOffset = Int(Double(frameRange.startFrame) * (1.0 - t) + Double(frameRange.endFrame) * t) + let lowerBound: Int = 0 + let upperBound = state.frameCount - 1 + let frameIndex = max(lowerBound, min(upperBound, frameOffset)) + + if state.frameIndex != frameIndex { + state.frameIndex = frameIndex + if let image = state.draw() { + self.imageNode.image = image + } + } + + var animationAdvancement: Double = 1.0 / 60.0 + animationAdvancement *= Double(min(2, self.trackStack.count + 1)) + + state.relativeTime += animationAdvancement + + if state.relativeTime >= duration && !self.didTryAdvancingState { + self.didTryAdvancingState = true + self.advanceState() + } + } + + func trackTo(item: ManagedAnimationItem) { + self.trackStack.append(item) + self.didTryAdvancingState = false + self.updateAnimation() + } +} + +enum ManagedDiceAnimationState: Equatable { + case rolling + case value(Int) +} + +final class ManagedDiceAnimationNode: ManagedAnimationNode { + private let context: AccountContext + private var diceState: ManagedDiceAnimationState = .rolling + private let disposable = MetaDisposable() + + init(context: AccountContext) { + self.context = context + + super.init(size: CGSize(width: 136.0, height: 136.0)) + + self.trackTo(item: ManagedAnimationItem(source: .local("DiceRolling"), frames: ManagedAnimationFrameRange(startFrame: 0, endFrame: 0), duration: 0.3)) + } + + deinit { + self.disposable.dispose() + } + + func setState(_ diceState: ManagedDiceAnimationState) { + let previousState = self.diceState + self.diceState = diceState + + switch previousState { + case .rolling: + switch diceState { + case let .value(value): + self.trackTo(item: ManagedAnimationItem(source: .local("DiceRolling"), frames: ManagedAnimationFrameRange(startFrame: 0, endFrame: 0), duration: 0.3)) + case .rolling: + break + } + case let .value(currentValue): + switch diceState { + case .rolling: + self.trackTo(item: ManagedAnimationItem(source: .local("DiceRolling"), frames: ManagedAnimationFrameRange(startFrame: 0, endFrame: 0), duration: 0.3)) + case let .value(value): + break + } + } + } +} + + private class ChatMessageHeartbeatHaptic { private var hapticFeedback = HapticFeedback() private var timer: SwiftSignalKit.Timer? @@ -257,7 +518,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { if self.telegramFile == nil { var emojiFile: TelegramMediaFile? - if emoji == "🎲" { + if false && emoji == "🎲" { var pointsValue: Int if let value = item.controllerInteraction.seenDicePointsValue[item.message.id] { pointsValue = value @@ -901,27 +1162,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { } else if let _ = self.emojiFile { 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 { var startTime: Signal if self.animationNode.playIfNeeded() { diff --git a/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift b/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift index 9d7591e00c..990b0646a6 100644 --- a/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift +++ b/submodules/TelegramUI/TelegramUI/NavigateToChatController.swift @@ -14,48 +14,49 @@ import SettingsUI public func navigateToChatControllerImpl(_ params: NavigateToChatControllerParams) { var found = false var isFirst = true - for controller in params.navigationController.viewControllers.reversed() { - if let controller = controller as? ChatControllerImpl, controller.chatLocation == params.chatLocation && (controller.subject != .scheduledMessages || controller.subject == params.subject) { - if let updateTextInputState = params.updateTextInputState { - controller.updateTextInputState(updateTextInputState) + if params.useExisting { + for controller in params.navigationController.viewControllers.reversed() { + if let controller = controller as? ChatControllerImpl, controller.chatLocation == params.chatLocation && (controller.subject != .scheduledMessages || controller.subject == params.subject) { + if let updateTextInputState = params.updateTextInputState { + controller.updateTextInputState(updateTextInputState) + } + if let subject = params.subject, case let .message(messageId) = subject { + let navigationController = params.navigationController + let animated = params.animated + controller.navigateToMessage(messageLocation: .id(messageId), animated: isFirst, completion: { [weak navigationController, weak controller] in + if let navigationController = navigationController, let controller = controller { + let _ = navigationController.popToViewController(controller, animated: animated) + } + }, customPresentProgress: { [weak navigationController] c, a in + (navigationController?.viewControllers.last as? ViewController)?.present(c, in: .window(.root), with: a) + }) + } else if params.scrollToEndIfExists && isFirst { + controller.scrollToEndOfHistory() + let _ = params.navigationController.popToViewController(controller, animated: params.animated) + params.completion() + } else if params.activateMessageSearch { + controller.activateSearch() + let _ = params.navigationController.popToViewController(controller, animated: params.animated) + params.completion() + } else { + let _ = params.navigationController.popToViewController(controller, animated: params.animated) + params.completion() + } + controller.purposefulAction = params.purposefulAction + if params.activateInput { + controller.activateInput() + } + if let botStart = params.botStart { + controller.updateChatPresentationInterfaceState(interactive: false, { state -> ChatPresentationInterfaceState in + return state.updatedBotStartPayload(botStart.payload) + }) + } + found = true + break } - if let subject = params.subject, case let .message(messageId) = subject { - let navigationController = params.navigationController - let animated = params.animated - controller.navigateToMessage(messageLocation: .id(messageId), animated: isFirst, completion: { [weak navigationController, weak controller] in - if let navigationController = navigationController, let controller = controller { - let _ = navigationController.popToViewController(controller, animated: animated) - } - }, customPresentProgress: { [weak navigationController] c, a in - (navigationController?.viewControllers.last as? ViewController)?.present(c, in: .window(.root), with: a) - }) - } else if params.scrollToEndIfExists && isFirst { - controller.scrollToEndOfHistory() - let _ = params.navigationController.popToViewController(controller, animated: params.animated) - params.completion() - } else if params.activateMessageSearch { - controller.activateSearch() - let _ = params.navigationController.popToViewController(controller, animated: params.animated) - params.completion() - } else { - let _ = params.navigationController.popToViewController(controller, animated: params.animated) - params.completion() - } - controller.purposefulAction = params.purposefulAction - if params.activateInput { - controller.activateInput() - } - if let botStart = params.botStart { - controller.updateChatPresentationInterfaceState(interactive: false, { state -> ChatPresentationInterfaceState in - return state.updatedBotStartPayload(botStart.payload) - }) - } - found = true - break + isFirst = false } - isFirst = false } - if !found { let controller: ChatControllerImpl if let chatController = params.chatController as? ChatControllerImpl { diff --git a/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift b/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift index 3ac3a2bf4f..db29b57c7c 100644 --- a/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift +++ b/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift @@ -324,7 +324,7 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur var cancelImpl: (() -> Void)? let progressSignal = Signal { subscriber in - let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { cancelImpl?() })) present(controller, nil) diff --git a/submodules/TelegramUI/TelegramUI/PeerInfo/PeerInfoData.swift b/submodules/TelegramUI/TelegramUI/PeerInfo/PeerInfoData.swift index 15ff1752b1..2d9edbe0d4 100644 --- a/submodules/TelegramUI/TelegramUI/PeerInfo/PeerInfoData.swift +++ b/submodules/TelegramUI/TelegramUI/PeerInfo/PeerInfoData.swift @@ -726,6 +726,11 @@ func peerInfoHeaderButtons(peer: Peer?, cachedData: CachedPeerData?, isOpenedFro result.append(.more) } else if let channel = peer as? TelegramChannel { var displayLeave = !channel.flags.contains(.isCreator) + var canViewStats = false + if let cachedChannelData = cachedData as? CachedChannelData { + canViewStats = cachedChannelData.flags.contains(.canViewStats) + } + switch channel.info { case .broadcast: if !channel.flags.contains(.isCreator) { @@ -744,6 +749,10 @@ func peerInfoHeaderButtons(peer: Peer?, cachedData: CachedPeerData?, isOpenedFro displayLeave = false } + if canViewStats { + displayLeave = false + } + result.append(.mute) result.append(.search) if displayLeave { @@ -755,6 +764,7 @@ func peerInfoHeaderButtons(peer: Peer?, cachedData: CachedPeerData?, isOpenedFro displayMore = false } } + if displayMore { result.append(.more) } diff --git a/submodules/TelegramUI/TelegramUI/PeerInfo/PeerInfoScreen.swift b/submodules/TelegramUI/TelegramUI/PeerInfo/PeerInfoScreen.swift index bb2a47f6ea..6446ed0f53 100644 --- a/submodules/TelegramUI/TelegramUI/PeerInfo/PeerInfoScreen.swift +++ b/submodules/TelegramUI/TelegramUI/PeerInfo/PeerInfoScreen.swift @@ -2705,7 +2705,7 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD } self.view.endEditing(true) - controller.push(channelStatsController(context: self.context, peer: peer, cachedPeerData: cachedData)) + controller.push(channelStatsController(context: self.context, peerId: peer.id, cachedPeerData: cachedData)) } private func openReport(user: Bool) { diff --git a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping index 989b8c032d1c7068f30a0b7e9a2a8d8c506f4201..4a4a8803c856b349cf158b1e27b1f23fc0e6e74f 100644 GIT binary patch delta 43558 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%0DP3mjV&$;qji%~K+nB3DUF9g%B4c`h{`C1 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 delta 43522 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